From 07c9b2b9453b77bd9a75e6ca8266b11041d2ee3d Mon Sep 17 00:00:00 2001 From: huangminlinux <380108184@qq.com> Date: Fri, 20 Oct 2017 11:28:51 +0800 Subject: [PATCH] fix iOS10 remove local notification fail bug --- src/ios/Plugins/AppDelegate+JPush.m | 7 +- src/ios/Plugins/JPushPlugin.m | 1058 ++++++++++++++------------- 2 files changed, 558 insertions(+), 507 deletions(-) diff --git a/src/ios/Plugins/AppDelegate+JPush.m b/src/ios/Plugins/AppDelegate+JPush.m index 6af1bb9..82145c4 100644 --- a/src/ios/Plugins/AppDelegate+JPush.m +++ b/src/ios/Plugins/AppDelegate+JPush.m @@ -155,7 +155,12 @@ NSDictionary *_launchOptions; } - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { - [[NSNotificationCenter defaultCenter] postNotificationName:JPushDocumentEvent_ReceiveLocalNotification object:notification.userInfo]; + NSDictionary* localNotificationEvent = @{@"content":notification.alertBody, + @"badge": @(notification.applicationIconBadgeNumber), + @"extras":notification.userInfo, + }; + + [[NSNotificationCenter defaultCenter] postNotificationName:JPushDocumentEvent_ReceiveLocalNotification object:localNotificationEvent]; } - (void)applicationWillEnterForeground:(UIApplication *)application { diff --git a/src/ios/Plugins/JPushPlugin.m b/src/ios/Plugins/JPushPlugin.m index 3351702..aab742a 100644 --- a/src/ios/Plugins/JPushPlugin.m +++ b/src/ios/Plugins/JPushPlugin.m @@ -1,506 +1,552 @@ -#import "JPushPlugin.h" -#import "JPUSHService.h" -#import -#import -#import -#import "AppDelegate+JPush.h" -#import "JPushDefine.h" - -@implementation NSDictionary (JPush) --(NSString*)toJsonString{ - NSError *error; - NSData *data = [NSJSONSerialization dataWithJSONObject:self options:0 error:&error]; - NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; - return jsonString; -} -@end - -@implementation NSString (JPush) --(NSDictionary*)toDictionary{ - NSError *error; - NSData *jsonData = [self dataUsingEncoding:NSUTF8StringEncoding]; - NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; - return dict; -} -@end - -@interface JPushPlugin() - -@end - -@implementation JPushPlugin - --(void)startJPushSDK:(CDVInvokedUrlCommand*)command{ - [(AppDelegate*)[UIApplication sharedApplication].delegate startJPushSDK]; -} - -#pragma mark- 外部接口 --(void)stopPush:(CDVInvokedUrlCommand*)command{ - [[UIApplication sharedApplication]unregisterForRemoteNotifications]; -} - --(void)resumePush:(CDVInvokedUrlCommand*)command{ - [(AppDelegate*)[UIApplication sharedApplication].delegate registerForRemoteNotification]; -} - --(void)isPushStopped:(CDVInvokedUrlCommand*)command{ - NSNumber *result = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications] ? @(0) : @(1); - [self handleResultWithValue:result command:command]; -} - --(void)initial:(CDVInvokedUrlCommand*)command{ - //do nithng,because Cordova plugin use lazy load mode. -} - -#ifdef __CORDOVA_4_0_0 - -- (void)pluginInitialize { - NSLog(@"### pluginInitialize "); - [self initPlugin]; -} - -#else - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{ - NSLog(@"### initWithWebView "); - if (self=[super initWithWebView:theWebView]) { - } - [self initPlugin]; - return self; -} - -#endif - --(void)initPlugin{ - if (!SharedJPushPlugin) { - SharedJPushPlugin = self; - } - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(networkDidReceiveMessage:) - name:kJPFNetworkDidReceiveMessageNotification - object:nil]; -} - -+(void)fireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString{ - dispatch_async(dispatch_get_main_queue(), ^{ - [SharedJPushPlugin.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.%@',%@)", eventName, jsString]]; - }); -} - --(void)setTags:(CDVInvokedUrlCommand*)command { - NSDictionary* params = [command.arguments objectAtIndex:0]; - NSNumber* sequence = params[@"sequence"]; - NSArray* tags = params[@"tags"]; - - [JPUSHService setTags:[NSSet setWithArray:tags] - completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { - NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; - [dic setObject:sequence forKey:@"sequence"]; - - CDVPluginResult* result; - - if (iResCode == 0) { - [dic setObject:[iTags allObjects] forKey:@"tags"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; - } else { - [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; - } - - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } seq:[sequence integerValue]]; -} - --(void)addTags:(CDVInvokedUrlCommand *)command { - NSDictionary* params = [command.arguments objectAtIndex:0]; - NSNumber* sequence = params[@"sequence"]; - NSArray* tags = params[@"tags"]; - - [JPUSHService addTags:[NSSet setWithArray:tags] - completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { - NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; - [dic setObject:sequence forKey:@"sequence"]; - - CDVPluginResult* result; - - if (iResCode == 0) { - [dic setObject:[iTags allObjects] forKey:@"tags"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; - } else { - [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; - } - - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } seq:[sequence integerValue]]; -} - --(void)deleteTags:(CDVInvokedUrlCommand *)command { - NSDictionary* params = [command.arguments objectAtIndex:0]; - NSNumber* sequence = params[@"sequence"]; - NSArray* tags = params[@"tags"]; - - [JPUSHService deleteTags:[NSSet setWithArray:tags] - completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { - NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; - [dic setObject:sequence forKey:@"sequence"]; - - CDVPluginResult* result; - - if (iResCode == 0) { - [dic setObject:[iTags allObjects] forKey:@"tags"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; - } else { - [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; - } - - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } seq:[sequence integerValue]]; -} - --(void)cleanTags:(CDVInvokedUrlCommand *)command { - NSDictionary* params = [command.arguments objectAtIndex:0]; - NSNumber* sequence = params[@"sequence"]; - - [JPUSHService cleanTags:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { - NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; - [dic setObject:sequence forKey:@"sequence"]; - - CDVPluginResult* result; - - if (iResCode == 0) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; - } else { - [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; - } - - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } seq:[sequence integerValue]]; -} - --(void)getAllTags:(CDVInvokedUrlCommand *)command { - NSDictionary* params = [command.arguments objectAtIndex:0]; - NSNumber* sequence = params[@"sequence"]; - - [JPUSHService getAllTags:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { - NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; - [dic setObject:sequence forKey:@"sequence"]; - - CDVPluginResult* result; - - if (iResCode == 0) { - [dic setObject:[iTags allObjects] forKey:@"tags"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; - } else { - [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; - } - - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } seq:[sequence integerValue]]; -} - --(void)checkTagBindState:(CDVInvokedUrlCommand *)command { - NSDictionary* params = [command.arguments objectAtIndex:0]; - NSNumber* sequence = params[@"sequence"]; - NSString* tag = params[@"tag"]; - - [JPUSHService validTag:tag completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq, BOOL isBind) { - NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; - [dic setObject:sequence forKey:@"sequence"]; - - CDVPluginResult* result; - - if (iResCode == 0) { - [dic setObject:[iTags allObjects] forKey:@"tags"]; - [dic setObject:[NSNumber numberWithBool:isBind] forKey:@"isBind"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; - } else { - [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; - } - - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } seq:[sequence integerValue]]; -} - --(void)setAlias:(CDVInvokedUrlCommand*)command { - NSDictionary* params = [command.arguments objectAtIndex:0]; - NSNumber* sequence = params[@"sequence"]; - NSString* alias = params[@"alias"]; - - [JPUSHService setAlias:alias completion:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { - NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; - [dic setObject:sequence forKey:@"sequence"]; - - CDVPluginResult* result; - - if (iResCode == 0) { - [dic setObject:iAlias forKey:@"alias"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; - - } else { - [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; - } - - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } seq:[sequence integerValue]]; -} - --(void)deleteAlias:(CDVInvokedUrlCommand*)command { - NSDictionary* params = [command.arguments objectAtIndex:0]; - NSNumber* sequence = params[@"sequence"]; - - [JPUSHService deleteAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { - NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; - [dic setObject:sequence forKey:@"sequence"]; - - CDVPluginResult* result; - - if (iResCode == 0) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; - } else { - [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; - } - - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } seq:[sequence integerValue]]; -} - --(void)getAlias:(CDVInvokedUrlCommand*)command { - NSDictionary* params = [command.arguments objectAtIndex:0]; - NSNumber* sequence = params[@"sequence"]; - - [JPUSHService getAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { - NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; - [dic setObject:sequence forKey:@"sequence"]; - - CDVPluginResult* result; - - if (iResCode == 0) { - [dic setObject:iAlias forKey:@"alias"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; - } else { - [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; - } - - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; - } seq:[sequence integerValue]]; -} - --(void)getRegistrationID:(CDVInvokedUrlCommand*)command{ - NSString* registrationID = [JPUSHService registrationID]; - [self handleResultWithValue:registrationID command:command]; -} - --(void)startLogPageView:(CDVInvokedUrlCommand*)command{ - NSString * pageName = [command argumentAtIndex:0]; - [JPUSHService startLogPageView:pageName]; -} - --(void)stopLogPageView:(CDVInvokedUrlCommand*)command{ - NSString * pageName = [command argumentAtIndex:0]; - [JPUSHService stopLogPageView:pageName]; -} - --(void)beginLogPageView:(CDVInvokedUrlCommand*)command{ - NSString *pageName = [command argumentAtIndex:0]; - NSNumber *duration = [command argumentAtIndex:1]; - [JPUSHService beginLogPageView:pageName duration:duration.intValue]; -} - --(void)setBadge:(CDVInvokedUrlCommand*)command{ - NSNumber *badge = [command argumentAtIndex:0]; - [JPUSHService setBadge:badge.intValue]; -} - --(void)resetBadge:(CDVInvokedUrlCommand*)command{ - [JPUSHService resetBadge]; -} - --(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command{ - NSNumber *badge = [command argumentAtIndex:0]; - [UIApplication sharedApplication].applicationIconBadgeNumber = badge.intValue; -} - --(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command { - NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber; - NSNumber *number = [NSNumber numberWithInteger:num]; - [self handleResultWithValue:number command:command]; -} - --(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{ - [JPUSHService setDebugMode]; -} - --(void)setLogOFF:(CDVInvokedUrlCommand*)command{ - [JPUSHService setLogOFF]; -} - --(void)crashLogON:(CDVInvokedUrlCommand*)command{ - [JPUSHService crashLogON]; -} - --(void)setLocalNotification:(CDVInvokedUrlCommand*)command{ - NSLog(@"ios 10 after please use UNNotificationRequest to set local notification, see apple doc to learn more"); - - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:[[command argumentAtIndex:0] intValue]]; - NSString *alert = [command argumentAtIndex:1]; - NSNumber *badge = [command argumentAtIndex:2]; - NSString *idKey = [command argumentAtIndex:3]; - NSDictionary *dict = [command argumentAtIndex:4]; - [JPUSHService setLocalNotification:date alertBody:alert badge:badge.intValue alertAction:nil identifierKey:idKey userInfo:dict soundName:nil]; -} - --(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{ - NSString *identifier = [command argumentAtIndex:0]; - JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new]; - jpid.identifiers = @[identifier]; - [JPUSHService removeNotification:jpid]; -} - --(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{ - [JPUSHService removeNotification:nil]; -} - --(void)setLocation:(CDVInvokedUrlCommand*)command{ - NSNumber *latitude = [command argumentAtIndex:0]; - NSNumber *longitude = [command argumentAtIndex:1]; - [JPUSHService setLatitude:latitude.doubleValue longitude:longitude.doubleValue]; -} - --(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command{ - if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { - UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; - WEAK_SELF(weakSelf); - [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { - NSMutableDictionary *dict = [NSMutableDictionary dictionary]; - dict[@"authorizationStatus"] = @(settings.authorizationStatus); - dict[@"soundSetting"] = @(settings.soundSetting); - dict[@"badgeSetting"] = @(settings.badgeSetting); - dict[@"alertSetting"] = @(settings.alertSetting); - dict[@"notificationCenterSetting"] = @(settings.notificationCenterSetting); - dict[@"lockScreenSetting"] = @(settings.lockScreenSetting); - dict[@"carPlaySetting"] = @(settings.carPlaySetting); - dict[@"alertStyle"] = @(settings.alertStyle); - [weakSelf handleResultWithValue:dict command:command]; - }]; - }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { - UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings]; - UIUserNotificationType type = settings.types; - NSNumber *number = [NSNumber numberWithInteger:type]; - [self handleResultWithValue:number command:command]; - }else{ - UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; - NSNumber *number = [NSNumber numberWithInteger:type]; - [self handleResultWithValue:number command:command]; - } -} - -#pragma mark - ios 10 APIs - --(void)addDismissActions:(CDVInvokedUrlCommand*)command{ - [self addActions:command dismiss:YES]; -} - --(void)addNotificationActions:(CDVInvokedUrlCommand*)command{ - [self addActions:command dismiss:NO]; -} - --(void)addActions:(CDVInvokedUrlCommand*)command dismiss:(BOOL)dimiss{ - NSArray *actionsData = [command argumentAtIndex:0]; - NSString *categoryId = [command argumentAtIndex:1]; - NSMutableArray *actions = [NSMutableArray array]; - for (NSDictionary *dict in actionsData) { - NSString *title = dict[@"title"]; - NSString *identifier = dict[@"identifier"]; - NSString *option = dict[@"option"]; - NSString *type = dict[@"type"]; - if ([type isEqualToString:@"textInput"]) { - NSString *textInputButtonTitle = dict[@"textInputButtonTitle"]; - NSString *textInputPlaceholder = dict[@"textInputPlaceholder"]; - UNTextInputNotificationAction *inputAction = [UNTextInputNotificationAction actionWithIdentifier:identifier title:title options:option.integerValue textInputButtonTitle:textInputButtonTitle textInputPlaceholder:textInputPlaceholder]; - [actions addObject:inputAction]; - } else { - UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:title title:title options:option.integerValue]; - [actions addObject:action]; - } - } - UNNotificationCategory *category; - if (dimiss) { - category = [UNNotificationCategory categoryWithIdentifier:categoryId - actions:actions - intentIdentifiers:@[] - options:UNNotificationCategoryOptionCustomDismissAction]; - } else { - category = [UNNotificationCategory categoryWithIdentifier:categoryId - actions:actions - intentIdentifiers:@[] - options:UNNotificationCategoryOptionNone]; - } - [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:category]]; -} - -#pragma mark - 内部方法 - -+(void)setupJPushSDK:(NSDictionary*)userInfo{ - NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"]; - if (plistPath == nil) { - NSLog(@"error: PushConfig.plist not found"); - assert(0); - } - - NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; - NSString *appkey = [plistData valueForKey:JPushConfig_Appkey]; - NSString *channel = [plistData valueForKey:JPushConfig_Channel]; - NSNumber *isProduction = [plistData valueForKey:JPushConfig_IsProduction]; - NSNumber *isIDFA = [plistData valueForKey:JPushConfig_IsIDFA]; - - NSString *advertisingId = nil; - if(isIDFA.boolValue) { - advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; - } - [JPUSHService setupWithOption:userInfo - appKey:appkey - channel:channel - apsForProduction:[isProduction boolValue] - advertisingIdentifier:advertisingId]; -} - -#pragma mark 将参数返回给js --(void)handleResultWithValue:(id)value command:(CDVInvokedUrlCommand*)command { - CDVPluginResult *result = nil; - CDVCommandStatus status = CDVCommandStatus_OK; - - if ([value isKindOfClass:[NSString class]]) { - value = [value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - } else if ([value isKindOfClass:[NSNull class]]) { - value = nil; - } - - if ([value isKindOfClass:[NSObject class]]) { - result = [CDVPluginResult resultWithStatus:status messageAsString:value];//NSObject 类型都可以 - } else { - NSLog(@"Cordova callback block returned unrecognized type: %@", NSStringFromClass([value class])); - result = nil; - } - - if (!result) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR]; - } - [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; -} - --(void)networkDidReceiveMessage:(NSNotification *)notification { - if (notification && notification.userInfo) { - [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveMessage - jsString:[notification.userInfo toJsonString]]; - } -} - -@end +#import "JPushPlugin.h" +#import "JPUSHService.h" +#import +#import +#import +#import "AppDelegate+JPush.h" +#import "JPushDefine.h" + +@implementation NSDictionary (JPush) +-(NSString*)toJsonString{ + NSError *error; + NSData *data = [NSJSONSerialization dataWithJSONObject:self options:0 error:&error]; + NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; + return jsonString; +} +@end + +@implementation NSString (JPush) +-(NSDictionary*)toDictionary{ + NSError *error; + NSData *jsonData = [self dataUsingEncoding:NSUTF8StringEncoding]; + NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; + return dict; +} +@end + +@interface JPushPlugin() + +@end + +@implementation JPushPlugin + +-(void)startJPushSDK:(CDVInvokedUrlCommand*)command{ + [(AppDelegate*)[UIApplication sharedApplication].delegate startJPushSDK]; +} + +#pragma mark- 外部接口 +-(void)stopPush:(CDVInvokedUrlCommand*)command{ + [[UIApplication sharedApplication]unregisterForRemoteNotifications]; +} + +-(void)resumePush:(CDVInvokedUrlCommand*)command{ + [(AppDelegate*)[UIApplication sharedApplication].delegate registerForRemoteNotification]; +} + +-(void)isPushStopped:(CDVInvokedUrlCommand*)command{ + NSNumber *result = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications] ? @(0) : @(1); + [self handleResultWithValue:result command:command]; +} + +-(void)initial:(CDVInvokedUrlCommand*)command{ + //do nithng,because Cordova plugin use lazy load mode. +} + +#ifdef __CORDOVA_4_0_0 + +- (void)pluginInitialize { + NSLog(@"### pluginInitialize "); + [self initPlugin]; +} + +#else + +- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{ + NSLog(@"### initWithWebView "); + if (self=[super initWithWebView:theWebView]) { + } + [self initPlugin]; + return self; +} + +#endif + +-(void)initPlugin{ + if (!SharedJPushPlugin) { + SharedJPushPlugin = self; + } + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(networkDidReceiveMessage:) + name:kJPFNetworkDidReceiveMessageNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(receiveLocalNotification:) + name:JPushDocumentEvent_ReceiveLocalNotification + object:nil]; +} + ++(void)fireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString{ + dispatch_async(dispatch_get_main_queue(), ^{ + [SharedJPushPlugin.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.%@',%@)", eventName, jsString]]; + }); +} + +-(void)setTags:(CDVInvokedUrlCommand*)command { + NSDictionary* params = [command.arguments objectAtIndex:0]; + NSNumber* sequence = params[@"sequence"]; + NSArray* tags = params[@"tags"]; + + [JPUSHService setTags:[NSSet setWithArray:tags] + completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; + [dic setObject:sequence forKey:@"sequence"]; + + CDVPluginResult* result; + + if (iResCode == 0) { + [dic setObject:[iTags allObjects] forKey:@"tags"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; + } else { + [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; + } + + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; + } seq:[sequence integerValue]]; +} + +-(void)addTags:(CDVInvokedUrlCommand *)command { + NSDictionary* params = [command.arguments objectAtIndex:0]; + NSNumber* sequence = params[@"sequence"]; + NSArray* tags = params[@"tags"]; + + [JPUSHService addTags:[NSSet setWithArray:tags] + completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; + [dic setObject:sequence forKey:@"sequence"]; + + CDVPluginResult* result; + + if (iResCode == 0) { + [dic setObject:[iTags allObjects] forKey:@"tags"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; + } else { + [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; + } + + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; + } seq:[sequence integerValue]]; +} + +-(void)deleteTags:(CDVInvokedUrlCommand *)command { + NSDictionary* params = [command.arguments objectAtIndex:0]; + NSNumber* sequence = params[@"sequence"]; + NSArray* tags = params[@"tags"]; + + [JPUSHService deleteTags:[NSSet setWithArray:tags] + completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; + [dic setObject:sequence forKey:@"sequence"]; + + CDVPluginResult* result; + + if (iResCode == 0) { + [dic setObject:[iTags allObjects] forKey:@"tags"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; + } else { + [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; + } + + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; + } seq:[sequence integerValue]]; +} + +-(void)cleanTags:(CDVInvokedUrlCommand *)command { + NSDictionary* params = [command.arguments objectAtIndex:0]; + NSNumber* sequence = params[@"sequence"]; + + [JPUSHService cleanTags:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; + [dic setObject:sequence forKey:@"sequence"]; + + CDVPluginResult* result; + + if (iResCode == 0) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; + } else { + [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; + } + + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; + } seq:[sequence integerValue]]; +} + +-(void)getAllTags:(CDVInvokedUrlCommand *)command { + NSDictionary* params = [command.arguments objectAtIndex:0]; + NSNumber* sequence = params[@"sequence"]; + + [JPUSHService getAllTags:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; + [dic setObject:sequence forKey:@"sequence"]; + + CDVPluginResult* result; + + if (iResCode == 0) { + [dic setObject:[iTags allObjects] forKey:@"tags"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; + } else { + [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; + } + + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; + } seq:[sequence integerValue]]; +} + +-(void)checkTagBindState:(CDVInvokedUrlCommand *)command { + NSDictionary* params = [command.arguments objectAtIndex:0]; + NSNumber* sequence = params[@"sequence"]; + NSString* tag = params[@"tag"]; + + [JPUSHService validTag:tag completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq, BOOL isBind) { + NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; + [dic setObject:sequence forKey:@"sequence"]; + + CDVPluginResult* result; + + if (iResCode == 0) { + [dic setObject:[iTags allObjects] forKey:@"tags"]; + [dic setObject:[NSNumber numberWithBool:isBind] forKey:@"isBind"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; + } else { + [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; + } + + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; + } seq:[sequence integerValue]]; +} + +-(void)setAlias:(CDVInvokedUrlCommand*)command { + NSDictionary* params = [command.arguments objectAtIndex:0]; + NSNumber* sequence = params[@"sequence"]; + NSString* alias = params[@"alias"]; + + [JPUSHService setAlias:alias completion:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { + NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; + [dic setObject:sequence forKey:@"sequence"]; + + CDVPluginResult* result; + + if (iResCode == 0) { + [dic setObject:iAlias forKey:@"alias"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; + + } else { + [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; + } + + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; + } seq:[sequence integerValue]]; +} + +-(void)deleteAlias:(CDVInvokedUrlCommand*)command { + NSDictionary* params = [command.arguments objectAtIndex:0]; + NSNumber* sequence = params[@"sequence"]; + + [JPUSHService deleteAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { + NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; + [dic setObject:sequence forKey:@"sequence"]; + + CDVPluginResult* result; + + if (iResCode == 0) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; + } else { + [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; + } + + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; + } seq:[sequence integerValue]]; +} + +-(void)getAlias:(CDVInvokedUrlCommand*)command { + NSDictionary* params = [command.arguments objectAtIndex:0]; + NSNumber* sequence = params[@"sequence"]; + + [JPUSHService getAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { + NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; + [dic setObject:sequence forKey:@"sequence"]; + + CDVPluginResult* result; + + if (iResCode == 0) { + [dic setObject:iAlias forKey:@"alias"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic]; + } else { + [dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"]; + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic]; + } + + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; + } seq:[sequence integerValue]]; +} + +-(void)getRegistrationID:(CDVInvokedUrlCommand*)command{ + NSString* registrationID = [JPUSHService registrationID]; + [self handleResultWithValue:registrationID command:command]; +} + +-(void)startLogPageView:(CDVInvokedUrlCommand*)command{ + NSString * pageName = [command argumentAtIndex:0]; + [JPUSHService startLogPageView:pageName]; +} + +-(void)stopLogPageView:(CDVInvokedUrlCommand*)command{ + NSString * pageName = [command argumentAtIndex:0]; + [JPUSHService stopLogPageView:pageName]; +} + +-(void)beginLogPageView:(CDVInvokedUrlCommand*)command{ + NSString *pageName = [command argumentAtIndex:0]; + NSNumber *duration = [command argumentAtIndex:1]; + [JPUSHService beginLogPageView:pageName duration:duration.intValue]; +} + +-(void)setBadge:(CDVInvokedUrlCommand*)command{ + NSNumber *badge = [command argumentAtIndex:0]; + [JPUSHService setBadge:badge.intValue]; +} + +-(void)resetBadge:(CDVInvokedUrlCommand*)command{ + [JPUSHService resetBadge]; +} + +-(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command{ + NSNumber *badge = [command argumentAtIndex:0]; + [UIApplication sharedApplication].applicationIconBadgeNumber = badge.intValue; +} + +-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command { + NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber; + NSNumber *number = [NSNumber numberWithInteger:num]; + [self handleResultWithValue:number command:command]; +} + +-(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{ + [JPUSHService setDebugMode]; +} + +-(void)setLogOFF:(CDVInvokedUrlCommand*)command{ + [JPUSHService setLogOFF]; +} + +-(void)crashLogON:(CDVInvokedUrlCommand*)command{ + [JPUSHService crashLogON]; +} + +-(void)setLocalNotification:(CDVInvokedUrlCommand*)command{ + NSNumber *delay = [command argumentAtIndex:0]; + NSString *alert = [command argumentAtIndex:1]; + NSNumber *badge = [command argumentAtIndex:2]; + NSString *idKey = [command argumentAtIndex:3]; + NSDictionary *userInfo = [command argumentAtIndex:4]; + + JPushNotificationContent *content = [[JPushNotificationContent alloc] init]; + + if (alert) { + content.body = alert; + } + + if (badge) { + content.badge = badge; + } + + if (userInfo) { + content.userInfo = userInfo; + } + + JPushNotificationTrigger *trigger = [[JPushNotificationTrigger alloc] init]; + if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) { + if (delay) { + trigger.timeInterval = [delay doubleValue]; + } + } else { + if (delay) { + trigger.fireDate = [NSDate dateWithTimeIntervalSinceNow:[[command argumentAtIndex:0] intValue]]; + } + } + + JPushNotificationRequest *request = [[JPushNotificationRequest alloc] init]; + request.content = content; + request.trigger = trigger; + + if (idKey) { + request.requestIdentifier = idKey; + } + + request.completionHandler = ^(id result) { + NSLog(@"result"); + }; + + [JPUSHService addNotification:request]; +} + +-(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{ + NSString *identifier = [command argumentAtIndex:0]; + JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new]; + jpid.identifiers = @[identifier]; + [JPUSHService removeNotification:jpid]; +} + +-(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{ + [JPUSHService removeNotification:nil]; +} + +-(void)setLocation:(CDVInvokedUrlCommand*)command{ + NSNumber *latitude = [command argumentAtIndex:0]; + NSNumber *longitude = [command argumentAtIndex:1]; + [JPUSHService setLatitude:latitude.doubleValue longitude:longitude.doubleValue]; +} + +-(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command{ + if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + WEAK_SELF(weakSelf); + [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + dict[@"authorizationStatus"] = @(settings.authorizationStatus); + dict[@"soundSetting"] = @(settings.soundSetting); + dict[@"badgeSetting"] = @(settings.badgeSetting); + dict[@"alertSetting"] = @(settings.alertSetting); + dict[@"notificationCenterSetting"] = @(settings.notificationCenterSetting); + dict[@"lockScreenSetting"] = @(settings.lockScreenSetting); + dict[@"carPlaySetting"] = @(settings.carPlaySetting); + dict[@"alertStyle"] = @(settings.alertStyle); + [weakSelf handleResultWithValue:dict command:command]; + }]; + }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { + UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings]; + UIUserNotificationType type = settings.types; + NSNumber *number = [NSNumber numberWithInteger:type]; + [self handleResultWithValue:number command:command]; + }else{ + UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; + NSNumber *number = [NSNumber numberWithInteger:type]; + [self handleResultWithValue:number command:command]; + } +} + +#pragma mark - ios 10 APIs + +-(void)addDismissActions:(CDVInvokedUrlCommand*)command{ + [self addActions:command dismiss:YES]; +} + +-(void)addNotificationActions:(CDVInvokedUrlCommand*)command{ + [self addActions:command dismiss:NO]; +} + +-(void)addActions:(CDVInvokedUrlCommand*)command dismiss:(BOOL)dimiss{ + NSArray *actionsData = [command argumentAtIndex:0]; + NSString *categoryId = [command argumentAtIndex:1]; + NSMutableArray *actions = [NSMutableArray array]; + for (NSDictionary *dict in actionsData) { + NSString *title = dict[@"title"]; + NSString *identifier = dict[@"identifier"]; + NSString *option = dict[@"option"]; + NSString *type = dict[@"type"]; + if ([type isEqualToString:@"textInput"]) { + NSString *textInputButtonTitle = dict[@"textInputButtonTitle"]; + NSString *textInputPlaceholder = dict[@"textInputPlaceholder"]; + UNTextInputNotificationAction *inputAction = [UNTextInputNotificationAction actionWithIdentifier:identifier title:title options:option.integerValue textInputButtonTitle:textInputButtonTitle textInputPlaceholder:textInputPlaceholder]; + [actions addObject:inputAction]; + } else { + UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:title title:title options:option.integerValue]; + [actions addObject:action]; + } + } + UNNotificationCategory *category; + if (dimiss) { + category = [UNNotificationCategory categoryWithIdentifier:categoryId + actions:actions + intentIdentifiers:@[] + options:UNNotificationCategoryOptionCustomDismissAction]; + } else { + category = [UNNotificationCategory categoryWithIdentifier:categoryId + actions:actions + intentIdentifiers:@[] + options:UNNotificationCategoryOptionNone]; + } + [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:category]]; +} + +#pragma mark - 内部方法 + ++(void)setupJPushSDK:(NSDictionary*)userInfo{ + NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"]; + if (plistPath == nil) { + NSLog(@"error: PushConfig.plist not found"); + assert(0); + } + + NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; + NSString *appkey = [plistData valueForKey:JPushConfig_Appkey]; + NSString *channel = [plistData valueForKey:JPushConfig_Channel]; + NSNumber *isProduction = [plistData valueForKey:JPushConfig_IsProduction]; + NSNumber *isIDFA = [plistData valueForKey:JPushConfig_IsIDFA]; + + NSString *advertisingId = nil; + if(isIDFA.boolValue) { + advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; + } + [JPUSHService setupWithOption:userInfo + appKey:appkey + channel:channel + apsForProduction:[isProduction boolValue] + advertisingIdentifier:advertisingId]; +} + +#pragma mark 将参数返回给js +-(void)handleResultWithValue:(id)value command:(CDVInvokedUrlCommand*)command { + CDVPluginResult *result = nil; + CDVCommandStatus status = CDVCommandStatus_OK; + + if ([value isKindOfClass:[NSString class]]) { + value = [value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + } else if ([value isKindOfClass:[NSNull class]]) { + value = nil; + } + + if ([value isKindOfClass:[NSObject class]]) { + result = [CDVPluginResult resultWithStatus:status messageAsString:value];//NSObject 类型都可以 + } else { + NSLog(@"Cordova callback block returned unrecognized type: %@", NSStringFromClass([value class])); + result = nil; + } + + if (!result) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR]; + } + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; +} + +-(void)networkDidReceiveMessage:(NSNotification *)notification { + if (notification && notification.userInfo) { + [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveMessage + jsString:[notification.userInfo toJsonString]]; + } +} + +-(void)receiveLocalNotification:(NSNotification *)notification { + if (notification && notification.object) { + [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveLocalNotification + jsString:[notification.object toJsonString]]; + } +} +@end