diff --git a/Universal Presenter Remote/MMWormhole/MMWormhole.h b/Universal Presenter Remote/MMWormhole/MMWormhole.h new file mode 100755 index 0000000..c497f84 --- /dev/null +++ b/Universal Presenter Remote/MMWormhole/MMWormhole.h @@ -0,0 +1,143 @@ +// +// MMWormhole.h +// +// Copyright (c) 2014 Mutual Mobile (http://www.mutualmobile.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +/** + This class creates a wormhole between a containing iOS application and an extension. The wormhole + is meant to be used to pass data or commands back and forth between the two locations. The effect + closely resembles interprocess communication between the app and the extension, though this is not + really the case. The wormhole does have some disadvantages, including the fact that a contract must + be determined in advance between the app and the extension that defines the interchange format. + + A good way to think of the wormhole is a collection of shared mailboxes. An identifier is + essentially a unique mailbox you can send messages to. You know where a message will be delivered + to because of the identifier you associate with it, but not necessarily when the message will be + picked up by the recipient. If the app or extension are in the background, they may not receive the + message immediately. By convention, sending messages should be done from one side to another, not + necessarily from yourself to yourself. It's also a good practice to check the contents of your + mailbox when your app or extension wakes up, in case any messages have been left there while you + were away. + + Passing a message to the wormhole can be inferred as a data transfer package or as a command. In + both cases, the passed message is archived using NSKeyedArchiver to a .archive file named with the + included identifier. Once passed, the contents of the written .archive file can be queried using + the messageWithIdentifier: method. As a command, the simple existence of the message in the shared + app group should be taken as proof of the command's invocation. The contents of the message then + become parameters to be evaluated along with the command. Of course, to avoid confusion later, it + may be best to clear the contents of the message after recognizing the command. The + -clearMessageContentsForIdentifier: method is provided for this purpose. + + A good wormhole includes wormhole aliens who listen for message changes. This class supports + CFNotificationCenter Darwin Notifications, which act as a bridge between the containing app and the + extension. When a message is passed with an identifier, a notification is fired to the Darwin + Notification Center with the given identifier. If you have indicated your interest in the message + by using the -listenForMessageWithIdentifier:completion: method then your completion block will be + called when this notification is received, and the contents of the message will be unarchived and + passed as an object to the completion block. + + It's worth noting that as a best practice to avoid confusing issues or deadlock that messages + should be passed one way only for a given identifier. The containing app should pass messages to + one set of identifiers, which are only ever read or listened for by the extension, and vic versa. + The extension should not then write messages back to the same identifier. Instead, the extension + should use it's own set of identifiers to associate with it's messages back to the application. + Passing messages to the same identifier from two locations should be done only at your own risk. + */ +@interface MMWormhole : NSObject + +/** + Designated Initializer. This method must be called with an application group identifier that will + be used to contain passed messages. It is also recommended that you include a directory name for + messages to be read and written, but this parameter is optional. + + @param identifier An application group identifier + @param directory An optional directory to read/write messages + */ + +- (instancetype)initWithApplicationGroupIdentifier:(NSString *)identifier + optionalDirectory:(NSString *)directory NS_DESIGNATED_INITIALIZER; + +/** + This method passes a message object associated with a given identifier. This is the primary means + of passing information through the wormhole. + + @warning You should avoid situations where you need to pass messages to the same identifier in + rapid succession. If a message's contents will be changing rapidly then consider modifying your + workflow to write bulk changes without listening on the other side of the wormhole, and then add a + listener for a "finished changing" message to let the other side know it's safe to read the + contents of your message. + + @param messageobject The message object to be passed + @param identifier The identifier for the message + */ +- (void)passMessageObject:(id )messageObject + identifier:(NSString *)identifier; + +/** + This method returns the value of a message with a specific identifier as an object. + + @param identifier The identifier for the message + */ +- (id)messageWithIdentifier:(NSString *)identifier; + +/** + This method clears the contents of a specific message with a given identifier. + + @param identifier The identifier for the message + */ +- (void)clearMessageContentsForIdentifier:(NSString *)identifier; + +/** + This method clears the contents of your optional message directory to give you a clean state. + + @warning This method will delete all messages passed to your message directory. Use with care. + */ +- (void)clearAllMessageContents; + +/** + This method begins listening for notifications of changes to a message with a specific identifier. + If notifications are observed then the given listener block will be called along with the actual + message object. + + @discussion This class only supports one listener per message identifier, so calling this method + repeatedly for the same identifier will update the listener block that will be called when a + message is heard. + + @param identifier The identifier for the message + @param listener A listener block called with the messageObject parameter when a notification + is observed. + */ +- (void)listenForMessageWithIdentifier:(NSString *)identifier + listener:(void (^)(id messageObject))listener; + +/** + This method stops listening for change notifications for a given message identifier. + + NOTE: This method is NOT required to be called. If the wormhole is deallocated then all listeners + will go away as well. + + @param identifier The identifier for the message + */ +- (void)stopListeningForMessageWithIdentifier:(NSString *)identifier; + +@end diff --git a/Universal Presenter Remote/MMWormhole/MMWormhole.m b/Universal Presenter Remote/MMWormhole/MMWormhole.m new file mode 100755 index 0000000..292b952 --- /dev/null +++ b/Universal Presenter Remote/MMWormhole/MMWormhole.m @@ -0,0 +1,265 @@ +// +// MMWormhole.m +// +// Copyright (c) 2014 Mutual Mobile (http://www.mutualmobile.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "MMWormhole.h" + +#if !__has_feature(objc_arc) +#error This class requires automatic reference counting +#endif + +#include + +static NSString * const MMWormholeNotificationName = @"MMWormholeNotificationName"; + +@interface MMWormhole () + +@property (nonatomic, copy) NSString *applicationGroupIdentifier; +@property (nonatomic, copy) NSString *directory; +@property (nonatomic, strong) NSFileManager *fileManager; +@property (nonatomic, strong) NSMutableDictionary *listenerBlocks; + +@end + +@implementation MMWormhole + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-designated-initializers" + +- (id)init { + return nil; +} + +#pragma clang diagnostic pop + +- (instancetype)initWithApplicationGroupIdentifier:(NSString *)identifier + optionalDirectory:(NSString *)directory { + if ((self = [super init])) { + + if (NO == [[NSFileManager defaultManager] respondsToSelector:@selector(containerURLForSecurityApplicationGroupIdentifier:)]) { + //Protect the user of a crash because of iOSVersion < iOS7 + return nil; + } + + _applicationGroupIdentifier = [identifier copy]; + _directory = [directory copy]; + _fileManager = [[NSFileManager alloc] init]; + _listenerBlocks = [NSMutableDictionary dictionary]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didReceiveMessageNotification:) + name:MMWormholeNotificationName + object:nil]; + } + + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + CFNotificationCenterRef const center = CFNotificationCenterGetDarwinNotifyCenter(); + CFNotificationCenterRemoveEveryObserver(center, (__bridge const void *)(self)); +} + + +#pragma mark - Private File Operation Methods + +- (NSString *)messagePassingDirectoryPath { + NSURL *appGroupContainer = [self.fileManager containerURLForSecurityApplicationGroupIdentifier:self.applicationGroupIdentifier]; + NSString *appGroupContainerPath = [appGroupContainer path]; + NSString *directoryPath = appGroupContainerPath; + + if (self.directory != nil) { + directoryPath = [appGroupContainerPath stringByAppendingPathComponent:self.directory]; + } + + [self.fileManager createDirectoryAtPath:directoryPath + withIntermediateDirectories:YES + attributes:nil + error:NULL]; + + return directoryPath; +} + +- (NSString *)filePathForIdentifier:(NSString *)identifier { + if (identifier == nil || identifier.length == 0) { + return nil; + } + + NSString *directoryPath = [self messagePassingDirectoryPath]; + NSString *fileName = [NSString stringWithFormat:@"%@.archive", identifier]; + NSString *filePath = [directoryPath stringByAppendingPathComponent:fileName]; + + return filePath; +} + +- (void)writeMessageObject:(id)messageObject toFileWithIdentifier:(NSString *)identifier { + if (identifier == nil) { + return; + } + + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:messageObject]; + NSString *filePath = [self filePathForIdentifier:identifier]; + + if (data == nil || filePath == nil) { + return; + } + + BOOL success = [data writeToFile:filePath atomically:YES]; + + if (success) { + [self sendNotificationForMessageWithIdentifier:identifier]; + } +} + +- (id)messageObjectFromFileWithIdentifier:(NSString *)identifier { + if (identifier == nil) { + return nil; + } + + NSData *data = [NSData dataWithContentsOfFile:[self filePathForIdentifier:identifier]]; + + if (data == nil) { + return nil; + } + + id messageObject = [NSKeyedUnarchiver unarchiveObjectWithData:data]; + + return messageObject; +} + +- (void)deleteFileForIdentifier:(NSString *)identifier { + [self.fileManager removeItemAtPath:[self filePathForIdentifier:identifier] error:NULL]; +} + + +#pragma mark - Private Notification Methods + +- (void)sendNotificationForMessageWithIdentifier:(NSString *)identifier { + CFNotificationCenterRef const center = CFNotificationCenterGetDarwinNotifyCenter(); + CFDictionaryRef const userInfo = NULL; + BOOL const deliverImmediately = YES; + CFStringRef str = (__bridge CFStringRef)identifier; + CFNotificationCenterPostNotification(center, str, NULL, userInfo, deliverImmediately); +} + +- (void)registerForNotificationsWithIdentifier:(NSString *)identifier { + CFNotificationCenterRef const center = CFNotificationCenterGetDarwinNotifyCenter(); + CFStringRef str = (__bridge CFStringRef)identifier; + CFNotificationCenterAddObserver(center, + (__bridge const void *)(self), + wormholeNotificationCallback, + str, + NULL, + CFNotificationSuspensionBehaviorDeliverImmediately); +} + +- (void)unregisterForNotificationsWithIdentifier:(NSString *)identifier { + CFNotificationCenterRef const center = CFNotificationCenterGetDarwinNotifyCenter(); + CFStringRef str = (__bridge CFStringRef)identifier; + CFNotificationCenterRemoveObserver(center, + (__bridge const void *)(self), + str, + NULL); +} + +void wormholeNotificationCallback(CFNotificationCenterRef center, + void * observer, + CFStringRef name, + void const * object, + CFDictionaryRef userInfo) { + NSString *identifier = (__bridge NSString *)name; + [[NSNotificationCenter defaultCenter] postNotificationName:MMWormholeNotificationName + object:nil + userInfo:@{@"identifier" : identifier}]; +} + +- (void)didReceiveMessageNotification:(NSNotification *)notification { + typedef void (^MessageListenerBlock)(id messageObject); + + NSDictionary *userInfo = notification.userInfo; + NSString *identifier = [userInfo valueForKey:@"identifier"]; + + if (identifier != nil) { + MessageListenerBlock listenerBlock = [self listenerBlockForIdentifier:identifier]; + + if (listenerBlock) { + id messageObject = [self messageObjectFromFileWithIdentifier:identifier]; + + listenerBlock(messageObject); + } + } +} + +- (id)listenerBlockForIdentifier:(NSString *)identifier { + return [self.listenerBlocks valueForKey:identifier]; +} + + +#pragma mark - Public Interface Methods + +- (void)passMessageObject:(id )messageObject identifier:(NSString *)identifier { + [self writeMessageObject:messageObject toFileWithIdentifier:identifier]; +} + + +- (id)messageWithIdentifier:(NSString *)identifier { + id messageObject = [self messageObjectFromFileWithIdentifier:identifier]; + + return messageObject; +} + +- (void)clearMessageContentsForIdentifier:(NSString *)identifier { + [self deleteFileForIdentifier:identifier]; +} + +- (void)clearAllMessageContents { + if (self.directory != nil) { + NSArray *messageFiles = [self.fileManager contentsOfDirectoryAtPath:[self messagePassingDirectoryPath] error:NULL]; + + NSString *directoryPath = [self messagePassingDirectoryPath]; + + for (NSString *path in messageFiles) { + NSString *filePath = [directoryPath stringByAppendingPathComponent:path]; + + [self.fileManager removeItemAtPath:filePath error:NULL]; + } + } +} + +- (void)listenForMessageWithIdentifier:(NSString *)identifier + listener:(void (^)(id messageObject))listener { + if (identifier != nil) { + [self.listenerBlocks setValue:listener forKey:identifier]; + [self registerForNotificationsWithIdentifier:identifier]; + } +} + +- (void)stopListeningForMessageWithIdentifier:(NSString *)identifier { + if (identifier != nil) { + [self.listenerBlocks setValue:nil forKey:identifier]; + [self unregisterForNotificationsWithIdentifier:identifier]; + } +} + +@end diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Base.lproj/Interface.storyboard b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Base.lproj/Interface.storyboard new file mode 100644 index 0000000..0bdc8ba --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Base.lproj/Interface.storyboard @@ -0,0 +1,151 @@ + + + + + + + + + BatmanForeverAlternate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/172x172.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/172x172.png new file mode 100644 index 0000000..0655d55 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/172x172.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/196x196.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/196x196.png new file mode 100644 index 0000000..1c09818 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/196x196.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/29x29@2x.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/29x29@2x.png new file mode 100644 index 0000000..61025cc Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/29x29@2x.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/29x29@3x.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/29x29@3x.png new file mode 100644 index 0000000..2d8cc97 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/29x29@3x.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/48x48.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/48x48.png new file mode 100644 index 0000000..518c6e6 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/48x48.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/55x55.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/55x55.png new file mode 100644 index 0000000..2b87741 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/55x55.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/80x80.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/80x80.png new file mode 100644 index 0000000..68eade5 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/80x80.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/88x88.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/88x88.png new file mode 100644 index 0000000..2fcac11 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/88x88.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/Contents.json b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..10f6fbc --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,70 @@ +{ + "images" : [ + { + "size" : "24x24", + "idiom" : "watch", + "scale" : "2x", + "filename" : "48x48.png", + "role" : "notificationCenter", + "subtype" : "38mm" + }, + { + "size" : "27.5x27.5", + "idiom" : "watch", + "scale" : "2x", + "filename" : "55x55.png", + "role" : "notificationCenter", + "subtype" : "42mm" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "29x29@2x.png", + "role" : "companionSettings", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "29x29@3x.png", + "role" : "companionSettings", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "watch", + "scale" : "2x", + "filename" : "80x80.png", + "role" : "appLauncher", + "subtype" : "38mm" + }, + { + "size" : "44x44", + "idiom" : "watch", + "scale" : "2x", + "filename" : "88x88.png", + "role" : "longLook", + "subtype" : "42mm" + }, + { + "size" : "86x86", + "idiom" : "watch", + "scale" : "2x", + "filename" : "172x172.png", + "role" : "quickLook", + "subtype" : "38mm" + }, + { + "size" : "98x98", + "idiom" : "watch", + "scale" : "2x", + "filename" : "196x196.png", + "role" : "quickLook", + "subtype" : "42mm" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Color Block.imageset/Color Block.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Color Block.imageset/Color Block.png new file mode 100644 index 0000000..9004523 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Color Block.imageset/Color Block.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Color Block.imageset/Contents.json b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Color Block.imageset/Contents.json new file mode 100644 index 0000000..64a64bd --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Color Block.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "Color Block.png" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Gradient.imageset/Contents.json b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Gradient.imageset/Contents.json new file mode 100644 index 0000000..e056c46 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Gradient.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "Gradient.png" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Gradient.imageset/Gradient.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Gradient.imageset/Gradient.png new file mode 100644 index 0000000..bcf17b7 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Gradient.imageset/Gradient.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/Contents.json b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/Contents.json new file mode 100644 index 0000000..09092bb --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "glyphicons-194-circle-ok.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "glyphicons-194-circle-ok@2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "glyphicons-194-circle-ok@3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/glyphicons-194-circle-ok.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/glyphicons-194-circle-ok.png new file mode 100644 index 0000000..fd6a6fb Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/glyphicons-194-circle-ok.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/glyphicons-194-circle-ok@2x.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/glyphicons-194-circle-ok@2x.png new file mode 100644 index 0000000..4ac714f Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/glyphicons-194-circle-ok@2x.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/glyphicons-194-circle-ok@3x.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/glyphicons-194-circle-ok@3x.png new file mode 100644 index 0000000..29a871e Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/Ok.imageset/glyphicons-194-circle-ok@3x.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/WatchLogo.imageset/196x196.png b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/WatchLogo.imageset/196x196.png new file mode 100644 index 0000000..39afcf3 Binary files /dev/null and b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/WatchLogo.imageset/196x196.png differ diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/WatchLogo.imageset/Contents.json b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/WatchLogo.imageset/Contents.json new file mode 100644 index 0000000..c7af789 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Images.xcassets/WatchLogo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "196x196.png" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Info.plist b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Info.plist new file mode 100644 index 0000000..4f76e5a --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit App/Info.plist @@ -0,0 +1,35 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + UPR: Remote + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.dbztech.Universal-Presenter-Remote.watchkitapp + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 3.0 + CFBundleSignature + ???? + CFBundleVersion + 9 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + com.dbztech.Universal-Presenter-Remote + WKWatchKitApp + + + diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKControlView.h b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKControlView.h new file mode 100644 index 0000000..120766f --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKControlView.h @@ -0,0 +1,19 @@ +// +// DBZ_WKControlView.h +// Universal Presenter Remote +// +// Created by Brendan Boyle on 3/15/15. +// Copyright (c) 2015 DBZ Technology. All rights reserved. +// + +#import +#import +#import "MMWormhole.h" + +@interface DBZ_WKControlView : WKInterfaceController + +@property (nonatomic, strong) MMWormhole *wormhole; + + + +@end diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKControlView.m b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKControlView.m new file mode 100644 index 0000000..1d87a9b --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKControlView.m @@ -0,0 +1,125 @@ +// +// DBZ_WKControlView.m +// Universal Presenter Remote +// +// Created by Brendan Boyle on 3/15/15. +// Copyright (c) 2015 DBZ Technology. All rights reserved. +// + +#import "DBZ_WKControlView.h" +#import "MMWormhole.h" +#import "DBZ_ServerCommunication.h" + +@interface DBZ_WKControlView() + +@end + + +@implementation DBZ_WKControlView + +- (void)awakeWithContext:(id)context { + [super awakeWithContext:context]; + + // Configure interface objects here. +} + +- (void)willActivate { + // This method is called when watch view controller is about to be visible to user + [super willActivate]; + + self.wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:@"group.com.dbztech.Universal-Presenter-Remote.wormhole" optionalDirectory:@"wormhole"]; + + NSDictionary *requst = @{@"request":@"ConnectSession"}; + + [DBZ_WKControlView openParentApplication:requst reply:^(NSDictionary *replyInfo, NSError *error) { + + if (error) { + NSLog(@"%@", error); + } else { + + NSLog(@"%@",[replyInfo objectForKey:@"response"]); + } + + }]; + + // Become a listener for changes to the wormhole for the button message + [self.wormhole listenForMessageWithIdentifier:@"UPRWatchAction" listener:^(id messageObject) { + // The number is identified with the buttonNumber key in the message object + NSString *action = [messageObject valueForKey:@"action"]; + if ([action isEqual: @"EndSession"]) { + [self popToRootController]; + } + }]; + + +} + +- (void)didDeactivate { + // This method is called when watch view controller is no longer visible + [super didDeactivate]; + + NSDictionary *requst = @{@"request":@"EndSession"}; + + [DBZ_WKControlView openParentApplication:requst reply:^(NSDictionary *replyInfo, NSError *error) { + + if (error) { + NSLog(@"%@", error); + } else { + + NSLog(@"%@",[replyInfo objectForKey:@"response"]); + } + + }]; +} + +- (IBAction)mediaPressed { + //[self.wormhole passMessageObject:@{@"token" : @(3)} identifier:@"UPRWatchAction"]; + NSDictionary *requst = @{@"request":@"ChangeSlideMedia"}; + + [DBZ_WKControlView openParentApplication:requst reply:^(NSDictionary *replyInfo, NSError *error) { + + if (error) { + NSLog(@"%@", error); + } else { + + NSLog(@"%@",[replyInfo objectForKey:@"response"]); + } + + }]; +} + +- (IBAction)nextPressed { + NSDictionary *requst = @{@"request":@"ChangeSlideUp"}; + + [DBZ_WKControlView openParentApplication:requst reply:^(NSDictionary *replyInfo, NSError *error) { + + if (error) { + NSLog(@"%@", error); + } else { + + NSLog(@"%@",[replyInfo objectForKey:@"response"]); + } + + }]; + +} + +- (IBAction)previousPressed { + NSDictionary *requst = @{@"request":@"ChangeSlideDown"}; + + [DBZ_WKControlView openParentApplication:requst reply:^(NSDictionary *replyInfo, NSError *error) { + + if (error) { + NSLog(@"%@", error); + } else { + + NSLog(@"%@",[replyInfo objectForKey:@"response"]); + } + + }]; +} + +@end + + + diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKLoginView.h b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKLoginView.h new file mode 100644 index 0000000..503f27c --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKLoginView.h @@ -0,0 +1,22 @@ +// +// DBZ_WKLoginView.h +// Universal Presenter Remote +// +// Created by Brendan Boyle on 3/15/15. +// Copyright (c) 2015 DBZ Technology. All rights reserved. +// + +#import +#import +#import "MMWormhole.h" + +@interface DBZ_WKLoginView : WKInterfaceController + +@property (nonatomic, strong) MMWormhole *wormhole; + +@property (strong, nonatomic) IBOutlet WKInterfaceLabel *tokenLabel; +@property (strong, nonatomic) IBOutlet WKInterfaceButton *connectButton; +- (IBAction)refreshToken; +- (IBAction)openInstructions; + +@end diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKLoginView.m b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKLoginView.m new file mode 100644 index 0000000..c157049 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/DBZ_WKLoginView.m @@ -0,0 +1,95 @@ +// +// DBZ_WKLoginView.m +// Universal Presenter Remote +// +// Created by Brendan Boyle on 3/15/15. +// Copyright (c) 2015 DBZ Technology. All rights reserved. +// + +#import "DBZ_WKLoginView.h" +#import "MMWormhole.h" + + +@interface DBZ_WKLoginView() + +@end + + +@implementation DBZ_WKLoginView + +- (void)awakeWithContext:(id)context { + [super awakeWithContext:context]; + + // Configure interface objects here. +} + +- (void)willActivate { + // This method is called when watch view controller is about to be visible to user + [super willActivate]; + + self.wormhole = [[MMWormhole alloc] initWithApplicationGroupIdentifier:@"group.com.dbztech.Universal-Presenter-Remote.wormhole" optionalDirectory:@"wormhole"]; + + NSDictionary *requst = @{@"request":@"Startup"}; + + [DBZ_WKLoginView openParentApplication:requst reply:^(NSDictionary *replyInfo, NSError *error) { + + if (error) { + NSLog(@"%@", error); + } else { + + NSLog(@"%@",[replyInfo objectForKey:@"response"]); + } + + }]; + + // Become a listener for changes to the wormhole for the button message + [self.wormhole listenForMessageWithIdentifier:@"UPRWatchData" listener:^(id messageObject) { + // The number is identified with the buttonNumber key in the message object + NSNumber *number = [messageObject valueForKey:@"token"]; + NSNumber *enabled = [messageObject valueForKey:@"connectEnabled"]; + NSString *title = [messageObject valueForKey:@"connectTitle"]; + if (![[number stringValue] isEqualToString:@"0"]) { + _tokenLabel.text = [number stringValue]; + } else { + _tokenLabel.text = @"..."; + } + + [_connectButton setTitle:title]; + if ([enabled isEqualToNumber:@(1)]) { + [_connectButton setEnabled:YES]; + } else { + [_connectButton setEnabled:NO]; + } + }]; +} + +- (void)didDeactivate { + // This method is called when watch view controller is no longer visible + [super didDeactivate]; +} + + + +- (IBAction)refreshToken { + NSDictionary *requst = @{@"request":@"Refresh"}; + + [DBZ_WKLoginView openParentApplication:requst reply:^(NSDictionary *replyInfo, NSError *error) { + + if (error) { + NSLog(@"%@", error); + } else { + + NSLog(@"%@",[replyInfo objectForKey:@"response"]); + } + + }]; +} + +- (IBAction)openInstructions { + NSLog(@"Open Instructions"); + [self presentControllerWithName:@"Instructions" context: nil]; +} +@end + + + diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/Images.xcassets/README__ignoredByTemplate__ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/Images.xcassets/README__ignoredByTemplate__ new file mode 100644 index 0000000..b601d38 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/Images.xcassets/README__ignoredByTemplate__ @@ -0,0 +1 @@ +Did you know that git does not support storing empty directories? diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/Info.plist b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/Info.plist new file mode 100644 index 0000000..ac67215 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/Info.plist @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Universal Presenter Remote WatchKit Extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.dbztech.Universal-Presenter-Remote.watchkitextension + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 3.0 + CFBundleSignature + ???? + CFBundleVersion + 9 + NSExtension + + NSExtensionAttributes + + WKAppBundleIdentifier + com.dbztech.Universal-Presenter-Remote.watchkitapp + + NSExtensionPointIdentifier + com.apple.watchkit + + RemoteInterfacePrincipalClass + $(PRODUCT_MODULE_NAME).InterfaceController + + diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/NotificationController.swift b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/NotificationController.swift new file mode 100644 index 0000000..c88428d --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/NotificationController.swift @@ -0,0 +1,53 @@ +// +// NotificationController.swift +// Universal Presenter Remote WatchKit Extension +// +// Created by Brendan Boyle on 3/12/15. +// Copyright (c) 2015 DBZ Technology. All rights reserved. +// + +import WatchKit +import Foundation + + +class NotificationController: WKUserNotificationInterfaceController { + + override init() { + // Initialize variables here. + super.init() + + // Configure interface objects here. + } + + override func willActivate() { + // This method is called when watch view controller is about to be visible to user + super.willActivate() + } + + override func didDeactivate() { + // This method is called when watch view controller is no longer visible + super.didDeactivate() + } + + /* + override func didReceiveLocalNotification(localNotification: UILocalNotification, withCompletion completionHandler: ((WKUserNotificationInterfaceType) -> Void)) { + // This method is called when a local notification needs to be presented. + // Implement it if you use a dynamic notification interface. + // Populate your dynamic notification interface as quickly as possible. + // + // After populating your dynamic notification interface call the completion block. + completionHandler(.Custom) + } + */ + + /* + override func didReceiveRemoteNotification(remoteNotification: [NSObject : AnyObject], withCompletion completionHandler: ((WKUserNotificationInterfaceType) -> Void)) { + // This method is called when a remote notification needs to be presented. + // Implement it if you use a dynamic notification interface. + // Populate your dynamic notification interface as quickly as possible. + // + // After populating your dynamic notification interface call the completion block. + completionHandler(.Custom) + } + */ +} diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/PushNotificationPayload.apns b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/PushNotificationPayload.apns new file mode 100644 index 0000000..1f1855b --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/PushNotificationPayload.apns @@ -0,0 +1,8 @@ +{ + "aps": { + "alert": { + "body": "Ready to Present session 1234!" + }, + "category": "presentationReady" + } +} diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/PushNotificationPayloadOld.apns b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/PushNotificationPayloadOld.apns new file mode 100644 index 0000000..54563fd --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/PushNotificationPayloadOld.apns @@ -0,0 +1,16 @@ +{ + "aps": { + "alert": { + "body": "Session 123456 is ready to present", + "title": "Optional title" + }, + "category": "presentationReady" + }, + + "WatchKit Simulator Actions": [ + { + "title": "Begin Presenting", + "identifier": "beginPresenting" + } + ] +} diff --git a/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/Universal Presenter Remote WatchKit Extension.entitlements b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/Universal Presenter Remote WatchKit Extension.entitlements new file mode 100644 index 0000000..5767e10 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote WatchKit Extension/Universal Presenter Remote WatchKit Extension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.dbztech.Universal-Presenter-Remote.wormhole + + + diff --git a/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/project.pbxproj b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/project.pbxproj index 2f617c1..526a56b 100644 --- a/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/project.pbxproj +++ b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/project.pbxproj @@ -7,15 +7,28 @@ objects = { /* Begin PBXBuildFile section */ + B3063AEB1AB655E500285BE4 /* DBZ_WKLoginView.m in Sources */ = {isa = PBXBuildFile; fileRef = B3063AEA1AB655E500285BE4 /* DBZ_WKLoginView.m */; }; + B3063AEE1AB6560300285BE4 /* DBZ_WKControlView.m in Sources */ = {isa = PBXBuildFile; fileRef = B3063AED1AB6560300285BE4 /* DBZ_WKControlView.m */; }; B318D1531A097829002F59AB /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B318D1521A097829002F59AB /* AdSupport.framework */; }; B3257AC319B41E8D00CC471C /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3257AC219B41E8D00CC471C /* CoreData.framework */; }; B3257AC519B41E9B00CC471C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3257AC419B41E9B00CC471C /* SystemConfiguration.framework */; }; B3257ACA19B423CC00CC471C /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = B3257AC619B41EA700CC471C /* libz.dylib */; }; + B32B67131AB7950D00D2C728 /* Unified.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B32B67151AB7950D00D2C728 /* Unified.storyboard */; }; B34E227119AD41290001127D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ED70D5FB18FF17E0007B4C18 /* Images.xcassets */; }; B34E227319AD5B4F0001127D /* Batman.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B34E227219AD5B4F0001127D /* Batman.ttf */; }; B357A5DD190453D500CCECB6 /* DBZ_InfoView.m in Sources */ = {isa = PBXBuildFile; fileRef = B357A5DC190453D500CCECB6 /* DBZ_InfoView.m */; }; + B362B6131AC5E25C00F2BBAE /* Batman.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B34E227219AD5B4F0001127D /* Batman.ttf */; }; + B362B6141AC5E26700F2BBAE /* Batman.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B34E227219AD5B4F0001127D /* Batman.ttf */; }; + B36A1DE31AB7672B00A6A956 /* PushNotificationPayloadOld.apns in Resources */ = {isa = PBXBuildFile; fileRef = B36A1DE21AB7672B00A6A956 /* PushNotificationPayloadOld.apns */; }; B3A99A2A19D203E9002BBBA5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B3A99A2919D203E9002BBBA5 /* LaunchScreen.storyboard */; }; - B3BD750619C2635D0095C461 /* Unified.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B3BD750519C2635D0095C461 /* Unified.storyboard */; }; + B3C820E71AB627E000CD3438 /* MMWormhole.m in Sources */ = {isa = PBXBuildFile; fileRef = B3C820E61AB627E000CD3438 /* MMWormhole.m */; }; + B3C820E81AB627E000CD3438 /* MMWormhole.m in Sources */ = {isa = PBXBuildFile; fileRef = B3C820E61AB627E000CD3438 /* MMWormhole.m */; }; + B3C968BB1AB20B44000819E0 /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C968BA1AB20B44000819E0 /* NotificationController.swift */; }; + B3C968BD1AB20B44000819E0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B3C968BC1AB20B44000819E0 /* Images.xcassets */; }; + B3C968C11AB20B44000819E0 /* Universal Presenter Remote WatchKit App.app in Resources */ = {isa = PBXBuildFile; fileRef = B3C968C01AB20B44000819E0 /* Universal Presenter Remote WatchKit App.app */; }; + B3C968C91AB20B44000819E0 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B3C968C71AB20B44000819E0 /* Interface.storyboard */; }; + B3C968CB1AB20B44000819E0 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B3C968CA1AB20B44000819E0 /* Images.xcassets */; }; + B3C968CE1AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = B3C968B31AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; B3CBFA5019B80AD100FF6837 /* DBZ_SettingsView.m in Sources */ = {isa = PBXBuildFile; fileRef = B3CBFA4F19B80AD100FF6837 /* DBZ_SettingsView.m */; }; B3E35D181A094B1D0099DCD4 /* DBZ_QRVeiw.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3E35D171A094B1D0099DCD4 /* DBZ_QRVeiw.swift */; }; B3E35D1B1A094D530099DCD4 /* igViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3E35D1A1A094D530099DCD4 /* igViewController.m */; }; @@ -41,6 +54,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + B3C968C21AB20B44000819E0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = ED70D5DE18FF17E0007B4C18 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B3C968BF1AB20B44000819E0; + remoteInfo = "Universal Presenter Remote WatchKit App"; + }; + B3C968CC1AB20B44000819E0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = ED70D5DE18FF17E0007B4C18 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B3C968B21AB20B44000819E0; + remoteInfo = "Universal Presenter Remote WatchKit Extension"; + }; ED70D60618FF17E1007B4C18 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = ED70D5DE18FF17E0007B4C18 /* Project object */; @@ -50,18 +77,50 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + B3C968D51AB20B44000819E0 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + B3C968CE1AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ + B3063AE81AB635B100285BE4 /* Universal Presenter Remote WatchKit Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "Universal Presenter Remote WatchKit Extension.entitlements"; sourceTree = ""; }; + B3063AE91AB655E500285BE4 /* DBZ_WKLoginView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBZ_WKLoginView.h; sourceTree = ""; }; + B3063AEA1AB655E500285BE4 /* DBZ_WKLoginView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DBZ_WKLoginView.m; sourceTree = ""; }; + B3063AEC1AB6560300285BE4 /* DBZ_WKControlView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBZ_WKControlView.h; sourceTree = ""; }; + B3063AED1AB6560300285BE4 /* DBZ_WKControlView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DBZ_WKControlView.m; sourceTree = ""; }; B318D1521A097829002F59AB /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; B3257AC219B41E8D00CC471C /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; B3257AC419B41E9B00CC471C /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; B3257AC619B41EA700CC471C /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; B3257ACD19B424C200CC471C /* libsqlite3.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.0.dylib; path = usr/lib/libsqlite3.0.dylib; sourceTree = SDKROOT; }; + B32B67141AB7950D00D2C728 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Unified.storyboard; sourceTree = ""; }; + B32B67161AB7951800D2C728 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Unified.storyboard; sourceTree = ""; }; B34E227219AD5B4F0001127D /* Batman.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Batman.ttf; sourceTree = ""; }; B34E227419AD629D0001127D /* Universal Presenter Remote.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "Universal Presenter Remote.entitlements"; sourceTree = ""; }; B357A5DB190453D500CCECB6 /* DBZ_InfoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBZ_InfoView.h; sourceTree = ""; }; B357A5DC190453D500CCECB6 /* DBZ_InfoView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DBZ_InfoView.m; sourceTree = ""; }; + B36A1DE21AB7672B00A6A956 /* PushNotificationPayloadOld.apns */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PushNotificationPayloadOld.apns; sourceTree = ""; }; B3A99A2919D203E9002BBBA5 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; - B3BD750519C2635D0095C461 /* Unified.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Unified.storyboard; sourceTree = ""; }; + B3C820E51AB627E000CD3438 /* MMWormhole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MMWormhole.h; sourceTree = ""; }; + B3C820E61AB627E000CD3438 /* MMWormhole.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MMWormhole.m; sourceTree = ""; }; + B3C968B31AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Universal Presenter Remote WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + B3C968B61AB20B44000819E0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B3C968B71AB20B44000819E0 /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; + B3C968BA1AB20B44000819E0 /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; }; + B3C968BC1AB20B44000819E0 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + B3C968C01AB20B44000819E0 /* Universal Presenter Remote WatchKit App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Universal Presenter Remote WatchKit App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + B3C968C61AB20B44000819E0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B3C968C81AB20B44000819E0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; + B3C968CA1AB20B44000819E0 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; B3CBFA4E19B80AD100FF6837 /* DBZ_SettingsView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBZ_SettingsView.h; sourceTree = ""; }; B3CBFA4F19B80AD100FF6837 /* DBZ_SettingsView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DBZ_SettingsView.m; sourceTree = ""; }; B3E35D141A094ABA0099DCD4 /* Universal Presenter Remote-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Universal Presenter Remote-Bridging-Header.h"; path = "Universal Presenter Remote/Universal Presenter Remote-Bridging-Header.h"; sourceTree = ""; }; @@ -108,6 +167,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + B3C968B01AB20B44000819E0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; ED70D5E318FF17E0007B4C18 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -138,6 +204,66 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + B3A5D5241AB221C20071A5A3 /* WatchApp */ = { + isa = PBXGroup; + children = ( + B3063AE91AB655E500285BE4 /* DBZ_WKLoginView.h */, + B3063AEA1AB655E500285BE4 /* DBZ_WKLoginView.m */, + B3063AEC1AB6560300285BE4 /* DBZ_WKControlView.h */, + B3063AED1AB6560300285BE4 /* DBZ_WKControlView.m */, + ); + name = WatchApp; + sourceTree = ""; + }; + B3C820E41AB627E000CD3438 /* MMWormhole */ = { + isa = PBXGroup; + children = ( + B3C820E51AB627E000CD3438 /* MMWormhole.h */, + B3C820E61AB627E000CD3438 /* MMWormhole.m */, + ); + path = MMWormhole; + sourceTree = ""; + }; + B3C968B41AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension */ = { + isa = PBXGroup; + children = ( + B3063AE81AB635B100285BE4 /* Universal Presenter Remote WatchKit Extension.entitlements */, + B3A5D5241AB221C20071A5A3 /* WatchApp */, + B3C968BA1AB20B44000819E0 /* NotificationController.swift */, + B3C968BC1AB20B44000819E0 /* Images.xcassets */, + B3C968B51AB20B44000819E0 /* Supporting Files */, + ); + path = "Universal Presenter Remote WatchKit Extension"; + sourceTree = ""; + }; + B3C968B51AB20B44000819E0 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + B3C968B61AB20B44000819E0 /* Info.plist */, + B3C968B71AB20B44000819E0 /* PushNotificationPayload.apns */, + B36A1DE21AB7672B00A6A956 /* PushNotificationPayloadOld.apns */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + B3C968C41AB20B44000819E0 /* Universal Presenter Remote WatchKit App */ = { + isa = PBXGroup; + children = ( + B3C968C71AB20B44000819E0 /* Interface.storyboard */, + B3C968CA1AB20B44000819E0 /* Images.xcassets */, + B3C968C51AB20B44000819E0 /* Supporting Files */, + ); + path = "Universal Presenter Remote WatchKit App"; + sourceTree = ""; + }; + B3C968C51AB20B44000819E0 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + B3C968C61AB20B44000819E0 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; B3EAFE1B19BE53AD002E1F29 /* GoogleAnalytics */ = { isa = PBXGroup; children = ( @@ -190,8 +316,11 @@ B3E35D141A094ABA0099DCD4 /* Universal Presenter Remote-Bridging-Header.h */, ED70D5EF18FF17E0007B4C18 /* Universal Presenter Remote */, ED70D60818FF17E1007B4C18 /* Universal Presenter RemoteTests */, + B3C968B41AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension */, + B3C968C41AB20B44000819E0 /* Universal Presenter Remote WatchKit App */, ED70D5E818FF17E0007B4C18 /* Frameworks */, ED70D5E718FF17E0007B4C18 /* Products */, + B3C820E41AB627E000CD3438 /* MMWormhole */, ); sourceTree = ""; }; @@ -200,6 +329,8 @@ children = ( ED70D5E618FF17E0007B4C18 /* Universal Presenter Remote.app */, ED70D60118FF17E1007B4C18 /* Universal Presenter RemoteTests.xctest */, + B3C968B31AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension.appex */, + B3C968C01AB20B44000819E0 /* Universal Presenter Remote WatchKit App.app */, ); name = Products; sourceTree = ""; @@ -270,7 +401,7 @@ ED70D61C18FF182F007B4C18 /* Interface */ = { isa = PBXGroup; children = ( - B3BD750519C2635D0095C461 /* Unified.storyboard */, + B32B67151AB7950D00D2C728 /* Unified.storyboard */, B3A99A2919D203E9002BBBA5 /* LaunchScreen.storyboard */, ); name = Interface; @@ -297,6 +428,39 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + B3C968B21AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = B3C968D41AB20B44000819E0 /* Build configuration list for PBXNativeTarget "Universal Presenter Remote WatchKit Extension" */; + buildPhases = ( + B3C968AF1AB20B44000819E0 /* Sources */, + B3C968B01AB20B44000819E0 /* Frameworks */, + B3C968B11AB20B44000819E0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + B3C968C31AB20B44000819E0 /* PBXTargetDependency */, + ); + name = "Universal Presenter Remote WatchKit Extension"; + productName = "Universal Presenter Remote WatchKit Extension"; + productReference = B3C968B31AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension.appex */; + productType = "com.apple.product-type.watchkit-extension"; + }; + B3C968BF1AB20B44000819E0 /* Universal Presenter Remote WatchKit App */ = { + isa = PBXNativeTarget; + buildConfigurationList = B3C968D31AB20B44000819E0 /* Build configuration list for PBXNativeTarget "Universal Presenter Remote WatchKit App" */; + buildPhases = ( + B3C968BE1AB20B44000819E0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Universal Presenter Remote WatchKit App"; + productName = "Universal Presenter Remote WatchKit App"; + productReference = B3C968C01AB20B44000819E0 /* Universal Presenter Remote WatchKit App.app */; + productType = "com.apple.product-type.application.watchapp"; + }; ED70D5E518FF17E0007B4C18 /* Universal Presenter Remote */ = { isa = PBXNativeTarget; buildConfigurationList = ED70D61218FF17E1007B4C18 /* Build configuration list for PBXNativeTarget "Universal Presenter Remote" */; @@ -304,10 +468,12 @@ ED70D5E218FF17E0007B4C18 /* Sources */, ED70D5E318FF17E0007B4C18 /* Frameworks */, ED70D5E418FF17E0007B4C18 /* Resources */, + B3C968D51AB20B44000819E0 /* Embed App Extensions */, ); buildRules = ( ); dependencies = ( + B3C968CD1AB20B44000819E0 /* PBXTargetDependency */, ); name = "Universal Presenter Remote"; productName = "Universal Presenter Remote"; @@ -342,9 +508,25 @@ LastUpgradeCheck = 0510; ORGANIZATIONNAME = "DBZ Technology"; TargetAttributes = { + B3C968B21AB20B44000819E0 = { + CreatedOnToolsVersion = 6.2; + DevelopmentTeam = 93C4626635; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + }; + }; + B3C968BF1AB20B44000819E0 = { + CreatedOnToolsVersion = 6.2; + DevelopmentTeam = 93C4626635; + }; ED70D5E518FF17E0007B4C18 = { DevelopmentTeam = 93C4626635; SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; com.apple.BackgroundModes = { enabled = 1; }; @@ -367,6 +549,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = ED70D5DD18FF17E0007B4C18; productRefGroup = ED70D5E718FF17E0007B4C18 /* Products */; @@ -375,11 +558,34 @@ targets = ( ED70D5E518FF17E0007B4C18 /* Universal Presenter Remote */, ED70D60018FF17E1007B4C18 /* Universal Presenter RemoteTests */, + B3C968B21AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension */, + B3C968BF1AB20B44000819E0 /* Universal Presenter Remote WatchKit App */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + B3C968B11AB20B44000819E0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B3C968BD1AB20B44000819E0 /* Images.xcassets in Resources */, + B362B6131AC5E25C00F2BBAE /* Batman.ttf in Resources */, + B3C968C11AB20B44000819E0 /* Universal Presenter Remote WatchKit App.app in Resources */, + B36A1DE31AB7672B00A6A956 /* PushNotificationPayloadOld.apns in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B3C968BE1AB20B44000819E0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B362B6141AC5E26700F2BBAE /* Batman.ttf in Resources */, + B3C968C91AB20B44000819E0 /* Interface.storyboard in Resources */, + B3C968CB1AB20B44000819E0 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; ED70D5E418FF17E0007B4C18 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -388,7 +594,7 @@ B34E227119AD41290001127D /* Images.xcassets in Resources */, B34E227319AD5B4F0001127D /* Batman.ttf in Resources */, ED70D5F418FF17E0007B4C18 /* InfoPlist.strings in Resources */, - B3BD750619C2635D0095C461 /* Unified.storyboard in Resources */, + B32B67131AB7950D00D2C728 /* Unified.storyboard in Resources */, B3EAFE2C19BE53AD002E1F29 /* Changelog.txt in Resources */, B3EAFE2F19BE53AD002E1F29 /* Readme.txt in Resources */, ); @@ -405,6 +611,17 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + B3C968AF1AB20B44000819E0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B3C968BB1AB20B44000819E0 /* NotificationController.swift in Sources */, + B3063AEB1AB655E500285BE4 /* DBZ_WKLoginView.m in Sources */, + B3C820E81AB627E000CD3438 /* MMWormhole.m in Sources */, + B3063AEE1AB6560300285BE4 /* DBZ_WKControlView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; ED70D5E218FF17E0007B4C18 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -415,6 +632,7 @@ ED70D5FA18FF17E0007B4C18 /* DBZ_AppDelegate.m in Sources */, B3E35D1B1A094D530099DCD4 /* igViewController.m in Sources */, ED70D62218FF1979007B4C18 /* DBZ_LoginView.m in Sources */, + B3C820E71AB627E000CD3438 /* MMWormhole.m in Sources */, ED282332190068010030B9C4 /* DBZ_ControlView.m in Sources */, B3CBFA5019B80AD100FF6837 /* DBZ_SettingsView.m in Sources */, ED28233519006BF50030B9C4 /* DBZ_ServerCommunication.m in Sources */, @@ -432,6 +650,16 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + B3C968C31AB20B44000819E0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B3C968BF1AB20B44000819E0 /* Universal Presenter Remote WatchKit App */; + targetProxy = B3C968C21AB20B44000819E0 /* PBXContainerItemProxy */; + }; + B3C968CD1AB20B44000819E0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B3C968B21AB20B44000819E0 /* Universal Presenter Remote WatchKit Extension */; + targetProxy = B3C968CC1AB20B44000819E0 /* PBXContainerItemProxy */; + }; ED70D60718FF17E1007B4C18 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = ED70D5E518FF17E0007B4C18 /* Universal Presenter Remote */; @@ -440,6 +668,23 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + B32B67151AB7950D00D2C728 /* Unified.storyboard */ = { + isa = PBXVariantGroup; + children = ( + B32B67141AB7950D00D2C728 /* en */, + B32B67161AB7951800D2C728 /* Base */, + ); + name = Unified.storyboard; + sourceTree = ""; + }; + B3C968C71AB20B44000819E0 /* Interface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + B3C968C81AB20B44000819E0 /* Base */, + ); + name = Interface.storyboard; + sourceTree = ""; + }; ED70D5F218FF17E0007B4C18 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( @@ -459,6 +704,99 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + B3C968CF1AB20B44000819E0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_ENTITLEMENTS = "Universal Presenter Remote WatchKit Extension/Universal Presenter Remote WatchKit Extension.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer: Brendan Boyle (6EM5FFNW2D)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Brendan Boyle (6EM5FFNW2D)"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "Universal Presenter Remote WatchKit Extension/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/GoogleAnalytics", + ); + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "${TARGET_NAME}"; + PROVISIONING_PROFILE = "82478e06-fcdc-4076-b098-61c66fa6021f"; + SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = "Universal Presenter Remote/Universal Presenter Remote-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + B3C968D01AB20B44000819E0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_ENTITLEMENTS = "Universal Presenter Remote WatchKit Extension/Universal Presenter Remote WatchKit Extension.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Distribution: Brendan Boyle (93C4626635)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Brendan Boyle (93C4626635)"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Universal Presenter Remote WatchKit Extension/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/GoogleAnalytics", + ); + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "${TARGET_NAME}"; + PROVISIONING_PROFILE = "374936aa-fb85-434b-a064-f30e76fd333f"; + SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = "Universal Presenter Remote/Universal Presenter Remote-Bridging-Header.h"; + }; + name = Release; + }; + B3C968D11AB20B44000819E0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + IBSC_MODULE = Universal_Presenter_Remote_WatchKit_Extension; + INFOPLIST_FILE = "Universal Presenter Remote WatchKit App/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; + }; + name = Debug; + }; + B3C968D21AB20B44000819E0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + IBSC_MODULE = Universal_Presenter_Remote_WatchKit_Extension; + INFOPLIST_FILE = "Universal Presenter Remote WatchKit App/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; + }; + name = Release; + }; ED70D61018FF17E1007B4C18 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -538,19 +876,20 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "Universal Presenter Remote/Universal Presenter Remote.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer: Brendan Boyle (6EM5FFNW2D)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Brendan Boyle (6EM5FFNW2D)"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Universal Presenter Remote/Universal Presenter Remote-Prefix.pch"; INFOPLIST_FILE = "Universal Presenter Remote/Universal Presenter Remote-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/GoogleAnalytics", ); PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "295760c8-e23b-48c4-8c16-6b3c9a66cc66"; + PROVISIONING_PROFILE = "ca3b0ce2-9f1e-4a3f-81e6-f2b90935ce4a"; SWIFT_OBJC_BRIDGING_HEADER = "Universal Presenter Remote/Universal Presenter Remote-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; WRAPPER_EXTENSION = app; @@ -564,19 +903,20 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "Universal Presenter Remote/Universal Presenter Remote.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Distribution: Brendan Boyle (93C4626635)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Brendan Boyle (93C4626635)"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Universal Presenter Remote/Universal Presenter Remote-Prefix.pch"; INFOPLIST_FILE = "Universal Presenter Remote/Universal Presenter Remote-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/GoogleAnalytics", ); PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "f18f28ce-a26c-47f8-91f7-364eb742b091"; + PROVISIONING_PROFILE = "ff5e77e7-4b6d-4b08-a30f-8868b720b896"; SWIFT_OBJC_BRIDGING_HEADER = "Universal Presenter Remote/Universal Presenter Remote-Bridging-Header.h"; WRAPPER_EXTENSION = app; }; @@ -625,6 +965,24 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + B3C968D31AB20B44000819E0 /* Build configuration list for PBXNativeTarget "Universal Presenter Remote WatchKit App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B3C968D11AB20B44000819E0 /* Debug */, + B3C968D21AB20B44000819E0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B3C968D41AB20B44000819E0 /* Build configuration list for PBXNativeTarget "Universal Presenter Remote WatchKit Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B3C968CF1AB20B44000819E0 /* Debug */, + B3C968D01AB20B44000819E0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; ED70D5E118FF17E0007B4C18 /* Build configuration list for PBXProject "Universal Presenter Remote" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/project.xcworkspace/xcuserdata/brendancboyle.xcuserdatad/UserInterfaceState.xcuserstate b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/project.xcworkspace/xcuserdata/brendancboyle.xcuserdatad/UserInterfaceState.xcuserstate index d498d5b..14c61cc 100644 Binary files a/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/project.xcworkspace/xcuserdata/brendancboyle.xcuserdatad/UserInterfaceState.xcuserstate and b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/project.xcworkspace/xcuserdata/brendancboyle.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Notification - Universal Presenter Remote WatchKit App.xcscheme b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Notification - Universal Presenter Remote WatchKit App.xcscheme new file mode 100644 index 0000000..9b96aa5 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Notification - Universal Presenter Remote WatchKit App.xcscheme @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/UPR No Watch.xcscheme b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/UPR No Watch.xcscheme new file mode 100644 index 0000000..41b22f1 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/UPR No Watch.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Universal Presenter Remote WatchKit App.xcscheme b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Universal Presenter Remote WatchKit App.xcscheme new file mode 100644 index 0000000..72225a5 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Universal Presenter Remote WatchKit App.xcscheme @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Universal Presenter Remote.xcscheme b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Universal Presenter Remote.xcscheme index 1efecd2..4b4b91a 100644 --- a/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Universal Presenter Remote.xcscheme +++ b/Universal Presenter Remote/Universal Presenter Remote.xcodeproj/xcuserdata/brendancboyle.xcuserdatad/xcschemes/Universal Presenter Remote.xcscheme @@ -58,7 +58,8 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" allowLocationSimulation = "YES"> - + - + SchemeUserState + Notification - Universal Presenter Remote WatchKit App.xcscheme + + orderHint + 3 + Release Test.xcscheme orderHint 1 + UPR No Watch.xcscheme + + orderHint + 4 + + Universal Presenter Remote WatchKit App.xcscheme + + orderHint + 2 + Universal Presenter Remote.xcscheme orderHint @@ -17,6 +32,11 @@ SuppressBuildableAutocreation + B3C968BF1AB20B44000819E0 + + primary + + ED70D5E518FF17E0007B4C18 primary diff --git a/Universal Presenter Remote/Universal Presenter Remote/Unified.storyboard b/Universal Presenter Remote/Universal Presenter Remote/Base.lproj/Unified.storyboard similarity index 97% rename from Universal Presenter Remote/Universal Presenter Remote/Unified.storyboard rename to Universal Presenter Remote/Universal Presenter Remote/Base.lproj/Unified.storyboard index 51ed15d..2f3cc19 100644 --- a/Universal Presenter Remote/Universal Presenter Remote/Unified.storyboard +++ b/Universal Presenter Remote/Universal Presenter Remote/Base.lproj/Unified.storyboard @@ -1,8 +1,8 @@ - + - + @@ -66,7 +66,7 @@ - + @@ -80,7 +80,7 @@ - + diff --git a/Universal Presenter Remote/Universal Presenter Remote/en.lproj/Unified.strings b/Universal Presenter Remote/Universal Presenter Remote/en.lproj/Unified.strings new file mode 100644 index 0000000..daa3578 --- /dev/null +++ b/Universal Presenter Remote/Universal Presenter Remote/en.lproj/Unified.strings @@ -0,0 +1,114 @@ + +/* Class = "UITextView"; text = "You can now click begin on your phone or watch and press the Previous, Next, and Media buttons to control your presentation. If you have any issues, please contact support@dbztech.com"; ObjectID = "0a3-Zh-jeU"; */ +"0a3-Zh-jeU.text" = "You can now click begin on your phone or watch and press the Previous, Next, and Media buttons to control your presentation. If you have any issues, please contact support@dbztech.com"; + +/* Class = "UITextView"; text = "Enter the token generated by this App into the presenting computer and click begin. If you are using a Mac, you can also scan the QR code generated by the computer to link your remote."; ObjectID = "3I5-hz-LaU"; */ +"3I5-hz-LaU.text" = "Enter the token generated by this App into the presenting computer and click begin. If you are using a Mac, you can also scan the QR code generated by the computer to link your remote."; + +/* Class = "UINavigationItem"; title = "Swipe Control"; ObjectID = "3ix-EK-pRA"; */ +"3ix-EK-pRA.title" = "Swipe Control"; + +/* Class = "UISegmentedControl"; 7Pi-ZQ-9NE.segmentTitles[0] = "Show Instructions"; ObjectID = "7Pi-ZQ-9NE"; */ +"7Pi-ZQ-9NE.segmentTitles[0]" = "Show Instructions"; + +/* Class = "UISegmentedControl"; 7Pi-ZQ-9NE.segmentTitles[1] = "Hide Instructions"; ObjectID = "7Pi-ZQ-9NE"; */ +"7Pi-ZQ-9NE.segmentTitles[1]" = "Hide Instructions"; + +/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "8a8-35-JCH"; */ +"8a8-35-JCH.title" = "Back"; + +/* Class = "UINavigationItem"; title = "Instructions"; ObjectID = "9gN-80-2ip"; */ +"9gN-80-2ip.title" = "Instructions"; + +/* Class = "UIButton"; normalTitle = "Next"; ObjectID = "AHM-JX-6GA"; */ +"AHM-JX-6GA.normalTitle" = "Next"; + +/* Class = "UILabel"; text = "QR support only available on OS X (UPR Controller)"; ObjectID = "BUa-dv-n6I"; */ +"BUa-dv-n6I.text" = "QR support only available on OS X (UPR Controller)"; + +/* Class = "UINavigationItem"; title = "QR Code Join"; ObjectID = "F51-Df-PbV"; */ +"F51-Df-PbV.title" = "QR Code Join"; + +/* Class = "UIButton"; normalTitle = "Media"; ObjectID = "Fpr-A8-DIf"; */ +"Fpr-A8-DIf.normalTitle" = "Media"; + +/* Class = "UINavigationItem"; title = "Settings"; ObjectID = "Hko-H5-NDo"; */ +"Hko-H5-NDo.title" = "Settings"; + +/* Class = "UIButton"; normalTitle = "Connecting..."; ObjectID = "IU0-Hn-Sno"; */ +"IU0-Hn-Sno.normalTitle" = "Connecting..."; + +/* Class = "UIButton"; normalTitle = "Previous"; ObjectID = "IeA-OW-kgV"; */ +"IeA-OW-kgV.normalTitle" = "Previous"; + +/* Class = "UILabel"; text = "When UPR Starts:"; ObjectID = "O0O-AK-yWJ"; */ +"O0O-AK-yWJ.text" = "When UPR Starts:"; + +/* Class = "UILabel"; text = "Scan the QR code to begin presenting"; ObjectID = "QnW-6E-cH9"; */ +"QnW-6E-cH9.text" = "Scan the QR code to begin presenting"; + +/* Class = "UISegmentedControl"; R4V-f7-xw6.segmentTitles[0] = "Token"; ObjectID = "R4V-f7-xw6"; */ +"R4V-f7-xw6.segmentTitles[0]" = "Token"; + +/* Class = "UISegmentedControl"; R4V-f7-xw6.segmentTitles[1] = "QR Code"; ObjectID = "R4V-f7-xw6"; */ +"R4V-f7-xw6.segmentTitles[1]" = "QR Code"; + +/* Class = "UINavigationItem"; title = "Control"; ObjectID = "RQO-IZ-lIN"; */ +"RQO-IZ-lIN.title" = "Control"; + +/* Class = "UITextView"; text = "Download the UPR Controller App on the presenting computer. This can be found at universalpresenterremote.com. Once installed, open the application and verify that your computer is connected to the internet."; ObjectID = "WIz-gW-TSU"; */ +"WIz-gW-TSU.text" = "Download the UPR Controller App on the presenting computer. This can be found at universalpresenterremote.com. Once installed, open the application and verify that your computer is connected to the internet."; + +/* Class = "UILabel"; text = "Enable Swipe Control"; ObjectID = "XGM-jg-ClN"; */ +"XGM-jg-ClN.text" = "Enable Swipe Control"; + +/* Class = "UILabel"; text = "Swipe below to control presentation"; ObjectID = "Yev-FW-yRq"; */ +"Yev-FW-yRq.text" = "Swipe below to control presentation"; + +/* Class = "UINavigationItem"; title = "Instructions"; ObjectID = "apH-sP-JQz"; */ +"apH-sP-JQz.title" = "Instructions"; + +/* Class = "UINavigationItem"; title = "UPR"; ObjectID = "bOq-F0-cZB"; */ +"bOq-F0-cZB.title" = "UPR"; + +/* Class = "UIBarButtonItem"; title = "Settings"; ObjectID = "bTL-sO-Tjg"; */ +"bTL-sO-Tjg.title" = "Settings"; + +/* Class = "UIButton"; normalTitle = "Next"; ObjectID = "d1R-Wu-8zX"; */ +"d1R-Wu-8zX.normalTitle" = "Next"; + +/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "eSJ-Mn-PoJ"; */ +"eSJ-Mn-PoJ.title" = "Back"; + +/* Class = "UINavigationItem"; title = "Instructions"; ObjectID = "hC0-Pg-Kv4"; */ +"hC0-Pg-Kv4.title" = "Instructions"; + +/* Class = "UIBarButtonItem"; title = "Settings"; ObjectID = "hbE-Jc-mQQ"; */ +"hbE-Jc-mQQ.title" = "Settings"; + +/* Class = "UIBarButtonItem"; title = "Settings"; ObjectID = "iZf-aI-N39"; */ +"iZf-aI-N39.title" = "Settings"; + +/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "mCV-3C-EBK"; */ +"mCV-3C-EBK.title" = "Back"; + +/* Class = "UIButton"; normalTitle = "Close"; ObjectID = "mqg-l1-TT3"; */ +"mqg-l1-TT3.normalTitle" = "Close"; + +/* Class = "UILabel"; text = "Enter token on presenting device"; ObjectID = "noH-s5-T4p"; */ +"noH-s5-T4p.text" = "Enter token on presenting device"; + +/* Class = "UILabel"; text = "..."; ObjectID = "orP-yK-NZr"; */ +"orP-yK-NZr.text" = "..."; + +/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "uxE-pf-dxq"; */ +"uxE-pf-dxq.title" = "Back"; + +/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "xGg-P2-CxC"; */ +"xGg-P2-CxC.title" = "Back"; + +/* Class = "UIButton"; normalTitle = "Next"; ObjectID = "ypQ-rR-xbo"; */ +"ypQ-rR-xbo.normalTitle" = "Next"; + +/* Class = "UIBarButtonItem"; title = "Back"; ObjectID = "z8P-tF-EpH"; */ +"z8P-tF-EpH.title" = "Back";