diff --git a/README.md b/README.md index 66844c1..d73138f 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,8 @@ ### iOS #### PushConfig.plist 文件中的字段都是什么意思? -- APP_KEY:应用标识。 -- CHANNEL:渠道标识。 +- Appkey:应用标识。 +- Channel:渠道标识。 - IsProduction:是否生产环境。 - IsIDFA:是否使用 IDFA 启动 SDK。 diff --git a/doc/iOS_API.md b/doc/iOS_API.md index 4c3b2c4..5efa852 100644 --- a/doc/iOS_API.md +++ b/doc/iOS_API.md @@ -267,7 +267,7 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。 #### event - jpush.backgroundNotification -应用程序处于后台时收到推送会触发该事件,可以在后台执行一段代码。具体配置参考 [iOS 7 Background Remote Notification](http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification) +应用程序处于后台时收到推送会触发该事件,可以在后台执行一段代码。具体配置参考 [iOS 7 Background Remote Notification](https://docs.jiguang.cn/jpush/client/iOS/ios_new_fetures/#ios-7-background-remote-notification) #### 代码示例 @@ -296,20 +296,6 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。 "_j_msgid":154604475 } -#### API - receiveMessageIniOSCallback - -用于 iOS 收到应用内消息的回调函数(请注意和通知的区别),该函数不需要主动调用 -不推荐使用回调函数 - -##### 接口定义 - - JPushPlugin.prototype.receiveMessageIniOSCallback(data) - -##### 参数说明 - -- data: 是一个 js 字符串使用如下代码解析,js 具体 key 根据应用内消息来确定: - - var bToObj = JSON.parse(data); ## 获取自定义消息内容 diff --git a/doc/iOS_install.md b/doc/iOS_install.md index 6a58f5c..8d5582b 100644 --- a/doc/iOS_install.md +++ b/doc/iOS_install.md @@ -1,35 +1,39 @@ ## iOS 手动安装 -- 下载 JPush PhoneGap Plugin 插件,并解压 +不建议使用手动安装,请参照 README.md 进行自动安装。 -- 将 [/src/ios](/src/ios) 文件夹及内容在 xcode 中拖到你的工程里,并配置 [/src/ios/PushConfig.plist](/src/ios/PushConfig.plist) 中相应参数: +1. 下载 JPush PhoneGap Plugin 插件,并解压 +2. 将 [/src/ios](/src/ios) 文件夹及内容在 xcode 中拖到你的工程里,并配置 [/src/ios/PushConfig.plist](/src/ios/PushConfig.plist) 中相应参数: - APP_KEY: 应用标识 - CHANNEL: 渠道标识 - IsProduction:是否生产环境 - IsIDFA: 是否使用 IDFA 启动 sdk + Appkey: 应用标识 + Channel: 渠道标识 + IsProduction:是否生产环境 + IsIDFA: 是否使用 IDFA 启动 sdk +3. 打开 xcode,点击工程目录中顶部的 工程,选择(Target -> Build Phases -> Link Binary With Libraries),添加以下框架: -- 打开 xcode,点击工程目录中顶部的 工程,选择(Target -> Build Phases -> Link Binary With Libraries),添加以下框架: + CFNetwork.framework + CoreFoundation.framework + CoreTelephony.framework + SystemConfiguration.framework + CoreGraphics.framework + Foundation.framework + UIKit.framework + AdSupport.framework + libz.tbd(若存在 libz.dylib 则替换为 libz.tbd) + UserNotifications.framework + libresolv.tbd +4. 修改 phonegap config.xml 文件以添加 JPushPlugin 插件 - CFNetwork.framework - CoreFoundation.framework - CoreTelephony.framework - SystemConfiguration.framework - CoreGraphics.framework - Foundation.framework - UIKit.framework - AdSupport.framework - libz.tbd(若存在 libz.dylib 则替换为 libz.tbd) +```xml + + + + +``` +5. 将 [/www/JPushPlugin.js](/www/JPushPlugin.js) 在 xcode 中拖到工程的 www 目录下面 +6. 在需要使用插件处加入以下代码,并根据 [iOS API](/doc/iOS_API.md) 文档说明调用相应接口 -- 修改 phonegap config.xml 文件以添加 JPushPlugin 插件 +```xml + +``` - - - - - -- 将 [/www/JPushPlugin.js](/www/JPushPlugin.js) 在 xcode 中拖到工程的 www 目录下面 - -- 在需要使用插件处加入以下代码,并根据 [iOS API](/doc/iOS_API.md) 文档说明调用相应接口 - - diff --git a/plugin.xml b/plugin.xml index e6f8d8b..ba51f47 100644 --- a/plugin.xml +++ b/plugin.xml @@ -32,11 +32,11 @@ - - - + + + @@ -49,9 +49,10 @@ + - + $API_KEY diff --git a/src/ios/Plugins/AppDelegate+JPush.h b/src/ios/Plugins/AppDelegate+JPush.h index 30219cc..5420b50 100644 --- a/src/ios/Plugins/AppDelegate+JPush.h +++ b/src/ios/Plugins/AppDelegate+JPush.h @@ -1,15 +1,15 @@ -// -// AppDelegate+JPush.h -// delegateExtention -// -// Created by 张庆贺 on 15/8/3. -// Copyright (c) 2015年 JPush. All rights reserved. -// - -#import "AppDelegate.h" -#import -#import "JPUSHService.h" - -@interface AppDelegate (JPush) --(void)registerForIos10RemoteNotification; -@end +// +// AppDelegate+JPush.h +// delegateExtention +// +// Created by pikacode@qq.com on 15/8/3. +// Copyright (c) 2015年 JPush. All rights reserved. +// + +#import "AppDelegate.h" +#import +#import "JPUSHService.h" + +@interface AppDelegate (JPush) +-(void)registerForRemoteNotification; +@end diff --git a/src/ios/Plugins/AppDelegate+JPush.m b/src/ios/Plugins/AppDelegate+JPush.m index 2a18ee0..f01a1fc 100644 --- a/src/ios/Plugins/AppDelegate+JPush.m +++ b/src/ios/Plugins/AppDelegate+JPush.m @@ -1,101 +1,132 @@ -// -// AppDelegate+JPush.m -// delegateExtention -// -// Created by 张庆贺 on 15/8/3. -// Copyright (c) 2015年 JPush. All rights reserved. -// - -#import "AppDelegate+JPush.h" -#import "JPushPlugin.h" -#import -#import -#import - - - -@implementation AppDelegate (JPush) - -+(void)load{ - - Method origin; - Method swizzle; - - origin=class_getInstanceMethod([self class],@selector(init)); - swizzle=class_getInstanceMethod([self class], @selector(init_plus)); - method_exchangeImplementations(origin, swizzle); -} - --(instancetype)init_plus{ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:UIApplicationDidFinishLaunchingNotification object:nil]; - return [self init_plus]; -} - --(void)applicationDidLaunch:(NSNotification *)notification{ - if (notification) { - [self registerForIos10RemoteNotification]; - [JPushPlugin setLaunchOptions:notification.userInfo]; - } -} - -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - [JPUSHService registerDeviceToken:deviceToken]; -} - --(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ - [JPUSHService handleRemoteNotification:userInfo]; - [[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveNotification object:userInfo]; -} - --(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ - [JPUSHService handleRemoteNotification:userInfo]; - [[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveNotification object:userInfo]; - completionHandler(UIBackgroundFetchResultNewData); -} - -- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { - [JPUSHService showLocalNotificationAtFront:notification identifierKey:nil]; -} - -- (void)applicationWillEnterForeground:(UIApplication *)application { - // [application setApplicationIconBadgeNumber:0]; - // [application cancelAllLocalNotifications]; -} - -- (void)applicationDidEnterBackground:(UIApplication *)application { - // [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; -} - --(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{ - - NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo]; - - [userInfo setValue:kJPushPluginiOS10ForegroundReceiveNotification forKey:@"JPushNotificationType"]; - - [[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginiOS10ForegroundReceiveNotification object:userInfo]; - - completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); -} - --(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{ - NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:response.notification.request.content.userInfo]; - @try { - [userInfo setValue:[response valueForKey:@"userText"] forKey:@"userText"]; - } @catch (NSException *exception) { } - [userInfo setValue:response.actionIdentifier forKey:@"actionIdentifier"]; - [userInfo setValue:kJPushPluginiOS10ClickNotification forKey:@"JPushNotificationType"]; - [[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginiOS10ClickNotification object:userInfo]; - completionHandler(); -} - --(void)registerForIos10RemoteNotification{ - if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { -#ifdef NSFoundationVersionNumber_iOS_9_x_Max - JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init]; - entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound; - [JPUSHService registerForRemoteNotificationConfig:entity delegate:self]; -#endif - } -} - -@end +// +// AppDelegate+JPush.m +// delegateExtention +// +// Created by pikacode@qq.com on 15/8/3. +// Copyright (c) 2015年 JPush. All rights reserved. +// + +#import "AppDelegate+JPush.h" +#import "JPushPlugin.h" +#import +#import +#import +#import "JPushDefine.h" + +@implementation AppDelegate (JPush) + ++(void)load{ + Method origin1; + Method swizzle1; + origin1 = class_getInstanceMethod([self class],@selector(init)); + swizzle1 = class_getInstanceMethod([self class], @selector(init_plus)); + method_exchangeImplementations(origin1, swizzle1); +} + +-(instancetype)init_plus{ + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:UIApplicationDidFinishLaunchingNotification object:nil]; + return [self init_plus]; +} + + + +-(void)applicationDidLaunch:(NSNotification *)notification{ + if (notification) { + if (notification.userInfo) { + NSDictionary *userInfo1 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; + if (userInfo1.count > 0) { + [SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo1 toJsonString]]; + } + NSDictionary *userInfo2 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]; + if (userInfo2.count > 0) { + [SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_OpenLocalNotification jsString:[userInfo1 toJsonString]]; + } + } + [JPUSHService setDebugMode]; + [self registerForRemoteNotification]; + [JPushPlugin setupJPushSDK:notification.userInfo]; + } +} + +-(void)registerForRemoteNotification{ + if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { +#ifdef NSFoundationVersionNumber_iOS_9_x_Max + JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init]; + entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound; + [JPUSHService registerForRemoteNotificationConfig:entity delegate:self]; +#endif + }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { + //可以添加自定义categories + [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | + UIUserNotificationTypeSound | + UIUserNotificationTypeAlert) + categories:nil]; + } else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){ + //categories 必须为nil + [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | + UIRemoteNotificationTypeSound | + UIRemoteNotificationTypeAlert) + categories:nil]; + } +} + +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + [JPUSHService registerDeviceToken:deviceToken]; +} + +-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ + [JPUSHService handleRemoteNotification:userInfo]; + + [SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]]; +} + +-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ + [JPUSHService handleRemoteNotification:userInfo]; + NSString *eventName; + switch ([UIApplication sharedApplication].applicationState) { + case UIApplicationStateInactive: + eventName = JPushDocumentEvent_OpenNotification; + break; + case UIApplicationStateActive: + eventName = JPushDocumentEvent_ReceiveNotification; + break; + case UIApplicationStateBackground: + eventName = JPushDocumentEvent_BackgoundNotification; + break; + default: + break; + } + [SharedJPushPlugin jpushFireDocumentEvent:eventName jsString:[userInfo toJsonString]]; + completionHandler(UIBackgroundFetchResultNewData); +} + +-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{ + NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo]; + [SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]]; + completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); +} + +-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{ + NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:response.notification.request.content.userInfo]; + @try { + [userInfo setValue:[response valueForKey:@"userText"] forKey:@"userText"]; + } @catch (NSException *exception) { } + [userInfo setValue:response.actionIdentifier forKey:@"actionIdentifier"]; + [SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo toJsonString]]; + completionHandler(); +} + +- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { + // [[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveLocalNotification object:notification.userInfo]; +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // [application setApplicationIconBadgeNumber:0]; + // [application cancelAllLocalNotifications]; +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; +} + +@end diff --git a/src/ios/Plugins/JPushDefine.h b/src/ios/Plugins/JPushDefine.h new file mode 100644 index 0000000..002721c --- /dev/null +++ b/src/ios/Plugins/JPushDefine.h @@ -0,0 +1,31 @@ +// +// ConstantDef.h +// jmessage +// +// Created by pikacode@qq.com on 16/1/19. +// +// + +#ifndef ConstantDef_h +#define ConstantDef_h + + + +#endif /* ConstantDef_h */ + +#define WEAK_SELF(weakSelf) __weak __typeof(&*self)weakSelf = self; + +static NSString *const JPushConfig_Appkey = @"Appkey"; +static NSString *const JPushConfig_Channel = @"Channel"; +static NSString *const JPushConfig_IsProduction = @"IsProduction"; +static NSString *const JPushConfig_IsIDFA = @"IsIDFA"; +static NSString *const JPushConfig_FileName = @"PushConfig"; + +static NSString *const JPushDocumentEvent_ReceiveNotification = @"receiveNotification"; +static NSString *const JPushDocumentEvent_OpenNotification = @"openNotification"; +static NSString *const JPushDocumentEvent_BackgoundNotification = @"backgoundNotification"; +static NSString *const JPushDocumentEvent_SetTagsWithAlias = @"setTagsWithAlias"; +static NSString *const JPushDocumentEvent_ReceiveMessage = @"receiveMessage"; +static NSString *const JPushDocumentEvent_OpenLocalNotification = @"openLocalNotification"; + + diff --git a/src/ios/Plugins/JPushPlugin.h b/src/ios/Plugins/JPushPlugin.h index abbb0e1..a0869f6 100644 --- a/src/ios/Plugins/JPushPlugin.h +++ b/src/ios/Plugins/JPushPlugin.h @@ -1,80 +1,91 @@ -// -// PushTalkPlugin.h -// PushTalk -// -// Created by zhangqinghe on 13-12-13. -// -// - -#import - -#define kJPushPluginReceiveNotification @"JPushPluginReceiveNofication" -#define kJPushPluginiOS10ForegroundReceiveNotification @"kJPushPluginiOS10ForegroundReceiveNotification" -#define kJPushPluginiOS10ClickNotification @"kJPushPluginiOS10ClickNotification" - - -@interface JPushPlugin : CDVPlugin{ - -} - -+(void)setLaunchOptions:(NSDictionary *)theLaunchOptions; - -//以下为js中可调用接口 -//设置标签、别名 --(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command; --(void)setTags:(CDVInvokedUrlCommand*)command; --(void)setAlias:(CDVInvokedUrlCommand*)command; - -//获取 RegistrationID --(void)getRegistrationID:(CDVInvokedUrlCommand*)command; - -//页面统计 --(void)startLogPageView:(CDVInvokedUrlCommand*)command; --(void)stopLogPageView:(CDVInvokedUrlCommand*)command; --(void)beginLogPageView:(CDVInvokedUrlCommand*)command; - -//设置角标到服务器,服务器下一次发消息时,会设置成这个值 -//本接口不会改变应用本地的角标值. --(void)setBadge:(CDVInvokedUrlCommand*)command; -//相当于 [setBadge:0] --(void)resetBadge:(CDVInvokedUrlCommand*)command; - -//应用本地的角标值设置/获取 --(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command; --(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command; - -//停止与恢复推送 --(void)stopPush:(CDVInvokedUrlCommand*)command; --(void)resumePush:(CDVInvokedUrlCommand*)command; --(void)isPushStopped:(CDVInvokedUrlCommand*)command; - -//开关日志 --(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command; --(void)setLogOFF:(CDVInvokedUrlCommand*)command; --(void)crashLogON:(CDVInvokedUrlCommand*)command; - -//本地推送 --(void)setLocalNotification:(CDVInvokedUrlCommand*)command; --(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command; --(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command; - -//地理位置上报 [latitude,longitude] --(void)setLocation:(CDVInvokedUrlCommand*)command; - -//检查用户的推送设置情况 --(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command; - -//ios 10 APIs --(void)addDismissActions:(CDVInvokedUrlCommand*)command; --(void)addNotificationActions:(CDVInvokedUrlCommand*)command; - -/* - * 以下为js中可监听到的事件 - * jpush.openNotification 点击推送消息启动或唤醒app - * jpush.setTagsWithAlias 设置标签、别名完成 - * jpush.receiveMessage 收到自定义消息 - * jpush.receiveNotification 前台收到推送 - * jpush.backgroundNotification 后台收到推送 - */ - -@end +// +// PushTalkPlugin.h +// PushTalk +// +// Created by pikacode@qq.com on 13-12-13. +// +// + +#import + +@interface JPushPlugin : CDVPlugin{ + +} + +//以下为js中可调用接口 +//设置标签、别名 +-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command; +-(void)setTags:(CDVInvokedUrlCommand*)command; +-(void)setAlias:(CDVInvokedUrlCommand*)command; + +//获取 RegistrationID +-(void)getRegistrationID:(CDVInvokedUrlCommand*)command; + +//页面统计 +-(void)startLogPageView:(CDVInvokedUrlCommand*)command; +-(void)stopLogPageView:(CDVInvokedUrlCommand*)command; +-(void)beginLogPageView:(CDVInvokedUrlCommand*)command; + +//设置角标到服务器,服务器下一次发消息时,会设置成这个值 +//本接口不会改变应用本地的角标值. +-(void)setBadge:(CDVInvokedUrlCommand*)command; +//相当于 [setBadge:0] +-(void)resetBadge:(CDVInvokedUrlCommand*)command; + +//应用本地的角标值设置/获取 +-(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command; +-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command; + +//停止与恢复推送 +-(void)stopPush:(CDVInvokedUrlCommand*)command; +-(void)resumePush:(CDVInvokedUrlCommand*)command; +-(void)isPushStopped:(CDVInvokedUrlCommand*)command; + +//开关日志 +-(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command; +-(void)setLogOFF:(CDVInvokedUrlCommand*)command; +-(void)crashLogON:(CDVInvokedUrlCommand*)command; + +//本地推送 +-(void)setLocalNotification:(CDVInvokedUrlCommand*)command; +-(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command; +-(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command; + +//地理位置上报 [latitude,longitude] +-(void)setLocation:(CDVInvokedUrlCommand*)command; + +//检查用户的推送设置情况 +-(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command; + +//ios 10 APIs +-(void)addDismissActions:(CDVInvokedUrlCommand*)command; +-(void)addNotificationActions:(CDVInvokedUrlCommand*)command; + +/* + * 以下为js中可监听到的事件 + * jpush.openNotification 点击推送消息启动或唤醒app + * jpush.setTagsWithAlias 设置标签、别名完成 + * jpush.receiveMessage 收到自定义消息 + * jpush.receiveNotification 前台收到推送 + * jpush.backgroundNotification 后台收到推送 + */ + +# pragma mark - private + +-(void)jpushFireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString; + ++(void)setupJPushSDK:(NSDictionary*)userInfo; + +@end + +static JPushPlugin *SharedJPushPlugin; + +@interface NSDictionary (JPush) +-(NSString*)toJsonString; +@end + +@interface NSString (JPush) +-(NSDictionary*)toDictionary; +@end + + diff --git a/src/ios/Plugins/JPushPlugin.m b/src/ios/Plugins/JPushPlugin.m index 64feb98..e659c66 100644 --- a/src/ios/Plugins/JPushPlugin.m +++ b/src/ios/Plugins/JPushPlugin.m @@ -1,484 +1,318 @@ -// -// PushTalkPlugin.m -// PushTalk -// -// Created by zhangqinghe on 13-12-13. -// -// - -#import "JPushPlugin.h" -#import "JPUSHService.h" -#import -#import -#import -#import "AppDelegate+JPush.h" - -static NSString *const JP_APP_KEY = @"APP_KEY"; -static NSString *const JP_APP_CHANNEL = @"CHANNEL"; -static NSString *const JP_APP_ISPRODUCTION = @"IsProduction"; -static NSString *const JP_APP_ISIDFA = @"IsIDFA"; -static NSString *const JPushConfigFileName = @"PushConfig"; -static NSDictionary *_launchOptions = nil; - -#define WEAK_SELF(weakSelf) __weak __typeof(&*self)weakSelf = self; - -@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 - -#pragma mark- 外部接口 --(void)stopPush:(CDVInvokedUrlCommand*)command{ - [[UIApplication sharedApplication]unregisterForRemoteNotifications]; -} - --(void)resumePush:(CDVInvokedUrlCommand*)command{ - [JPushPlugin registerForRemoteNotification]; -} - --(void)isPushStopped:(CDVInvokedUrlCommand*)command{ - NSNumber *result; - if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) { - result = @(0); - }else{ - result = @(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 initNotifications]; -} - -#else - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{ - NSLog(@"### initWithWebView "); - if (self=[super initWithWebView:theWebView]) { - [self initNotifications]; - } - return self; -} - - -#endif - --(void)initNotifications { - NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; - [defaultCenter addObserver:self - selector:@selector(networkDidReceiveMessage:) - name:kJPFNetworkDidReceiveMessageNotification - object:nil]; - - [defaultCenter addObserver:self - selector:@selector(networkDidReceiveNotification:) - name:kJPushPluginReceiveNotification - object:nil]; - - [defaultCenter addObserver:self - selector:@selector(networkDidReceiveNotification:) - name:kJPushPluginiOS10ForegroundReceiveNotification - object:nil]; - - [defaultCenter addObserver:self - selector:@selector(networkDidReceiveNotification:) - name:kJPushPluginiOS10ClickNotification - object:nil]; - - - if (_launchOptions) { - NSDictionary *userInfo = [_launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; - if ([userInfo count] >0) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.openNotification',%@)",[userInfo toJsonString]]]; - }); - } - - } -} - --(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{ - NSArray *arguments = command.arguments; - NSString *alias; - NSArray *tags; - if (!arguments || [arguments count] < 2) { - NSLog(@"#### setTagsWithAlias param is less"); - return ; - }else{ - alias = arguments[0]; - tags = arguments[1]; - } - - NSLog(@"#### setTagsWithAlias alias is %@, tags is %@",alias,tags); - - [JPUSHService setTags:[NSSet setWithArray:tags] - alias:alias - callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) - object:self]; -} - --(void)setTags:(CDVInvokedUrlCommand *)command{ - - NSArray *tags = command.arguments; - - NSLog(@"#### setTags %@",tags); - - [JPUSHService setTags:[NSSet setWithArray:tags] - callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) - object:self]; - -} - --(void)setAlias:(CDVInvokedUrlCommand *)command{ - - NSLog(@"#### setAlias %@",command.arguments); - [JPUSHService setAlias:command.arguments[0] - callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) - object:self]; -} - --(void)getRegistrationID:(CDVInvokedUrlCommand*)command{ - NSString* registrationID = [JPUSHService registrationID]; - NSLog(@"### getRegistrationID %@",registrationID); - [self handleResultWithValue:registrationID command:command]; -} - --(void)startLogPageView:(CDVInvokedUrlCommand*)command{ - NSArray *arguments = command.arguments; - if (!arguments || [arguments count] < 1) { - NSLog(@"startLogPageView argument error"); - return ; - } - NSString * pageName = arguments[0]; - if (pageName) { - [JPUSHService startLogPageView:pageName]; - } -} - --(void)stopLogPageView:(CDVInvokedUrlCommand*)command{ - NSArray *arguments = command.arguments; - if (!arguments || [arguments count] < 1) { - NSLog(@"stopLogPageView argument error"); - return ; - } - NSString * pageName = arguments[0]; - if (pageName) { - [JPUSHService stopLogPageView:pageName]; - } - -} - --(void)beginLogPageView:(CDVInvokedUrlCommand*)command{ - NSArray *arguments = command.arguments; - if (!arguments || [arguments count] < 2) { - NSLog(@"beginLogPageView argument error"); - return ; - } - NSString * pageName = arguments[0]; - int duration = [arguments[0] intValue]; - if (pageName) { - [JPUSHService beginLogPageView:pageName duration:duration]; - } -} - --(void)setBadge:(CDVInvokedUrlCommand*)command{ - NSArray *argument = command.arguments; - if ([argument count] < 1) { - NSLog(@"setBadge argument error!"); - return; - } - NSNumber *badge = argument[0]; - [JPUSHService setBadge:[badge intValue]]; -} - --(void)resetBadge:(CDVInvokedUrlCommand*)command{ - [JPUSHService resetBadge]; -} - --(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command{ - // - NSArray *argument = command.arguments; - if ([argument count] < 1) { - NSLog(@"setBadge argument error!"); - return; - } - NSNumber *badge = [argument objectAtIndex: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{ - NSArray *arguments = command.arguments; - NSDate *date = arguments[0] == [NSNull null] ? nil : [NSDate dateWithTimeIntervalSinceNow:[((NSString*)arguments[0]) intValue]]; - NSString *alertBody = arguments[1] == [NSNull null] ? nil : (NSString*)arguments[1]; - int badge = arguments[2] == [NSNull null] ? 0 : [(NSString*)arguments[2] intValue]; - NSString *idKey = arguments[3] == [NSNull null] ? nil : (NSString*)arguments[3]; - NSDictionary *dict = arguments[4] == [NSNull null] ? nil : (NSDictionary*)arguments[4]; - [JPUSHService setLocalNotification:date alertBody:alertBody badge:badge alertAction:nil identifierKey:idKey userInfo:dict soundName:nil]; -} - --(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{ - NSString *identifier = [command argumentAtIndex:0]; - if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0) { - JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new]; - jpid.identifiers = @[identifier]; - [JPUSHService removeNotification:jpid]; - }else{ - [JPUSHService deleteLocalNotificationWithIdentifierKey:identifier]; - } -} - --(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{ - [JPUSHService clearAllLocalNotifications]; -} - --(void)setLocation:(CDVInvokedUrlCommand*)command{ - [JPUSHService setLatitude:[((NSString*)command.arguments[0]) doubleValue] longitude:[((NSString*)command.arguments[1]) 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)setLaunchOptions:(NSDictionary *)theLaunchOptions{ - _launchOptions = theLaunchOptions; - - [JPUSHService setDebugMode]; - - [JPushPlugin registerForRemoteNotification]; - - //read appkey and channel from PushConfig.plist - NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfigFileName ofType:@"plist"]; - if (plistPath == nil) { - NSLog(@"error: PushConfig.plist not found"); - assert(0); - } - - NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; - NSString * appkey = [plistData valueForKey:JP_APP_KEY]; - NSString * channel = [plistData valueForKey:JP_APP_CHANNEL]; - NSNumber * isProduction = [plistData valueForKey:JP_APP_ISPRODUCTION]; - NSNumber *isIDFA = [plistData valueForKey:JP_APP_ISIDFA]; - - NSString *advertisingId = nil; - if(isIDFA){ - advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; - } - [JPUSHService setupWithOption:_launchOptions - appKey:appkey - channel:channel - apsForProduction:[isProduction boolValue] - advertisingIdentifier:advertisingId]; - -} - -+(void)registerForRemoteNotification{ - [(AppDelegate*)[UIApplication sharedApplication].delegate registerForIos10RemoteNotification]; - - if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { - //可以添加自定义categories - [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | - UIUserNotificationTypeSound | - UIUserNotificationTypeAlert) - categories:nil]; - } else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){ - //categories 必须为nil - [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | - UIRemoteNotificationTypeSound | - UIRemoteNotificationTypeAlert) - categories:nil]; - } -} - -#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]; -} - -#pragma mark 设置标签及别名回调 --(void)tagsWithAliasCallback:(int)resultCode tags:(NSSet *)tags alias:(NSString *)alias{ - NSDictionary *dict = @{@"resultCode":[NSNumber numberWithInt:resultCode], - @"tags" :tags == nil ? [NSNull null] : [tags allObjects], - @"alias" :alias == nil ? [NSNull null] : alias - }; - dispatch_async(dispatch_get_main_queue(), ^{ - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.setTagsWithAlias',%@)",[dict toJsonString]]]; - }); -} - -- (void)networkDidReceiveMessage:(NSNotification *)notification { - if (notification) { - dispatch_async(dispatch_get_main_queue(), ^{ - - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.receiveMessage',%@)",[notification.userInfo toJsonString]]]; - - [self.commandDelegate evalJs:[NSString stringWithFormat:@"window.plugins.jPushPlugin.receiveMessageIniOSCallback('%@')",[notification.userInfo toJsonString]]]; - - }); - } -} - --(void)networkDidReceiveNotification:(NSNotification *)notification{ - - NSError *error; - NSDictionary *userInfo = [notification object]; - - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:&error]; - NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; - - switch ([UIApplication sharedApplication].applicationState) { - case UIApplicationStateActive:{ - //前台收到 - dispatch_async(dispatch_get_main_queue(), ^{ - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.receiveNotification',%@)",jsonString]]; - }); - break; - } - case UIApplicationStateInactive:{ - //后台点击 - dispatch_async(dispatch_get_main_queue(), ^{ - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.openNotification',%@)",jsonString]]; - }); - break; - } - case UIApplicationStateBackground:{ - //后台收到 - dispatch_async(dispatch_get_main_queue(), ^{ - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.backgoundNotification',%@)",jsonString]]; - }); - break; - } - default: - //do nothing - break; - } - -} - -@end +// +// PushTalkPlugin.m +// PushTalk +// +// Created by pikacode@qq.com on 13-12-13. +// +// + +#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 + +#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 "); + SharedJPushPlugin = self; +} + +#else + +- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{ + NSLog(@"### initWithWebView "); + if (self=[super initWithWebView:theWebView]) { + } + return self; +} + +#endif + +-(void)jpushFireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString{ + dispatch_async(dispatch_get_main_queue(), ^{ + [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.%@',%@)", eventName, jsString]]; + }); +} + +-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{ + NSString *alias = [command argumentAtIndex:0]; + NSArray *tags = [command argumentAtIndex:1]; + [JPUSHService setTags:[NSSet setWithArray:tags] + alias:alias + callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) + object:self]; +} + +-(void)setTags:(CDVInvokedUrlCommand *)command{ + NSArray *tags = command.arguments; + [JPUSHService setTags:[NSSet setWithArray:tags] + callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) + object:self]; +} + +-(void)setAlias:(CDVInvokedUrlCommand *)command{ + NSString *alias = [command argumentAtIndex:0]; + [JPUSHService setAlias:alias + callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) + object:self]; +} + +-(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 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){ + 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]; +} + +#pragma mark 设置标签及别名回调 +-(void)tagsWithAliasCallback:(int)resultCode tags:(NSSet *)tags alias:(NSString *)alias{ + NSDictionary *dict = @{@"resultCode":[NSNumber numberWithInt:resultCode], + @"tags" :tags == nil ? [NSNull null] : [tags allObjects], + @"alias" :alias == nil ? [NSNull null] : alias + }; + [self jpushFireDocumentEvent:JPushDocumentEvent_SetTagsWithAlias jsString:[dict toJsonString]]; +} + +- (void)networkDidReceiveMessage:(NSNotification *)notification { + if (notification && notification.userInfo) { + [self jpushFireDocumentEvent:JPushDocumentEvent_ReceiveMessage jsString:[notification.userInfo toJsonString]]; + } +} + +@end diff --git a/src/ios/PushConfig.plist b/src/ios/PushConfig.plist index 99b470f..3dc78da 100644 --- a/src/ios/PushConfig.plist +++ b/src/ios/PushConfig.plist @@ -2,9 +2,9 @@ - APP_KEY + Appkey - CHANNEL + Channel Subscription IsProduction diff --git a/src/ios/lib/JPUSHService.h b/src/ios/lib/JPUSHService.h index f552234..e5424a3 100644 --- a/src/ios/lib/JPUSHService.h +++ b/src/ios/lib/JPUSHService.h @@ -9,7 +9,7 @@ * Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved. */ -#define JPUSH_VERSION_NUMBER 2.1.9 +#define JPUSH_VERSION_NUMBER 2.2.0 #import diff --git a/src/ios/lib/jpush-ios-2.1.9.a b/src/ios/lib/jpush-ios-2.2.0.a similarity index 51% rename from src/ios/lib/jpush-ios-2.1.9.a rename to src/ios/lib/jpush-ios-2.2.0.a index 5bda39b..9e48b2d 100644 Binary files a/src/ios/lib/jpush-ios-2.1.9.a and b/src/ios/lib/jpush-ios-2.2.0.a differ diff --git a/www/JPushPlugin.js b/www/JPushPlugin.js index a2e443e..a7e8dcc 100644 --- a/www/JPushPlugin.js +++ b/www/JPushPlugin.js @@ -165,17 +165,6 @@ JPushPlugin.prototype.setLocation = function (latitude, longitude) { } } -JPushPlugin.prototype.receiveMessageIniOSCallback = function (data) { - try { - console.log('JPushPlugin:receiveMessageIniOSCallback--data:' + data) - var bToObj = JSON.parse(data) - var content = bToObj.content - console.log(content) - } catch(exception) { - console.log('JPushPlugin:receiveMessageIniOSCallback' + exception) - } -} - JPushPlugin.prototype.startLogPageView = function (pageName) { if (this.isPlatformIOS()) { this.call_native('startLogPageView', [pageName], null)