diff --git a/README.md b/README.md index 096f001..f9f970d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,17 @@ -l## JPush PhoneGap Plugin ## +## JPush PhoneGap Plugin ## + +jpush-phonegap-plugin 支持 iOS,Android 的推送插件。 + +**功能特性:** +>+ 发送推送通知 ++ 发送推送自定义消息 ++ 设置推送标签和别名 ++ 设置角标(iOS) + +*如需要 IM 功能插件,请关注[jmessage-phonegap-plugin](https://github.com/jpush/jmessage-phonegap-plugin)* +## 安装 ## ###准备工作 1. cordova create 文件夹名字 包名 应用名字 @@ -19,30 +30,32 @@ l## JPush PhoneGap Plugin ## ###Cordova CLI/Phonegap 安装 Android & iOS -3. 使用git命令将jpush phonegap插件下载的本地,将这个目录标记为`$JPUSH_PLUGIN_DIR` - - git clone https://github.com/jpush/jpush-phonegap-plugin.git +1). 安装JPush PhoneGap Plugin。 有两种方法。 + +方法一: 在线安装 + + cordova plugin add https://github.com/jpush/jpush-phonegap-plugin.git --variable API_KEY=your_jpush_appkey + +方法二:下载到本地再安装 + +使用git命令将jpush phonegap插件下载的本地,将这个目录标记为`$JPUSH_PLUGIN_DIR` -4. 将`$JPUSH_PLUGIN_DIR/plugin.xml`文件中的AppKey替换为在Portal上注册该应用的的Key,例如(9fed5bcb7b9b87413678c407) - - - -4. 打开`$JPUSH_PLUGIN_DIR/src/ios/PushConfig.plist`文件将文件中的`7d431e42dfa6a6d693ac2d04`替换为在Portal上注册该应用的的Key,例如(9fed5bcb7b9b87413678c407) - - -5. 在`$JPUSH_PLUGIN_DIR/src/android/JPushPlugin.java` 文件`import your.package.name.R`替换为在Portal上注册该应用的包名,例如(com.thi.pushtest) + git clone https://github.com/jpush/jpush-phonegap-plugin.git + cordova plugin add $JPUSH_PLUGIN_DIR --variable API_KEY=your_jpush_appkey -6. cordova cli 添加jpush phonegap插件和依赖的device插件: - cordova plugin add $JPUSH_PLUGIN_DIR - cordova plugin add org.apache.cordova.device - -7. 在js中调用函数,初始化jpush sdk +2). 安装org.apache.cordova.device + + cordova plugin add org.apache.cordova.device + + +3). 在js中调用函数,初始化jpush sdk + + window.plugins.jPushPlugin.init(); + //由于phonegap插件采用了Lazy load的特性, 所以这里建议在js文件能执行的最开始就加 - window.plugins.jPushPlugin.init(); - //由于phonegap插件采用了Lazy load的特性, 所以这里建议在js文件能执行的最开始就加 ### Android 手工安装 @@ -66,12 +79,6 @@ l## JPush PhoneGap Plugin ## 该项目基于cordova实现,目前无法使用'phonegap build'云服务进行打包,建议使用本地环境进行打包 -###常见错误 -1. androd - - eclipse中phonegap工程import之后出现:`Type CallbackContext cannot be resolved to a type` - 解决方案:eclipse中右键单击工程名,Build Path->Config Build Path->Projects->选中 工程名称-CordovaLib->点击 add - ### API说明 插件的API集中在JPushPlugin.js文件中,这个文件的位置如下 @@ -186,5 +193,20 @@ l## JPush PhoneGap Plugin ## [Android API详细说明](document/Android_detail_api.md) +###常见问题 + +####1. androd + + eclipse中phonegap工程import之后出现:`Type CallbackContext cannot be resolved to a type` + 解决方案:eclipse中右键单击工程名,Build Path->Config Build Path->Projects->选中 工程名称-CordovaLib->点击 add + +####2. iOS 设置/修改 APP_KEY + + 在PushConfig.plist 中修改。PushConfig.plist 其他值说明: + CHANNEL 渠道标识 + IsProduction 是否生产环境(暂未启用) + + + ###更多 [JPush官网文档](http://docs.jpush.io/) \ No newline at end of file diff --git a/document/Common_detail_api.md b/document/Common_detail_api.md index b1900c0..c9a1329 100644 --- a/document/Common_detail_api.md +++ b/document/Common_detail_api.md @@ -271,7 +271,7 @@ ps:点击通知后传递的json object 保存在window.plugins.jPushPlugin.ope #### event - jpush.receiveNotification -点击通知进入应用程序时会出发改事件 +点击通知进入应用程序时会触发该事件 #####代码示例 diff --git a/document/iOS_detail_api.md b/document/iOS_detail_api.md index 3e25d19..4c79028 100644 --- a/document/iOS_detail_api.md +++ b/document/iOS_detail_api.md @@ -52,7 +52,8 @@ duration 自定义的页面时间 ### 设置Badge #### API - setBadge,resetBadge -badge是iOS用来标记应用程序状态的一个数字,出现在程序图标右上角。 JPush封装badge功能,允许应用上传badge值至JPush服务器,由JPush后台帮助管理每个用户所对应的推送badge值,简化了设置推送badge的操作。 + JPush封装badge功能,允许应用上传badge值至JPush服务器,由JPush后台帮助管理每个用户所对应的推送badge值,简化了设置推送badge的操作。 +(本接口不会直接改变应用本地的角标值. 要修改本地badege值,使用 setApplicationIconBadgeNumber) 实际应用中,开发者可以直接对badge值做增减操作,无需自己维护用户与badge值之间的对应关系。 ##### 接口定义 @@ -74,6 +75,7 @@ value 取值范围:[0,99999] #### API - setApplicationIconBadgeNumber +本接口直接改变应用本地的角标值. 设置iOS的角标,当设置badge=0时为清除角标 ##### 接口定义 @@ -92,6 +94,27 @@ value 取值范围:[0,99999] } +#### API - getApplicationIconBadgeNumber + +获取iOS的角标值 + +##### 接口定义 + + window.plugins.jPushPlugin.getApplicationIconBadgeNumber(callback) + +##### 参数说明 + +- callback 回调函数 + +#####代码示例 +``` + +window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data){ + console.log(data); + }); + +``` + ### 本地通知 ### 日志等级设置 diff --git a/example/index.html b/example/index.html index b7f1520..28a093a 100644 --- a/example/index.html +++ b/example/index.html @@ -1,210 +1,224 @@ - - - - - Phonegap Sample App - - - - - + + + - - -
- -
-
-
- -
-

JPushPlugin Example

-
- - -
-
- - - - - - - - - - - -
- -
- -
- -
- - - - - -
- -
-
-
- -
-
- - -
-
- - -
-
- - -
+ //jpush.receiveMessage + + + +
+ +
+ +
+ +
+

JPushPlugin Example

