├── 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 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 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 | --------------------------------------------------------------------------------