diff --git a/README.md b/README.md index cc9c481..f88ae5c 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,13 @@ > QQ 交流群:413602425。 -## 集成步骤 +## Install - 通过 Cordova Plugins 安装,要求 Cordova CLI 5.0+: cordova plugin add jpush-phonegap-plugin --variable API_KEY=your_jpush_appkey -- 或者直接通过 url 安装: +- 或直接通过 url 安装: cordova plugin add https://github.com/jpush/jpush-phonegap-plugin.git --variable API_KEY=your_jpush_appkey @@ -28,61 +28,47 @@ cordova plugin add Your_Plugin_Path --variable API_KEY=your_jpush_appkey -## Demo +## Usage +### API +- [公共 API](/doc/Common_detail_api.md) +- [iOS API](/doc/iOS_API.md) +- [Android API](/doc/Android_detail_api.md) + +### Demo 插件项目中包含一个简单的 Demo。若想参考,可以在 */example* 文件夹内找到并拷贝以下文件: - src/example/index.html -> www/index.html - src/example/css/* -> www/css - src/example/js/* -> www/js - -## 关于 PhoneGap build 云服务 + example/index.html -> www/index.html + example/css/* -> www/css + example/js/* -> www/js +### 关于 PhoneGap build 云服务 该项目基于 Cordova 实现,目前无法使用 PhoneGap build 云服务进行打包,建议使用本地环境进行打包。 -## API 说明 - -插件的 API 在 JPushPlugin.js 文件中,该文件的具体位置如下: -### Android - [Project]/assets/www/plugins/cn.jpush.phonegap.JPushPlugin/www - -### iOS - [Project]/www/plugins/cn.jpush.phonegap.JPushPlugin/www - -### 具体的 API 请参考: - -- [公共 API](/doc/Common_detail_api.md)。 - -- [iOS API](/doc/iOS_API.md)。 - -- [Android API](/doc/Android_detail_api.md)。 - - -## 常见问题 - -若要使用 CLI 来编译项目,注意应使用 cordova compile 而不是 cordova build 命令,因为如果修改了插件安装时默认写入到 AndroidManifest.xml -中的代码,cordova build 可能会导致对 AndroidManifest.xml 的修改。 -Cordova CLI 的具体用法可参考 [Cordova CLI 官方文档](https://cordova.apache.org/docs/en/latest/reference/cordova-cli/index.html)。 +## FAQ +> 如果遇到了疑问,请优先参考 Demo 和 API 文档。若还无法解决,可访问[极光社区](http://community.jiguang.cn/)或 [Issues](https://github.com/jpush/jpush-phonegap-plugin/issues) 提问。 ### Android - -- Eclipse 中 import PhoneGap 工程之后出现:*Type CallbackContext cannot be resolved to a type*。 - - 解决方案:Eclipse 中右键单击工程名,Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add。 +#### 在 Eclipse 中 import 工程之后出现:*Type CallbackContext cannot be resolved to a type*。 +右键单击工程名 -> Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add。 ### iOS +#### PushConfig.plist 文件中的字段都是什么意思? +- APP_KEY:应用标识。 +- CHANNEL:渠道标识。 +- IsProduction:是否生产环境。 +- IsIDFA:是否使用 IDFA 启动 SDK。 -- 设置 PushConfig.plist: - - APP_KEY:应用标识。 - - CHANNEL:渠道标识。 - - IsProduction:是否生产环境。 - - IsIDFA:是否使用 IDFA 启动 SDK。 +#### 收不到推送了。 +请首先按照正确方式再次配置证书、描述文件,具体可参考 [iOS 证书设置指南](http://docs.jpush.io/client/ios_tutorials/#ios_1)。 -- 收不到推送: - 请首先按照正确方式再次配置证书、描述文件,具体可参考 [iOS 证书设置指南](http://docs.jpush.io/client/ios_tutorials/#ios_1)。 +## Support +- QQ 群:413602425 +- [JPush 官网文档](http://docs.jpush.io/) +- [极光社区](http://community.jiguang.cn/) +## Contribute +Please contribute! [Look at the issues](https://github.com/jpush/jpush-phonegap-plugin/issues). -## 更多 -- QQ 群:413602425; -- [JPush 官网文档](http://docs.jpush.io/); -- 如有问题可访问[极光社区](http://community.jiguang.cn/)。 +## License +MIT © [JiGuang](/license) diff --git a/license b/license new file mode 100644 index 0000000..1221272 --- /dev/null +++ b/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) JiGuang (jiguang.cn) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/package.json b/package.json index d7149c1..d4bff13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jpush-phonegap-plugin", - "version": "2.2.5", + "version": "2.2.6", "description": "JPush for cordova plugin", "cordova": { "id": "jpush-phonegap-plugin", @@ -30,8 +30,8 @@ "peerDependencies": { "cordova-plugin-device": ">=1.0.0" }, - "author": "jpush", - "license": "Apache 2.0 License", + "author": "JiGuang", + "license": "MIT", "bugs": { "url": "https://github.com/jpush/jpush-phonegap-plugin/issues" }, diff --git a/plugin.xml b/plugin.xml index 9df7838..87b766d 100644 --- a/plugin.xml +++ b/plugin.xml @@ -2,13 +2,13 @@ + version="2.2.5"> JPush Plugin JPush for cordova plugin JPush JPush,push - Apache 2.0 License + MIT License @@ -34,7 +34,7 @@ - + @@ -48,6 +48,8 @@ + + $API_KEY @@ -166,12 +168,12 @@ - - - - - - + + + + + + diff --git a/src/android/JPushPlugin.java b/src/android/JPushPlugin.java index c68f70b..6c1f142 100644 --- a/src/android/JPushPlugin.java +++ b/src/android/JPushPlugin.java @@ -89,10 +89,10 @@ public class JPushPlugin extends CordovaPlugin { @Override public void initialize(CordovaInterface cordova, CordovaWebView webView) { - super.initialize(cordova, webView); + Log.i(TAG, "JPush initialize."); - Log.i(TAG, "---------------- initialize" + "-" + openNotificationAlert - + "-" + notificationAlert); + super.initialize(cordova, webView); + JPushInterface.init(cordova.getActivity().getApplicationContext()); cordovaActivity = cordova.getActivity(); diff --git a/src/android/arm64-v8a/libjpush217.so b/src/android/arm64-v8a/libjpush217.so deleted file mode 100644 index de6d111..0000000 Binary files a/src/android/arm64-v8a/libjpush217.so and /dev/null differ diff --git a/src/android/arm64-v8a/libjpush219.so b/src/android/arm64-v8a/libjpush219.so new file mode 100644 index 0000000..909b68e Binary files /dev/null and b/src/android/arm64-v8a/libjpush219.so differ diff --git a/src/android/armeabi-v7a/libjpush217.so b/src/android/armeabi-v7a/libjpush217.so deleted file mode 100644 index d47565c..0000000 Binary files a/src/android/armeabi-v7a/libjpush217.so and /dev/null differ diff --git a/src/android/armeabi-v7a/libjpush219.so b/src/android/armeabi-v7a/libjpush219.so new file mode 100644 index 0000000..9003c28 Binary files /dev/null and b/src/android/armeabi-v7a/libjpush219.so differ diff --git a/src/android/armeabi/libjpush217.so b/src/android/armeabi/libjpush217.so deleted file mode 100644 index 34d56e7..0000000 Binary files a/src/android/armeabi/libjpush217.so and /dev/null differ diff --git a/src/android/armeabi/libjpush219.so b/src/android/armeabi/libjpush219.so new file mode 100644 index 0000000..85b7cb5 Binary files /dev/null and b/src/android/armeabi/libjpush219.so differ diff --git a/src/android/jpush-android-2.1.7.jar b/src/android/jpush-android-2.1.7.jar deleted file mode 100644 index dc17b80..0000000 Binary files a/src/android/jpush-android-2.1.7.jar and /dev/null differ diff --git a/src/android/jpush-android-2.1.9.jar b/src/android/jpush-android-2.1.9.jar new file mode 100644 index 0000000..554f732 Binary files /dev/null and b/src/android/jpush-android-2.1.9.jar differ diff --git a/src/android/x86/libjpush217.so b/src/android/x86/libjpush217.so deleted file mode 100644 index 339e055..0000000 Binary files a/src/android/x86/libjpush217.so and /dev/null differ diff --git a/src/android/x86/libjpush219.so b/src/android/x86/libjpush219.so new file mode 100644 index 0000000..282ec5d Binary files /dev/null and b/src/android/x86/libjpush219.so differ diff --git a/src/android/x86_64/libjpush217.so b/src/android/x86_64/libjpush217.so deleted file mode 100644 index 68768b4..0000000 Binary files a/src/android/x86_64/libjpush217.so and /dev/null differ diff --git a/src/android/x86_64/libjpush219.so b/src/android/x86_64/libjpush219.so new file mode 100644 index 0000000..5302dbe Binary files /dev/null and b/src/android/x86_64/libjpush219.so differ diff --git a/src/ios/Plugins/AppDelegate+JPush.h b/src/ios/Plugins/AppDelegate+JPush.h index 7c1f366..30219cc 100644 --- a/src/ios/Plugins/AppDelegate+JPush.h +++ b/src/ios/Plugins/AppDelegate+JPush.h @@ -7,7 +7,9 @@ // #import "AppDelegate.h" +#import +#import "JPUSHService.h" -@interface AppDelegate (JPush) - +@interface AppDelegate (JPush) +-(void)registerForIos10RemoteNotification; @end diff --git a/src/ios/Plugins/AppDelegate+JPush.m b/src/ios/Plugins/AppDelegate+JPush.m index 207a3d0..fa106e1 100644 --- a/src/ios/Plugins/AppDelegate+JPush.m +++ b/src/ios/Plugins/AppDelegate+JPush.m @@ -8,8 +8,11 @@ #import "AppDelegate+JPush.h" #import "JPushPlugin.h" -#import "JPUSHService.h" #import +#import +#import + + @implementation AppDelegate (JPush) @@ -24,12 +27,13 @@ } -(instancetype)init_plus{ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:@"UIApplicationDidFinishLaunchingNotification" object:nil]; + [[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]; } } @@ -62,4 +66,33 @@ // [[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]; + [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 diff --git a/src/ios/Plugins/JPushPlugin.h b/src/ios/Plugins/JPushPlugin.h index 8ce48f4..b5302e7 100644 --- a/src/ios/Plugins/JPushPlugin.h +++ b/src/ios/Plugins/JPushPlugin.h @@ -9,6 +9,9 @@ #import #define kJPushPluginReceiveNotification @"JPushPluginReceiveNofication" +#define kJPushPluginiOS10ForegroundReceiveNotification @"kJPushPluginiOS10ForegroundReceiveNotification" +#define kJPushPluginiOS10ClickNotification @"kJPushPluginiOS10ClickNotification" + @interface JPushPlugin : CDVPlugin{ @@ -67,7 +70,7 @@ * jpush.setTagsWithAlias 设置标签、别名完成 * jpush.receiveMessage 收到自定义消息 * jpush.receiveNotification 前台收到推送 - * jpush.backgoundNotification 后台收到推送 + * jpush.backgroundNotification 后台收到推送 */ @end diff --git a/src/ios/Plugins/JPushPlugin.m b/src/ios/Plugins/JPushPlugin.m index a16c07f..e23873b 100644 --- a/src/ios/Plugins/JPushPlugin.m +++ b/src/ios/Plugins/JPushPlugin.m @@ -10,6 +10,8 @@ #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"; @@ -18,6 +20,30 @@ 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- 外部接口 @@ -29,22 +55,6 @@ static NSDictionary *_launchOptions = nil; [JPushPlugin registerForRemoteNotification]; } -+(void)registerForRemoteNotification{ - if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { - //可以添加自定义categories - [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | - UIUserNotificationTypeSound | - UIUserNotificationTypeAlert) - categories:nil]; - } else { - //categories 必须为nil - [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | - UIRemoteNotificationTypeSound | - UIRemoteNotificationTypeAlert) - categories:nil]; - } -} - -(void)isPushStopped:(CDVInvokedUrlCommand*)command{ NSNumber *result; if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) { @@ -92,19 +102,23 @@ static NSDictionary *_launchOptions = nil; name:kJPushPluginReceiveNotification object:nil]; - if (_launchOptions) { - NSDictionary *userInfo = [_launchOptions - valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; - if ([userInfo count] >0) { - NSError *error; - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:&error]; - NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; - if (!error) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.openNotification',%@)",jsonString]]; - }); + [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]]]; + }); } } @@ -248,7 +262,14 @@ static NSDictionary *_launchOptions = nil; } -(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{ - [JPUSHService deleteLocalNotificationWithIdentifierKey:(NSString*)command.arguments[0]]; + 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{ @@ -260,7 +281,22 @@ static NSDictionary *_launchOptions = nil; } -(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command{ - if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { + 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]; @@ -270,10 +306,9 @@ static NSDictionary *_launchOptions = nil; NSNumber *number = [NSNumber numberWithInteger:type]; [self handleResultWithValue:number command:command]; } - } -#pragma mark- 内部方法 +#pragma mark - 内部方法 +(void)setLaunchOptions:(NSDictionary *)theLaunchOptions{ _launchOptions = theLaunchOptions; @@ -294,11 +329,6 @@ static NSDictionary *_launchOptions = nil; NSNumber * isProduction = [plistData valueForKey:JP_APP_ISPRODUCTION]; NSNumber *isIDFA = [plistData valueForKey:JP_APP_ISIDFA]; - if (!appkey || appkey.length == 0) { - NSLog(@"error: app key not found in PushConfig.plist "); - assert(0); - } - NSString *advertisingId = nil; if(isIDFA){ advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; @@ -311,6 +341,24 @@ static NSDictionary *_launchOptions = nil; } ++(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; @@ -337,50 +385,35 @@ static NSDictionary *_launchOptions = nil; #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 }; - NSError *error; - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error]; - NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; - dispatch_async(dispatch_get_main_queue(), ^{ - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.setTagsWithAlias',%@)",jsonString]]; + [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.setTagsWithAlias',%@)",[dict toJsonString]]]; }); - } - - (void)networkDidReceiveMessage:(NSNotification *)notification { if (notification) { - NSDictionary *userInfo = [notification userInfo]; - //NSLog(@"%@",userInfo); - - NSError *error; - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:&error]; - NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; - - //NSLog(@"%@",jsonString); - dispatch_async(dispatch_get_main_queue(), ^{ - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.receiveMessage',%@)",jsonString]]; + [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.receiveMessage',%@)",[notification.userInfo toJsonString]]]; - [self.commandDelegate evalJs:[NSString stringWithFormat:@"window.plugins.jPushPlugin.receiveMessageIniOSCallback('%@')",jsonString]]; + [self.commandDelegate evalJs:[NSString stringWithFormat:@"window.plugins.jPushPlugin.receiveMessageIniOSCallback('%@')",[notification.userInfo toJsonString]]]; }); } } --(void)networkDidReceiveNotification:(id)notification{ +-(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:{ //前台收到 @@ -404,10 +437,10 @@ static NSDictionary *_launchOptions = nil; break; } default: - //do nothing - break; + //do nothing + break; } - + } @end diff --git a/src/ios/lib/JPUSHService.h b/src/ios/lib/JPUSHService.h old mode 100755 new mode 100644 index 968a700..f552234 --- a/src/ios/lib/JPUSHService.h +++ b/src/ios/lib/JPUSHService.h @@ -9,23 +9,102 @@ * Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved. */ -#define JPUSH_VERSION_NUMBER 2.1.8 +#define JPUSH_VERSION_NUMBER 2.1.9 #import @class CLRegion; @class UILocalNotification; +@class CLLocation; +@class UNNotificationCategory; +@class UNNotificationSettings; +@class UNNotificationRequest; +@class UNNotification; +@protocol JPUSHRegisterDelegate; extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中 extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接 extern NSString *const kJPFNetworkDidCloseNotification; // 关闭连接 extern NSString *const kJPFNetworkDidRegisterNotification; // 注册成功 +extern NSString *const kJPFNetworkFailedRegisterNotification; //注册失败 extern NSString *const kJPFNetworkDidLoginNotification; // 登录成功 extern NSString *const kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS) extern NSString *const kJPFServiceErrorNotification; // 错误提示 -@class CLLocation; +/*! + * 通知注册实体类 + */ +@interface JPUSHRegisterEntity : NSObject +/*! + * 支持的类型 + * badge,sound,alert + */ +@property (nonatomic, assign) NSInteger types; +/*! + * 注入的类别 + * iOS10 UNNotificationCategory + * iOS8-iOS9 UIUserNotificationCategory + */ +@property (nonatomic, strong) NSSet *categories; +@end + +/*! + * 进行删除、查找推送实体类 + */ +@interface JPushNotificationIdentifier : NSObject + +@property (nonatomic, copy) NSArray *identifiers; // 推送的标识数组 +@property (nonatomic, copy) UILocalNotification *notificationObj NS_DEPRECATED_IOS(4_0, 10_0); // iOS10以下可以传UILocalNotification对象数据,iOS10以上无效 +@property (nonatomic, assign) BOOL delivered NS_AVAILABLE_IOS(10_0); // 在通知中心显示的或待推送的标志,默认为NO,YES表示在通知中心显示的,NO表示待推送的 +@property (nonatomic, copy) void (^findCompletionHandler)(NSArray *results); // 用于查询回调,调用[findNotification:]方法前必须设置,results为返回相应对象数组,iOS10以下返回UILocalNotification对象数组;iOS10以上根据delivered传入值返回UNNotification或UNNotificationRequest对象数组(delivered传入YES,则返回UNNotification对象数组,否则返回UNNotificationRequest对象数组) + +@end + +/*! + * 推送内容实体类 + */ +@interface JPushNotificationContent : NSObject + +@property (nonatomic, copy) NSString *title; // 推送标题 +@property (nonatomic, copy) NSString *subtitle; // 推送副标题 +@property (nonatomic, copy) NSString *body; // 推送内容 +@property (nonatomic, copy) NSNumber *badge; // 角标的数字。如果不需要改变角标传@(-1) +@property (nonatomic, copy) NSString *action NS_DEPRECATED_IOS(8_0, 10_0); // 弹框的按钮显示的内容(IOS 8默认为"打开", 其他默认为"启动",iOS10以上无效) +@property (nonatomic, copy) NSString *categoryIdentifier; // 行为分类标识 +@property (nonatomic, copy) NSDictionary *userInfo; // 本地推送时可以设置userInfo来增加附加信息,远程推送时设置的payload推送内容作为此userInfo +@property (nonatomic, copy) NSString *sound; // 声音名称,不设置则为默认声音 +@property (nonatomic, copy) NSArray *attachments NS_AVAILABLE_IOS(10_0); // 附件,iOS10以上有效,需要传入UNNotificationAttachment对象数组类型 +@property (nonatomic, copy) NSString *threadIdentifier NS_AVAILABLE_IOS(10_0); // 线程或与推送请求相关对话的标识,iOS10以上有效,可用来对推送进行分组 +@property (nonatomic, copy) NSString *launchImageName NS_AVAILABLE_IOS(10_0); // 启动图片名,iOS10以上有效,从推送启动时将会用到 + +@end + +/*! + * 推送触发方式实体类 + * 注:dateComponents、timeInterval、region在iOS10以上可选择其中一个参数传入有效值,如果同时传入值会根据优先级I、II、III使其中一种触发方式生效,fireDate为iOS10以下根据时间触发时须传入的参数 + */ +@interface JPushNotificationTrigger : NSObject + +@property (nonatomic, assign) BOOL repeat; // 设置是否重复,默认为NO +@property (nonatomic, copy) NSDate *fireDate NS_DEPRECATED_IOS(2_0, 10_0); // 用来设置触发推送的时间,iOS10以上无效 +@property (nonatomic, copy) CLRegion *region NS_AVAILABLE_IOS(8_0); // 用来设置触发推送的位置,iOS8以上有效,iOS10以上优先级为I,应用需要有允许使用定位的授权 +@property (nonatomic, copy) NSDateComponents *dateComponents NS_AVAILABLE_IOS(10_0); // 用来设置触发推送的日期时间,iOS10以上有效,优先级为II +@property (nonatomic, assign) NSTimeInterval timeInterval NS_AVAILABLE_IOS(10_0); // 用来设置触发推送的时间,iOS10以上有效,优先级为III + +@end + +/*! + * 注册或更新推送实体类 + */ +@interface JPushNotificationRequest : NSObject + +@property (nonatomic, copy) NSString *requestIdentifier; // 推送请求标识 +@property (nonatomic, copy) JPushNotificationContent *content; // 设置推送的具体内容 +@property (nonatomic, copy) JPushNotificationTrigger *trigger; // 设置推送的触发方式 +@property (nonatomic, copy) void (^completionHandler)(id result); // 注册或更新推送成功回调,iOS10以上成功则result为UNNotificationRequest对象,失败则result为nil;iOS10以下成功result为UILocalNotification对象,失败则result为nil + +@end /*! * JPush 核心头文件 @@ -77,12 +156,20 @@ extern NSString *const kJPFServiceErrorNotification; // 错误提示 * @abstract 注册要处理的远程通知类型 * * @param types 通知类型 - * @param categories + * @param categories 类别组 * - * @discussion */ + (void)registerForRemoteNotificationTypes:(NSUInteger)types categories:(NSSet *)categories; +/*! + * @abstract 新版本的注册方法(兼容iOS10) + * + * @param config 注册通知配置 + * @param delegate 代理 + * + */ ++ (void)registerForRemoteNotificationConfig:(JPUSHRegisterEntity *)config delegate:(id)delegate; + + (void)registerDeviceToken:(NSData *)deviceToken; @@ -99,14 +186,14 @@ extern NSString *const kJPFServiceErrorNotification; // 错误提示 /*! * 下面的接口是可选的 - * 设置标签和(或)别名(若参数为nil,则忽略;若是空对象,则清空;详情请参考文档:http://docs.jpush.io/client/ios_api/#api-ios) + * 设置标签和(或)别名(若参数为nil,则忽略;若是空对象,则清空;详情请参考文档:http://docs.jiguang.cn/client/ios_api/#api-ios) * setTags:alias:fetchCompletionHandle:是新的设置标签别名的方法,不再需要显示声明回调函数,只需要在block里面处理设置结果即可. * WARN: 使用block时需要注意循环引用问题 */ + (void) setTags:(NSSet *)tags alias:(NSString *)alias callbackSelector:(SEL)cbSelector - target:(id)theTarget __attribute__((deprecated("JPush 2.1.1 版本已过期")));; + target:(id)theTarget __attribute__((deprecated("JPush 2.1.1 版本已过期"))); + (void) setTags:(NSSet *)tags alias:(NSString *)alias @@ -192,6 +279,35 @@ callbackSelector:(SEL)cbSelector ///---------------------------------------------------- /// @name Local Notification 本地通知 ///---------------------------------------------------- +/*! + * @abstract 注册或更新推送 (支持iOS10,并兼容iOS10以下版本) + * + * JPush 2.1.9新接口 + * @param request JPushNotificationRequest类型,设置推送的属性,设置已有推送的request.requestIdentifier即更新已有的推送,否则为注册新推送,更新推送仅仅在iOS10以上有效,结果通过request.completionHandler返回 + * @discussion 旧的注册本地推送接口被废弃,使用此接口可以替换 + * + */ ++ (void)addNotification:(JPushNotificationRequest *)request; + +/*! + * @abstract 移除推送 (支持iOS10,并兼容iOS10以下版本) + * + * JPush 2.1.9新接口 + * @param identifier JPushNotificationIdentifier类型,iOS10以上identifier设置为nil,则移除所有在通知中心显示推送和待推送请求,也可以通过设置identifier.delivered和identifier.identifiers来移除相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则移除相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier设置为nil,则移除所有推送,identifier.delivered属性无效,另外可以通过identifier.notificationObj传入特定推送对象来移除此推送。 + * @discussion 旧的所有删除推送接口被废弃,使用此接口可以替换 + * + */ ++ (void)removeNotification:(JPushNotificationIdentifier *)identifier; + +/*! + * @abstract 查找推送 (支持iOS10,并兼容iOS10以下版本) + * + * JPush 2.1.9新接口 + * @param identifier JPushNotificationIdentifier类型,iOS10以上可以通过设置identifier.delivered和identifier.identifiers来查找相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则返回相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier.delivered属性无效,identifier.identifiers如果设置nil或空数组则返回所有推送。须要设置identifier.findCompletionHandler回调才能得到查找结果,通过(NSArray *results)返回相应对象数组。 + * @discussion 旧的查找推送接口被废弃,使用此接口可以替换 + * + */ ++ (void)findNotification:(JPushNotificationIdentifier *)identifier; /*! * @abstract 本地推送,最多支持64个 @@ -204,7 +320,7 @@ callbackSelector:(SEL)cbSelector * @param userInfo 自定义参数,可以用来标识推送和增加附加信息 * @param soundName 自定义通知声音,设置为nil为默认声音 * - * @discussion 最多支持 64 个定义 + * @discussion 最多支持 64 个定义,此方法被[addNotification:]方法取代 */ + (UILocalNotification *)setLocalNotification:(NSDate *)fireDate alertBody:(NSString *)alertBody @@ -212,7 +328,7 @@ callbackSelector:(SEL)cbSelector alertAction:(NSString *)alertAction identifierKey:(NSString *)notificationKey userInfo:(NSDictionary *)userInfo - soundName:(NSString *)soundName; + soundName:(NSString *)soundName __attribute__((deprecated("JPush 2.1.9 版本已过期"))); /*! * @abstract 本地推送 (支持 iOS8 新参数) @@ -221,6 +337,7 @@ callbackSelector:(SEL)cbSelector * @param region 自定义参数 * @param regionTriggersOnce 自定义参数 * @param category 自定义参数 + * @discussion 此方法被[addNotification:]方法取代 */ + (UILocalNotification *)setLocalNotification:(NSDate *)fireDate alertBody:(NSString *)alertBody @@ -231,7 +348,7 @@ callbackSelector:(SEL)cbSelector soundName:(NSString *)soundName region:(CLRegion *)region regionTriggersOnce:(BOOL)regionTriggersOnce - category:(NSString *)category NS_AVAILABLE_IOS(8_0); + category:(NSString *)category NS_AVAILABLE_IOS(8_0) __attribute__((deprecated("JPush 2.1.9 版本已过期"))); /*! * @abstract 前台展示本地推送 @@ -239,35 +356,39 @@ callbackSelector:(SEL)cbSelector * @param notification 本地推送对象 * @param notificationKey 需要前台显示的本地推送通知的标示符 * - * @discussion 默认App在前台运行时不会进行弹窗,在程序接收通知调用此接口可实现指定的推送弹窗。 + * @discussion 默认App在前台运行时不会进行弹窗,在程序接收通知调用此接口可实现指定的推送弹窗。--iOS10以下还可继续使用,iOS10以上在[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:]方法中调用completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);即可 */ + (void)showLocalNotificationAtFront:(UILocalNotification *)notification - identifierKey:(NSString *)notificationKey; + identifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期"))); /*! * @abstract 删除本地推送定义 * * @param notificationKey 本地推送标示符 * @param myUILocalNotification 本地推送对象 + * @discussion 此方法被[removeNotification:]方法取代 */ -+ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey; ++ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期"))); /*! * @abstract 删除本地推送定义 + * @discussion 此方法被[removeNotification:]方法取代 */ -+ (void)deleteLocalNotification:(UILocalNotification *)localNotification; ++ (void)deleteLocalNotification:(UILocalNotification *)localNotification __attribute__((deprecated("JPush 2.1.9 版本已过期"))); /*! * @abstract 获取指定通知 * * @param notificationKey 本地推送标示符 * @return 本地推送对象数组, [array count]为0时表示没找到 + * @discussion 此方法被[findNotification:]方法取代 */ -+ (NSArray *)findLocalNotificationWithIdentifier:(NSString *)notificationKey; ++ (NSArray *)findLocalNotificationWithIdentifier:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期"))); /*! * @abstract 清除所有本地推送对象 + * @discussion 此方法被[removeNotification:]方法取代 */ -+ (void)clearAllLocalNotifications; ++ (void)clearAllLocalNotifications __attribute__((deprecated("JPush 2.1.9 版本已过期"))); ///---------------------------------------------------- @@ -313,11 +434,13 @@ callbackSelector:(SEL)cbSelector * * JPush 支持根据 registrationID 来进行推送. * 如果你需要此功能, 应该通过此接口获取到 registrationID 后, 上报到你自己的服务器端, 并保存下来. - * + * registrationIDCompletionHandler:是新增的获取registrationID的方法,需要在block中获取registrationID,resCode为返回码,模拟器调用此接口resCode返回1011,registrationID返回nil. * 更多的理解请参考 JPush 的文档网站. */ + (NSString *)registrationID; ++ (void)registrationIDCompletionHandler:(void(^)(int resCode,NSString *registrationID))completionHandler; + /*! * @abstract 打开日志级别到 Debug * @@ -342,5 +465,26 @@ callbackSelector:(SEL)cbSelector */ + (void)setLogOFF; +@end + +@class UNUserNotificationCenter; +@class UNNotificationResponse; + +@protocol JPUSHRegisterDelegate + +/* + * @brief handle UserNotifications.framework [willPresentNotification:withCompletionHandler:] + * @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心 + * @param notification 前台得到的的通知对象 + * @param completionHandler 该callback中的options 请使用UNNotificationPresentationOptions + */ +- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger options))completionHandler; +/* + * @brief handle UserNotifications.framework [didReceiveNotificationResponse:withCompletionHandler:] + * @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心 + * @param response 通知响应对象 + * @param completionHandler + */ +- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler; @end diff --git a/src/ios/lib/jpush-ios-2.1.8.a b/src/ios/lib/jpush-ios-2.1.9.a similarity index 70% rename from src/ios/lib/jpush-ios-2.1.8.a rename to src/ios/lib/jpush-ios-2.1.9.a index 3a34c19..5bda39b 100644 Binary files a/src/ios/lib/jpush-ios-2.1.8.a and b/src/ios/lib/jpush-ios-2.1.9.a differ