+ +
+ + +
+
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + + + +
+ +
+
+
+ +
+
+ + +
+
+ + +
+
+ + +
-
-
- -
- + +
+ +
+ diff --git a/plugin.xml b/plugin.xml index 8abab10..fcb22b7 100644 --- a/plugin.xml +++ b/plugin.xml @@ -2,7 +2,7 @@ + version="2.1.0"> JPush Plugin JPush for cordova plugin @@ -10,12 +10,14 @@ JPush,push Apache 2.0 License + + - + @@ -28,8 +30,8 @@ - - + + @@ -42,11 +44,18 @@ - + + + $API_KEY + + + + + @@ -152,16 +161,16 @@ - + - - - - + + + + - + - \ No newline at end of file + diff --git a/scripts/android-install.js b/scripts/android-install.js new file mode 100644 index 0000000..ae9d513 --- /dev/null +++ b/scripts/android-install.js @@ -0,0 +1,48 @@ +#!/usr/bin/env node + +module.exports = function (context) { + var path = context.requireCordovaModule('path'), + fs = context.requireCordovaModule('fs'), + shell = context.requireCordovaModule('shelljs'), + projectRoot = context.opts.projectRoot, + ConfigParser = context.requireCordovaModule('cordova-lib/src/configparser/ConfigParser'), + config = new ConfigParser(path.join(context.opts.projectRoot, "config.xml")), + packageName = config.android_packageName() || config.packageName(); + + console.info("Running android-install.Hook: " + context.hook + ", Package: " + packageName + ", Path: " + projectRoot + "."); + + if (!packageName) { + console.error("Package name could not be found!"); + return ; + } + + // android platform available? + if (context.opts.cordova.platforms.indexOf("android") === -1) { + console.info("Android platform has not been added."); + return ; + } + + var targetDir = path.join(projectRoot, "platforms", "android", "src", "cn", "jpush", "phonegap"); + targetFile = path.join(targetDir, "JPushPlugin.java"); + console.log(targetDir); + + if (['after_plugin_add', 'after_plugin_install', 'after_platform_add'].indexOf(context.hook) === -1) { + // remove it? + try { + fs.unlinkSync(targetFile); + } catch (err) {} + } else { + // create directory + shell.mkdir('-p', targetDir); + + // sync the content + fs.readFile(path.join(context.opts.plugin.dir, 'src', 'android', 'JPushPlugin.java'), {encoding: 'utf-8'}, function (err, data) { + if (err) { + throw err; + } + + data = data.replace(/^import __PACKAGE_NAME__.R;/m, 'import ' + packageName + '.R;'); + fs.writeFileSync(targetFile, data); + }); + } +}; diff --git a/src/android/JPushPlugin.java b/src/android/JPushPlugin.java index b669b65..5d4b71e 100644 --- a/src/android/JPushPlugin.java +++ b/src/android/JPushPlugin.java @@ -19,13 +19,15 @@ import org.json.JSONException; import org.json.JSONObject; import java.util.Map.Entry; -import your.package.name.R; +import __PACKAGE_NAME__.R; import cn.jpush.android.api.BasicPushNotificationBuilder; import cn.jpush.android.api.CustomPushNotificationBuilder; import cn.jpush.android.api.JPushInterface; import cn.jpush.android.data.JPushLocalNotification; import cn.jpush.android.api.TagAliasCallback; +import android.util.Log; + public class JPushPlugin extends CordovaPlugin { private final static List methodList = @@ -33,7 +35,7 @@ public class JPushPlugin extends CordovaPlugin { "getRegistrationID", "setTags", "setTagsWithAlias", - "setAlias", + "setAlias", "getNotification", "setBasicPushNotificationBuilder", "setCustomPushNotificationBuilder", @@ -46,6 +48,7 @@ public class JPushPlugin extends CordovaPlugin { "setLatestNotificationNum", "setPushTime", "clearAllNotification", + "clearNotificationById", "addLocalNotification", "removeLocalNotification", "clearLocalNotifications", @@ -55,12 +58,16 @@ public class JPushPlugin extends CordovaPlugin { private ExecutorService threadPool = Executors.newFixedThreadPool(1); private static JPushPlugin instance; + private static String TAG = "JPushPlugin"; + + private static boolean shouldCacheMsg = false; public static String notificationAlert; public static Map notificationExtras=new HashMap(); public static String openNotificationAlert; public static Map openNotificationExtras=new HashMap(); + public JPushPlugin() { instance = this; } @@ -68,21 +75,46 @@ public class JPushPlugin extends CordovaPlugin { @Override public void initialize(CordovaInterface cordova, CordovaWebView webView) { super.initialize(cordova, webView); - //JPushInterface.setDebugMode(true); - - //JPushPlugin.notificationAlert = alert; - //JPushPlugin.notificationExtras = extras; - if(JPushPlugin.openNotificationAlert != null){ - JPushPlugin.transmitOpen(JPushPlugin.openNotificationAlert, JPushPlugin.openNotificationExtras); - } - if(JPushPlugin.notificationAlert!=null){ - JPushPlugin.transmitReceive(JPushPlugin.notificationAlert, JPushPlugin.notificationExtras); - } + + Log.i(TAG, "---------------- initialize"+"-"+JPushPlugin.openNotificationAlert + "-" + JPushPlugin.notificationAlert); + + shouldCacheMsg = false; + + //如果同时缓存了打开事件openNotificationAlert 和 消息事件notificationAlert,只向UI 发 打开事件。 + //这样做是为了和iOS 统一 + if(JPushPlugin.openNotificationAlert != null){ + JPushPlugin.notificationAlert = null; + JPushPlugin.transmitOpen(JPushPlugin.openNotificationAlert, JPushPlugin.openNotificationExtras); + } + if(JPushPlugin.notificationAlert!=null){ + JPushPlugin.transmitReceive(JPushPlugin.notificationAlert, JPushPlugin.notificationExtras); + } + //JPushInterface.init(cordova.getActivity().getApplicationContext()); } + + public void onPause(boolean multitasking) { + Log.i(TAG, "---------------- onPause"); + shouldCacheMsg = true; + } + + public void onResume(boolean multitasking) { + shouldCacheMsg = false; + Log.i(TAG, "---------------- onResume"+"-"+JPushPlugin.openNotificationAlert + "-" + JPushPlugin.notificationAlert); + + if(JPushPlugin.openNotificationAlert != null){ + JPushPlugin.notificationAlert = null; + JPushPlugin.transmitOpen(JPushPlugin.openNotificationAlert, JPushPlugin.openNotificationExtras); + } + if(JPushPlugin.notificationAlert!=null){ + JPushPlugin.transmitReceive(JPushPlugin.notificationAlert, JPushPlugin.notificationExtras); + } + } + + private static JSONObject notificationObject(String message, Map extras) { JSONObject data = new JSONObject(); @@ -157,19 +189,18 @@ public class JPushPlugin extends CordovaPlugin { if (instance == null) { return; } + + if(JPushPlugin.shouldCacheMsg){ + return; + } + + Log.i(TAG, "---------------- transmitOpen"); + JSONObject data = openNotificationObject(alert, extras); String js = String .format("window.plugins.jPushPlugin.openNotificationInAndroidCallback('%s');", data.toString()); -// {"alert":"ding", -// "extras":{ -// "cn.jpush.android.MSG_ID":"1691785879", -// "app":"com.thi.pushtest", -// "cn.jpush.android.ALERT":"ding", -// "cn.jpush.android.EXTRA":{}, -// "cn.jpush.android.PUSH_ID":"1691785879", -// "cn.jpush.android.NOTIFICATION_ID":1691785879, -// "cn.jpush.android.NOTIFICATION_TYPE":"0"}} + try { instance.webView.sendJavascript(js); @@ -182,24 +213,22 @@ public class JPushPlugin extends CordovaPlugin { } catch (Exception e) { } + JPushPlugin.openNotificationAlert = null; } static void transmitReceive(String alert, Map extras) { if (instance == null) { return; } + + if(JPushPlugin.shouldCacheMsg){ + return; + } + JSONObject data = openNotificationObject(alert, extras); String js = String .format("window.plugins.jPushPlugin.receiveNotificationInAndroidCallback('%s');", data.toString()); -// {"alert":"ding", -// "extras":{ -// "cn.jpush.android.MSG_ID":"1691785879", -// "app":"com.thi.pushtest", -// "cn.jpush.android.ALERT":"ding", -// "cn.jpush.android.EXTRA":{}, -// "cn.jpush.android.PUSH_ID":"1691785879", -// "cn.jpush.android.NOTIFICATION_ID":1691785879, -// "cn.jpush.android.NOTIFICATION_TYPE":"0"}} + try { instance.webView.sendJavascript(js); @@ -209,6 +238,8 @@ public class JPushPlugin extends CordovaPlugin { } catch (Exception e) { } + JPushPlugin.notificationAlert = null; + } @Override @@ -225,7 +256,7 @@ public class JPushPlugin extends CordovaPlugin { JSONArray.class, CallbackContext.class); method.invoke(JPushPlugin.this, data, callbackContext); } catch (Exception e) { - System.out.println(e.toString()); + Log.e(TAG,e.toString()); } } }); @@ -341,27 +372,15 @@ public class JPushPlugin extends CordovaPlugin { } void setTags(JSONArray data, CallbackContext callbackContext) { - HashSet tags=null; try { - String tagStr; - if(data==null){ - //tags=null; - }else if(data.length()==0) { - tags= new HashSet(); - }else{ - tagStr = data.getString(0); - String[] tagArray = tagStr.split(","); - for (String tag : tagArray) { - if(tags==null){ - tags= new HashSet(); - } - tags.add(tag); - } + HashSet tags=new HashSet(); + for(int i=0;i validTags = JPushInterface.filterValidTags(tags); JPushInterface.setTags(this.cordova.getActivity() .getApplicationContext(), tags,mTagWithAliasCallback); callbackContext.success(); + } catch (JSONException e) { e.printStackTrace(); callbackContext.error("Error reading tags JSON"); diff --git a/src/android/MyReceiver.java b/src/android/MyReceiver.java index 2eff5d9..764a6d5 100644 --- a/src/android/MyReceiver.java +++ b/src/android/MyReceiver.java @@ -12,13 +12,13 @@ import android.content.Intent; import android.util.Log; public class MyReceiver extends BroadcastReceiver { - private static String TAG = "Client Receiver"; + private static String TAG = "JPushPlugin"; @Override public void onReceive(Context context, Intent intent) { if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { - }else if (JPushInterface.ACTION_UNREGISTER.equals(intent.getAction())){ +// }else if (JPushInterface.ACTION_UNREGISTER.equals(intent.getAction())){ } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { handlingReceivedMessage(intent); @@ -42,13 +42,14 @@ public class MyReceiver extends BroadcastReceiver { JPushPlugin.transmitPush(msg, extras); } private void handlingNotificationOpen(Context context,Intent intent){ + Log.i(TAG, "---------------- handlingNotificationOpen"); + String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT); Map extras = getNotificationExtras(intent); Intent launch = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); launch.addCategory(Intent.CATEGORY_LAUNCHER); launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP); - JPushPlugin.openNotificationAlert = alert; JPushPlugin.openNotificationExtras = extras; @@ -57,6 +58,9 @@ public class MyReceiver extends BroadcastReceiver { context.startActivity(launch); } private void handlingNotificationReceive(Context context,Intent intent){ + + Log.i(TAG, "---------------- handlingNotificationReceive"); + String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT); Map extras = getNotificationExtras(intent); diff --git a/src/android/arm64-v8a/libjpush175.so b/src/android/arm64-v8a/libjpush175.so deleted file mode 100644 index 1bc85f1..0000000 Binary files a/src/android/arm64-v8a/libjpush175.so and /dev/null differ diff --git a/src/android/arm64-v8a/libjpush206.so b/src/android/arm64-v8a/libjpush206.so new file mode 100644 index 0000000..aef78f3 Binary files /dev/null and b/src/android/arm64-v8a/libjpush206.so differ diff --git a/src/android/armeabi-v7a/libjpush175.so b/src/android/armeabi-v7a/libjpush206.so similarity index 53% rename from src/android/armeabi-v7a/libjpush175.so rename to src/android/armeabi-v7a/libjpush206.so index 81cbd3f..3dc17f1 100644 Binary files a/src/android/armeabi-v7a/libjpush175.so and b/src/android/armeabi-v7a/libjpush206.so differ diff --git a/src/android/armeabi/libjpush175.so b/src/android/armeabi/libjpush206.so similarity index 53% rename from src/android/armeabi/libjpush175.so rename to src/android/armeabi/libjpush206.so index 0cdb4a8..078cdfd 100644 Binary files a/src/android/armeabi/libjpush175.so and b/src/android/armeabi/libjpush206.so differ diff --git a/src/android/jpush-android-2.0.6.jar b/src/android/jpush-android-2.0.6.jar new file mode 100644 index 0000000..6074cb4 Binary files /dev/null and b/src/android/jpush-android-2.0.6.jar differ diff --git a/src/android/jpush-sdk-release1.7.5.jar b/src/android/jpush-sdk-release1.7.5.jar deleted file mode 100644 index 89b2a7b..0000000 Binary files a/src/android/jpush-sdk-release1.7.5.jar and /dev/null differ diff --git a/src/ios/Plugins/AppDelegate+JPush.m b/src/ios/Plugins/AppDelegate+JPush.m index dc2db41..5c41cb4 100644 --- a/src/ios/Plugins/AppDelegate+JPush.m +++ b/src/ios/Plugins/AppDelegate+JPush.m @@ -9,9 +9,9 @@ #import "AppDelegate+JPush.h" #import #import "JPushPlugin.h" -#import "APService.h" +#import "JPUSHService.h" -static char launchNotificationKey; +//static char launchNotificationKey; @implementation AppDelegate (JPush) @@ -41,25 +41,44 @@ static char launchNotificationKey; } } + - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - [APService registerDeviceToken:deviceToken]; + [JPUSHService registerDeviceToken:deviceToken]; } -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ - [APService handleRemoteNotification:userInfo]; + [JPUSHService handleRemoteNotification:userInfo]; [[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveNotification object:userInfo]; - } + -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ - [APService handleRemoteNotification:userInfo]; + [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]; +} + + + //delegate里不能声明变量,所以采用关联对象这种技术绕过这个限制 //-(NSDictionary *)luanchOption{ // return objc_getAssociatedObject(self, &launchNotificationKey); diff --git a/src/ios/Plugins/JPushPlugin.h b/src/ios/Plugins/JPushPlugin.h index 605f420..b86a217 100644 --- a/src/ios/Plugins/JPushPlugin.h +++ b/src/ios/Plugins/JPushPlugin.h @@ -22,4 +22,17 @@ -(void)startLogPageView:(CDVInvokedUrlCommand*)command; -(void)stopLogPageView:(CDVInvokedUrlCommand*)command; +// 设置角标到服务器, 服务器下一次发消息时,会设置成这个值 +//本接口不会改变应用本地的角标值. +-(void)setBadge:(CDVInvokedUrlCommand*)command; +//相当于 [setBadge:0] +-(void)resetBadge:(CDVInvokedUrlCommand*)command; + + +//改变应用本地的角标值. +-(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command; +//获取应用本地的角标值. +-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command; + + @end diff --git a/src/ios/Plugins/JPushPlugin.m b/src/ios/Plugins/JPushPlugin.m index 6d1435b..1c37fc6 100644 --- a/src/ios/Plugins/JPushPlugin.m +++ b/src/ios/Plugins/JPushPlugin.m @@ -7,335 +7,454 @@ // #import "JPushPlugin.h" -#import "APService.h" +#import "JPUSHService.h" #import + + +static NSString *const JM_APP_KEY = @"APP_KEY"; +static NSString *const JM_APP_CHANNEL = @"CHANNEL"; +static NSString *const JM_APP_ISPRODUCTION = @"IsProduction"; + +static NSString *const JMessageConfigFileName = @"PushConfig"; + + static NSDictionary *_luanchOptions=nil; @implementation JPushPlugin +(void)setLaunchOptions:(NSDictionary *)theLaunchOptions{ - _luanchOptions=theLaunchOptions; - [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | - UIUserNotificationTypeSound | - UIUserNotificationTypeAlert) - categories:nil]; - [APService setupWithOption:_luanchOptions]; + _luanchOptions=theLaunchOptions; + [JPUSHService setDebugMode]; + 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]; + } + + //read appkey and channel from JMessageConfig.plist + NSString *plistPath = [[NSBundle mainBundle] pathForResource:JMessageConfigFileName ofType:@"plist"]; + if (plistPath == nil) { + NSLog(@"error: PushConfig.plist not found"); + assert(0); + } + + NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; + NSString * appkey = [plistData valueForKey:JM_APP_KEY]; + NSString * channel = [plistData valueForKey:JM_APP_CHANNEL]; + NSNumber * isProduction = [plistData valueForKey:JM_APP_ISPRODUCTION]; + + if (!appkey || appkey.length == 0) { + NSLog(@"error: app key not found in JMessageConfig.plist "); + assert(0); + } + + [JPUSHService setupWithOption:_luanchOptions appKey:appkey + channel:channel apsForProduction:[isProduction boolValue] ]; + } --(void)initial:(CDVInvokedUrlCommand*)command{ - //do nithng,because Cordova plugin use lazy load mode. - -} -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{ - if (self=[super initWithWebView:theWebView]) { - - NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; - [defaultCenter addObserver:self - selector:@selector(networkDidReceiveMessage:) - name:kJPFNetworkDidReceiveMessageNotification - object:nil]; - - [defaultCenter addObserver:self - selector:@selector(networkDidReceiveNotification:) - name:kJPushPluginReceiveNotification - object:nil]; - if (_luanchOptions) { - NSDictionary *userInfo = [_luanchOptions - 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]]; - }); - - } - } - - } - - } - return self; +-(void)stopPush:(CDVInvokedUrlCommand*)command{ + + [[UIApplication sharedApplication]unregisterForRemoteNotifications]; } --(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{ - - NSArray *arguments=command.arguments; - if (!arguments||[arguments count]<2) { -// [self writeJavascript:[NSString stringWithFormat:@"window.plugins.jPushPlugin.pushCallback('%@')",@""]]; - return ; - } - NSString *alias=[arguments objectAtIndex:0]; - NSArray *arrayTags=[arguments objectAtIndex:1]; - NSSet* set=[NSSet setWithArray:arrayTags]; - [APService setTags:set - alias:alias - callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) - object:self]; -} -(void)resumePush:(CDVInvokedUrlCommand*)command{ - + #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1 - if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { + if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { //可以添加自定义categories - [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | - UIUserNotificationTypeSound | - UIUserNotificationTypeAlert) - categories:nil]; - } else { - //categories 必须为nil - [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | - UIRemoteNotificationTypeSound | - UIRemoteNotificationTypeAlert) - categories:nil]; - } -#else + [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | + UIUserNotificationTypeSound | + UIUserNotificationTypeAlert) + categories:nil]; + } else { //categories 必须为nil - [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | - UIRemoteNotificationTypeSound | - UIRemoteNotificationTypeAlert) - categories:nil]; + [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | + UIRemoteNotificationTypeSound | + UIRemoteNotificationTypeAlert) + categories:nil]; + } +#else + //categories 必须为nil + [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | + UIRemoteNotificationTypeSound | + UIRemoteNotificationTypeAlert) + categories:nil]; +#endif + +} + + +-(void)isPushStopped:(CDVInvokedUrlCommand*)command{ + + NSNumber *result; + if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications ]) { + result=@(0); + }else{ + result=@(1); + } + CDVPluginResult * pushResult=[self pluginResultForValue:result]; + if (pushResult) { + [self succeedWithPluginResult:pushResult withCallbackID:command.callbackId]; + } else { + [self failWithCallbackID:command.callbackId]; + } +} + + +-(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)isPushStopped:(CDVInvokedUrlCommand*)command{ - NSNumber *result; - if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications ]) { - result=@(1); - }else{ - result=@(0); + +-(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]; + + if (_luanchOptions) { + NSDictionary *userInfo = [_luanchOptions + 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]]; + }); + + } } - CDVPluginResult * pushResult=[self pluginResultForValue:result]; - if (pushResult) { - [self succeedWithPluginResult:pushResult withCallbackID:command.callbackId]; - } else { - [self failWithCallbackID:command.callbackId]; -}} --(void)setTags:(CDVInvokedUrlCommand *)command{ + } +} - NSArray *arguments=[command arguments]; - NSString *tags=[arguments objectAtIndex:0]; - - NSArray *array=[tags componentsSeparatedByString:@","]; - [APService setTags:[NSSet setWithArray:array] - callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) - object:self]; + + +-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{ + NSArray *arguments=command.arguments; + if (!arguments||[arguments count]<2) { + NSLog(@"#### setTagsWithAlias param is less"); + return ; + } + NSString *alias=[arguments objectAtIndex:0]; + NSArray *arrayTags=[arguments objectAtIndex:1]; + + NSLog(@"#### setTagsWithAlias alias is %@, tags is %@",alias,arrayTags); + + NSSet* set=[NSSet setWithArray:arrayTags]; + [JPUSHService setTags:set + alias:alias + callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) + object:self]; } - + + + +-(void)setTags:(CDVInvokedUrlCommand *)command{ + + + NSArray *arguments=[command arguments]; + NSString *tags=[arguments objectAtIndex:0]; + + NSLog(@"#### setTags %@",tags); + + NSArray *array=[tags componentsSeparatedByString:@","]; + [JPUSHService setTags:[NSSet setWithArray:array] + callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) + object:self]; + +} + + + -(void)setAlias:(CDVInvokedUrlCommand *)command{ - - NSArray *arguments=[command arguments]; - [APService setAlias:[arguments objectAtIndex:0] - callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) - object:self]; - + + NSArray *arguments=[command arguments]; + NSLog(@"#### setAlias %@",arguments); + [JPUSHService setAlias:[arguments objectAtIndex:0] + callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) + object:self]; + } + + -(void)getRegistrationID:(CDVInvokedUrlCommand*)command{ - - NSString* registrationID = [APService registrationID]; - CDVPluginResult *result=[self pluginResultForValue:registrationID]; - if (result) { - [self succeedWithPluginResult:result withCallbackID:command.callbackId]; - } else { - [self failWithCallbackID:command.callbackId]; - } + NSString* registrationID = [JPUSHService registrationID]; + NSLog(@"### getRegistrationID %@",registrationID); + + CDVPluginResult *result=[self pluginResultForValue:registrationID]; + if (result) { + [self succeedWithPluginResult:result withCallbackID:command.callbackId]; + } else { + [self failWithCallbackID:command.callbackId]; + } } - + + + -(void)tagsWithAliasCallback:(int)resultCode tags:(NSSet *)tags alias:(NSString *)alias{ - - NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInt:resultCode],@"resultCode", - tags==nil?[NSNull null]:[tags allObjects],@"tags", - alias==nil?[NSNull null]:alias,@"alias",nil]; - NSMutableDictionary *data = [NSMutableDictionary dictionary]; - [data setObject:[NSNumber numberWithInt:resultCode] forKey:@"resultCode"]; - [data setObject:tags==nil?[NSNull null]:[tags allObjects] forKey:@"tags"]; - [data setObject:alias==nil?[NSNull null]:alias forKey:@"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 writeJavascript:[NSString stringWithFormat:@"window.plugins.jPushPlugin.pushCallback('%@')",jsonString]]; - }); - + + NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt:resultCode],@"resultCode", + tags==nil?[NSNull null]:[tags allObjects],@"tags", + alias==nil?[NSNull null]:alias,@"alias",nil]; + NSMutableDictionary *data = [NSMutableDictionary dictionary]; + [data setObject:[NSNumber numberWithInt:resultCode] forKey:@"resultCode"]; + [data setObject:tags==nil?[NSNull null]:[tags allObjects] forKey:@"tags"]; + [data setObject:alias==nil?[NSNull null]:alias forKey:@"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 writeJavascript:[NSString stringWithFormat:@"window.plugins.jPushPlugin.pushCallback('%@')",jsonString]]; + }); + } + -(void)startLogPageView:(CDVInvokedUrlCommand*)command{ - NSArray *arguments=command.arguments; - if (!arguments||[arguments count]<1) { - NSLog(@"startLogPageView argument error"); - return ; - } - NSString * pageName=[arguments objectAtIndex:0]; - if (pageName) { - [APService startLogPageView:pageName]; - } + NSArray *arguments=command.arguments; + if (!arguments||[arguments count]<1) { + NSLog(@"startLogPageView argument error"); + return ; + } + NSString * pageName=[arguments objectAtIndex: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 objectAtIndex:0]; - if (pageName) { - [APService stopLogPageView:pageName]; - } - + NSArray *arguments=command.arguments; + if (!arguments||[arguments count]<1) { + NSLog(@"stopLogPageView argument error"); + return ; + } + NSString * pageName=[arguments objectAtIndex: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 objectAtIndex:0]; - int duration=[[arguments objectAtIndex:0]intValue]; - if (pageName) { - [APService beginLogPageView:pageName duration:duration]; - } - + NSArray *arguments=command.arguments; + if (!arguments||[arguments count]<2) { + NSLog(@"beginLogPageView argument error"); + return ; + } + NSString * pageName=[arguments objectAtIndex:0]; + int duration=[[arguments objectAtIndex: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 objectAtIndex:0]; - [APService setBadge:[badge intValue]]; + NSArray *argument=command.arguments; + if ([argument count]<1) { + NSLog(@"setBadge argument error!"); + return; + } + NSNumber *badge=[argument objectAtIndex:0]; + [JPUSHService setBadge:[badge intValue]]; } --(void)resetBadge:(CDVInvokedUrlCommand*)command{ - [APService resetBadge]; -} --(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{ - - [APService setDebugMode]; -} --(void)setLogOFF:(CDVInvokedUrlCommand*)command{ - - [APService setLogOFF]; -} --(void)stopPush:(CDVInvokedUrlCommand*)command{ - - [[UIApplication sharedApplication]unregisterForRemoteNotifications]; + + +-(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; + CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:num]; + [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; +} + + + +-(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{ + + [JPUSHService setDebugMode]; +} + + + +-(void)setLogOFF:(CDVInvokedUrlCommand*)command{ + + [JPUSHService setLogOFF]; +} + + + - (void)failWithCallbackID:(NSString *)callbackID { - CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR]; - [self.commandDelegate sendPluginResult:result callbackId:callbackID]; + CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR]; + [self.commandDelegate sendPluginResult:result callbackId:callbackID]; } + + + - (void)succeedWithPluginResult:(CDVPluginResult *)result withCallbackID:(NSString *)callbackID { - [self.commandDelegate sendPluginResult:result callbackId:callbackID]; -} --(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]; + [self.commandDelegate sendPluginResult:result callbackId:callbackID]; } + - (CDVPluginResult *)pluginResultForValue:(id)value { - - CDVPluginResult *result; - if ([value isKindOfClass:[NSString class]]) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK - messageAsString:[value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; - } else if ([value isKindOfClass:[NSNumber class]]) { - CFNumberType numberType = CFNumberGetType((CFNumberRef)value); - //note: underlyingly, BOOL values are typedefed as char - if (numberType == kCFNumberIntType || numberType == kCFNumberCharType) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:[value intValue]]; - } else { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:[value doubleValue]]; - } - } else if ([value isKindOfClass:[NSArray class]]) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:value]; - } else if ([value isKindOfClass:[NSDictionary class]]) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:value]; - } else if ([value isKindOfClass:[NSNull class]]) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - } else { - NSLog(@"Cordova callback block returned unrecognized type: %@", NSStringFromClass([value class])); - return nil; + + CDVPluginResult *result; + if ([value isKindOfClass:[NSString class]]) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK + messageAsString:[value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + } else if ([value isKindOfClass:[NSNumber class]]) { + CFNumberType numberType = CFNumberGetType((CFNumberRef)value); + //note: underlyingly, BOOL values are typedefed as char + if (numberType == kCFNumberIntType || numberType == kCFNumberCharType) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:[value intValue]]; + } else { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDouble:[value doubleValue]]; } - return result; + } else if ([value isKindOfClass:[NSArray class]]) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsArray:value]; + } else if ([value isKindOfClass:[NSDictionary class]]) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:value]; + } else if ([value isKindOfClass:[NSNull class]]) { + result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; + } else { + NSLog(@"Cordova callback block returned unrecognized type: %@", NSStringFromClass([value class])); + return nil; + } + return result; } + + - (void)networkDidReceiveMessage:(NSNotification *)notification { - - NSDictionary *userInfo = [notification userInfo]; - //NSLog(@"%@",userInfo); + + 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(), ^{ - NSError *error; - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:&error]; - NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; - - //NSLog(@"%@",jsonString); + [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.receiveMessage',%@)",jsonString]]; - dispatch_async(dispatch_get_main_queue(), ^{ - - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.receiveMessage',%@)",jsonString]]; - - [self.commandDelegate evalJs:[NSString stringWithFormat:@"window.plugins.jPushPlugin.receiveMessageIniOSCallback('%@')",jsonString]]; - - - }); - + [self.commandDelegate evalJs:[NSString stringWithFormat:@"window.plugins.jPushPlugin.receiveMessageIniOSCallback('%@')",jsonString]]; + + + }); + } + + -(void)networkDidReceiveNotification:(id)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: - case UIApplicationStateBackground: - { - dispatch_async(dispatch_get_main_queue(), ^{ - [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.openNotification',%@)",jsonString]]; - }); - - } - break; - default: - //do nothing - break; + + 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: + case UIApplicationStateBackground: + { + dispatch_async(dispatch_get_main_queue(), ^{ + [self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.openNotification',%@)",jsonString]]; + }); + + } + break; + default: + //do nothing + break; + } + } diff --git a/src/ios/PushConfig.plist b/src/ios/PushConfig.plist index 5d8a46d..6800671 100644 --- a/src/ios/PushConfig.plist +++ b/src/ios/PushConfig.plist @@ -3,8 +3,10 @@ APP_KEY - 7d431e42dfa6a6d693ac2d04 + CHANNEL Subscription + IsProduction + diff --git a/src/ios/lib/APService.h b/src/ios/lib/APService.h deleted file mode 100644 index bd529c3..0000000 --- a/src/ios/lib/APService.h +++ /dev/null @@ -1,175 +0,0 @@ -// -// APService.h -// APService -// -// Created by JPush on 12-8-15. -// Copyright (c) 2012年 HXHG. All rights reserved. -// Version: 1.8.3 - -@class CLRegion; -@class UILocalNotification; - -extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接 -extern NSString *const kJPFNetworkDidCloseNotification; // 关闭连接 -extern NSString *const kJPFNetworkDidRegisterNotification; // 注册成功 -extern NSString *const kJPFNetworkDidLoginNotification; // 登录成功 -extern NSString *const - kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS) -extern NSString *const kJPFServiceErrorNotification; // 错误提示 - -@class CLLocation; -@interface APService : NSObject - -#pragma - mark 基本功能 -// 以下四个接口是必须调用的 -+ (void)setupWithOption:(NSDictionary *)launchingOption; // 初始化 -+ (void)registerForRemoteNotificationTypes:(NSUInteger)types - categories:(NSSet *)categories; // 注册APNS类型 -+ (void)registerDeviceToken:(NSData *)deviceToken; // 向服务器上报Device Token -+ (void)handleRemoteNotification:(NSDictionary *) - remoteInfo; // 处理收到的APNS消息,向服务器上报收到APNS消息 - -// 下面的接口是可选的 -// 设置标签和(或)别名(若参数为nil,则忽略;若是空对象,则清空;详情请参考文档:http://docs.jpush.cn/pages/viewpage.action?pageId=3309913) -+ (void)setTags:(NSSet *)tags - alias:(NSString *)alias - callbackSelector:(SEL)cbSelector - target:(id)theTarget; -+ (void)setTags:(NSSet *)tags - alias:(NSString *)alias - callbackSelector:(SEL)cbSelector - object:(id)theTarget; -+ (void)setTags:(NSSet *)tags - callbackSelector:(SEL)cbSelector - object:(id)theTarget; -+ (void)setAlias:(NSString *)alias - callbackSelector:(SEL)cbSelector - object:(id)theTarget; -// 用于过滤出正确可用的tags,如果总数量超出最大限制则返回最大数量的靠前的可用tags -+ (NSSet *)filterValidTags:(NSSet *)tags; - -#pragma - mark 上报日志 -/** - * 记录页面停留时间功能。 - * startLogPageView和stopLogPageView为自动计算停留时间 - * beginLogPageView为手动自己输入停留时间 - * - * @param pageName 页面名称 - * @param seconds 页面停留时间 - */ -+ (void)startLogPageView:(NSString *)pageName; -+ (void)stopLogPageView:(NSString *)pageName; -+ (void)beginLogPageView:(NSString *)pageName duration:(int)seconds; - -/** - * 开启Crash日志收集, 默认是关闭状态. -*/ -+ (void)crashLogON; - -/** - * 地理位置设置 - * 为了更精确的统计用户地理位置,可以调用此方法传入经纬度信息 - * 需要链接 CoreLocation.framework 并且 #import - * @param latitude 纬度. - * @param longitude 经度. - * @param location 直接传递CLLocation *型的地理信息 - */ -+ (void)setLatitude:(double)latitude longitude:(double)longitude; -+ (void)setLocation:(CLLocation *)location; - -#pragma - mark 本地通知 -/** -* 本地推送,最多支持64个 -* @param fireDate 本地推送触发的时间 -* @param alertBody 本地推送需要显示的内容 -* @param badge 角标的数字。如果不需要改变角标传-1 -* @param alertAction 弹框的按钮显示的内容(IOS 8默认为"打开",其他默认为"启动") -* @param notificationKey 本地推送标示符 -* @param userInfo 自定义参数,可以用来标识推送和增加附加信息 -* @param soundName 自定义通知声音,设置为nil为默认声音 - -* IOS8新参数 -* @param region 自定义参数 -* @param regionTriggersOnce 自定义参数 -* @param category 自定义参数 -*/ -+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate - alertBody:(NSString *)alertBody - badge:(int)badge - alertAction:(NSString *)alertAction - identifierKey:(NSString *)notificationKey - userInfo:(NSDictionary *)userInfo - soundName:(NSString *)soundName; - -+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate - alertBody:(NSString *)alertBody - badge:(int)badge - alertAction:(NSString *)alertAction - identifierKey:(NSString *)notificationKey - userInfo:(NSDictionary *)userInfo - soundName:(NSString *)soundName - region:(CLRegion *)region - regionTriggersOnce:(BOOL)regionTriggersOnce - category:(NSString *)category - NS_AVAILABLE_IOS(8_0); - -/** -* 本地推送在前台推送。默认App在前台运行时不会进行弹窗,在程序接收通知调用此接口可实现指定的推送弹窗。 -* @param notification 本地推送对象 -* @param notificationKey 需要前台显示的本地推送通知的标示符 -*/ -+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification - identifierKey:(NSString *)notificationKey; -/** -* 删除本地推送 -* @param notificationKey 本地推送标示符 -* @param myUILocalNotification 本地推送对象 -*/ -+ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey; -+ (void)deleteLocalNotification:(UILocalNotification *)localNotification; - -/** -* 获取指定通知 -* @param notificationKey 本地推送标示符 -* @return 本地推送对象数组,[array count]为0时表示没找到 -*/ -+ (NSArray *)findLocalNotificationWithIdentifier:(NSString *)notificationKey; - -/** -* 清除所有本地推送对象 -*/ -+ (void)clearAllLocalNotifications; - -#pragma - mark 设置Badge -/** - * set setBadge - * @param value 设置JPush服务器的badge的值 - * 本地仍须调用UIApplication:setApplicationIconBadgeNumber函数,来设置脚标 - */ -+ (BOOL)setBadge:(NSInteger)value; -/** - * set setBadge - * @param value 清除JPush服务器对badge值的设定. - * 本地仍须调用UIApplication:setApplicationIconBadgeNumber函数,来设置脚标 - */ - -+ (void)resetBadge; - -/** - * get RegistrationID - */ -+ (NSString *)registrationID; - -#pragma - mark 打印日志信息配置 -/** - * setDebugMode获取更多的Log信息 - * 开发过程中建议开启DebugMode - * - * setLogOFF关闭除了错误信息外的所有Log - * 发布时建议开启LogOFF用于节省性能开销 - * - * 默认为不开启DebugLog,只显示基本的信息 - */ -+ (void)setDebugMode; -+ (void)setLogOFF; -@end diff --git a/src/ios/lib/JPUSHService.h b/src/ios/lib/JPUSHService.h new file mode 100755 index 0000000..15435bd --- /dev/null +++ b/src/ios/lib/JPUSHService.h @@ -0,0 +1,337 @@ +/* + * | | | | \ \ / / | | | | / _______| + * | |____| | \ \/ / | |____| | / / + * | |____| | \ / | |____| | | | _____ + * | | | | / \ | | | | | | |____ | + * | | | | / /\ \ | | | | \ \______| | + * | | | | /_/ \_\ | | | | \_________| + * + * Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved. + */ + +#define JPUSH_VERSION_NUMBER 2.1.0 + +#import + +@class CLRegion; +@class UILocalNotification; + +extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中 +extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接 +extern NSString *const kJPFNetworkDidCloseNotification; // 关闭连接 +extern NSString *const kJPFNetworkDidRegisterNotification; // 注册成功 +extern NSString *const kJPFNetworkDidLoginNotification; // 登录成功 +extern NSString *const kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS) +extern NSString *const kJPFServiceErrorNotification; // 错误提示 + +@class CLLocation; + + +/*! + * JPush 核心头文件 + */ +@interface JPUSHService : NSObject + + +///---------------------------------------------------- +/// @name Setup 启动相关 +///---------------------------------------------------- + +/*! + * @abstract 启动SDK + * + * @discussion 这是旧版本的启动方法, 依赖于 PushConfig.plist 文件. 建议不要使用, 已经过期. + */ ++ (void)setupWithOption:(NSDictionary *)launchingOption __attribute__((deprecated("JPush 2.1.0 版本已过期"))); + +/*! + * @abstract 启动SDK + * + * @param launchingOption 启动参数. + * @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识. + * @param channel 发布渠道. 可选. + * @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES. + * + * @discussion 提供SDK启动必须的参数, 来启动 SDK. + * 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作. + */ ++ (void)setupWithOption:(NSDictionary *)launchingOption + appKey:(NSString *)appKey + channel:(NSString *)channel + apsForProduction:(BOOL)isProduction; + + +///---------------------------------------------------- +/// @name APNs about 通知相关 +///---------------------------------------------------- + +/*! + * @abstract 注册要处理的远程通知类型 + * + * @param types 通知类型 + * @param categories + * + * @discussion + */ ++ (void)registerForRemoteNotificationTypes:(NSUInteger)types + categories:(NSSet *)categories; + ++ (void)registerDeviceToken:(NSData *)deviceToken; + +/*! + * @abstract 处理收到的 APNs 消息 + */ ++ (void)handleRemoteNotification:(NSDictionary *)remoteInfo; + + +///---------------------------------------------------- +/// @name Tag alias setting 设置别名与标签 +///---------------------------------------------------- + +/*! + * 下面的接口是可选的 + * 设置标签和(或)别名(若参数为nil,则忽略;若是空对象,则清空;详情请参考文档:http://docs.jpush.io/client/ios_api/#api-ios) + * setTags:alias:fetchCompletionHandle:是新的设置标签别名的方法,不再需要显示声明回调函数,只需要在block里面处理设置结果即可. + * WARN: 使用block时需要注意循环引用问题 + */ ++ (void) setTags:(NSSet *)tags + alias:(NSString *)alias +callbackSelector:(SEL)cbSelector + target:(id)theTarget; + ++ (void) setTags:(NSSet *)tags + alias:(NSString *)alias +callbackSelector:(SEL)cbSelector + object:(id)theTarget; + ++ (void) setTags:(NSSet *)tags +callbackSelector:(SEL)cbSelector + object:(id)theTarget; + ++ (void) setTags:(NSSet *)tags + alias:(NSString *)alias +fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler; + ++ (void) setTags:(NSSet *)tags +aliasInbackground:(NSString *)alias; + ++ (void)setAlias:(NSString *)alias +callbackSelector:(SEL)cbSelector + object:(id)theTarget; + +/*! + * @abstract 过滤掉无效的 tags + * + * @discussion 如果 tags 数量超过限制数量, 则返回靠前的有效的 tags. + * 建议设置 tags 前用此接口校验. SDK 内部也会基于此接口来做过滤. + */ ++ (NSSet *)filterValidTags:(NSSet *)tags; + + +///---------------------------------------------------- +/// @name Stats 统计功能 +///---------------------------------------------------- + +/*! + * @abstract 开始记录页面停留 + * + * @param pageName 页面名称 + */ ++ (void)startLogPageView:(NSString *)pageName; + +/*! + * @abstract 停止记录页面停留 + * + * @param pageName 页面 + */ ++ (void)stopLogPageView:(NSString *)pageName; + +/*! + * @abstract 直接上报在页面的停留时工 + * + * @param pageName 页面 + * @param seconds 停留的秒数 + */ ++ (void)beginLogPageView:(NSString *)pageName duration:(int)seconds; + +/*! + * @abstract 开启Crash日志收集 + * + * @discussion 默认是关闭状态. + */ ++ (void)crashLogON; + +/*! + * @abstract 地理位置上报 + * + * @param latitude 纬度. + * @param longitude 经度. + * + */ ++ (void)setLatitude:(double)latitude longitude:(double)longitude; + +/*! + * @abstract 地理位置上报 + * + * @param location 直接传递 CLLocation * 型的地理信息 + * + * @discussion 需要链接 CoreLocation.framework 并且 #import + */ ++ (void)setLocation:(CLLocation *)location; + + +///---------------------------------------------------- +/// @name Local Notification 本地通知 +///---------------------------------------------------- + +/*! + * @abstract 本地推送,最多支持64个 + * + * @param fireDate 本地推送触发的时间 + * @param alertBody 本地推送需要显示的内容 + * @param badge 角标的数字。如果不需要改变角标传-1 + * @param alertAction 弹框的按钮显示的内容(IOS 8默认为"打开", 其他默认为"启动") + * @param notificationKey 本地推送标示符 + * @param userInfo 自定义参数,可以用来标识推送和增加附加信息 + * @param soundName 自定义通知声音,设置为nil为默认声音 + * + * @discussion 最多支持 64 个定义 + */ ++ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate + alertBody:(NSString *)alertBody + badge:(int)badge + alertAction:(NSString *)alertAction + identifierKey:(NSString *)notificationKey + userInfo:(NSDictionary *)userInfo + soundName:(NSString *)soundName; + +/*! + * @abstract 本地推送 (支持 iOS8 新参数) + * + * IOS8新参数 + * @param region 自定义参数 + * @param regionTriggersOnce 自定义参数 + * @param category 自定义参数 + */ ++ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate + alertBody:(NSString *)alertBody + badge:(int)badge + alertAction:(NSString *)alertAction + identifierKey:(NSString *)notificationKey + userInfo:(NSDictionary *)userInfo + soundName:(NSString *)soundName + region:(CLRegion *)region + regionTriggersOnce:(BOOL)regionTriggersOnce + category:(NSString *)category NS_AVAILABLE_IOS(8_0); + +/*! + * @abstract 前台展示本地推送 + * + * @param notification 本地推送对象 + * @param notificationKey 需要前台显示的本地推送通知的标示符 + * + * @discussion 默认App在前台运行时不会进行弹窗,在程序接收通知调用此接口可实现指定的推送弹窗。 + */ ++ (void)showLocalNotificationAtFront:(UILocalNotification *)notification + identifierKey:(NSString *)notificationKey; +/*! + * @abstract 删除本地推送定义 + * + * @param notificationKey 本地推送标示符 + * @param myUILocalNotification 本地推送对象 + */ ++ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey; + +/*! + * @abstract 删除本地推送定义 + */ ++ (void)deleteLocalNotification:(UILocalNotification *)localNotification; + +/*! + * @abstract 获取指定通知 + * + * @param notificationKey 本地推送标示符 + * @return 本地推送对象数组, [array count]为0时表示没找到 + */ ++ (NSArray *)findLocalNotificationWithIdentifier:(NSString *)notificationKey; + +/*! + * @abstract 清除所有本地推送对象 + */ ++ (void)clearAllLocalNotifications; + + +///---------------------------------------------------- +/// @name Server badge 服务器端 badge 功能 +///---------------------------------------------------- + +/*! + * @abstract 设置角标(到服务器) + * + * @param value 新的值. 会覆盖服务器上保存的值(这个用户) + * + * @discussion 本接口不会改变应用本地的角标值. + * 本地仍须调用 UIApplication:setApplicationIconBadgeNumber 函数来设置脚标. + * + * 本接口用于配合 JPush 提供的服务器端角标功能. + * 该功能解决的问题是, 服务器端推送 APNs 时, 并不知道客户端原来已经存在的角标是多少, 指定一个固定的数字不太合理. + * + * JPush 服务器端脚标功能提供: + * + * - 通过本 API 把当前客户端(当前这个用户的) 的实际 badge 设置到服务器端保存起来; + * - 调用服务器端 API 发 APNs 时(通常这个调用是批量针对大量用户), + * 使用 "+1" 的语义, 来表达需要基于目标用户实际的 badge 值(保存的) +1 来下发通知时带上新的 badge 值; + */ ++ (BOOL)setBadge:(NSInteger)value; + +/*! + * @abstract 重置脚标(为0) + * + * @discussion 相当于 [setBadge:0] 的效果. + * 参考 [JPUSHService setBadge:] 说明来理解其作用. + */ ++ (void)resetBadge; + + +///---------------------------------------------------- +/// @name Logs and others 日志与其他 +///---------------------------------------------------- + +/*! + * @abstract JPush标识此设备的 registrationID + * + * @discussion SDK注册成功后, 调用此接口获取到 registrationID 才能够获取到. + * + * JPush 支持根据 registrationID 来进行推送. + * 如果你需要此功能, 应该通过此接口获取到 registrationID 后, 上报到你自己的服务器端, 并保存下来. + * + * 更多的理解请参考 JPush 的文档网站. + */ ++ (NSString *)registrationID; + +/*! + * @abstract 打开日志级别到 Debug + * + * @discussion JMessage iOS 的日志系统参考 Android 设计了级别. + * 从低到高是: Verbose, Debug, Info, Warning, Error. + * 对日志级别的进一步理解, 请参考 Android 相关的说明. + * + * SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志. + * + * 调用本接口可打开日志级别为: Debug, 打印调试日志. + */ ++ (void)setDebugMode; + +/*! + * @abstract 关闭日志 + * + * @discussion 关于日志级别的说明, 参考 [JPUSHService setDebugMode] + * + * 虽说是关闭日志, 但还是会打印 Warning, Error 日志. 这二种日志级别, 在程序运行正常时, 不应有打印输出. + * + * 建议在发布的版本里, 调用此接口, 关闭掉日志打印. + */ ++ (void)setLogOFF; + + +@end diff --git a/src/ios/lib/jpush-ios-2.1.0.a b/src/ios/lib/jpush-ios-2.1.0.a new file mode 100644 index 0000000..319d1a0 Binary files /dev/null and b/src/ios/lib/jpush-ios-2.1.0.a differ diff --git a/src/ios/lib/libPushSDK-1.8.3.a b/src/ios/lib/libPushSDK-1.8.3.a deleted file mode 100644 index c03cb14..0000000 Binary files a/src/ios/lib/libPushSDK-1.8.3.a and /dev/null differ diff --git a/www/JPushPlugin.js b/www/JPushPlugin.js index a830f5e..099252b 100644 --- a/www/JPushPlugin.js +++ b/www/JPushPlugin.js @@ -1,4 +1,5 @@ + var JPushPlugin = function(){ }; @@ -43,9 +44,14 @@ JPushPlugin.prototype.beginLogPageView = function(pageName,duration){ } JPushPlugin.prototype.setApplicationIconBadgeNumber = function(badge){ if(this.isPlatformIOS()){ - this.call_native( "setApplicationIconBadgeNumber",[badge],null); + this.call_native( "setApplicationIconBadgeNumber",[badge],null); } } + JPushPlugin.prototype.getApplicationIconBadgeNumber = function(callback){ + if(this.isPlatformIOS()){ + this.call_native( "getApplicationIconBadgeNumber",[],callback); + } + } JPushPlugin.prototype.setTagsWithAlias = function(tags,alias){ try{ @@ -253,6 +259,13 @@ JPushPlugin.prototype.clearAllNotification = function(){ } } +JPushPlugin.prototype.clearNotificationById = function(notificationId){ + if(device.platform == "Android") { + data=[] + this.call_native("clearNotificationById",[notificationId],null); + } +} + JPushPlugin.prototype.setLatestNotificationNum = function(num){ if(device.platform == "Android") { this.call_native("setLatestNotificationNum",[num],null); @@ -321,3 +334,5 @@ if(!window.plugins.jPushPlugin){ module.exports = new JPushPlugin(); + +