diff options
Diffstat (limited to 'StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.m')
| -rw-r--r-- | StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.m | 278 |
1 files changed, 0 insertions, 278 deletions
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.m b/StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.m deleted file mode 100644 index fc18dd79..00000000 --- a/StoneIsland/plugins/phonegap-plugin-push/src/ios/AppDelegate+notification.m +++ /dev/null @@ -1,278 +0,0 @@ -// -// AppDelegate+notification.m -// pushtest -// -// Created by Robert Easterday on 10/26/12. -// -// - -#import "AppDelegate+notification.h" -#import "PushPlugin.h" -#import <objc/runtime.h> - -static char launchNotificationKey; -static char coldstartKey; - -@implementation AppDelegate (notification) - -- (id) getCommandInstance:(NSString*)className -{ - return [self.viewController getCommandInstance:className]; -} - -// its dangerous to override a method from within a category. -// Instead we will use method swizzling. we set this up in the load call. -+ (void)load -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - Class class = [self class]; - - SEL originalSelector = @selector(init); - SEL swizzledSelector = @selector(pushPluginSwizzledInit); - - Method original = class_getInstanceMethod(class, originalSelector); - Method swizzled = class_getInstanceMethod(class, swizzledSelector); - - BOOL didAddMethod = - class_addMethod(class, - originalSelector, - method_getImplementation(swizzled), - method_getTypeEncoding(swizzled)); - - if (didAddMethod) { - class_replaceMethod(class, - swizzledSelector, - method_getImplementation(original), - method_getTypeEncoding(original)); - } else { - method_exchangeImplementations(original, swizzled); - } - }); -} - -- (AppDelegate *)pushPluginSwizzledInit -{ - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(createNotificationChecker:) - name:UIApplicationDidFinishLaunchingNotification - object:nil]; - [[NSNotificationCenter defaultCenter]addObserver:self - selector:@selector(pushPluginOnApplicationDidBecomeActive:) - name:UIApplicationDidBecomeActiveNotification - object:nil]; - - // This actually calls the original init method over in AppDelegate. Equivilent to calling super - // on an overrided method, this is not recursive, although it appears that way. neat huh? - return [self pushPluginSwizzledInit]; -} - -// This code will be called immediately after application:didFinishLaunchingWithOptions:. We need -// to process notifications in cold-start situations -- (void)createNotificationChecker:(NSNotification *)notification -{ - NSLog(@"createNotificationChecker"); - if (notification) - { - NSDictionary *launchOptions = [notification userInfo]; - if (launchOptions) { - NSLog(@"coldstart"); - self.launchNotification = [launchOptions objectForKey: @"UIApplicationLaunchOptionsRemoteNotificationKey"]; - self.coldstart = [NSNumber numberWithBool:YES]; - } else { - NSLog(@"not coldstart"); - self.coldstart = [NSNumber numberWithBool:NO]; - } - } -} - -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - [pushHandler didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; -} - -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - [pushHandler didFailToRegisterForRemoteNotificationsWithError:error]; -} - -- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { - NSLog(@"clicked on the shade"); - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - pushHandler.notificationMessage = userInfo; - pushHandler.isInline = NO; - [pushHandler notificationReceived]; -} - -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { - NSLog(@"didReceiveNotification with fetchCompletionHandler"); - - // app is in the foreground so call notification callback - if (application.applicationState == UIApplicationStateActive) { - NSLog(@"app active"); - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - pushHandler.notificationMessage = userInfo; - pushHandler.isInline = YES; - [pushHandler notificationReceived]; - - completionHandler(UIBackgroundFetchResultNewData); - } - // app is in background or in stand by - else { - NSLog(@"app in-active"); - - // do some convoluted logic to find out if this should be a silent push. - long silent = 0; - id aps = [userInfo objectForKey:@"aps"]; - id contentAvailable = [aps objectForKey:@"content-available"]; - if ([contentAvailable isKindOfClass:[NSString class]] && [contentAvailable isEqualToString:@"1"]) { - silent = 1; - } else if ([contentAvailable isKindOfClass:[NSNumber class]]) { - silent = [contentAvailable integerValue]; - } - - if (silent == 1) { - NSLog(@"this should be a silent push"); - void (^safeHandler)(UIBackgroundFetchResult) = ^(UIBackgroundFetchResult result){ - dispatch_async(dispatch_get_main_queue(), ^{ - completionHandler(result); - }); - }; - - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - - if (pushHandler.handlerObj == nil) { - pushHandler.handlerObj = [NSMutableDictionary dictionaryWithCapacity:2]; - } - - id notId = [userInfo objectForKey:@"notId"]; - if (notId != nil) { - NSLog(@"Push Plugin notId %@", notId); - [pushHandler.handlerObj setObject:safeHandler forKey:notId]; - } else { - NSLog(@"Push Plugin notId handler"); - [pushHandler.handlerObj setObject:safeHandler forKey:@"handler"]; - } - - pushHandler.notificationMessage = userInfo; - pushHandler.isInline = NO; - [pushHandler notificationReceived]; - } else { - NSLog(@"just put it in the shade"); - //save it for later - self.launchNotification = userInfo; - - completionHandler(UIBackgroundFetchResultNewData); - } - } -} - -- (BOOL)userHasRemoteNotificationsEnabled { - UIApplication *application = [UIApplication sharedApplication]; - if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) { - return application.currentUserNotificationSettings.types != UIUserNotificationTypeNone; - } else { -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - return application.enabledRemoteNotificationTypes != UIRemoteNotificationTypeNone; -#pragma GCC diagnostic pop - } -} - -- (void)pushPluginOnApplicationDidBecomeActive:(NSNotification *)notification { - - NSLog(@"active"); - - UIApplication *application = notification.object; - - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - if (pushHandler.clearBadge) { - NSLog(@"PushPlugin clearing badge"); - //zero badge - application.applicationIconBadgeNumber = 0; - } else { - NSLog(@"PushPlugin skip clear badge"); - } - - if (self.launchNotification) { - pushHandler.isInline = NO; - pushHandler.coldstart = [self.coldstart boolValue]; - pushHandler.notificationMessage = self.launchNotification; - self.launchNotification = nil; - self.coldstart = [NSNumber numberWithBool:NO]; - [pushHandler performSelectorOnMainThread:@selector(notificationReceived) withObject:pushHandler waitUntilDone:NO]; - } -} - - -- (void)application:(UIApplication *) application handleActionWithIdentifier: (NSString *) identifier -forRemoteNotification: (NSDictionary *) notification completionHandler: (void (^)()) completionHandler { - - NSLog(@"Push Plugin handleActionWithIdentifier %@", identifier); - NSMutableDictionary *userInfo = [notification mutableCopy]; - [userInfo setObject:identifier forKey:@"actionCallback"]; - NSLog(@"Push Plugin userInfo %@", userInfo); - - if (application.applicationState == UIApplicationStateActive) { - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - pushHandler.notificationMessage = userInfo; - pushHandler.isInline = NO; - [pushHandler notificationReceived]; - } else { - void (^safeHandler)() = ^(void){ - dispatch_async(dispatch_get_main_queue(), ^{ - completionHandler(); - }); - }; - - PushPlugin *pushHandler = [self getCommandInstance:@"PushNotification"]; - - if (pushHandler.handlerObj == nil) { - pushHandler.handlerObj = [NSMutableDictionary dictionaryWithCapacity:2]; - } - - id notId = [userInfo objectForKey:@"notId"]; - if (notId != nil) { - NSLog(@"Push Plugin notId %@", notId); - [pushHandler.handlerObj setObject:safeHandler forKey:notId]; - } else { - NSLog(@"Push Plugin notId handler"); - [pushHandler.handlerObj setObject:safeHandler forKey:@"handler"]; - } - - pushHandler.notificationMessage = userInfo; - pushHandler.isInline = NO; - - [pushHandler performSelectorOnMainThread:@selector(notificationReceived) withObject:pushHandler waitUntilDone:NO]; - } -} - -// The accessors use an Associative Reference since you can't define a iVar in a category -// http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocAssociativeReferences.html -- (NSMutableArray *)launchNotification -{ - return objc_getAssociatedObject(self, &launchNotificationKey); -} - -- (void)setLaunchNotification:(NSDictionary *)aDictionary -{ - objc_setAssociatedObject(self, &launchNotificationKey, aDictionary, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (NSNumber *)coldstart -{ - return objc_getAssociatedObject(self, &coldstartKey); -} - -- (void)setColdstart:(NSNumber *)aNumber -{ - objc_setAssociatedObject(self, &coldstartKey, aNumber, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (void)dealloc -{ - self.launchNotification = nil; // clear the association and release the object - self.coldstart = nil; -} - -@end |
