diff --git a/README.md b/README.md index f9f970d..6f3e761 100644 --- a/README.md +++ b/README.md @@ -17,16 +17,16 @@ jpush-phonegap-plugin 支持 iOS,Android 的推送插件。 1. cordova create 文件夹名字 包名 应用名字 cordova create Myproj com.myproj.jpush MyTestProj - + 2. 添加平台 - cd Myproj + cd Myproj cordova platform add android cordova platform add ios ps:这里请注意iOS平台,必须先执行 `cordova platform add ios`, 然后再执行`cordova plugin add xxxxx`命令,不然有一些必须要的链接库需要手动添加 - + ###Cordova CLI/Phonegap 安装 Android & iOS @@ -53,14 +53,14 @@ jpush-phonegap-plugin 支持 iOS,Android 的推送插件。 3). 在js中调用函数,初始化jpush sdk - window.plugins.jPushPlugin.init(); + window.plugins.jPushPlugin.init(); //由于phonegap插件采用了Lazy load的特性, 所以这里建议在js文件能执行的最开始就加 ### Android 手工安装 [Android 手工安装文档地址](document/Android_handle_install.md) - + ### IOS手工安装 @@ -88,10 +88,10 @@ jpush-phonegap-plugin 支持 iOS,Android 的推送插件。 具体的API请参考这里 -#### iOS和adnroid通用API简介 +#### iOS和android通用API简介 + 停止与恢复推送服务 API - + window.plugins.jPushPlugin.init() window.plugins.jPushPlugin.stopPush() window.plugins.jPushPlugin.resumePush() @@ -101,17 +101,17 @@ jpush-phonegap-plugin 支持 iOS,Android 的推送插件。 + 获取 RegistrationID API window.plugins.jPushPlugin.getRegistrationID(callback) - + + 别名与标签 API - + window.plugins.jPushPlugin.setTagsWithAlias(tags,alias) window.plugins.jPushPlugin.setTags(tags) window.plugins.jPushPlugin.setAlias(alias) + 获取点击通知内容 - + event - jpush.openNotification + 获取通知内容 - + event - jpush.receiveNotification + 获取自定义消息推送内容 @@ -128,9 +128,9 @@ jpush-phonegap-plugin 支持 iOS,Android 的推送插件。 event - jpush.receiveMessage //推荐使用事件的方式传递,但同时保留了receiveMessageIniOSCallback的回调函数,兼容以前的代码 window.plugins.jPushPlugin.receiveMessageIniOSCallback(data) - + + 页面的统计 - + window.plugins.jPushPlugin.startLogPageView (pageName) window.plugins.jPushPlugin.stopLogPageView (pageName) window.plugins.jPushPlugin.beginLogPageView (pageName,duration) @@ -142,31 +142,36 @@ jpush-phonegap-plugin 支持 iOS,Android 的推送插件。 + 本地通知 + 后续版本加入 - + + 日志等级设置 - + window.plugins.jPushPlugin.setDebugModeFromIos () window.plugins.jPushPlugin.setLogOFF() - - + + [iOS API详细说明](document/iOS_detail_api.md) -#### adnroid API简介 - +#### android API简介 + + 获取集成日志 window.plugins.jPushPlugin.setDebugMode(mode) + 接收推送消息和点击通知 - + //下面这两个api 是兼容旧有的代码 window.plugins.jPushPlugin.receiveMessageInAndroidCallback(data) window.plugins.jPushPlugin.openNotificationInAndroidCallback(data) + 统计分析 API - onResume / onPause(java api) - + window.plugins.jPushPlugin.setStatisticsOpen(boolean) + + 或在 MainActivity 中的 onPause() 和 onResume() 方法中分别调用 + JPushInterface.onResume(this) 和 JPushInterface.onPause(this) 来启用统计分析功能, + 如果使用这种方式启用统计分析功能,则window.plugins.jPushPlugin.setStatisticsOpen(boolean) + 方法不再有效,建议不要同时使用。 + + 清除通知 API window.plugins.jPushPlugin.clearAllNotification() @@ -177,11 +182,11 @@ jpush-phonegap-plugin 支持 iOS,Android 的推送插件。 window.plugins.jPushPlugin.setCustomPushNotificationBuilder = function() + 设置保留最近通知条数 API - + window.plugins.jPushPlugin.setLatestNotificationNum(num) - + + 本地通知API - + window.plugins.jPushPlugin.addLocalNotification(builderId, content, title, @@ -195,18 +200,18 @@ jpush-phonegap-plugin 支持 iOS,Android 的推送插件。 ###常见问题 -####1. androd +####1. android 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 其他值说明: + + 在PushConfig.plist 中修改。PushConfig.plist 其他值说明: CHANNEL 渠道标识 IsProduction 是否生产环境(暂未启用) - + ###更多 - [JPush官网文档](http://docs.jpush.io/) \ No newline at end of file + [JPush官网文档](http://docs.jpush.io/) diff --git a/document/Android_detail_api.md b/document/Android_detail_api.md index 4a774b4..bfcac55 100644 --- a/document/Android_detail_api.md +++ b/document/Android_detail_api.md @@ -28,7 +28,7 @@ ##### 接口定义 window.plugins.jPushPlugin.receiveMessageInAndroidCallback = function(data) - + ##### 参数说明 - data 接收到的js字符串,包含的key:value请进入该函数体查看 @@ -42,7 +42,7 @@ ##### 接口定义 window.plugins.jPushPlugin.openNotificationInAndroidCallback = function(data) - + ##### 参数说明 - data js字符串 @@ -80,6 +80,19 @@ JPushInterface.onPause(this); } +#### API - setStatisticsOpen(boolean) + +用于在 js 中控制是否打开应用的统计分析功能,但如果已经添加了上面的 onResume/onPause 方法, +就不能再通过这个方法来控制统计分析功能了。 + +#### 接口定义 + + window.plugins.jPushPlugin.setStatisticsOpen(boolean) + +#### 参数说明 +- boolean + -true : 打开统计分析功能 + -false: 关闭统计分析功能 #### API - reportNotificationOpened @@ -89,7 +102,7 @@ ##### 接口定义 window.plugins.jPushPlugin.reportNotificationOpened(msgID) - + ##### 参数说明 - msgID -收到的通知或者自定义消息的id @@ -117,14 +130,14 @@ 当用户需要定制默认的通知栏样式时,则可调用此方法。 极光 Push SDK 提供了 2 个用于定制通知栏样式的构建类: -- setBasicPushNotificationBuilder +- setBasicPushNotificationBuilder - Basic 用于定制 Android Notification 里的 defaults / flags / icon 等基础样式(行为) - setCustomPushNotificationBuilder - 继承 Basic 进一步让开发者定制 Notification Layout - + 如果不调用此方法定制,则极光Push SDK 默认的通知栏样式是:Android标准的通知栏提示。 -##### 接口定义 +##### 接口定义 window.plugins.jPushPlugin.setBasicPushNotificationBuilder = function() window.plugins.jPushPlugin.setCustomPushNotificationBuilder = function() @@ -143,7 +156,7 @@ ##### 接口定义 window.plugins.jPushPlugin.setLatestNotificationNum(num) - + ##### 参数说明 - num 保存的条数 @@ -181,5 +194,3 @@ - notificaitonID 设置本地通知的ID - broadcastTime 设置本地通知触发时间,为距离当前时间的数值,单位是毫秒 - extras 设置额外的数据信息extras为json字符串 - - diff --git a/document/Android_handle_install.md b/document/Android_handle_install.md index ea9b1c1..ae58338 100644 --- a/document/Android_handle_install.md +++ b/document/Android_handle_install.md @@ -4,9 +4,9 @@ 1. 复制:`$JPUSH_PLUGIN_DIR`/src/android/*.java 到cn/jpush/phonega/目录下(即:cn.jpush.phonegap的包下) 2. 复制:`$JPUSH_PLUGIN_DIR`/src/android/armeabi/libjpush.so 到lib/armeabi/ -3. 复制:`$JPUSH_PLUGIN_DIR`/src/android/jpush-sdk-release1.5.0.jar 到lib/ +3. 复制:`$JPUSH_PLUGIN_DIR`/src/android/jpush-sdk-release2.0.6.jar 到lib/ 4. 复制:`$JPUSH_PLUGIN_DIR`/src/android/test_notification_layout.xml到res/layout/ -5. 复制:`$JPUSH_PLUGIN_DIR`/src/android/jpush_notification_icon.png 到res/drawable/ +5. 复制:`$JPUSH_PLUGIN_DIR`/src/android/jpush_notification_icon.png到res/drawable/ 6. 修改 AndroidManifest.xml 在 manifest 节点下添加以下权限 @@ -53,7 +53,7 @@ - + @@ -76,7 +76,7 @@ - + - - diff --git a/src/android/JPushPlugin.java b/src/android/JPushPlugin.java index 5d4b71e..9f9672e 100644 --- a/src/android/JPushPlugin.java +++ b/src/android/JPushPlugin.java @@ -28,395 +28,372 @@ 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 = - Arrays.asList( - "getRegistrationID", - "setTags", - "setTagsWithAlias", - "setAlias", - "getNotification", - "setBasicPushNotificationBuilder", - "setCustomPushNotificationBuilder", - "setPushTime", - "init", - "setDebugMode", - "stopPush", - "resumePush", - "isPushStopped", - "setLatestNotificationNum", - "setPushTime", - "clearAllNotification", - "clearNotificationById", - "addLocalNotification", - "removeLocalNotification", - "clearLocalNotifications", - "onResume", - "onPause", - "reportNotificationOpened"); - - private ExecutorService threadPool = Executors.newFixedThreadPool(1); - private static JPushPlugin instance; + private final static List methodList = + Arrays.asList( + "getRegistrationID", + "setTags", + "setTagsWithAlias", + "setAlias", + "getNotification", + "setBasicPushNotificationBuilder", + "setCustomPushNotificationBuilder", + "setPushTime", + "init", + "setDebugMode", + "stopPush", + "resumePush", + "isPushStopped", + "setLatestNotificationNum", + "setPushTime", + "clearAllNotification", + "clearNotificationById", + "addLocalNotification", + "removeLocalNotification", + "clearLocalNotifications", + "onResume", + "onPause", + "reportNotificationOpened", + "setStatisticsOpen"); + + private ExecutorService threadPool = Executors.newFixedThreadPool(1); + private static JPushPlugin instance; + private static Activity cordovaActivity; private static String TAG = "JPushPlugin"; - private static boolean shouldCacheMsg = false; + private static boolean shouldCacheMsg = false; + private static boolean isStatisticsOpened = true; // 是否开启统计分析功能 - public static String notificationAlert; - public static Map notificationExtras=new HashMap(); - public static String openNotificationAlert; - public static Map openNotificationExtras=new HashMap(); + public static String notificationAlert; + public static Map notificationExtras = new HashMap(); + public static String openNotificationAlert; + public static Map openNotificationExtras = new HashMap(); + public JPushPlugin() { + instance = this; + } - public JPushPlugin() { - instance = this; - } + @Override + public void initialize(CordovaInterface cordova, CordovaWebView webView) { + super.initialize(cordova, webView); - @Override - public void initialize(CordovaInterface cordova, CordovaWebView webView) { - super.initialize(cordova, webView); + Log.i(TAG, "---------------- initialize" + "-" + JPushPlugin.openNotificationAlert + "-" + JPushPlugin.notificationAlert); - Log.i(TAG, "---------------- initialize"+"-"+JPushPlugin.openNotificationAlert + "-" + JPushPlugin.notificationAlert); + cordovaActivity = this.cordova.getActivity(); - 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()); + } - //如果同时缓存了打开事件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); - } + public void onPause(boolean multitasking) { + Log.i(TAG, "---------------- onPause"); + shouldCacheMsg = true; + if (isStatisticsOpened) { + JPushInterface.onPause(this.cordova.getActivity()); + } + } + public void onResume(boolean multitasking) { + shouldCacheMsg = false; + Log.i(TAG, "---------------- onResume" + "-" + JPushPlugin.openNotificationAlert + "-" + JPushPlugin.notificationAlert); + if (isStatisticsOpened) { + JPushInterface.onResume(this.cordova.getActivity()); + } + 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(); - try { - data.put("message", message); - JSONObject jExtras = new JSONObject(); - for(Entry entry:extras.entrySet()){ - if(entry.getKey().equals("cn.jpush.android.EXTRA")){ - JSONObject jo = new JSONObject((String)entry.getValue()); + private static JSONObject notificationObject(String message, + Map extras) { + JSONObject data = new JSONObject(); + try { + data.put("message", message); + JSONObject jExtras = new JSONObject(); + for (Entry entry : extras.entrySet()) { + if (entry.getKey().equals("cn.jpush.android.EXTRA")) { + JSONObject jo = new JSONObject((String) entry.getValue()); jExtras.put("cn.jpush.android.EXTRA", jo); } else { - jExtras.put(entry.getKey(),entry.getValue()); + jExtras.put(entry.getKey(), entry.getValue()); } - } - if(jExtras.length()>0) - { - data.put("extras", jExtras); - } - } catch (JSONException e) { + } + if (jExtras.length() > 0) { + data.put("extras", jExtras); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return data; + } - } - return data; - } + private static JSONObject openNotificationObject(String alert, + Map extras) { + JSONObject data = new JSONObject(); + try { + data.put("alert", alert); + JSONObject jExtras = new JSONObject(); + for (Entry entry : extras.entrySet()) { + if (entry.getKey().equals("cn.jpush.android.EXTRA")) { + JSONObject jo = new JSONObject((String) entry.getValue()); + jExtras.put("cn.jpush.android.EXTRA", jo); + } else { + jExtras.put(entry.getKey(), entry.getValue()); + } + } + if (jExtras.length() > 0) { + data.put("extras", jExtras); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return data; + } - private static JSONObject openNotificationObject(String alert, - Map extras){ - JSONObject data = new JSONObject(); - try{ - data.put("alert", alert); - JSONObject jExtras = new JSONObject(); - for(Entry entry:extras.entrySet()){ - if(entry.getKey().equals("cn.jpush.android.EXTRA")){ - JSONObject jo = new JSONObject((String)entry.getValue()); - jExtras.put("cn.jpush.android.EXTRA", jo); - }else{ - jExtras.put(entry.getKey(),entry.getValue()); - } - } - if(jExtras.length()>0) - { - data.put("extras", jExtras); - } - } catch (JSONException e) { + static void transmitPush(String message, Map extras) { + if (instance == null) { + return; + } + JSONObject data = notificationObject(message, extras); + String format = "window.plugins.jPushPlugin.receiveMessageInAndroidCallback('%s');"; + final String js = String.format(format, data.toString()); + cordovaActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + instance.webView.loadUrl("javascript:" + js); + } + }); + } - } - return data; - } - static void transmitPush(String message, Map extras) { - if (instance == null) { - return; - } - JSONObject data = notificationObject(message, extras); - String js = String - .format("window.plugins.jPushPlugin.receiveMessageInAndroidCallback('%s');", - data.toString()); - - - try { - instance.webView.sendJavascript(js); - -// String jsEvent=String -// .format("cordova.fireDocumentEvent('jpush.receiveMessage',%s)", -// data.toString()); -// instance.webView.sendJavascript(jsEvent); - } catch (NullPointerException e) { + static void transmitOpen(String alert, Map extras) { + if (instance == null) { + return; + } + if (JPushPlugin.shouldCacheMsg) { + return; + } + Log.i(TAG, "---------------- transmitOpen"); - } catch (Exception e) { + JSONObject data = openNotificationObject(alert, extras); + String format = "window.plugins.jPushPlugin.openNotificationInAndroidCallback('%s');"; + final String js = String.format(format, data.toString()); + cordovaActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + instance.webView.loadUrl("javascript:" + js); + } + }); + JPushPlugin.openNotificationAlert = null; + } - } - } - static void transmitOpen(String alert, Map extras) { - if (instance == null) { - return; - } + static void transmitReceive(String alert, Map extras) { + if (instance == null) { + return; + } + if (JPushPlugin.shouldCacheMsg) { + return; + } + JSONObject data = openNotificationObject(alert, extras); + String format = "window.plugins.jPushPlugin.receiveNotificationInAndroidCallback('%s');"; + final String js = String.format(format, data.toString()); + cordovaActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + instance.webView.loadUrl("javascript:" + js); + } + }); + JPushPlugin.notificationAlert = null; + } - if(JPushPlugin.shouldCacheMsg){ - return; - } + @Override + public boolean execute(final String action, final JSONArray data, + final CallbackContext callbackContext) throws JSONException { + if (!methodList.contains(action)) { + return false; + } + threadPool.execute(new Runnable() { + @Override + public void run() { + try { + Method method = JPushPlugin.class.getDeclaredMethod(action, + JSONArray.class, CallbackContext.class); + method.invoke(JPushPlugin.this, data, callbackContext); + } catch (Exception e) { + Log.e(TAG, e.toString()); + } + } + }); + return true; + } - Log.i(TAG, "---------------- transmitOpen"); + void init(JSONArray data, CallbackContext callbackContext) { + JPushInterface.init(this.cordova.getActivity().getApplicationContext()); + //callbackContext.success(); + } - JSONObject data = openNotificationObject(alert, extras); - String js = String - .format("window.plugins.jPushPlugin.openNotificationInAndroidCallback('%s');", - data.toString()); + void setDebugMode(JSONArray data, CallbackContext callbackContext) { + boolean mode; + try { + mode = data.getBoolean(0); + // if (mode.equals("true")) { + // JPushInterface.setDebugMode(true); + // } else if (mode.equals("false")) { + // JPushInterface.setDebugMode(false); + // } else { + // callbackContext.error("error mode"); + // } + JPushInterface.setDebugMode(mode); + callbackContext.success(); + } catch (JSONException e) { + e.printStackTrace(); + } + } - try { - instance.webView.sendJavascript(js); - -// String jsEvent=String -// .format("cordova.fireDocumentEvent('jpush.openNotification',%s)", -// data.toString()); -// instance.webView.sendJavascript(jsEvent); - } catch (NullPointerException e) { + void stopPush(JSONArray data, CallbackContext callbackContext) { + JPushInterface.stopPush(this.cordova.getActivity().getApplicationContext()); + callbackContext.success(); + } - } catch (Exception e) { + void resumePush(JSONArray data, CallbackContext callbackContext) { + JPushInterface.resumePush(this.cordova.getActivity().getApplicationContext()); + callbackContext.success(); + } - } - JPushPlugin.openNotificationAlert = null; - } - static void transmitReceive(String alert, Map extras) { - if (instance == null) { - return; - } + void isPushStopped(JSONArray data, CallbackContext callbackContext) { + boolean isStopped = JPushInterface.isPushStopped( + this.cordova.getActivity().getApplicationContext()); + if (isStopped) { + callbackContext.success(1); + } else { + callbackContext.success(0); + } + } - if(JPushPlugin.shouldCacheMsg){ - return; - } + void setLatestNotificationNum(JSONArray data, CallbackContext callbackContext) { + int num = -1; + try { + num = data.getInt(0); + } catch (JSONException e) { + e.printStackTrace(); + callbackContext.error("error reading num json"); + } + if (num != -1) { + JPushInterface.setLatestNotificationNumber( + this.cordova.getActivity().getApplicationContext(), num); + } else { + callbackContext.error("error num"); + } + } - JSONObject data = openNotificationObject(alert, extras); - String js = String - .format("window.plugins.jPushPlugin.receiveNotificationInAndroidCallback('%s');", - data.toString()); + void setPushTime(JSONArray data, CallbackContext callbackContext) { + Set days = new HashSet(); + JSONArray dayArray; + int startHour = -1; + int endHour = -1; + try { + dayArray = data.getJSONArray(0); + for (int i = 0; i < dayArray.length(); i++) { + days.add(dayArray.getInt(i)); + } + } catch (JSONException e) { + e.printStackTrace(); + callbackContext.error("error reading days json"); + } + try { + startHour = data.getInt(1); + endHour = data.getInt(2); + } catch (JSONException e) { + callbackContext.error("error reading hour json"); + } + Context context = this.cordova.getActivity().getApplicationContext(); + JPushInterface.setPushTime(context, days, startHour, endHour); + callbackContext.success(); + } - try { - - instance.webView.sendJavascript(js); + void getRegistrationID(JSONArray data, CallbackContext callbackContext) { + Context context = this.cordova.getActivity().getApplicationContext(); + String regID = JPushInterface.getRegistrationID(context); + callbackContext.success(regID); + } - } catch (NullPointerException e) { + void onResume(JSONArray data, CallbackContext callbackContext) { + JPushInterface.onResume(this.cordova.getActivity()); + } - } catch (Exception e) { + void onPause(JSONArray data, CallbackContext callbackContext) { + JPushInterface.onPause(this.cordova.getActivity()); + } - } - JPushPlugin.notificationAlert = null; + void reportNotificationOpened(JSONArray data, CallbackContext callbackContext) { + try { + String msgID; + msgID = data.getString(0); + JPushInterface.reportNotificationOpened(this.cordova.getActivity(), msgID); + } catch (JSONException e) { + e.printStackTrace(); + } + } - } + void setTags(JSONArray data, CallbackContext callbackContext) { + try { + HashSet tags = new HashSet(); + for (int i = 0; i < data.length(); i++) { + tags.add(data.getString(i)); + } + JPushInterface.setTags(this.cordova.getActivity() + .getApplicationContext(), tags, mTagWithAliasCallback); + callbackContext.success(); + } catch (JSONException e) { + e.printStackTrace(); + callbackContext.error("Error reading tags JSON"); + } + } - @Override - public boolean execute(final String action, final JSONArray data, - final CallbackContext callbackContext) throws JSONException { - if (!methodList.contains(action)) { - return false; - } - threadPool.execute(new Runnable() { - @Override - public void run() { - try { - Method method = JPushPlugin.class.getDeclaredMethod(action, - JSONArray.class, CallbackContext.class); - method.invoke(JPushPlugin.this, data, callbackContext); - } catch (Exception e) { - Log.e(TAG,e.toString()); - } - } - }); - return true; - } - - void init(JSONArray data,CallbackContext callbackContext){ - JPushInterface.init(this.cordova.getActivity().getApplicationContext()); - //callbackContext.success(); - } - - void setDebugMode(JSONArray data, CallbackContext callbackContext) { - boolean mode; - try { - mode = data.getBoolean(0); - // if (mode.equals("true")) { - // JPushInterface.setDebugMode(true); - // } else if (mode.equals("false")) { - // JPushInterface.setDebugMode(false); - // } else { - // callbackContext.error("error mode"); - // } - JPushInterface.setDebugMode(mode); - callbackContext.success(); - } catch (JSONException e) { - } - } - - void stopPush(JSONArray data, - CallbackContext callbackContext){ - JPushInterface.stopPush(this.cordova.getActivity().getApplicationContext()); - callbackContext.success(); - } - - void resumePush(JSONArray data, - CallbackContext callbackContext){ - JPushInterface.resumePush(this.cordova.getActivity().getApplicationContext()); - callbackContext.success(); - } - - void isPushStopped(JSONArray data, - CallbackContext callbackContext){ - boolean isStopped =JPushInterface.isPushStopped(this.cordova.getActivity().getApplicationContext()); - if(isStopped){ - callbackContext.success(1); - }else{ - callbackContext.success(0); - } - } - - void setLatestNotificationNum(JSONArray data, - CallbackContext callbackContext){ - int num = -1; - try { - num = data.getInt(0); - } catch (JSONException e) { - e.printStackTrace(); - callbackContext.error("error reading num json"); - } - if(num != -1){ - JPushInterface.setLatestNotificationNumber(this.cordova.getActivity().getApplicationContext(), num); - }else{ - callbackContext.error("error num"); - } - } - - void setPushTime(JSONArray data, - CallbackContext callbackContext){ - Set days = new HashSet(); - JSONArray dayArray; - int startHour = -1; - int endHour = -1; - try { - dayArray = data.getJSONArray(0); - for (int i = 0; i < dayArray.length(); i++) { - days.add(dayArray.getInt(i)); - } - } catch (JSONException e) { - e.printStackTrace(); - callbackContext.error("error reading days json"); - } - try{ - startHour = data.getInt(1); - endHour = data.getInt(2); - }catch(JSONException e){ - callbackContext.error("error reading hour json"); - } - JPushInterface.setPushTime(this.cordova.getActivity().getApplicationContext(), days, startHour, endHour); - callbackContext.success(); - } - - void getRegistrationID(JSONArray data, CallbackContext callbackContext) { - String regID= JPushInterface.getRegistrationID(this.cordova.getActivity().getApplicationContext()); - callbackContext.success(regID); + void setAlias(JSONArray data, CallbackContext callbackContext) { + try { + String alias = data.getString(0); + JPushInterface.setAlias(this.cordova.getActivity() + .getApplicationContext(), alias, mTagWithAliasCallback); + callbackContext.success(); + } catch (JSONException e) { + e.printStackTrace(); + callbackContext.error("Error reading alias JSON"); + } + } - } - void onResume(JSONArray data, CallbackContext callbackContext) { - JPushInterface.onResume(this.cordova.getActivity()); - } - void onPause(JSONArray data, CallbackContext callbackContext) { - JPushInterface.onPause(this.cordova.getActivity()); - } - void reportNotificationOpened(JSONArray data, CallbackContext callbackContext) { - try { - String msgID; - msgID = data.getString(0); - JPushInterface.reportNotificationOpened(this.cordova.getActivity(),msgID); - } catch (JSONException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - void setTags(JSONArray data, CallbackContext callbackContext) { - - try { - HashSet tags=new HashSet(); - for(int i=0;i tags = new HashSet(); - String alias; - try { - alias = data.getString(0); - JSONArray tagsArray = data.getJSONArray(1); - for (int i = 0; i < tagsArray.length(); i++) { - tags.add(tagsArray.getString(i)); - } - - JPushInterface.setAliasAndTags(this.cordova.getActivity() - .getApplicationContext(), alias, tags,mTagWithAliasCallback); - callbackContext.success(); - } catch (JSONException e) { - e.printStackTrace(); - callbackContext.error("Error reading tagAlias JSON"); - } - } + void setTagsWithAlias(JSONArray data, CallbackContext callbackContext) { + HashSet tags = new HashSet(); + String alias; + try { + alias = data.getString(0); + JSONArray tagsArray = data.getJSONArray(1); + for (int i = 0; i < tagsArray.length(); i++) { + tags.add(tagsArray.getString(i)); + } + JPushInterface.setAliasAndTags(this.cordova.getActivity() + .getApplicationContext(), alias, tags, mTagWithAliasCallback); + callbackContext.success(); + } catch (JSONException e) { + e.printStackTrace(); + callbackContext.error("Error reading tagAlias JSON"); + } + } // void getNotification(JSONArray data, CallbackContext callBackContext) { // String alert = JPushPlugin.notificationAlert; @@ -436,123 +413,123 @@ public class JPushPlugin extends CordovaPlugin { // JPushPlugin.notificationExtras = new HashMap(); // } - void setBasicPushNotificationBuilder(JSONArray data, - CallbackContext callbackContext) { - BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder( - this.cordova.getActivity()); - builder.developerArg0 = "Basic builder 1"; - JPushInterface.setPushNotificationBuilder(1, builder); - JSONObject obj = new JSONObject(); - try { - obj.put("id", 1); - } catch (JSONException e) { - e.printStackTrace(); - } - //callbackContext.success(obj); - } + void setBasicPushNotificationBuilder(JSONArray data, + CallbackContext callbackContext) { + BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder( + this.cordova.getActivity()); + builder.developerArg0 = "Basic builder 1"; + JPushInterface.setPushNotificationBuilder(1, builder); + JSONObject obj = new JSONObject(); + try { + obj.put("id", 1); + } catch (JSONException e) { + e.printStackTrace(); + } + //callbackContext.success(obj); + } - void setCustomPushNotificationBuilder(JSONArray data, - CallbackContext callbackContext) { - CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder( - this.cordova.getActivity(), R.layout.test_notification_layout, - R.id.icon, R.id.title, R.id.text); - builder.developerArg0 = "Custom Builder 1"; - builder.layoutIconDrawable = R.drawable.jpush_notification_icon; - JPushInterface.setPushNotificationBuilder(2, builder); - JSONObject obj = new JSONObject(); - try { - obj.put("id", 2); - } catch (JSONException e) { - e.printStackTrace(); - } - //callbackContext.success(obj); - } - - void clearAllNotification(JSONArray data, - CallbackContext callbackContext){ - JPushInterface.clearAllNotifications(this.cordova.getActivity()); - //callbackContext.success(); - } - - void clearNotificationById(JSONArray data, - CallbackContext callbackContext){ - int notificationId=-1; - try { - notificationId = data.getInt(0); - } catch (JSONException e) { - e.printStackTrace(); - callbackContext.error("error reading id json"); - } - if(notificationId != -1){ - JPushInterface.clearNotificationById(this.cordova.getActivity(), notificationId); - }else{ - callbackContext.error("error id"); - } - } - void addLocalNotification(JSONArray data, - CallbackContext callbackContext) throws JSONException{ - //builderId,content,title,notificaitonID,broadcastTime,extras - - int builderId=data.getInt(0); - String content =data.getString(1); - String title = data.getString(2); - int notificationID= data.getInt(3); - int broadcastTime=data.getInt(4); - JSONObject extras=data.getJSONObject(5); - - JPushLocalNotification ln = new JPushLocalNotification(); - ln.setBuilderId(builderId); - ln.setContent(content); - ln.setTitle(title); - ln.setNotificationId(notificationID) ; - ln.setBroadcastTime(System.currentTimeMillis() + broadcastTime); + void setCustomPushNotificationBuilder(JSONArray data, + CallbackContext callbackContext) { + CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder( + this.cordova.getActivity(), R.layout.test_notification_layout, + R.id.icon, R.id.title, R.id.text); + builder.developerArg0 = "Custom Builder 1"; + builder.layoutIconDrawable = R.drawable.jpush_notification_icon; + JPushInterface.setPushNotificationBuilder(2, builder); + JSONObject obj = new JSONObject(); + try { + obj.put("id", 2); + } catch (JSONException e) { + e.printStackTrace(); + } + //callbackContext.success(obj); + } - ln.setExtras(extras.toString()) ; - JPushInterface.addLocalNotification(this.cordova.getActivity(), ln); - - } - void removeLocalNotification(JSONArray data, - CallbackContext callbackContext) throws JSONException{ - - int notificationID=data.getInt(0); - JPushInterface.removeLocalNotification(this.cordova.getActivity(),notificationID); + void clearAllNotification(JSONArray data, CallbackContext callbackContext) { + JPushInterface.clearAllNotifications(this.cordova.getActivity()); + //callbackContext.success(); + } - } - void clearLocalNotifications(JSONArray data, - CallbackContext callbackContext){ - - JPushInterface.clearLocalNotifications(this.cordova.getActivity()); + void clearNotificationById(JSONArray data, CallbackContext callbackContext) { + int notificationId = -1; + try { + notificationId = data.getInt(0); + } catch (JSONException e) { + e.printStackTrace(); + callbackContext.error("error reading id json"); + } + if (notificationId != -1) { + JPushInterface.clearNotificationById(this.cordova.getActivity(), + notificationId); + } else { + callbackContext.error("error id"); + } + } - } - - private final TagAliasCallback mTagWithAliasCallback = new TagAliasCallback() { + void addLocalNotification(JSONArray data, CallbackContext callbackContext) + throws JSONException { + //builderId,content,title,notificaitonID,broadcastTime,extras + int builderId = data.getInt(0); + String content = data.getString(1); + String title = data.getString(2); + int notificationID = data.getInt(3); + int broadcastTime = data.getInt(4); + JSONObject extras = data.getJSONObject(5); + JPushLocalNotification ln = new JPushLocalNotification(); + ln.setBuilderId(builderId); + ln.setContent(content); + ln.setTitle(title); + ln.setNotificationId(notificationID); + ln.setBroadcastTime(System.currentTimeMillis() + broadcastTime); + + ln.setExtras(extras.toString()); + JPushInterface.addLocalNotification(this.cordova.getActivity(), ln); + } + + void removeLocalNotification(JSONArray data, CallbackContext callbackContext) + throws JSONException { + int notificationID = data.getInt(0); + JPushInterface.removeLocalNotification(this.cordova.getActivity(), + notificationID); + } + + void clearLocalNotifications(JSONArray data, CallbackContext callbackContext) { + JPushInterface.clearLocalNotifications(this.cordova.getActivity()); + } + + /** + * 决定是否启用统计分析功能。 + * @param data + * @param callbackContext + */ + void setStatisticsOpen(JSONArray data, CallbackContext callbackContext) { + try { + isStatisticsOpened = data.getBoolean(0); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + private final TagAliasCallback mTagWithAliasCallback = new TagAliasCallback() { @Override public void gotResult(int code, String alias, Set tags) { - if (instance == null) { - return; - } - - JSONObject data = new JSONObject(); - try { - data.put("resultCode", code); - data.put("tags", tags); - data.put("alias", alias); - - String jsEvent=String - .format("cordova.fireDocumentEvent('jpush.setTagsWithAlias',%s)", - data.toString()); - instance.webView.sendJavascript(jsEvent); - - - } catch (JSONException e) { - - } - + if (instance == null) { + return; + } + JSONObject data = new JSONObject(); + try { + data.put("resultCode", code); + data.put("tags", tags); + data.put("alias", alias); + String jsEvent = String.format( + "cordova.fireDocumentEvent('jpush.setTagsWithAlias',%s)", + data.toString()); + instance.webView.sendJavascript(jsEvent); + } catch (JSONException e) { + e.printStackTrace(); + } } - - }; - - - + }; + } diff --git a/src/android/MyReceiver.java b/src/android/MyReceiver.java index 764a6d5..fb79632 100644 --- a/src/android/MyReceiver.java +++ b/src/android/MyReceiver.java @@ -12,82 +12,82 @@ import android.content.Intent; import android.util.Log; public class MyReceiver extends BroadcastReceiver { - private static String TAG = "JPushPlugin"; - @Override - public void onReceive(Context context, Intent intent) { + private static String TAG = "JPushPlugin"; + private static final List IGNORED_EXTRAS_KEYS = + Arrays.asList( + "cn.jpush.android.TITLE", + "cn.jpush.android.MESSAGE", + "cn.jpush.android.APPKEY", + "cn.jpush.android.NOTIFICATION_CONTENT_TITLE" + ); - if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { - -// }else if (JPushInterface.ACTION_UNREGISTER.equals(intent.getAction())){ - - } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { - handlingReceivedMessage(intent); - } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { - handlingNotificationReceive(context,intent); - - } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { - handlingNotificationOpen(context,intent); - } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { - + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(action)) { + handlingReceivedMessage(intent); + } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(action)) { + handlingNotificationReceive(context, intent); + } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(action)) { + handlingNotificationOpen(context, intent); } else { - Log.d(TAG, "Unhandled intent - " + intent.getAction()); + Log.d(TAG, "Unhandled intent - " + action); } - - } - private void handlingReceivedMessage(Intent intent) { - String msg = intent.getStringExtra(JPushInterface.EXTRA_MESSAGE); - Map extras = getNotificationExtras(intent); - - - 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; - - JPushPlugin.transmitOpen(alert, extras); + private void handlingReceivedMessage(Intent intent) { + String msg = intent.getStringExtra(JPushInterface.EXTRA_MESSAGE); + Map extras = getNotificationExtras(intent); + JPushPlugin.transmitPush(msg, extras); + } - context.startActivity(launch); - } - private void handlingNotificationReceive(Context context,Intent intent){ + private void handlingNotificationOpen(Context context, Intent intent) { + Log.i(TAG, "---------------- handlingNotificationOpen"); - Log.i(TAG, "---------------- handlingNotificationReceive"); + String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT); + JPushPlugin.openNotificationAlert = alert; + + Map extras = getNotificationExtras(intent); + JPushPlugin.openNotificationExtras = extras; + + JPushPlugin.transmitOpen(alert, extras); + + Intent launch = context.getPackageManager().getLaunchIntentForPackage( + context.getPackageName()); + launch.addCategory(Intent.CATEGORY_LAUNCHER); + launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); + context.startActivity(launch); + } + + private void handlingNotificationReceive(Context context, Intent intent) { + Log.i(TAG, "---------------- handlingNotificationReceive"); + + Intent launch = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); + launch.addCategory(Intent.CATEGORY_LAUNCHER); + launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); + + String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT); + JPushPlugin.notificationAlert = alert; + + Map extras = getNotificationExtras(intent); + JPushPlugin.notificationExtras = extras; + + JPushPlugin.transmitReceive(alert, extras); + } + + private Map getNotificationExtras(Intent intent) { + Map extrasMap = new HashMap(); + for (String key : intent.getExtras().keySet()) { + if (!IGNORED_EXTRAS_KEYS.contains(key)) { + Log.e("key", "key:" + key); + if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) { + extrasMap.put(key, intent.getIntExtra(key, 0)); + } else { + extrasMap.put(key, intent.getStringExtra(key)); + } + } + } + return extrasMap; + } - 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.notificationAlert = alert; - JPushPlugin.notificationExtras = extras; - - JPushPlugin.transmitReceive(alert, extras); - } - private Map getNotificationExtras(Intent intent) { - Map extrasMap = new HashMap(); - - for (String key : intent.getExtras().keySet()) { - if (!IGNORED_EXTRAS_KEYS.contains(key)) { - Log.e("key","key:"+key); - if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)){ - extrasMap.put(key, intent.getIntExtra(key,0)); - }else{ - extrasMap.put(key, intent.getStringExtra(key)); - } - } - } - return extrasMap; - } - private static final List IGNORED_EXTRAS_KEYS = - Arrays.asList("cn.jpush.android.TITLE","cn.jpush.android.MESSAGE","cn.jpush.android.APPKEY","cn.jpush.android.NOTIFICATION_CONTENT_TITLE"); } diff --git a/src/ios/Plugins/AppDelegate+JPush.h b/src/ios/Plugins/AppDelegate+JPush.h index 3694db5..7c1f366 100644 --- a/src/ios/Plugins/AppDelegate+JPush.h +++ b/src/ios/Plugins/AppDelegate+JPush.h @@ -10,6 +10,4 @@ @interface AppDelegate (JPush) -//@property(nonatomic,strong)NSDictionary *luanchOption; - @end diff --git a/src/ios/Plugins/AppDelegate+JPush.m b/src/ios/Plugins/AppDelegate+JPush.m index 5c41cb4..542ea00 100644 --- a/src/ios/Plugins/AppDelegate+JPush.m +++ b/src/ios/Plugins/AppDelegate+JPush.m @@ -7,87 +7,42 @@ // #import "AppDelegate+JPush.h" -#import #import "JPushPlugin.h" #import "JPUSHService.h" -//static char launchNotificationKey; - @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); +-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ + [JPushPlugin setLaunchOptions:launchOptions]; + return [super application:application didFinishLaunchingWithOptions:launchOptions]; } --(instancetype)init_plus{ - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(applicationDidLaunch:) - name:@"UIApplicationDidFinishLaunchingNotification" - object:nil]; - return [self init_plus]; -} - --(void)applicationDidLaunch:(NSNotification *)notification{ - - if (notification) { - [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]; + [[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]; + [[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveNotification object:userInfo]; completionHandler(UIBackgroundFetchResultNewData); - } -- (void)application:(UIApplication *)application - didReceiveLocalNotification:(UILocalNotification *)notification { - [JPUSHService showLocalNotificationAtFront:notification identifierKey:nil]; +- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { + [JPUSHService showLocalNotificationAtFront:notification identifierKey:nil]; } - - (void)applicationWillEnterForeground:(UIApplication *)application { -// [application setApplicationIconBadgeNumber:0]; -// [application cancelAllLocalNotifications]; + // [application setApplicationIconBadgeNumber:0]; + // [application cancelAllLocalNotifications]; } - - (void)applicationDidEnterBackground:(UIApplication *)application { -// [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; + // [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; } - - -//delegate里不能声明变量,所以采用关联对象这种技术绕过这个限制 -//-(NSDictionary *)luanchOption{ -// return objc_getAssociatedObject(self, &launchNotificationKey); -//} -//-(void)setLuanchOption:(NSDictionary *)luanchOption{ -// objc_setAssociatedObject(self, &launchNotificationKey, luanchOption, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -//} -//-(void)dealloc{ -// self.luanchOption=nil; -//} - @end diff --git a/src/ios/Plugins/JPushPlugin.h b/src/ios/Plugins/JPushPlugin.h index b86a217..256b05a 100644 --- a/src/ios/Plugins/JPushPlugin.h +++ b/src/ios/Plugins/JPushPlugin.h @@ -11,28 +11,59 @@ #define kJPushPluginReceiveNotification @"JPushPluginReceiveNofication" @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; + +/* + * 以下为js中可监听到的事件 + * jpush.openNotification 点击推送消息唤醒或启动app + * jpush.setTagsWithAlias 设置标签、别名完成 + * jpush.receiveMessage 收到自定义消息 + * jpush.receiveNotification 前台收到推送消息 + */ @end diff --git a/src/ios/Plugins/JPushPlugin.m b/src/ios/Plugins/JPushPlugin.m index 1c37fc6..68c96ae 100644 --- a/src/ios/Plugins/JPushPlugin.m +++ b/src/ios/Plugins/JPushPlugin.m @@ -10,452 +10,377 @@ #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; +static NSString *const JPushConfigFileName = @"PushConfig"; +static NSDictionary *_luanchOptions = nil; @implementation JPushPlugin - -+(void)setLaunchOptions:(NSDictionary *)theLaunchOptions{ - _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] ]; - -} - - +#pragma mark- 外部接口 -(void)stopPush:(CDVInvokedUrlCommand*)command{ - - [[UIApplication sharedApplication]unregisterForRemoteNotifications]; + [[UIApplication sharedApplication]unregisterForRemoteNotifications]; } - -(void)resumePush:(CDVInvokedUrlCommand*)command{ - -#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1 - 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]; - } -#else - //categories 必须为nil - [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | - UIRemoteNotificationTypeSound | - UIRemoteNotificationTypeAlert) - categories:nil]; -#endif - + [JPushPlugin registerForRemoteNotification]; } ++(void)registerForRemoteNotification{ + if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { + //可以添加自定义categories + [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | + UIUserNotificationTypeSound | + UIUserNotificationTypeAlert) + categories:nil]; + } else { +#ifndef __IPHONE_8_0 + //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]; - } + NSNumber *result; + if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) { + result = @(0); + }else{ + result = @(1); + } + [self hanleResultWithValue:result command:command]; } - -(void)initial:(CDVInvokedUrlCommand*)command{ - //do nithng,because Cordova plugin use lazy load mode. + //do nithng,because Cordova plugin use lazy load mode. } - #ifdef __CORDOVA_4_0_0 - (void)pluginInitialize { - NSLog(@"### pluginInitialize "); - [self initNotifications]; + NSLog(@"### pluginInitialize "); + [self initNotifications]; } #else - (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{ - NSLog(@"### initWithWebView "); - if (self=[super initWithWebView:theWebView]) { - [self initNotifications]; - - } - return self; + 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]; - - 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]]; - }); - - } + 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]]; + }); + + } + } + } - - } } - - -(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]; + 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 *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]; - + NSArray *tags = command.arguments; + + NSLog(@"#### setTags %@",tags); + + [JPUSHService setTags:[NSSet setWithArray:tags] + callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) + object:self]; + } - - -(void)setAlias:(CDVInvokedUrlCommand *)command{ - - NSArray *arguments=[command arguments]; - NSLog(@"#### setAlias %@",arguments); - [JPUSHService setAlias:[arguments objectAtIndex:0] - callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) - object:self]; - + + 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); - - 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); + [self hanleResultWithValue:registrationID command:command]; } - - - --(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]]; - }); - -} - - -(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) { - [JPUSHService startLogPageView:pageName]; - } + 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 objectAtIndex:0]; - if (pageName) { - [JPUSHService stopLogPageView:pageName]; - } - + 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 objectAtIndex:0]; - int duration=[[arguments objectAtIndex:0]intValue]; - if (pageName) { - [JPUSHService beginLogPageView:pageName duration:duration]; - } - + 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 objectAtIndex:0]; - [JPUSHService setBadge:[badge intValue]]; + 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]; + [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]; + // + 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]; + NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber; + NSNumber *number = [NSNumber numberWithInteger:num]; + [self hanleResultWithValue:number command:command]; } - - -(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{ - - [JPUSHService setDebugMode]; + [JPUSHService setDebugMode]; } - - -(void)setLogOFF:(CDVInvokedUrlCommand*)command{ - - [JPUSHService setLogOFF]; + [JPUSHService setLogOFF]; } - - -- (void)failWithCallbackID:(NSString *)callbackID { - CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR]; - [self.commandDelegate sendPluginResult:result callbackId:callbackID]; +-(void)crashLogON:(CDVInvokedUrlCommand*)command{ + [JPUSHService crashLogON]; } - - -- (void)succeedWithPluginResult:(CDVPluginResult *)result withCallbackID:(NSString *)callbackID { - [self.commandDelegate sendPluginResult:result callbackId:callbackID]; +-(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{ + [JPUSHService deleteLocalNotificationWithIdentifierKey:(NSString*)command.arguments[0]]; +} +-(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{ + [JPUSHService clearAllLocalNotifications]; +} +-(void)setLocation:(CDVInvokedUrlCommand*)command{ + [JPUSHService setLatitude:[((NSString*)command.arguments[0]) doubleValue] longitude:[((NSString*)command.arguments[1]) doubleValue]]; +} -- (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]]; +#pragma mark- 内部方法 ++(void)setLaunchOptions:(NSDictionary *)theLaunchOptions{ + _luanchOptions = 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); } - } 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; + + 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 PushConfig.plist "); + assert(0); + } + + [JPUSHService setupWithOption:_luanchOptions appKey:appkey + channel:channel apsForProduction:[isProduction boolValue] ]; } +#pragma mark 将参数返回给js +-(void)hanleResultWithValue:(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 + }; + 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]]; + }); + +} - (void)networkDidReceiveMessage:(NSNotification *)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:@"window.plugins.jPushPlugin.receiveMessageIniOSCallback('%@')",jsonString]]; - - - }); - + 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:@"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]]; - }); + + NSError *error; + NSDictionary *userInfo = [notification object]; + + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:&error]; + NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; + NSLog(@"%ld",(long)[UIApplication sharedApplication].applicationState); + 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; } - 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; - } - + } - @end diff --git a/www/JPushPlugin.js b/www/JPushPlugin.js index 099252b..90a9c6b 100644 --- a/www/JPushPlugin.js +++ b/www/JPushPlugin.js @@ -5,156 +5,192 @@ var JPushPlugin = function(){ //private plugin function -JPushPlugin.prototype.receiveMessage={} -JPushPlugin.prototype.openNotification={} -JPushPlugin.prototype.receiveNotification={} +JPushPlugin.prototype.receiveMessage = {} +JPushPlugin.prototype.openNotification = {} +JPushPlugin.prototype.receiveNotification = {} -JPushPlugin.prototype.isPlatformIOS = function(){ - return device.platform == "iPhone" || device.platform == "iPad" || device.platform == "iPod touch" || device.platform == "iOS" +JPushPlugin.prototype.isPlatformIOS = function() { + var isPlatformIOS = device.platform == "iPhone" + || device.platform == "iPad" + || device.platform == "iPod touch" + || device.platform == "iOS"; + return isPlatformIOS; } -JPushPlugin.prototype.error_callback = function(msg){ - console.log("Javascript Callback Error: " + msg) +JPushPlugin.prototype.error_callback = function(msg) { + console.log("Javascript Callback Error: " + msg); } -JPushPlugin.prototype.call_native = function(name, args, callback){ - - ret = cordova.exec(callback,this.error_callback,'JPushPlugin',name,args); +JPushPlugin.prototype.call_native = function(name, args, callback) { + ret = cordova.exec(callback, this.error_callback, 'JPushPlugin', name, args); return ret; } + //public plugin function -JPushPlugin.prototype.startLogPageView = function(pageName){ - if(this.isPlatformIOS()){ - this.call_native( "startLogPageView",[pageName],null); - } +JPushPlugin.prototype.startLogPageView = function(pageName) { + if(this.isPlatformIOS()) { + this.call_native("startLogPageView", [pageName], null); + } } -JPushPlugin.prototype.stopLogPageView = function(pageName){ - if(this.isPlatformIOS()){ - this.call_native( "stopLogPageView",[pageName],null); +JPushPlugin.prototype.stopLogPageView = function(pageName) { + if(this.isPlatformIOS()) { + this.call_native("stopLogPageView", [pageName], null); } } -JPushPlugin.prototype.beginLogPageView = function(pageName,duration){ - if(this.isPlatformIOS()){ - this.call_native( "beginLogPageView",[pageName,duration],null); +JPushPlugin.prototype.beginLogPageView = function(pageName, duration) { + if(this.isPlatformIOS()) { + this.call_native("beginLogPageView", [pageName, duration], null); } } -JPushPlugin.prototype.setApplicationIconBadgeNumber = function(badge){ - if(this.isPlatformIOS()){ - 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{ - if(tags==null){ - this.setAlias(alias); - return; - } - if(alias==null){ - this.setTags(tags); +JPushPlugin.prototype.setApplicationIconBadgeNumber = function(badge) { + if(this.isPlatformIOS()) { + 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 { + if(tags == null) { + this.setAlias(alias); + return; + } + if(alias == null) { + this.setTags(tags); return; } - var arrayTagWithAlias=[tags]; + var arrayTagWithAlias = [tags]; arrayTagWithAlias.unshift(alias); - this.call_native( "setTagsWithAlias", arrayTagWithAlias,null); - } - catch(exception){ + this.call_native("setTagsWithAlias", arrayTagWithAlias, null); + } catch(exception) { console.log(exception); } - } -JPushPlugin.prototype.setTags = function(tags){ - - try{ - this.call_native("setTags",tags,null); - } - catch(exception){ + +JPushPlugin.prototype.setTags = function(tags) { + try { + this.call_native("setTags", tags, null); + } catch(exception) { console.log(exception); } } -JPushPlugin.prototype.setAlias = function(alias){ - try{ - this.call_native("setAlias",[alias],null); - } - catch(exception){ - console.log(exception); - } -} -JPushPlugin.prototype.getRegistrationID = function(callback){ - - try{ - var data=[]; - this.call_native("getRegistrationID",[data],callback); - } - catch(exception){ +JPushPlugin.prototype.setAlias = function(alias) { + try { + this.call_native("setAlias", [alias], null); + } catch(exception) { console.log(exception); } } -JPushPlugin.prototype.setBadge = function(value){ - - if(this.isPlatformIOS()){ - try{ - this.call_native("setBadge",[value],null); - } - catch(exception){ - console.log(exception); - } - - } +JPushPlugin.prototype.getRegistrationID = function(callback) { + try { + var data = []; + this.call_native("getRegistrationID", [data], callback); + } catch(exception) { + console.log(exception); + } } -JPushPlugin.prototype.resetBadge = function(){ - - if(this.isPlatformIOS()){ - try{ - var data=[]; - this.call_native("resetBadge",[data],null); - } - catch(exception){ - console.log(exception); - } + +JPushPlugin.prototype.setBadge = function(value) { + if(this.isPlatformIOS()) { + try { + this.call_native("setBadge", [value], null); + } catch(exception) { + console.log(exception); + } + } +} + +JPushPlugin.prototype.resetBadge = function() { + if(this.isPlatformIOS()) { + try { + var data = []; + this.call_native("resetBadge", [data], null); + } catch(exception) { + console.log(exception); + } + } +} + +JPushPlugin.prototype.setDebugModeFromIos = function() { + if(this.isPlatformIOS()) { + var data = []; + this.call_native("setDebugModeFromIos", [data], null); + } +} + +JPushPlugin.prototype.setLogOFF = function() { + if(this.isPlatformIOS()) { + var data = []; + this.call_native("setLogOFF", [data], null); + } +} + +JPushPlugin.prototype.setCrashLogON = function() { + if (this.isPlatformIOS()) { + var data = []; + this.call_native("crashLogON", [data], null); } } -JPushPlugin.prototype.setDebugModeFromIos = function(){ - if(this.isPlatformIOS()){ - var data=[]; - this.call_native("setDebugModeFromIos",[data],null); - } +JPushPlugin.prototype.addLocalNotificationForIOS = function(delayTime, content, + badge, notificationID, extras) { + if (this.isPlatformIOS()) { + var data = [delayTime, content, badge, notificationID, extras]; + this.call_native("setLocalNotification", data, null); + } } -JPushPlugin.prototype.setLogOFF = function(){ - if(this.isPlatformIOS()){ - var data=[]; - this.call_native("setLogOFF",[data],null); - } + +JPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS = function( + identifierKey) { + if (this.isPlatformIOS()) { + var data = [identifierKey]; + this.call_native("deleteLocalNotificationWithIdentifierKey", data, null); + } } -JPushPlugin.prototype.receiveMessageIniOSCallback = function(data){ - try{ - console.log("JPushPlugin:receiveMessageIniOSCallback--data:"+data); + +JPushPlugin.prototype.clearAllLocalNotifications = function(){ + if (this.isPlatformIOS()) { + var data = []; + this.call_native("clearAllLocalNotifications", data, null); + } +} + +JPushPlugin.prototype.setLocation = function(latitude, longitude){ + if (this.isPlatformIOS()) { + var data = [latitude, longitude]; + this.call_native("setLocation", data, null); + } +} + +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); + console.log(content); + } catch(exception) { + console.log("JPushPlugin:receiveMessageIniOSCallback" + exception); } } -JPushPlugin.prototype.receiveMessageInAndroidCallback = function(data){ - try{ + +JPushPlugin.prototype.receiveMessageInAndroidCallback = function(data) { + try { console.log("JPushPlugin:receiveMessageInAndroidCallback"); - var bToObj = JSON.parse(data); - this.receiveMessage=bToObj - cordova.fireDocumentEvent('jpush.receiveMessage',null); + var bToObj = JSON.parse(data); + this.receiveMessage = bToObj + cordova.fireDocumentEvent('jpush.receiveMessage', null); //console.log(data); //var message = bToObj.message; //var extras = bToObj.extras; @@ -163,20 +199,18 @@ JPushPlugin.prototype.receiveMessageInAndroidCallback = function(data){ //console.log(extras['cn.jpush.android.MSG_ID']); //console.log(extras['cn.jpush.android.CONTENT_TYPE']); //console.log(extras['cn.jpush.android.EXTRA']); - } - catch(exception){ - console.log("JPushPlugin:pushCallback "+exception); + } catch(exception) { + console.log("JPushPlugin:pushCallback " + exception); } } -// -JPushPlugin.prototype.openNotificationInAndroidCallback = function(data){ - try{ +JPushPlugin.prototype.openNotificationInAndroidCallback = function(data) { + try { console.log("JPushPlugin:openNotificationInAndroidCallback"); - var bToObj = JSON.parse(data); - this.openNotification=bToObj; - cordova.fireDocumentEvent('jpush.openNotification',null); - + var bToObj = JSON.parse(data); + this.openNotification = bToObj; + cordova.fireDocumentEvent('jpush.openNotification', null); + //console.log(data); //var bToObj = JSON.parse(data); //var alert = bToObj.alert; @@ -190,18 +224,18 @@ JPushPlugin.prototype.openNotificationInAndroidCallback = function(data){ //console.log(extras['cn.jpush.android.PUSH_ID']); //console.log(extras['cn.jpush.android.NOTIFICATION_ID']); //console.log("JPushPlugin:openNotificationCallback is ready"); - } - catch(exception){ + } catch(exception) { console.log(exception); } } -JPushPlugin.prototype.receiveNotificationInAndroidCallback = function(data){ + +JPushPlugin.prototype.receiveNotificationInAndroidCallback = function(data) { try{ console.log("JPushPlugin:receiveNotificationInAndroidCallback"); - var bToObj = JSON.parse(data); - this.receiveNotification=bToObj; - cordova.fireDocumentEvent('jpush.receiveNotification',null); - + var bToObj = JSON.parse(data); + this.receiveNotification = bToObj; + cordova.fireDocumentEvent('jpush.receiveNotification', null); + //console.log(data); //var bToObj = JSON.parse(data); //var alert = bToObj.alert; @@ -215,124 +249,130 @@ JPushPlugin.prototype.receiveNotificationInAndroidCallback = function(data){ //console.log(extras['cn.jpush.android.PUSH_ID']); //console.log(extras['cn.jpush.android.NOTIFICATION_ID']); //console.log("JPushPlugin:openNotificationCallback is ready"); - } - catch(exception){ + } catch(exception) { console.log(exception); } } + //android single -JPushPlugin.prototype.setBasicPushNotificationBuilder = function(){ +JPushPlugin.prototype.setBasicPushNotificationBuilder = function() { if(device.platform == "Android") { - data=[] - this.call_native("setBasicPushNotificationBuilder",data,null); + data = []; + this.call_native("setBasicPushNotificationBuilder", data, null); } } -JPushPlugin.prototype.setCustomPushNotificationBuilder = function(){ +JPushPlugin.prototype.setCustomPushNotificationBuilder = function() { if(device.platform == "Android") { - data=[]; - this.call_native("setCustomPushNotificationBuilder",data,null); + data = []; + this.call_native("setCustomPushNotificationBuilder", data, null); } } -JPushPlugin.prototype.stopPush = function(){ - data=[]; - this.call_native("stopPush",data,null); +JPushPlugin.prototype.stopPush = function() { + data = []; + this.call_native("stopPush", data, null); } -JPushPlugin.prototype.resumePush = function(){ - data=[] - this.call_native("resumePush",data,null); - +JPushPlugin.prototype.resumePush = function() { + data = []; + this.call_native("resumePush", data, null); } -JPushPlugin.prototype.setDebugMode = function(mode){ + +JPushPlugin.prototype.setDebugMode = function(mode) { if(device.platform == "Android") { - this.call_native("setDebugMode",[mode],null); + this.call_native("setDebugMode", [mode], null); } } + //setDebugMode -JPushPlugin.prototype.clearAllNotification = function(){ +JPushPlugin.prototype.clearAllNotification = function() { if(device.platform == "Android") { - data=[] - this.call_native("clearAllNotification",data,null); + data = []; + this.call_native("clearAllNotification", data, null); } } -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); +JPushPlugin.prototype.clearNotificationById = function(notificationId) { + if(device.platform == "Android") { + data = []; + this.call_native("clearNotificationById", [notificationId], null); } } -JPushPlugin.prototype.isPushStopped = function(callback){ - - data=[]; - this.call_native("isPushStopped",data,callback) - -} - -JPushPlugin.prototype.init = function(){ - if(this.isPlatformIOS()){ - var data=[]; - this.call_native("initial",data,null); - }else{ - data=[]; - this.call_native("init",data,null); - - } - -} - -JPushPlugin.prototype.setDebugMode = function(mode){ +JPushPlugin.prototype.setLatestNotificationNum = function(num) { if(device.platform == "Android") { - this.call_native("setDebugMode",[mode],null); - } -} -JPushPlugin.prototype.addLocalNotification = function(builderId,content,title,notificaitonID,broadcastTime,extras){ - if(device.platform == "Android") { - data=[builderId,content,title,notificaitonID,broadcastTime,extras]; - this.call_native("addLocalNotification",data,null); - } -} -JPushPlugin.prototype.removeLocalNotification = function(notificationID){ - if(device.platform == "Android") { - this.call_native("removeLocalNotification",[notificationID],null); - } -} -JPushPlugin.prototype.clearLocalNotifications = function(){ - if(device.platform == "Android") { - data=[] - this.call_native("clearLocalNotifications",data,null); + this.call_native("setLatestNotificationNum", [num], null); } } -JPushPlugin.prototype.reportNotificationOpened = function(msgID){ +JPushPlugin.prototype.isPushStopped = function(callback) { + data = []; + this.call_native("isPushStopped", data, callback); +} + +JPushPlugin.prototype.init = function() { + if(this.isPlatformIOS()) { + var data = []; + this.call_native("initial", data, null); + } else { + data = []; + this.call_native("init", data, null); + } +} + +JPushPlugin.prototype.setDebugMode = function(mode) { if(device.platform == "Android") { - - this.call_native("reportNotificationOpened",[msgID],null); + this.call_native("setDebugMode", [mode], null); + } +} + +JPushPlugin.prototype.addLocalNotification = function(builderId, content, title, + notificaitonID, broadcastTime, extras) { + if(device.platform == "Android") { + data = [builderId, content, title, notificaitonID, broadcastTime, extras]; + this.call_native("addLocalNotification", data, null); + } +} + +JPushPlugin.prototype.removeLocalNotification = function(notificationID) { + if(device.platform == "Android") { + this.call_native("removeLocalNotification", [notificationID], null); + } +} + +JPushPlugin.prototype.clearLocalNotifications = function() { + if(device.platform == "Android") { + data = []; + this.call_native("clearLocalNotifications", data, null); + } +} + +JPushPlugin.prototype.reportNotificationOpened = function(msgID) { + if(device.platform == "Android") { + this.call_native("reportNotificationOpened", [msgID], null); + } +} + +/** + *是否开启统计分析功能,用于“用户使用时长”,“活跃用户”,“用户打开次数”的统计,并上报到服务器上, + *在 Portal 上展示给开发者。 + **/ +JPushPlugin.prototype.setStatisticsOpen = function(mode) { + if(device.platform == "Android") { + this.call_native("setStatisticsOpen", [mode], null); } } //iOS single - -if(!window.plugins){ +if(!window.plugins) { window.plugins = {}; } -if(!window.plugins.jPushPlugin){ +if(!window.plugins.jPushPlugin) { window.plugins.jPushPlugin = new JPushPlugin(); -} - -module.exports = new JPushPlugin(); - - +} +module.exports = new JPushPlugin();