├── Fire TV Remote
├── Assets.xcassets
│ ├── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Info.plist
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── ViewController.swift
└── AppDelegate.swift
├── Fire TV Remote WatchKit App
├── Assets.xcassets
│ ├── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Info.plist
└── Base.lproj
│ └── Interface.storyboard
├── Fire TV Remote WatchKit Extension
├── Assets.xcassets
│ ├── Contents.json
│ └── Complication.complicationset
│ │ ├── Circular.imageset
│ │ └── Contents.json
│ │ ├── Modular.imageset
│ │ └── Contents.json
│ │ ├── Extra Large.imageset
│ │ └── Contents.json
│ │ ├── Utilitarian.imageset
│ │ └── Contents.json
│ │ └── Contents.json
├── PushNotificationPayload.apns
├── NotificationController.swift
├── Info.plist
├── ExtensionDelegate.swift
├── InterfaceController.swift
└── ComplicationController.swift
└── Fire TV Remote.xcodeproj
├── project.xcworkspace
├── contents.xcworkspacedata
└── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── xcuserdata
└── jason.xcuserdatad
│ └── xcschemes
│ └── xcschememanagement.plist
└── project.pbxproj
/Fire TV Remote/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit App/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Fire TV Remote.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Fire TV Remote.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "scale" : "2x",
6 | "screen-width" : "<=145"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "scale" : "2x",
11 | "screen-width" : ">145"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "scale" : "2x",
6 | "screen-width" : "<=145"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "scale" : "2x",
11 | "screen-width" : ">145"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "scale" : "2x",
6 | "screen-width" : "<=145"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "scale" : "2x",
11 | "screen-width" : ">145"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "watch",
5 | "scale" : "2x",
6 | "screen-width" : "<=145"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "scale" : "2x",
11 | "screen-width" : ">145"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "assets" : [
3 | {
4 | "idiom" : "watch",
5 | "filename" : "Circular.imageset",
6 | "role" : "circular"
7 | },
8 | {
9 | "idiom" : "watch",
10 | "filename" : "Extra Large.imageset",
11 | "role" : "extra-large"
12 | },
13 | {
14 | "idiom" : "watch",
15 | "filename" : "Modular.imageset",
16 | "role" : "modular"
17 | },
18 | {
19 | "idiom" : "watch",
20 | "filename" : "Utilitarian.imageset",
21 | "role" : "utilitarian"
22 | }
23 | ],
24 | "info" : {
25 | "version" : 1,
26 | "author" : "xcode"
27 | }
28 | }
--------------------------------------------------------------------------------
/Fire TV Remote.xcodeproj/xcuserdata/jason.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Fire TV Remote WatchKit App (Complication).xcscheme
8 |
9 | orderHint
10 | 3
11 |
12 | Fire TV Remote WatchKit App (Notification).xcscheme
13 |
14 | orderHint
15 | 2
16 |
17 | Fire TV Remote WatchKit App.xcscheme
18 |
19 | orderHint
20 | 1
21 |
22 | Fire TV Remote.xcscheme
23 |
24 | orderHint
25 | 0
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/PushNotificationPayload.apns:
--------------------------------------------------------------------------------
1 | {
2 | "aps": {
3 | "alert": {
4 | "body": "Test message",
5 | "title": "Optional title"
6 | },
7 | "category": "myCategory",
8 | "thread-id":"5280"
9 | },
10 |
11 | "WatchKit Simulator Actions": [
12 | {
13 | "title": "First Button",
14 | "identifier": "firstButtonAction"
15 | }
16 | ],
17 |
18 | "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App."
19 | }
20 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit App/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Fire TV Remote WatchKit App
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | UISupportedInterfaceOrientations
24 |
25 | UIInterfaceOrientationPortrait
26 | UIInterfaceOrientationPortraitUpsideDown
27 |
28 | WKCompanionAppBundleIdentifier
29 | com.octalmage.Fire-TV-Remote
30 | WKWatchKitApp
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/NotificationController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NotificationController.swift
3 | // Fire TV Remote WatchKit Extension
4 | //
5 | // Created by Jason Stallings on 10/28/18.
6 | // Copyright © 2018 Jason Stallings. All rights reserved.
7 | //
8 |
9 | import WatchKit
10 | import Foundation
11 | import UserNotifications
12 |
13 |
14 | class NotificationController: WKUserNotificationInterfaceController {
15 |
16 | override init() {
17 | // Initialize variables here.
18 | super.init()
19 |
20 | // Configure interface objects here.
21 | }
22 |
23 | override func willActivate() {
24 | // This method is called when watch view controller is about to be visible to user
25 | super.willActivate()
26 | }
27 |
28 | override func didDeactivate() {
29 | // This method is called when watch view controller is no longer visible
30 | super.didDeactivate()
31 | }
32 |
33 | /*
34 | override func didReceive(_ notification: UNNotification, withCompletion completionHandler: @escaping (WKUserNotificationInterfaceType) -> Swift.Void) {
35 | // This method is called when a notification needs to be presented.
36 | // Implement it if you use a dynamic notification interface.
37 | // Populate your dynamic notification interface as quickly as possible.
38 | //
39 | // After populating your dynamic notification interface call the completion block.
40 | completionHandler(.custom)
41 | }
42 | */
43 | }
44 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "24x24",
5 | "idiom" : "watch",
6 | "scale" : "2x",
7 | "role" : "notificationCenter",
8 | "subtype" : "38mm"
9 | },
10 | {
11 | "size" : "27.5x27.5",
12 | "idiom" : "watch",
13 | "scale" : "2x",
14 | "role" : "notificationCenter",
15 | "subtype" : "42mm"
16 | },
17 | {
18 | "size" : "29x29",
19 | "idiom" : "watch",
20 | "role" : "companionSettings",
21 | "scale" : "2x"
22 | },
23 | {
24 | "size" : "29x29",
25 | "idiom" : "watch",
26 | "role" : "companionSettings",
27 | "scale" : "3x"
28 | },
29 | {
30 | "size" : "40x40",
31 | "idiom" : "watch",
32 | "scale" : "2x",
33 | "role" : "appLauncher",
34 | "subtype" : "38mm"
35 | },
36 | {
37 | "size" : "44x44",
38 | "idiom" : "watch",
39 | "scale" : "2x",
40 | "role" : "longLook",
41 | "subtype" : "42mm"
42 | },
43 | {
44 | "size" : "86x86",
45 | "idiom" : "watch",
46 | "scale" : "2x",
47 | "role" : "quickLook",
48 | "subtype" : "38mm"
49 | },
50 | {
51 | "size" : "98x98",
52 | "idiom" : "watch",
53 | "scale" : "2x",
54 | "role" : "quickLook",
55 | "subtype" : "42mm"
56 | },
57 | {
58 | "idiom" : "watch-marketing",
59 | "size" : "1024x1024",
60 | "scale" : "1x"
61 | }
62 | ],
63 | "info" : {
64 | "version" : 1,
65 | "author" : "xcode"
66 | }
67 | }
--------------------------------------------------------------------------------
/Fire TV Remote/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Fire TV Remote
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | Fire TV Remote
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UISupportedInterfaceOrientations
34 |
35 | UIInterfaceOrientationPortrait
36 | UIInterfaceOrientationLandscapeLeft
37 | UIInterfaceOrientationLandscapeRight
38 |
39 | UISupportedInterfaceOrientations~ipad
40 |
41 | UIInterfaceOrientationPortrait
42 | UIInterfaceOrientationPortraitUpsideDown
43 | UIInterfaceOrientationLandscapeLeft
44 | UIInterfaceOrientationLandscapeRight
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Fire TV Remote WatchKit Extension
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | XPC!
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | CLKComplicationPrincipalClass
24 | $(PRODUCT_MODULE_NAME).ComplicationController
25 | CLKComplicationSupportedFamilies
26 |
27 | CLKComplicationFamilyGraphicBezel
28 | CLKComplicationFamilyGraphicCircular
29 | CLKComplicationFamilyGraphicCorner
30 | CLKComplicationFamilyModularSmall
31 |
32 | NSExtension
33 |
34 | NSExtensionAttributes
35 |
36 | WKAppBundleIdentifier
37 | com.octalmage.Fire-TV-Remote.watchkitapp
38 |
39 | NSExtensionPointIdentifier
40 | com.apple.watchkit
41 |
42 | WKExtensionDelegateClassName
43 | $(PRODUCT_MODULE_NAME).ExtensionDelegate
44 |
45 |
46 |
--------------------------------------------------------------------------------
/Fire TV Remote/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Fire TV Remote/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // Fire TV Remote
4 | //
5 | // Created by Jason Stallings on 10/28/18.
6 | // Copyright © 2018 Jason Stallings. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import WatchConnectivity
11 |
12 | class ViewController: UIViewController, WCSessionDelegate {
13 | var session : WCSession!
14 | @IBOutlet weak var SaveButton: UIButton!
15 | @IBOutlet weak var IPAddress: UITextField!
16 |
17 | override func viewDidLoad() {
18 | super.viewDidLoad()
19 | let defaults = UserDefaults.standard
20 | if let ip = defaults.string(forKey: "ip") {
21 | IPAddress.text = ip
22 | }
23 |
24 | if WCSession.isSupported() {
25 |
26 | session = WCSession.default
27 | session.delegate = self
28 | session.activate()
29 | }
30 | }
31 |
32 | @IBAction func Click(_ sender: Any) {
33 | let defaults = UserDefaults.standard
34 | defaults.set(IPAddress.text ?? "", forKey: "ip")
35 | print(IPAddress.text ?? "No Ip")
36 | session.transferUserInfo(["ip" : IPAddress.text ?? ""])
37 | }
38 |
39 | override func didReceiveMemoryWarning() {
40 | super.didReceiveMemoryWarning()
41 | // Dispose of any resources that can be recreated.
42 | }
43 |
44 |
45 | func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
46 |
47 | }
48 |
49 | func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
50 |
51 | }
52 |
53 | func sessionDidBecomeInactive(_ session: WCSession) {
54 |
55 | }
56 |
57 | func sessionDidDeactivate(_ session: WCSession) {
58 |
59 | }
60 |
61 |
62 | }
63 |
64 |
--------------------------------------------------------------------------------
/Fire TV Remote/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/Fire TV Remote/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // Fire TV Remote
4 | //
5 | // Created by Jason Stallings on 10/28/18.
6 | // Copyright © 2018 Jason Stallings. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 | return true
20 | }
21 |
22 | func applicationWillResignActive(_ application: UIApplication) {
23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
25 | }
26 |
27 | func applicationDidEnterBackground(_ application: UIApplication) {
28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
30 | }
31 |
32 | func applicationWillEnterForeground(_ application: UIApplication) {
33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | func applicationDidBecomeActive(_ application: UIApplication) {
37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
38 | }
39 |
40 | func applicationWillTerminate(_ application: UIApplication) {
41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
42 | }
43 |
44 |
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/ExtensionDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ExtensionDelegate.swift
3 | // Fire TV Remote WatchKit Extension
4 | //
5 | // Created by Jason Stallings on 10/28/18.
6 | // Copyright © 2018 Jason Stallings. All rights reserved.
7 | //
8 |
9 | import WatchKit
10 |
11 | class ExtensionDelegate: NSObject, WKExtensionDelegate {
12 |
13 | func applicationDidFinishLaunching() {
14 | // Perform any final initialization of your application.
15 | }
16 |
17 | func applicationDidBecomeActive() {
18 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
19 | }
20 |
21 | func applicationWillResignActive() {
22 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
23 | // Use this method to pause ongoing tasks, disable timers, etc.
24 | }
25 |
26 | func handle(_ backgroundTasks: Set) {
27 | // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one.
28 | for task in backgroundTasks {
29 | // Use a switch statement to check the task type
30 | switch task {
31 | case let backgroundTask as WKApplicationRefreshBackgroundTask:
32 | // Be sure to complete the background task once you’re done.
33 | backgroundTask.setTaskCompletedWithSnapshot(false)
34 | case let snapshotTask as WKSnapshotRefreshBackgroundTask:
35 | // Snapshot tasks have a unique completion call, make sure to set your expiration date
36 | snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil)
37 | case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask:
38 | // Be sure to complete the connectivity task once you’re done.
39 | connectivityTask.setTaskCompletedWithSnapshot(false)
40 | case let urlSessionTask as WKURLSessionRefreshBackgroundTask:
41 | // Be sure to complete the URL session task once you’re done.
42 | urlSessionTask.setTaskCompletedWithSnapshot(false)
43 | default:
44 | // make sure to complete unhandled task types
45 | task.setTaskCompletedWithSnapshot(false)
46 | }
47 | }
48 | }
49 |
50 | }
51 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/InterfaceController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InterfaceController.swift
3 | // Fire TV Remote WatchKit Extension
4 | //
5 | // Created by Jason Stallings on 10/28/18.
6 | // Copyright © 2018 Jason Stallings. All rights reserved.
7 | //
8 |
9 | import WatchKit
10 | import Foundation
11 | import WatchConnectivity
12 |
13 |
14 | class InterfaceController: WKInterfaceController, WCSessionDelegate {
15 | var session : WCSession!
16 | let defaults = UserDefaults.standard
17 | @IBOutlet var PlayButton: WKInterfaceButton!
18 | @IBOutlet var UpButton: WKInterfaceButton!
19 | @IBOutlet var LeftButton: WKInterfaceButton!
20 | @IBOutlet var RightButton: WKInterfaceButton!
21 | @IBOutlet var DownButton: WKInterfaceButton!
22 | @IBOutlet var BackButton: WKInterfaceButton!
23 |
24 | override func awake(withContext context: Any?) {
25 | super.awake(withContext: context)
26 |
27 | // Configure interface objects here.
28 | }
29 |
30 | @IBAction func Play() {
31 | sendKeycode(key: "85")
32 | }
33 |
34 | @IBAction func Up() {
35 | sendKeycode(key: "19")
36 | }
37 |
38 | @IBAction func Left() {
39 | sendKeycode(key: "21")
40 | }
41 |
42 | @IBAction func Right() {
43 | sendKeycode(key: "22")
44 | }
45 |
46 | @IBAction func Down() {
47 | sendKeycode(key: "20")
48 | }
49 |
50 | @IBAction func Back() {
51 | sendKeycode(key: "4")
52 | }
53 |
54 | func sendKeycode(key: String) {
55 | if let ip = defaults.string(forKey: "ip") {
56 | let url = URL(string: "http://\(ip):8811/input/\(key)")!
57 | print(url)
58 | let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
59 | guard let data = data else { return }
60 | print(String(data: data, encoding: .utf8)!)
61 | }
62 |
63 | task.resume()
64 | }
65 | }
66 |
67 | override func willActivate() {
68 | // This method is called when watch view controller is about to be visible to user
69 | super.willActivate()
70 |
71 | if WCSession.isSupported() {
72 | session = WCSession.default
73 | session.delegate = self
74 | session.activate()
75 | }
76 | }
77 |
78 | override func didDeactivate() {
79 | // This method is called when watch view controller is no longer visible
80 | super.didDeactivate()
81 | }
82 |
83 | func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
84 |
85 | }
86 |
87 | func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
88 |
89 | }
90 |
91 | func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any]) {
92 | print(userInfo["ip"] ?? "No IP")
93 | defaults.set(userInfo["ip"] ?? "", forKey: "ip")
94 | }
95 |
96 | }
97 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit Extension/ComplicationController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ComplicationController.swift
3 | // Fire TV Remote WatchKit Extension
4 | //
5 | // Created by Jason Stallings on 10/28/18.
6 | // Copyright © 2018 Jason Stallings. All rights reserved.
7 | //
8 |
9 | import ClockKit
10 |
11 |
12 | class ComplicationController: NSObject, CLKComplicationDataSource {
13 |
14 | // MARK: - Timeline Configuration
15 |
16 | func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) {
17 | handler([.forward, .backward])
18 | }
19 |
20 | func getTimelineStartDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) {
21 | handler(nil)
22 | }
23 |
24 | func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) {
25 | handler(nil)
26 | }
27 |
28 | func getPrivacyBehavior(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationPrivacyBehavior) -> Void) {
29 | handler(.showOnLockScreen)
30 | }
31 |
32 | // MARK: - Timeline Population
33 |
34 | func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {
35 | let template = getTemplate(complication: complication)
36 |
37 | let timelineEntry = CLKComplicationTimelineEntry(date: Date(), complicationTemplate: template!)
38 | handler(timelineEntry)
39 | }
40 |
41 | func getTimelineEntries(for complication: CLKComplication, before date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) {
42 | // Call the handler with the timeline entries prior to the given date
43 | handler(nil)
44 | }
45 |
46 | func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) {
47 | // Call the handler with the timeline entries after to the given date
48 | handler(nil)
49 | }
50 |
51 | // MARK: - Placeholder Templates
52 |
53 | func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
54 | // This method will be called once per supported complication, and the results will be cached
55 | handler(nil)
56 | }
57 |
58 | func getTemplate(complication: CLKComplication?) -> CLKComplicationTemplate? {
59 | // This method will be called once per supported complication, and
60 | // the results will be cached
61 |
62 | var template: CLKComplicationTemplate?
63 | switch complication!.family {
64 | case .modularSmall:
65 | let modularSmallTemplate =
66 | CLKComplicationTemplateModularSmallRingText()
67 | modularSmallTemplate.textProvider =
68 | CLKSimpleTextProvider(text: "F")
69 | modularSmallTemplate.fillFraction = 100
70 | modularSmallTemplate.ringStyle = CLKComplicationRingStyle.closed
71 | template = modularSmallTemplate
72 | case .utilitarianSmall:
73 | template = nil
74 | case .utilitarianLarge:
75 | template = nil
76 | case .circularSmall:
77 | template = nil
78 | case .utilitarianSmallFlat:
79 | template = nil
80 | case .extraLarge:
81 | template = nil
82 | case .graphicCorner:
83 | if #available(watchOSApplicationExtension 5.0, *) {
84 | let graphicCornerTemplate = CLKComplicationTemplateGraphicCornerStackText()
85 | graphicCornerTemplate.outerTextProvider = CLKSimpleTextProvider(text: "Get")
86 | graphicCornerTemplate.innerTextProvider = CLKSimpleTextProvider(text: "Money")
87 | template = graphicCornerTemplate
88 | } else {
89 | template = nil
90 | }
91 | case .graphicBezel:
92 | template = nil
93 | case .graphicCircular:
94 | template = nil
95 | case .graphicRectangular:
96 | template = nil
97 | case .modularLarge:
98 | template = nil
99 | }
100 | return template
101 |
102 | }
103 |
104 | func getPlaceholderTemplateForComplication(
105 | complication: CLKComplication,
106 | withHandler handler: (CLKComplicationTemplate?) -> Void) {
107 |
108 | handler(getTemplate(complication: complication))
109 | }
110 |
111 | }
112 |
--------------------------------------------------------------------------------
/Fire TV Remote WatchKit App/Base.lproj/Interface.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
22 |
27 |
28 |
29 |
34 |
39 |
40 |
41 |
46 |
51 |
52 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
--------------------------------------------------------------------------------
/Fire TV Remote/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
43 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/Fire TV Remote.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 9679D4492185859000F9AAFF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9679D4482185859000F9AAFF /* AppDelegate.swift */; };
11 | 9679D44B2185859000F9AAFF /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9679D44A2185859000F9AAFF /* ViewController.swift */; };
12 | 9679D44E2185859000F9AAFF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9679D44C2185859000F9AAFF /* Main.storyboard */; };
13 | 9679D4502185859100F9AAFF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9679D44F2185859100F9AAFF /* Assets.xcassets */; };
14 | 9679D4532185859100F9AAFF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9679D4512185859100F9AAFF /* LaunchScreen.storyboard */; };
15 | 9679D4582185859100F9AAFF /* Fire TV Remote WatchKit App.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 9679D4572185859100F9AAFF /* Fire TV Remote WatchKit App.app */; };
16 | 9679D45E2185859100F9AAFF /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9679D45C2185859100F9AAFF /* Interface.storyboard */; };
17 | 9679D4602185859200F9AAFF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9679D45F2185859200F9AAFF /* Assets.xcassets */; };
18 | 9679D4672185859200F9AAFF /* Fire TV Remote WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 9679D4662185859200F9AAFF /* Fire TV Remote WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
19 | 9679D46C2185859200F9AAFF /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9679D46B2185859200F9AAFF /* InterfaceController.swift */; };
20 | 9679D46E2185859200F9AAFF /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9679D46D2185859200F9AAFF /* ExtensionDelegate.swift */; };
21 | 9679D4702185859200F9AAFF /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9679D46F2185859200F9AAFF /* NotificationController.swift */; };
22 | 9679D4722185859200F9AAFF /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9679D4712185859200F9AAFF /* ComplicationController.swift */; };
23 | 9679D4742185859300F9AAFF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9679D4732185859300F9AAFF /* Assets.xcassets */; };
24 | /* End PBXBuildFile section */
25 |
26 | /* Begin PBXContainerItemProxy section */
27 | 9679D4592185859100F9AAFF /* PBXContainerItemProxy */ = {
28 | isa = PBXContainerItemProxy;
29 | containerPortal = 9679D43D2185859000F9AAFF /* Project object */;
30 | proxyType = 1;
31 | remoteGlobalIDString = 9679D4562185859100F9AAFF;
32 | remoteInfo = "Fire TV Remote WatchKit App";
33 | };
34 | 9679D4682185859200F9AAFF /* PBXContainerItemProxy */ = {
35 | isa = PBXContainerItemProxy;
36 | containerPortal = 9679D43D2185859000F9AAFF /* Project object */;
37 | proxyType = 1;
38 | remoteGlobalIDString = 9679D4652185859200F9AAFF;
39 | remoteInfo = "Fire TV Remote WatchKit Extension";
40 | };
41 | /* End PBXContainerItemProxy section */
42 |
43 | /* Begin PBXCopyFilesBuildPhase section */
44 | 9679D47C2185859300F9AAFF /* Embed App Extensions */ = {
45 | isa = PBXCopyFilesBuildPhase;
46 | buildActionMask = 2147483647;
47 | dstPath = "";
48 | dstSubfolderSpec = 13;
49 | files = (
50 | 9679D4672185859200F9AAFF /* Fire TV Remote WatchKit Extension.appex in Embed App Extensions */,
51 | );
52 | name = "Embed App Extensions";
53 | runOnlyForDeploymentPostprocessing = 0;
54 | };
55 | 9679D4802185859300F9AAFF /* Embed Watch Content */ = {
56 | isa = PBXCopyFilesBuildPhase;
57 | buildActionMask = 2147483647;
58 | dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
59 | dstSubfolderSpec = 16;
60 | files = (
61 | 9679D4582185859100F9AAFF /* Fire TV Remote WatchKit App.app in Embed Watch Content */,
62 | );
63 | name = "Embed Watch Content";
64 | runOnlyForDeploymentPostprocessing = 0;
65 | };
66 | /* End PBXCopyFilesBuildPhase section */
67 |
68 | /* Begin PBXFileReference section */
69 | 9679D4452185859000F9AAFF /* Fire TV Remote.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Fire TV Remote.app"; sourceTree = BUILT_PRODUCTS_DIR; };
70 | 9679D4482185859000F9AAFF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
71 | 9679D44A2185859000F9AAFF /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
72 | 9679D44D2185859000F9AAFF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
73 | 9679D44F2185859100F9AAFF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
74 | 9679D4522185859100F9AAFF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
75 | 9679D4542185859100F9AAFF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
76 | 9679D4572185859100F9AAFF /* Fire TV Remote WatchKit App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Fire TV Remote WatchKit App.app"; sourceTree = BUILT_PRODUCTS_DIR; };
77 | 9679D45D2185859100F9AAFF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; };
78 | 9679D45F2185859200F9AAFF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
79 | 9679D4612185859200F9AAFF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
80 | 9679D4662185859200F9AAFF /* Fire TV Remote WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Fire TV Remote WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
81 | 9679D46B2185859200F9AAFF /* InterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = ""; };
82 | 9679D46D2185859200F9AAFF /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; };
83 | 9679D46F2185859200F9AAFF /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; };
84 | 9679D4712185859200F9AAFF /* ComplicationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = ""; };
85 | 9679D4732185859300F9AAFF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
86 | 9679D4752185859300F9AAFF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
87 | 9679D4762185859300F9AAFF /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; };
88 | /* End PBXFileReference section */
89 |
90 | /* Begin PBXFrameworksBuildPhase section */
91 | 9679D4422185859000F9AAFF /* Frameworks */ = {
92 | isa = PBXFrameworksBuildPhase;
93 | buildActionMask = 2147483647;
94 | files = (
95 | );
96 | runOnlyForDeploymentPostprocessing = 0;
97 | };
98 | 9679D4632185859200F9AAFF /* Frameworks */ = {
99 | isa = PBXFrameworksBuildPhase;
100 | buildActionMask = 2147483647;
101 | files = (
102 | );
103 | runOnlyForDeploymentPostprocessing = 0;
104 | };
105 | /* End PBXFrameworksBuildPhase section */
106 |
107 | /* Begin PBXGroup section */
108 | 9679D43C2185859000F9AAFF = {
109 | isa = PBXGroup;
110 | children = (
111 | 9679D4472185859000F9AAFF /* Fire TV Remote */,
112 | 9679D45B2185859100F9AAFF /* Fire TV Remote WatchKit App */,
113 | 9679D46A2185859200F9AAFF /* Fire TV Remote WatchKit Extension */,
114 | 9679D4462185859000F9AAFF /* Products */,
115 | );
116 | sourceTree = "";
117 | };
118 | 9679D4462185859000F9AAFF /* Products */ = {
119 | isa = PBXGroup;
120 | children = (
121 | 9679D4452185859000F9AAFF /* Fire TV Remote.app */,
122 | 9679D4572185859100F9AAFF /* Fire TV Remote WatchKit App.app */,
123 | 9679D4662185859200F9AAFF /* Fire TV Remote WatchKit Extension.appex */,
124 | );
125 | name = Products;
126 | sourceTree = "";
127 | };
128 | 9679D4472185859000F9AAFF /* Fire TV Remote */ = {
129 | isa = PBXGroup;
130 | children = (
131 | 9679D4482185859000F9AAFF /* AppDelegate.swift */,
132 | 9679D44A2185859000F9AAFF /* ViewController.swift */,
133 | 9679D44C2185859000F9AAFF /* Main.storyboard */,
134 | 9679D44F2185859100F9AAFF /* Assets.xcassets */,
135 | 9679D4512185859100F9AAFF /* LaunchScreen.storyboard */,
136 | 9679D4542185859100F9AAFF /* Info.plist */,
137 | );
138 | path = "Fire TV Remote";
139 | sourceTree = "";
140 | };
141 | 9679D45B2185859100F9AAFF /* Fire TV Remote WatchKit App */ = {
142 | isa = PBXGroup;
143 | children = (
144 | 9679D45C2185859100F9AAFF /* Interface.storyboard */,
145 | 9679D45F2185859200F9AAFF /* Assets.xcassets */,
146 | 9679D4612185859200F9AAFF /* Info.plist */,
147 | );
148 | path = "Fire TV Remote WatchKit App";
149 | sourceTree = "";
150 | };
151 | 9679D46A2185859200F9AAFF /* Fire TV Remote WatchKit Extension */ = {
152 | isa = PBXGroup;
153 | children = (
154 | 9679D46B2185859200F9AAFF /* InterfaceController.swift */,
155 | 9679D46D2185859200F9AAFF /* ExtensionDelegate.swift */,
156 | 9679D46F2185859200F9AAFF /* NotificationController.swift */,
157 | 9679D4712185859200F9AAFF /* ComplicationController.swift */,
158 | 9679D4732185859300F9AAFF /* Assets.xcassets */,
159 | 9679D4752185859300F9AAFF /* Info.plist */,
160 | 9679D4762185859300F9AAFF /* PushNotificationPayload.apns */,
161 | );
162 | path = "Fire TV Remote WatchKit Extension";
163 | sourceTree = "";
164 | };
165 | /* End PBXGroup section */
166 |
167 | /* Begin PBXNativeTarget section */
168 | 9679D4442185859000F9AAFF /* Fire TV Remote */ = {
169 | isa = PBXNativeTarget;
170 | buildConfigurationList = 9679D4812185859300F9AAFF /* Build configuration list for PBXNativeTarget "Fire TV Remote" */;
171 | buildPhases = (
172 | 9679D4412185859000F9AAFF /* Sources */,
173 | 9679D4422185859000F9AAFF /* Frameworks */,
174 | 9679D4432185859000F9AAFF /* Resources */,
175 | 9679D4802185859300F9AAFF /* Embed Watch Content */,
176 | );
177 | buildRules = (
178 | );
179 | dependencies = (
180 | 9679D45A2185859100F9AAFF /* PBXTargetDependency */,
181 | );
182 | name = "Fire TV Remote";
183 | productName = "Fire TV Remote";
184 | productReference = 9679D4452185859000F9AAFF /* Fire TV Remote.app */;
185 | productType = "com.apple.product-type.application";
186 | };
187 | 9679D4562185859100F9AAFF /* Fire TV Remote WatchKit App */ = {
188 | isa = PBXNativeTarget;
189 | buildConfigurationList = 9679D47D2185859300F9AAFF /* Build configuration list for PBXNativeTarget "Fire TV Remote WatchKit App" */;
190 | buildPhases = (
191 | 9679D4552185859100F9AAFF /* Resources */,
192 | 9679D47C2185859300F9AAFF /* Embed App Extensions */,
193 | );
194 | buildRules = (
195 | );
196 | dependencies = (
197 | 9679D4692185859200F9AAFF /* PBXTargetDependency */,
198 | );
199 | name = "Fire TV Remote WatchKit App";
200 | productName = "Fire TV Remote WatchKit App";
201 | productReference = 9679D4572185859100F9AAFF /* Fire TV Remote WatchKit App.app */;
202 | productType = "com.apple.product-type.application.watchapp2";
203 | };
204 | 9679D4652185859200F9AAFF /* Fire TV Remote WatchKit Extension */ = {
205 | isa = PBXNativeTarget;
206 | buildConfigurationList = 9679D4792185859300F9AAFF /* Build configuration list for PBXNativeTarget "Fire TV Remote WatchKit Extension" */;
207 | buildPhases = (
208 | 9679D4622185859200F9AAFF /* Sources */,
209 | 9679D4632185859200F9AAFF /* Frameworks */,
210 | 9679D4642185859200F9AAFF /* Resources */,
211 | );
212 | buildRules = (
213 | );
214 | dependencies = (
215 | );
216 | name = "Fire TV Remote WatchKit Extension";
217 | productName = "Fire TV Remote WatchKit Extension";
218 | productReference = 9679D4662185859200F9AAFF /* Fire TV Remote WatchKit Extension.appex */;
219 | productType = "com.apple.product-type.watchkit2-extension";
220 | };
221 | /* End PBXNativeTarget section */
222 |
223 | /* Begin PBXProject section */
224 | 9679D43D2185859000F9AAFF /* Project object */ = {
225 | isa = PBXProject;
226 | attributes = {
227 | LastSwiftUpdateCheck = 0940;
228 | LastUpgradeCheck = 0940;
229 | ORGANIZATIONNAME = "Jason Stallings";
230 | TargetAttributes = {
231 | 9679D4442185859000F9AAFF = {
232 | CreatedOnToolsVersion = 9.4;
233 | };
234 | 9679D4562185859100F9AAFF = {
235 | CreatedOnToolsVersion = 9.4;
236 | };
237 | 9679D4652185859200F9AAFF = {
238 | CreatedOnToolsVersion = 9.4;
239 | };
240 | };
241 | };
242 | buildConfigurationList = 9679D4402185859000F9AAFF /* Build configuration list for PBXProject "Fire TV Remote" */;
243 | compatibilityVersion = "Xcode 9.3";
244 | developmentRegion = en;
245 | hasScannedForEncodings = 0;
246 | knownRegions = (
247 | en,
248 | Base,
249 | );
250 | mainGroup = 9679D43C2185859000F9AAFF;
251 | productRefGroup = 9679D4462185859000F9AAFF /* Products */;
252 | projectDirPath = "";
253 | projectRoot = "";
254 | targets = (
255 | 9679D4442185859000F9AAFF /* Fire TV Remote */,
256 | 9679D4562185859100F9AAFF /* Fire TV Remote WatchKit App */,
257 | 9679D4652185859200F9AAFF /* Fire TV Remote WatchKit Extension */,
258 | );
259 | };
260 | /* End PBXProject section */
261 |
262 | /* Begin PBXResourcesBuildPhase section */
263 | 9679D4432185859000F9AAFF /* Resources */ = {
264 | isa = PBXResourcesBuildPhase;
265 | buildActionMask = 2147483647;
266 | files = (
267 | 9679D4532185859100F9AAFF /* LaunchScreen.storyboard in Resources */,
268 | 9679D4502185859100F9AAFF /* Assets.xcassets in Resources */,
269 | 9679D44E2185859000F9AAFF /* Main.storyboard in Resources */,
270 | );
271 | runOnlyForDeploymentPostprocessing = 0;
272 | };
273 | 9679D4552185859100F9AAFF /* Resources */ = {
274 | isa = PBXResourcesBuildPhase;
275 | buildActionMask = 2147483647;
276 | files = (
277 | 9679D4602185859200F9AAFF /* Assets.xcassets in Resources */,
278 | 9679D45E2185859100F9AAFF /* Interface.storyboard in Resources */,
279 | );
280 | runOnlyForDeploymentPostprocessing = 0;
281 | };
282 | 9679D4642185859200F9AAFF /* Resources */ = {
283 | isa = PBXResourcesBuildPhase;
284 | buildActionMask = 2147483647;
285 | files = (
286 | 9679D4742185859300F9AAFF /* Assets.xcassets in Resources */,
287 | );
288 | runOnlyForDeploymentPostprocessing = 0;
289 | };
290 | /* End PBXResourcesBuildPhase section */
291 |
292 | /* Begin PBXSourcesBuildPhase section */
293 | 9679D4412185859000F9AAFF /* Sources */ = {
294 | isa = PBXSourcesBuildPhase;
295 | buildActionMask = 2147483647;
296 | files = (
297 | 9679D44B2185859000F9AAFF /* ViewController.swift in Sources */,
298 | 9679D4492185859000F9AAFF /* AppDelegate.swift in Sources */,
299 | );
300 | runOnlyForDeploymentPostprocessing = 0;
301 | };
302 | 9679D4622185859200F9AAFF /* Sources */ = {
303 | isa = PBXSourcesBuildPhase;
304 | buildActionMask = 2147483647;
305 | files = (
306 | 9679D4702185859200F9AAFF /* NotificationController.swift in Sources */,
307 | 9679D4722185859200F9AAFF /* ComplicationController.swift in Sources */,
308 | 9679D46E2185859200F9AAFF /* ExtensionDelegate.swift in Sources */,
309 | 9679D46C2185859200F9AAFF /* InterfaceController.swift in Sources */,
310 | );
311 | runOnlyForDeploymentPostprocessing = 0;
312 | };
313 | /* End PBXSourcesBuildPhase section */
314 |
315 | /* Begin PBXTargetDependency section */
316 | 9679D45A2185859100F9AAFF /* PBXTargetDependency */ = {
317 | isa = PBXTargetDependency;
318 | target = 9679D4562185859100F9AAFF /* Fire TV Remote WatchKit App */;
319 | targetProxy = 9679D4592185859100F9AAFF /* PBXContainerItemProxy */;
320 | };
321 | 9679D4692185859200F9AAFF /* PBXTargetDependency */ = {
322 | isa = PBXTargetDependency;
323 | target = 9679D4652185859200F9AAFF /* Fire TV Remote WatchKit Extension */;
324 | targetProxy = 9679D4682185859200F9AAFF /* PBXContainerItemProxy */;
325 | };
326 | /* End PBXTargetDependency section */
327 |
328 | /* Begin PBXVariantGroup section */
329 | 9679D44C2185859000F9AAFF /* Main.storyboard */ = {
330 | isa = PBXVariantGroup;
331 | children = (
332 | 9679D44D2185859000F9AAFF /* Base */,
333 | );
334 | name = Main.storyboard;
335 | sourceTree = "";
336 | };
337 | 9679D4512185859100F9AAFF /* LaunchScreen.storyboard */ = {
338 | isa = PBXVariantGroup;
339 | children = (
340 | 9679D4522185859100F9AAFF /* Base */,
341 | );
342 | name = LaunchScreen.storyboard;
343 | sourceTree = "";
344 | };
345 | 9679D45C2185859100F9AAFF /* Interface.storyboard */ = {
346 | isa = PBXVariantGroup;
347 | children = (
348 | 9679D45D2185859100F9AAFF /* Base */,
349 | );
350 | name = Interface.storyboard;
351 | sourceTree = "";
352 | };
353 | /* End PBXVariantGroup section */
354 |
355 | /* Begin XCBuildConfiguration section */
356 | 9679D4772185859300F9AAFF /* Debug */ = {
357 | isa = XCBuildConfiguration;
358 | buildSettings = {
359 | ALWAYS_SEARCH_USER_PATHS = NO;
360 | CLANG_ANALYZER_NONNULL = YES;
361 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
362 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
363 | CLANG_CXX_LIBRARY = "libc++";
364 | CLANG_ENABLE_MODULES = YES;
365 | CLANG_ENABLE_OBJC_ARC = YES;
366 | CLANG_ENABLE_OBJC_WEAK = YES;
367 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
368 | CLANG_WARN_BOOL_CONVERSION = YES;
369 | CLANG_WARN_COMMA = YES;
370 | CLANG_WARN_CONSTANT_CONVERSION = YES;
371 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
372 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
373 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
374 | CLANG_WARN_EMPTY_BODY = YES;
375 | CLANG_WARN_ENUM_CONVERSION = YES;
376 | CLANG_WARN_INFINITE_RECURSION = YES;
377 | CLANG_WARN_INT_CONVERSION = YES;
378 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
379 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
380 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
381 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
382 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
383 | CLANG_WARN_STRICT_PROTOTYPES = YES;
384 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
385 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
386 | CLANG_WARN_UNREACHABLE_CODE = YES;
387 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
388 | CODE_SIGN_IDENTITY = "iPhone Developer";
389 | COPY_PHASE_STRIP = NO;
390 | DEBUG_INFORMATION_FORMAT = dwarf;
391 | ENABLE_STRICT_OBJC_MSGSEND = YES;
392 | ENABLE_TESTABILITY = YES;
393 | GCC_C_LANGUAGE_STANDARD = gnu11;
394 | GCC_DYNAMIC_NO_PIC = NO;
395 | GCC_NO_COMMON_BLOCKS = YES;
396 | GCC_OPTIMIZATION_LEVEL = 0;
397 | GCC_PREPROCESSOR_DEFINITIONS = (
398 | "DEBUG=1",
399 | "$(inherited)",
400 | );
401 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
402 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
403 | GCC_WARN_UNDECLARED_SELECTOR = YES;
404 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
405 | GCC_WARN_UNUSED_FUNCTION = YES;
406 | GCC_WARN_UNUSED_VARIABLE = YES;
407 | IPHONEOS_DEPLOYMENT_TARGET = 11.4;
408 | MTL_ENABLE_DEBUG_INFO = YES;
409 | ONLY_ACTIVE_ARCH = YES;
410 | SDKROOT = iphoneos;
411 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
412 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
413 | };
414 | name = Debug;
415 | };
416 | 9679D4782185859300F9AAFF /* Release */ = {
417 | isa = XCBuildConfiguration;
418 | buildSettings = {
419 | ALWAYS_SEARCH_USER_PATHS = NO;
420 | CLANG_ANALYZER_NONNULL = YES;
421 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
422 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
423 | CLANG_CXX_LIBRARY = "libc++";
424 | CLANG_ENABLE_MODULES = YES;
425 | CLANG_ENABLE_OBJC_ARC = YES;
426 | CLANG_ENABLE_OBJC_WEAK = YES;
427 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
428 | CLANG_WARN_BOOL_CONVERSION = YES;
429 | CLANG_WARN_COMMA = YES;
430 | CLANG_WARN_CONSTANT_CONVERSION = YES;
431 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
432 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
433 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
434 | CLANG_WARN_EMPTY_BODY = YES;
435 | CLANG_WARN_ENUM_CONVERSION = YES;
436 | CLANG_WARN_INFINITE_RECURSION = YES;
437 | CLANG_WARN_INT_CONVERSION = YES;
438 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
439 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
440 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
441 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
442 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
443 | CLANG_WARN_STRICT_PROTOTYPES = YES;
444 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
445 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
446 | CLANG_WARN_UNREACHABLE_CODE = YES;
447 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
448 | CODE_SIGN_IDENTITY = "iPhone Developer";
449 | COPY_PHASE_STRIP = NO;
450 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
451 | ENABLE_NS_ASSERTIONS = NO;
452 | ENABLE_STRICT_OBJC_MSGSEND = YES;
453 | GCC_C_LANGUAGE_STANDARD = gnu11;
454 | GCC_NO_COMMON_BLOCKS = YES;
455 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
456 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
457 | GCC_WARN_UNDECLARED_SELECTOR = YES;
458 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
459 | GCC_WARN_UNUSED_FUNCTION = YES;
460 | GCC_WARN_UNUSED_VARIABLE = YES;
461 | IPHONEOS_DEPLOYMENT_TARGET = 11.4;
462 | MTL_ENABLE_DEBUG_INFO = NO;
463 | SDKROOT = iphoneos;
464 | SWIFT_COMPILATION_MODE = wholemodule;
465 | SWIFT_OPTIMIZATION_LEVEL = "-O";
466 | VALIDATE_PRODUCT = YES;
467 | };
468 | name = Release;
469 | };
470 | 9679D47A2185859300F9AAFF /* Debug */ = {
471 | isa = XCBuildConfiguration;
472 | buildSettings = {
473 | ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
474 | CODE_SIGN_STYLE = Automatic;
475 | DEVELOPMENT_TEAM = 75EGRT7282;
476 | INFOPLIST_FILE = "Fire TV Remote WatchKit Extension/Info.plist";
477 | LD_RUNPATH_SEARCH_PATHS = (
478 | "$(inherited)",
479 | "@executable_path/Frameworks",
480 | "@executable_path/../../Frameworks",
481 | );
482 | PRODUCT_BUNDLE_IDENTIFIER = "com.octalmage.Fire-TV-Remote.watchkitapp.watchkitextension";
483 | PRODUCT_NAME = "${TARGET_NAME}";
484 | SDKROOT = watchos;
485 | SKIP_INSTALL = YES;
486 | SWIFT_VERSION = 4.0;
487 | TARGETED_DEVICE_FAMILY = 4;
488 | WATCHOS_DEPLOYMENT_TARGET = 4.3;
489 | };
490 | name = Debug;
491 | };
492 | 9679D47B2185859300F9AAFF /* Release */ = {
493 | isa = XCBuildConfiguration;
494 | buildSettings = {
495 | ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
496 | CODE_SIGN_STYLE = Automatic;
497 | DEVELOPMENT_TEAM = 75EGRT7282;
498 | INFOPLIST_FILE = "Fire TV Remote WatchKit Extension/Info.plist";
499 | LD_RUNPATH_SEARCH_PATHS = (
500 | "$(inherited)",
501 | "@executable_path/Frameworks",
502 | "@executable_path/../../Frameworks",
503 | );
504 | PRODUCT_BUNDLE_IDENTIFIER = "com.octalmage.Fire-TV-Remote.watchkitapp.watchkitextension";
505 | PRODUCT_NAME = "${TARGET_NAME}";
506 | SDKROOT = watchos;
507 | SKIP_INSTALL = YES;
508 | SWIFT_VERSION = 4.0;
509 | TARGETED_DEVICE_FAMILY = 4;
510 | WATCHOS_DEPLOYMENT_TARGET = 4.3;
511 | };
512 | name = Release;
513 | };
514 | 9679D47E2185859300F9AAFF /* Debug */ = {
515 | isa = XCBuildConfiguration;
516 | buildSettings = {
517 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
518 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
519 | CODE_SIGN_STYLE = Automatic;
520 | DEVELOPMENT_TEAM = 75EGRT7282;
521 | IBSC_MODULE = Fire_TV_Remote_WatchKit_Extension;
522 | INFOPLIST_FILE = "Fire TV Remote WatchKit App/Info.plist";
523 | PRODUCT_BUNDLE_IDENTIFIER = "com.octalmage.Fire-TV-Remote.watchkitapp";
524 | PRODUCT_NAME = "$(TARGET_NAME)";
525 | SDKROOT = watchos;
526 | SKIP_INSTALL = YES;
527 | SWIFT_VERSION = 4.0;
528 | TARGETED_DEVICE_FAMILY = 4;
529 | WATCHOS_DEPLOYMENT_TARGET = 4.3;
530 | };
531 | name = Debug;
532 | };
533 | 9679D47F2185859300F9AAFF /* Release */ = {
534 | isa = XCBuildConfiguration;
535 | buildSettings = {
536 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
537 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
538 | CODE_SIGN_STYLE = Automatic;
539 | DEVELOPMENT_TEAM = 75EGRT7282;
540 | IBSC_MODULE = Fire_TV_Remote_WatchKit_Extension;
541 | INFOPLIST_FILE = "Fire TV Remote WatchKit App/Info.plist";
542 | PRODUCT_BUNDLE_IDENTIFIER = "com.octalmage.Fire-TV-Remote.watchkitapp";
543 | PRODUCT_NAME = "$(TARGET_NAME)";
544 | SDKROOT = watchos;
545 | SKIP_INSTALL = YES;
546 | SWIFT_VERSION = 4.0;
547 | TARGETED_DEVICE_FAMILY = 4;
548 | WATCHOS_DEPLOYMENT_TARGET = 4.3;
549 | };
550 | name = Release;
551 | };
552 | 9679D4822185859300F9AAFF /* Debug */ = {
553 | isa = XCBuildConfiguration;
554 | buildSettings = {
555 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
556 | CODE_SIGN_STYLE = Automatic;
557 | DEVELOPMENT_TEAM = 75EGRT7282;
558 | INFOPLIST_FILE = "Fire TV Remote/Info.plist";
559 | LD_RUNPATH_SEARCH_PATHS = (
560 | "$(inherited)",
561 | "@executable_path/Frameworks",
562 | );
563 | PRODUCT_BUNDLE_IDENTIFIER = "com.octalmage.Fire-TV-Remote";
564 | PRODUCT_NAME = "$(TARGET_NAME)";
565 | SWIFT_VERSION = 4.0;
566 | TARGETED_DEVICE_FAMILY = "1,2";
567 | };
568 | name = Debug;
569 | };
570 | 9679D4832185859300F9AAFF /* Release */ = {
571 | isa = XCBuildConfiguration;
572 | buildSettings = {
573 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
574 | CODE_SIGN_STYLE = Automatic;
575 | DEVELOPMENT_TEAM = 75EGRT7282;
576 | INFOPLIST_FILE = "Fire TV Remote/Info.plist";
577 | LD_RUNPATH_SEARCH_PATHS = (
578 | "$(inherited)",
579 | "@executable_path/Frameworks",
580 | );
581 | PRODUCT_BUNDLE_IDENTIFIER = "com.octalmage.Fire-TV-Remote";
582 | PRODUCT_NAME = "$(TARGET_NAME)";
583 | SWIFT_VERSION = 4.0;
584 | TARGETED_DEVICE_FAMILY = "1,2";
585 | };
586 | name = Release;
587 | };
588 | /* End XCBuildConfiguration section */
589 |
590 | /* Begin XCConfigurationList section */
591 | 9679D4402185859000F9AAFF /* Build configuration list for PBXProject "Fire TV Remote" */ = {
592 | isa = XCConfigurationList;
593 | buildConfigurations = (
594 | 9679D4772185859300F9AAFF /* Debug */,
595 | 9679D4782185859300F9AAFF /* Release */,
596 | );
597 | defaultConfigurationIsVisible = 0;
598 | defaultConfigurationName = Release;
599 | };
600 | 9679D4792185859300F9AAFF /* Build configuration list for PBXNativeTarget "Fire TV Remote WatchKit Extension" */ = {
601 | isa = XCConfigurationList;
602 | buildConfigurations = (
603 | 9679D47A2185859300F9AAFF /* Debug */,
604 | 9679D47B2185859300F9AAFF /* Release */,
605 | );
606 | defaultConfigurationIsVisible = 0;
607 | defaultConfigurationName = Release;
608 | };
609 | 9679D47D2185859300F9AAFF /* Build configuration list for PBXNativeTarget "Fire TV Remote WatchKit App" */ = {
610 | isa = XCConfigurationList;
611 | buildConfigurations = (
612 | 9679D47E2185859300F9AAFF /* Debug */,
613 | 9679D47F2185859300F9AAFF /* Release */,
614 | );
615 | defaultConfigurationIsVisible = 0;
616 | defaultConfigurationName = Release;
617 | };
618 | 9679D4812185859300F9AAFF /* Build configuration list for PBXNativeTarget "Fire TV Remote" */ = {
619 | isa = XCConfigurationList;
620 | buildConfigurations = (
621 | 9679D4822185859300F9AAFF /* Debug */,
622 | 9679D4832185859300F9AAFF /* Release */,
623 | );
624 | defaultConfigurationIsVisible = 0;
625 | defaultConfigurationName = Release;
626 | };
627 | /* End XCConfigurationList section */
628 | };
629 | rootObject = 9679D43D2185859000F9AAFF /* Project object */;
630 | }
631 |
--------------------------------------------------------------------------------