Mike 7 years ago
parent
commit
316b825dc6
60 changed files with 3370 additions and 1989 deletions
  1. 2 1
      miaomiao/package.json
  2. 3 3
      miaomiao/plugins/android.json
  3. 8 1
      miaomiao/plugins/cordova-plugin-jcore/README.md
  4. 1 1
      miaomiao/plugins/cordova-plugin-jcore/package.json
  5. 10 10
      miaomiao/plugins/cordova-plugin-jcore/plugin.xml
  6. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/arm64-v8a/libjcore116.so
  7. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/arm64-v8a/libjcore119.so
  8. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/armeabi-v7a/libjcore116.so
  9. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/armeabi-v7a/libjcore119.so
  10. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/armeabi/libjcore116.so
  11. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/armeabi/libjcore119.so
  12. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/jcore-android-1.1.6.jar
  13. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/jcore-android-1.1.9.jar
  14. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/mips/libjcore116.so
  15. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/mips/libjcore119.so
  16. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/mips64/libjcore116.so
  17. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/mips64/libjcore119.so
  18. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/x86/libjcore116.so
  19. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/x86/libjcore119.so
  20. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/x86_64/libjcore116.so
  21. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/android/x86_64/libjcore119.so
  22. BIN
      miaomiao/plugins/cordova-plugin-jcore/src/ios/jcore-ios-1.1.6.a
  23. 10 12
      miaomiao/plugins/fetch.json
  24. 8 8
      miaomiao/plugins/ios.json
  25. 41 9
      miaomiao/plugins/jpush-phonegap-plugin/README.md
  26. 45 204
      miaomiao/plugins/jpush-phonegap-plugin/doc/Android_detail_api.md
  27. 0 135
      miaomiao/plugins/jpush-phonegap-plugin/doc/Android_handle_install.md
  28. 416 214
      miaomiao/plugins/jpush-phonegap-plugin/doc/Common_detail_api.md
  29. 213 325
      miaomiao/plugins/jpush-phonegap-plugin/doc/iOS_API.md
  30. 0 41
      miaomiao/plugins/jpush-phonegap-plugin/doc/iOS_install.md
  31. 233 168
      miaomiao/plugins/jpush-phonegap-plugin/example/index.html
  32. 25 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/app/app.component.ts
  33. 1 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/app/app.html
  34. 34 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/app/app.module.ts
  35. 36 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/pages/home/home.html
  36. 3 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/pages/home/home.scss
  37. 146 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/pages/home/home.ts
  38. 171 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/index.ts
  39. 67 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.d.ts
  40. 352 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.js
  41. 0 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.js.map
  42. 0 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.metadata.json
  43. 18 0
      miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/package.json
  44. 35 0
      miaomiao/plugins/jpush-phonegap-plugin/issue_template.md
  45. 2 2
      miaomiao/plugins/jpush-phonegap-plugin/package.json
  46. 51 46
      miaomiao/plugins/jpush-phonegap-plugin/plugin.xml
  47. 156 0
      miaomiao/plugins/jpush-phonegap-plugin/src/android/JPushEventReceiver.java
  48. 175 120
      miaomiao/plugins/jpush-phonegap-plugin/src/android/JPushPlugin.java
  49. 6 9
      miaomiao/plugins/jpush-phonegap-plugin/src/android/JPushReceiver.java
  50. BIN
      miaomiao/plugins/jpush-phonegap-plugin/src/android/libs/jpush-android-3.1.1.jar
  51. BIN
      miaomiao/plugins/jpush-phonegap-plugin/src/android/libs/jpush-android_v3.0.6.jar
  52. 1 1
      miaomiao/plugins/jpush-phonegap-plugin/src/ios/JPushConfig.plist
  53. 213 156
      miaomiao/plugins/jpush-phonegap-plugin/src/ios/Plugins/AppDelegate+JPush.m
  54. 1 2
      miaomiao/plugins/jpush-phonegap-plugin/src/ios/Plugins/JPushDefine.h
  55. 102 94
      miaomiao/plugins/jpush-phonegap-plugin/src/ios/Plugins/JPushPlugin.h
  56. 575 365
      miaomiao/plugins/jpush-phonegap-plugin/src/ios/Plugins/JPushPlugin.m
  57. 127 28
      miaomiao/plugins/jpush-phonegap-plugin/src/ios/lib/JPUSHService.h
  58. BIN
      miaomiao/plugins/jpush-phonegap-plugin/src/ios/lib/jpush-ios-3.0.7.a
  59. 77 29
      miaomiao/plugins/jpush-phonegap-plugin/www/JPushPlugin.js
  60. 6 5
      miaomiao/www/js/app.js

+ 2 - 1
miaomiao/package.json

@@ -56,7 +56,8 @@
     "cordova-plugin-wechat@2.0.0",
     "cordova-plugin-wechat@2.0.0",
     "jpush-phonegap-plugin@^3.2.3",
     "jpush-phonegap-plugin@^3.2.3",
     "cordova-plugin-wechat@^2.0.0",
     "cordova-plugin-wechat@^2.0.0",
-    "cordova-plugin-jcore@1.1.8"
+    "cordova-plugin-jcore@1.1.8",
+    "jpush-phonegap-plugin"
   ],
   ],
   "cordovaPlatforms": [
   "cordovaPlatforms": [
     {
     {

+ 3 - 3
miaomiao/plugins/android.json

@@ -49,15 +49,15 @@
         "phonegap-plugin-barcodescanner": {
         "phonegap-plugin-barcodescanner": {
             "PACKAGE_NAME": "com.miaomiao.app"
             "PACKAGE_NAME": "com.miaomiao.app"
         },
         },
-        "cordova-plugin-jcore": {
+        "cordova-plugin-wechat": {
+            "WECHATAPPID": "wxc5181c0d406023e6",
             "PACKAGE_NAME": "com.miaomiao.app"
             "PACKAGE_NAME": "com.miaomiao.app"
         },
         },
         "jpush-phonegap-plugin": {
         "jpush-phonegap-plugin": {
             "APP_KEY": "69838317211448192366f9d8",
             "APP_KEY": "69838317211448192366f9d8",
             "PACKAGE_NAME": "com.miaomiao.app"
             "PACKAGE_NAME": "com.miaomiao.app"
         },
         },
-        "cordova-plugin-wechat": {
-            "WECHATAPPID": "wxc5181c0d406023e6",
+        "cordova-plugin-jcore": {
             "PACKAGE_NAME": "com.miaomiao.app"
             "PACKAGE_NAME": "com.miaomiao.app"
         }
         }
     },
     },

+ 8 - 1
miaomiao/plugins/cordova-plugin-jcore/README.md

@@ -1,6 +1,6 @@
 # Cordova Plugin JCore
 # Cordova Plugin JCore
 
 
-[![release](https://img.shields.io/badge/release-1.1.8-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases)
+[![release](https://img.shields.io/badge/release-1.2.0-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases)
 [![platforms](https://img.shields.io/badge/platforms-iOS%7CAndroid-lightgrey.svg)](https://github.com/jpush/jpush-phonegap-plugin)
 [![platforms](https://img.shields.io/badge/platforms-iOS%7CAndroid-lightgrey.svg)](https://github.com/jpush/jpush-phonegap-plugin)
 [![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1)
 [![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1)
 
 
@@ -13,6 +13,13 @@
 - 极光统计(JAnalytics)- [cordova-plugn-janalytics](https://github.com/jpush/cordova-plugin-janalytics)
 - 极光统计(JAnalytics)- [cordova-plugn-janalytics](https://github.com/jpush/cordova-plugin-janalytics)
 - 极光短信验证码(JSMS)- [cordova-plugin-jsms](https://github.com/jpush/cordova-plugin-jsms)
 - 极光短信验证码(JSMS)- [cordova-plugin-jsms](https://github.com/jpush/cordova-plugin-jsms)
 
 
+**v1.2.0** 对应的 jcore 版本:
+
+- Android: v1.1.9
+- iOS: v1.1.6
+
+注意:从 v1.2.0 版本开始支持 cordova-android 7.0.0。
+
 ## 什么是 JCore
 ## 什么是 JCore
 
 
 极光开发者服务 SDK 采用了模块化的使用模式,即一个核心(JCore)+ N 种服务(JPush,JMessage...)的使用方式,方便开发者使用某一项服务或多项服务,极大的优化了多模块同时使用时功能模块重复的问题。如下图:
 极光开发者服务 SDK 采用了模块化的使用模式,即一个核心(JCore)+ N 种服务(JPush,JMessage...)的使用方式,方便开发者使用某一项服务或多项服务,极大的优化了多模块同时使用时功能模块重复的问题。如下图:

+ 1 - 1
miaomiao/plugins/cordova-plugin-jcore/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "cordova-plugin-jcore",
   "name": "cordova-plugin-jcore",
-  "version": "1.1.8",
+  "version": "1.2.0",
   "description": "jcore for cordova plugin",
   "description": "jcore for cordova plugin",
   "cordova": {
   "cordova": {
     "id": "cordova-plugin-jcore",
     "id": "cordova-plugin-jcore",

+ 10 - 10
miaomiao/plugins/cordova-plugin-jcore/plugin.xml

@@ -2,7 +2,7 @@
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:android="http://schemas.android.com/apk/res/android"
      id="cordova-plugin-jcore"
      id="cordova-plugin-jcore"
-     version="1.1.8">
+     version="1.2.0">
 
 
     <name>JCore</name>
     <name>JCore</name>
     <description>Cordova plugin for jcore</description>
     <description>Cordova plugin for jcore</description>
@@ -15,18 +15,18 @@
     </engines>
     </engines>
 
 
     <platform name="android">
     <platform name="android">
-        <source-file src="src/android/arm64-v8a/libjcore116.so" target-dir="libs/arm64-v8a"/>
-        <source-file src="src/android/armeabi/libjcore116.so" target-dir="libs/armeabi"/>
-        <source-file src="src/android/armeabi-v7a/libjcore116.so" target-dir="libs/armeabi-v7a"/>
-        <source-file src="src/android/mips/libjcore116.so" target-dir="libs/mips"/>
-        <source-file src="src/android/mips64/libjcore116.so" target-dir="libs/mips64"/>
-        <source-file src="src/android/x86/libjcore116.so" target-dir="libs/x86"/>
-        <source-file src="src/android/x86_64/libjcore116.so" target-dir="libs/x86_64"/>
+        <resource-file src="src/android/arm64-v8a/libjcore119.so" target="jniLibs/arm64-v8a/libjcore119.so"/>
+        <resource-file src="src/android/armeabi/libjcore119.so" target="jniLibs/armeabi/libjcore119.so"/>
+        <resource-file src="src/android/armeabi-v7a/libjcore119.so" target="jniLibs/armeabi-v7a/libjcore119.so"/>
+        <resource-file src="src/android/mips/libjcore119.so" target="jniLibs/mips/libjcore119.so"/>
+        <resource-file src="src/android/mips64/libjcore119.so" target="jniLibs/mips64/libjcore119.so"/>
+        <resource-file src="src/android/x86/libjcore119.so" target="jniLibs/x86/libjcore119.so"/>
+        <resource-file src="src/android/x86_64/libjcore119.so" target="jniLibs/x86_64/libjcore119.so"/>
 
 
-        <source-file src="src/android/jcore-android-1.1.6.jar" target-dir="libs"/>
+        <lib-file src="src/android/jcore-android-1.1.9.jar" />
     </platform>
     </platform>
 
 
     <platform name="ios">
     <platform name="ios">
-        <source-file src="src/ios/jcore-ios-1.1.5.a" framework="true" />
+        <source-file src="src/ios/jcore-ios-1.1.6.a" framework="true" />
     </platform>
     </platform>
 </plugin>
 </plugin>

BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/arm64-v8a/libjcore116.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/arm64-v8a/libjcore119.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/armeabi-v7a/libjcore116.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/armeabi-v7a/libjcore119.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/armeabi/libjcore116.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/armeabi/libjcore119.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/jcore-android-1.1.6.jar


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/jcore-android-1.1.9.jar


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/mips/libjcore116.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/mips/libjcore119.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/mips64/libjcore116.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/mips64/libjcore119.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/x86/libjcore116.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/x86/libjcore119.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/x86_64/libjcore116.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/android/x86_64/libjcore119.so


BIN
miaomiao/plugins/cordova-plugin-jcore/src/ios/jcore-ios-1.1.5.a → miaomiao/plugins/cordova-plugin-jcore/src/ios/jcore-ios-1.1.6.a


+ 10 - 12
miaomiao/plugins/fetch.json

@@ -142,32 +142,30 @@
         "is_top_level": true,
         "is_top_level": true,
         "variables": {}
         "variables": {}
     },
     },
-    "cordova-plugin-jcore": {
+    "cordova-plugin-wechat": {
         "source": {
         "source": {
             "type": "registry",
             "type": "registry",
-            "id": "cordova-plugin-jcore@1.1.8"
+            "id": "cordova-plugin-wechat@2.0.0"
         },
         },
         "is_top_level": true,
         "is_top_level": true,
-        "variables": {}
+        "variables": {
+            "WECHATAPPID": "wxc5181c0d406023e6"
+        }
     },
     },
     "jpush-phonegap-plugin": {
     "jpush-phonegap-plugin": {
         "source": {
         "source": {
             "type": "registry",
             "type": "registry",
-            "id": "jpush-phonegap-plugin@3.2.3"
+            "id": "jpush-phonegap-plugin@2.2.8"
         },
         },
         "is_top_level": true,
         "is_top_level": true,
-        "variables": {
-            "APP_KEY": "69838317211448192366f9d8"
-        }
+        "variables": {}
     },
     },
-    "cordova-plugin-wechat": {
+    "cordova-plugin-jcore": {
         "source": {
         "source": {
             "type": "registry",
             "type": "registry",
-            "id": "cordova-plugin-wechat@2.0.0"
+            "id": "cordova-plugin-jcore@1.1.8"
         },
         },
         "is_top_level": true,
         "is_top_level": true,
-        "variables": {
-            "WECHATAPPID": "wxc5181c0d406023e6"
-        }
+        "variables": {}
     }
     }
 }
 }

+ 8 - 8
miaomiao/plugins/ios.json

@@ -45,26 +45,26 @@
         "cordova-plugin-video-editor": {
         "cordova-plugin-video-editor": {
             "PACKAGE_NAME": "com.miaomiao.app"
             "PACKAGE_NAME": "com.miaomiao.app"
         },
         },
+        "cordova-plugin-wechat": {
+            "WECHATAPPID": "wxc5181c0d406023e6",
+            "PACKAGE_NAME": "com.miaomiao.app"
+        },
         "cordova-plugin-whitelist": {
         "cordova-plugin-whitelist": {
             "PACKAGE_NAME": "com.miaomiao.app"
             "PACKAGE_NAME": "com.miaomiao.app"
         },
         },
         "ionic-plugin-keyboard": {
         "ionic-plugin-keyboard": {
             "PACKAGE_NAME": "com.miaomiao.app"
             "PACKAGE_NAME": "com.miaomiao.app"
         },
         },
+        "jpush-phonegap-plugin": {
+            "APP_KEY": "69838317211448192366f9d8",
+            "PACKAGE_NAME": "com.miaomiao.app"
+        },
         "phonegap-plugin-barcodescanner": {
         "phonegap-plugin-barcodescanner": {
             "CAMERA_USAGE_DESCRIPTION": " ",
             "CAMERA_USAGE_DESCRIPTION": " ",
             "PACKAGE_NAME": "com.miaomiao.app"
             "PACKAGE_NAME": "com.miaomiao.app"
         },
         },
         "cordova-plugin-jcore": {
         "cordova-plugin-jcore": {
             "PACKAGE_NAME": "com.miaomiao.app"
             "PACKAGE_NAME": "com.miaomiao.app"
-        },
-        "jpush-phonegap-plugin": {
-            "APP_KEY": "69838317211448192366f9d8",
-            "PACKAGE_NAME": "com.miaomiao.app"
-        },
-        "cordova-plugin-wechat": {
-            "WECHATAPPID": "wxc5181c0d406023e6",
-            "PACKAGE_NAME": "com.miaomiao.app"
         }
         }
     },
     },
     "dependent_plugins": {
     "dependent_plugins": {

+ 41 - 9
miaomiao/plugins/jpush-phonegap-plugin/README.md

@@ -1,7 +1,7 @@
 # JPush PhoneGap / Cordova Plugin
 # JPush PhoneGap / Cordova Plugin
 
 
 [![Build Status](https://travis-ci.org/jpush/jpush-phonegap-plugin.svg?branch=master)](https://travis-ci.org/jpush/jpush-phonegap-plugin)
 [![Build Status](https://travis-ci.org/jpush/jpush-phonegap-plugin.svg?branch=master)](https://travis-ci.org/jpush/jpush-phonegap-plugin)
-[![release](https://img.shields.io/badge/release-3.2.3-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases)
+[![release](https://img.shields.io/badge/release-3.4.1-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases)
 [![platforms](https://img.shields.io/badge/platforms-iOS%7CAndroid-lightgrey.svg)](https://github.com/jpush/jpush-phonegap-plugin)
 [![platforms](https://img.shields.io/badge/platforms-iOS%7CAndroid-lightgrey.svg)](https://github.com/jpush/jpush-phonegap-plugin)
 [![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1)
 [![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1)
 
 
@@ -11,8 +11,16 @@
 - 如需要短信验证码功能插件,可关注 [cordova-plugin-jsms](https://github.com/jpush/cordova-plugin-jsms)
 - 如需要短信验证码功能插件,可关注 [cordova-plugin-jsms](https://github.com/jpush/cordova-plugin-jsms)
 - 如需要统计分析功能插件,可关注 [cordova-plugin-janalytics](https://github.com/jpush/cordova-plugin-janalytics)
 - 如需要统计分析功能插件,可关注 [cordova-plugin-janalytics](https://github.com/jpush/cordova-plugin-janalytics)
 
 
+>注意:插件从 v3.4.0 开始支持 cordova-android 7.0.0,因 cordova-android 7.0.0 修改了 Android 项目结构,因此不兼容之前的版本,升级前请务必注意。
+>
+>如果需要安装之前版本的插件,请先安装 v1.2.0 以下版本(建议安装 v1.1.12)的 cordova-plugin-jcore,再安装旧版本插件(比如 v3.3.2),否则运行会报错。
+
 ## Install
 ## Install
 
 
+> 注意:
+> - 应用的包名一定要和 APP_KEY 对应应用的包名一致,否则极光推送服务无法注册成功。
+> - 在使用 8 或以上版本的 Xcode 调试 iOS 项目时,需要先在项目配置界面的 Capabilities 中打开 Push Notifications 开关。
+
 - 通过 Cordova Plugins 安装,要求 Cordova CLI 5.0+:
 - 通过 Cordova Plugins 安装,要求 Cordova CLI 5.0+:
 
 
   ```shell
   ```shell
@@ -28,10 +36,31 @@
 - 或下载到本地安装:
 - 或下载到本地安装:
 
 
   ```shell
   ```shell
-  cordova plugin add Your_Plugin_Path  --variable APP_KEY=your_jpush_appkey
+  cordova plugin add Your_Plugin_Path --variable APP_KEY=your_jpush_appkey
   ```
   ```
 
 
-> 在使用 Xcode 8 调试 iOS 项目时,需要先在项目配置界面的 Capabilities 中打开 Push Notifications 开关。
+### Ionic
+
+如果使用了 Ionic,可以再安装 @jiguang-ionic/jpush 包,适配 ionic-native:
+
+```shell
+npm install --save @jiguang-ionic/jpush
+```
+
+然后在 *app.module.ts* 中增加:
+
+```js
+import { JPush } from '@jiguang-ionic/jpush';
+...
+  providers: [
+    ...
+    JPush,
+    ...
+  ]
+```
+
+具体可参考 ./ionic/example 中的文件。
+
 
 
 ## Usage
 ## Usage
 
 
@@ -63,15 +92,22 @@
 
 
 右键单击工程名 -> Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add。
 右键单击工程名 -> Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add。
 
 
+#### 无法获取到 Registration Id
+
+检查 AppKey 和应用包名是否对应、是否调用了 `init` 方法。
+
 #### 如何自定义通知声音?
 #### 如何自定义通知声音?
 
 
 Android 因为各 Rom 的高度定制化,不像 iOS 一样能有一个统一的管理,如果在 Android 中想自定义通知铃声,推荐通过 JPush 推送自定义
 Android 因为各 Rom 的高度定制化,不像 iOS 一样能有一个统一的管理,如果在 Android 中想自定义通知铃声,推荐通过 JPush 推送自定义
 消息,之后在 `jpush.receiveMessage` 事件监听中通过 [Cordova Local-Notification Plugin](https://github.com/katzer/cordova-plugin-local-notifications) 触发通知,再配合 [Cordova Background Plugin](https://github.com/katzer/cordova-plugin-background-mode) 插件保证应用的后台运行。
 消息,之后在 `jpush.receiveMessage` 事件监听中通过 [Cordova Local-Notification Plugin](https://github.com/katzer/cordova-plugin-local-notifications) 触发通知,再配合 [Cordova Background Plugin](https://github.com/katzer/cordova-plugin-background-mode) 插件保证应用的后台运行。
 
 
+#### 如何让通知内容像 iOS 一样自动换行展示?
+
+[#267](https://github.com/jpush/jpush-phonegap-plugin/issues/267)
+
 #### 关闭 App 后收不到通知
 #### 关闭 App 后收不到通知
 
 
-Android 的推送通过长连接的方式实现,只有在连接保持的情况下才能收到通知。而有的第三方 ROM 会限制一般应用服务的自启动,也就是
-在退出应用后,应用的所有服务均被杀死,且无法自启动,所以就会收不到通知。
+Android 的推送通过长连接的方式实现,只有在保持连接的情况下才能收到通知。而有的第三方 ROM 会限制一般应用服务的自启动,也就是在退出应用后,应用的所有服务均被杀死,且无法自启动,所以就会收不到通知。
 
 
 目前 JPush 是做了应用互相拉起机制的,也就是当用户打开其他集成了 JPush 的应用时,你的应用也能同时收到推送消息。
 目前 JPush 是做了应用互相拉起机制的,也就是当用户打开其他集成了 JPush 的应用时,你的应用也能同时收到推送消息。
 
 
@@ -90,10 +126,6 @@ Android 的推送通过长连接的方式实现,只有在连接保持的情况
 cordova platform update ios
 cordova platform update ios
 ```
 ```
 
 
-#### ionic 2 如何调用 API?
-
-[issue 179](https://github.com/jpush/jpush-phonegap-plugin/issues/179)
-
 #### PushConfig.plist 文件中的字段都是什么意思?
 #### PushConfig.plist 文件中的字段都是什么意思?
 
 
 - Appkey:应用标识。
 - Appkey:应用标识。

+ 45 - 204
miaomiao/plugins/jpush-phonegap-plugin/doc/Android_detail_api.md

@@ -1,56 +1,11 @@
 # Android API 简介
 # Android API 简介
 
 
-- [注册成功事件](#注册成功事件)
-- [接收通知时获得通知的内容](#接收通知时获得通知的内容)
-- [打开通知时获得通知的内容](#打开通知时获得通知的内容)
-- [收到自定义消息时获取消息的内容](#收到自定义消息时获取消息的内容)
-- [获取集成日志(同时适用于 iOS)](#获取集成日志同时适用于-ios)
-- [接收消息和点击通知事件](#接收消息和点击通知事件)
-- [统计分析](#统计分析)
 - [清除通知](#清除通知)
 - [清除通知](#清除通知)
 - [设置允许推送时间](#设置允许推送时间)
 - [设置允许推送时间](#设置允许推送时间)
 - [设置通知静默时间](#设置通知静默时间)
 - [设置通知静默时间](#设置通知静默时间)
 - [通知栏样式定制](#通知栏样式定制)
 - [通知栏样式定制](#通知栏样式定制)
 - [设置保留最近通知条数](#设置保留最近通知条数)
 - [设置保留最近通知条数](#设置保留最近通知条数)
 - [本地通知](#本地通知)
 - [本地通知](#本地通知)
-- [富媒体页面 JavaScript 回调 API](#富媒体页面-javascript-回调-api)
-
-## 注册成功事件
-### jpush.receiveRegistrationId
-集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时,JPush 服务器会给客户端返回一个唯一的该设备的标识 - RegistrationID。
-就会触发这个事件(注意只有第一次会触发该事件,之后如果想要取到 registrationId,可以直接调用 *getRegistrationID* 方法)。
-
-#### 代码示例
-```Javascript
-document.addEventListener('jpush.receiveRegistrationId', function (event) {
-    console.log(event.registrationId)
-}, false)
-```
-
-## 接收通知时获得通知的内容
-
-- 内容:
-    window.plugins.jPushPlugin.receiveNotification.alert
-- 标题:
-    window.plugins.jPushPlugin.receiveNotification.title
-- 附加字段:
-    window.plugins.jPushPlugin.receiveNotification.extras.yourKey
-
-## 打开通知时获得通知的内容
-
-- 内容:
-    window.plugins.jPushPlugin.openNotification.alert
-- 标题:
-    window.plugins.jPushPlugin.openNotification.title
-- 附加字段
-    window.plugins.jPushPlugin.openNotification.extras.yourKey
-
-## 收到自定义消息时获取消息的内容
-
-- 内容:
-    window.plugins.jPushPlugin.receiveMessage.message
-- 附加字段:
-    window.plugins.jPushPlugin.receiveMessage.extras.yourKey
 
 
 ## 获取集成日志(同时适用于 iOS)
 ## 获取集成日志(同时适用于 iOS)
 
 
@@ -60,88 +15,15 @@ document.addEventListener('jpush.receiveRegistrationId', function (event) {
 
 
 #### 接口定义
 #### 接口定义
 
 
-	window.plugins.jPushPlugin.setDebugMode(mode)
+```js
+window.JPush.setDebugMode(mode)
+```
 
 
 #### 参数说明
 #### 参数说明
 
 
 - mode:
 - mode:
-	- true  显示集成日志。
-	- false 不显示集成日志。
-
-##  接收消息和点击通知事件
-### API - receiveMessageInAndroidCallback
-
-用于 Android 收到应用内消息的回调函数(请注意和通知的区别),该函数不需要主动调用。
-
-#### 接口定义
-
-	window.plugins.jPushPlugin.receiveMessageInAndroidCallback(data)
-
-#### 参数说明
-
-- data: 接收到的 js 字符串,包含的 key:value 请进入该函数体查看。
-
-
-### API - openNotificationInAndroidCallback
-
-当点击 Android 手机的通知栏进入应用程序时,会调用这个函数,这个函数不需要主动调用,是作为回调函数来用的。
-
-#### 接口定义
-
-	window.plugins.jPushPlugin.openNotificationInAndroidCallback(data)
-
-#### 参数说明
-
-- data: js 字符串。
-
-##  统计分析
-
-### API - onResume / onPause
-
-这是一个 Android Local API,不是 js 的 API,请注意。
-本 API 用于“用户使用时长”,“活跃用户”,“用户打开次数”的统计,并上报到服务器,在 Portal 上展示给开发者。
-
-#### 接口定义
-
-	public static void onResume(final Activity activity)
-	public static void onPause(final Activity activity)
-
-#### 参数说明
-
- - Activity: 当前所在的 Activity。
-
-#### 调用说明
-
-应在所有的 Activity 的 onResume / onPause 方法里调用。
-
-#### 代码示例
-
-	@Override
-	protected void onResume() {
-	    super.onResume();
-	    JPushInterface.onResume(this);
-	}
-
-	@Override
-	protected void onPause() {
-	    super.onPause();
-	    JPushInterface.onPause(this);
-	}
-
-### API - setStatisticsOpen
-
-用于在 js 中控制是否打开应用的统计分析功能,但如果已经添加了上面的 onResume / onPause 方法,
-就不能再通过这个方法来控制统计分析功能了。
-
-#### 接口定义
-
-	window.plugins.jPushPlugin.setStatisticsOpen(boolean)
-
-#### 参数说明
-
-- boolean:
-	- true: 打开统计分析功能。
-	- false: 关闭统计分析功能。
+  - true  显示集成日志。
+  - false 不显示集成日志。
 
 
 ### API - reportNotificationOpened
 ### API - reportNotificationOpened
 
 
@@ -149,13 +31,14 @@ document.addEventListener('jpush.receiveRegistrationId', function (event) {
 
 
 #### 接口定义
 #### 接口定义
 
 
-	window.plugins.jPushPlugin.reportNotificationOpened(msgID)
+```js
+window.JPush.reportNotificationOpened(msgID)
+```
 
 
 #### 参数说明
 #### 参数说明
 
 
 - msgID: 收到的通知或者自定义消息的 id。
 - msgID: 收到的通知或者自定义消息的 id。
 
 
-
 ##  清除通知
 ##  清除通知
 
 
 ### API - clearAllNotification
 ### API - clearAllNotification
@@ -166,36 +49,46 @@ document.addEventListener('jpush.receiveRegistrationId', function (event) {
 
 
 #### 接口定义
 #### 接口定义
 
 
-	window.plugins.jPushPlugin.clearAllNotification()
+```js
+window.JPush.clearAllNotification()
+```
 
 
 ### API - clearNotificationById
 ### API - clearNotificationById
 根据通知 Id 清除通知(包括本地通知)。
 根据通知 Id 清除通知(包括本地通知)。
 
 
 #### 接口定义
 #### 接口定义
 
 
-    window.plugins.jPushPlugin.clearNotificationById(notificationId)
+```js
+window.JPush.clearNotificationById(notificationId)
+```
 
 
 #### 参数说明
 #### 参数说明
 - notificationId:int,通知的 id。
 - notificationId:int,通知的 id。
 
 
 #### 代码示例
 #### 代码示例
 
 
-    window.plugins.jPushPlugin.clearNotificationById(1)
+```js
+window.JPush.clearNotificationById(1)
+```
 
 
 ## 设置允许推送时间
 ## 设置允许推送时间
 
 
 ### API - setPushTime
 ### API - setPushTime
+
 默认情况下用户在任何时间都允许推送。即任何时候有推送下来,客户端都会收到,并展示。
 默认情况下用户在任何时间都允许推送。即任何时候有推送下来,客户端都会收到,并展示。
 开发者可以调用此 API 来设置允许推送的时间。
 开发者可以调用此 API 来设置允许推送的时间。
 如果不在该时间段内收到消息,当前的行为是:推送到的通知会被扔掉。
 如果不在该时间段内收到消息,当前的行为是:推送到的通知会被扔掉。
 
 
 #### 接口定义
 #### 接口定义
 
 
-    window.plugins.jPushPlugin.setPushTime(days, startHour, endHour)
+```js
+window.JPush.setPushTime(days, startHour, endHour)
+```
 
 
 #### 参数说明
 #### 参数说明
+
 - days: 数组,0 表示星期天,1 表示星期一,以此类推(7天制,数组中值的范围为 0 到 6 )。
 - days: 数组,0 表示星期天,1 表示星期一,以此类推(7天制,数组中值的范围为 0 到 6 )。
-数组的值为 null, 表示任何时间都可以收到消息和通知,数组的 size 为 0,则表示任何时间都收不到消息和通知。
+  数组的值为 null, 表示任何时间都可以收到消息和通知,数组的 size 为 0,则表示任何时间都收不到消息和通知。
 - startHour: 整形,允许推送的开始时间 (24 小时制:startHour 的范围为 0 到 23)。
 - startHour: 整形,允许推送的开始时间 (24 小时制:startHour 的范围为 0 到 23)。
 - endHour: 整形,允许推送的结束时间 (24 小时制:endHour 的范围为 0 到 23)。
 - endHour: 整形,允许推送的结束时间 (24 小时制:endHour 的范围为 0 到 23)。
 
 
@@ -208,7 +101,9 @@ document.addEventListener('jpush.receiveRegistrationId', function (event) {
 
 
 #### 接口定义
 #### 接口定义
 
 
-    window.plugins.jPushPlugin.setSilenceTime(startHour, startMinute, endHour, endMinute)
+```js
+window.JPush.setSilenceTime(startHour, startMinute, endHour, endMinute)
+```
 
 
 #### 参数说明
 #### 参数说明
 
 
@@ -217,9 +112,13 @@ document.addEventListener('jpush.receiveRegistrationId', function (event) {
 - endHour: 整形,静音时段的结束时间 - 小时 (24小时制,范围:0~23 )。
 - endHour: 整形,静音时段的结束时间 - 小时 (24小时制,范围:0~23 )。
 - endMinute: 整形,静音时段的结束时间 - 分钟(范围:0~59 )。
 - endMinute: 整形,静音时段的结束时间 - 分钟(范围:0~59 )。
 
 
-
 ##  通知栏样式定制
 ##  通知栏样式定制
 
 
+目前 REST API 与极光控制台均已支持「大文本通知栏样」、「文本条目通知栏样式」和「大图片通知栏样式」。可直接推送对应样式
+的通知。
+
+此外也能够通过设置 Notification 的 flag 来控制通知提醒方式,具体用法可参考 [后台 REST API](https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push/#notification)。
+
 ### API - setBasicPushNotificationBuilder, setCustomPushNotificationBuilder
 ### API - setBasicPushNotificationBuilder, setCustomPushNotificationBuilder
 
 
 当用户需要定制默认的通知栏样式时,则可调用此方法。
 当用户需要定制默认的通知栏样式时,则可调用此方法。
@@ -238,9 +137,10 @@ JPush SDK 提供了 2 个用于定制通知栏样式的构建类:
 
 
 #### 接口定义
 #### 接口定义
 
 
-	window.plugins.jPushPlugin.setBasicPushNotificationBuilder()
-	window.plugins.jPushPlugin.setCustomPushNotificationBuilder()
-
+```js
+window.JPush.setBasicPushNotificationBuilder()
+window.JPush.setCustomPushNotificationBuilder()
+```
 
 
 ##  设置保留最近通知条数
 ##  设置保留最近通知条数
 
 
@@ -252,13 +152,14 @@ JPush SDK 提供了 2 个用于定制通知栏样式的构建类:
 
 
 #### 接口定义
 #### 接口定义
 
 
-	window.plugins.jPushPlugin.setLatestNotificationNum(num)
+```js
+window.JPush.setLatestNotificationNum(num)
+```
 
 
 #### 参数说明
 #### 参数说明
 
 
 - num: 保存的条数。
 - num: 保存的条数。
 
 
-
 ##  本地通知
 ##  本地通知
 ### API - addLocalNotification, removeLocalNotification, clearLocalNotifications
 ### API - addLocalNotification, removeLocalNotification, clearLocalNotifications
 本地通知 API 不依赖于网络,无网条件下依旧可以触发。
 本地通知 API 不依赖于网络,无网条件下依旧可以触发。
@@ -271,77 +172,17 @@ JPush SDK 提供了 2 个用于定制通知栏样式的构建类:
 
 
 #### 接口定义
 #### 接口定义
 
 
-	window.plugins.jPushPlugin.addLocalNotification(builderId, content, title,
-         notificaitonID, broadcastTime, extras)
-	window.plugins.jPushPlugin.removeLocalNotification(notificationID)
-	window.plugins.jPushPlugin.clearLocalNotifications() // 同时适用于 iOS
+```js
+window.JPush.addLocalNotification(builderId, content, title, notificationID, broadcastTime, extras)
+window.JPush.removeLocalNotification(notificationID)
+window.JPush.clearLocalNotifications() // 同时适用于 iOS
+```
 
 
 #### 参数说明
 #### 参数说明
 
 
 - builderId: 设置本地通知样式。
 - builderId: 设置本地通知样式。
 - content: 设置本地通知的 content。
 - content: 设置本地通知的 content。
 - title: 设置本地通知的 title。
 - title: 设置本地通知的 title。
-- notificaitonID: 设置本地通知的 ID(不要为 0)。
+- notificationID: 设置本地通知的 ID(不要为 0)。
 - broadcastTime: 设置本地通知触发时间,为距离当前时间的数值,单位是毫秒。
 - broadcastTime: 设置本地通知触发时间,为距离当前时间的数值,单位是毫秒。
-- extras: 设置额外的数据信息 extras 为 json 字符串。
-
-
-## 富媒体页面 JavaScript 回调 API
-富媒体推送通知时,用户可以用自定义的Javascript 函数来控制页面,如关闭当前页面,点击按钮跳转到指定的 Activity,通知应用程序做一些指定的动作等。
-
-此 API 提供的回调函数包括:关闭当前页面、打开应用的主 Activity、根据 Activity 名字打开对应的 Activity、以广播的形式传递页面参数到应用程序等功能。
-
-### API - 关闭当前页面
-
-    JPushWeb.close();   // 在富文本 HTML 页面中调用后会关闭当前页面。
-
-### API - 打开主 Activity
-
-    JPushWeb.startMainActivity(String params);
-
-在HTML中调用此函数后,会打开程序的主Activity, 并在对应的 Intent 传入参数 ”params“ ,Key 为 JPushInterface.EXTRA_EXTRA。
-
-对应 Activity 获取 params 示例代码:
-
-    Intent intent = getIntent();
-    if (null != intent ) {
-        String params = intent.getStringExtra(JPushInterface.EXTRA_EXTRA);
-    }
-
-### API - 触发应用中的操作
-
-    JPushWeb.triggerNativeAction(String params);
-
-调用了该方法后需要在 MyReceiver.java 中实现后面的业务逻辑:
-
-    if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
-        Log.d(TAG, "用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
-        //在这里根据 JPushInterface.EXTRA_EXTRA 的内容触发客户端动作,比如打开新的Activity 、打开一个网页等。
-    }
-
-#### 代码示例
-
-    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-    <html>
-     <head>
-      <title>JPush Webview Test</title>
-      <script>
-           function clickButton() {
-             JPushWeb.close();
-           }
-
-          function openUrl() {
-             var json = "{'action':'open', 'url':'www.jpush.cn'}";
-             JPushWeb.triggerNativeAction(json);
-             JPushWeb.close(); //客服端在广播中收到json 后,可以打开对应的URL。
-          }
-     </script>
-     </head>
-     <body>
-         <button onclick="javascript:clickButton(this);return false;">Close</button>
-         <button onclick="javascript:JPushWeb.startMainActivity('test - startMainActivity');return false;">StartMainActivity</button>
-         <button onclick="javascript:JPushWeb.triggerNativeAction('test - triggerNativeAction');Javascript:JPushWeb.close();">triggerNativeAction and Close current webwiew</button>
-         <button onclick="javascript:JPushWeb.startActivityByName('com.example.jpushdemo.TestActivity','test - startActivityByName');">startActivityByName</button>
-         <button onclick="javascript:openUrl();">open a url</button>
-     </body>
-    </html>
+- extras: 设置额外的数据信息 extras 为 json 字符串。

+ 0 - 135
miaomiao/plugins/jpush-phonegap-plugin/doc/Android_handle_install.md

@@ -1,135 +0,0 @@
-#Android 手动安装
-
-下载 JPush PhoneGap 插件,并解压缩,标记插件目录为:`$JPUSH_PLUGIN_DIR`
-
-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-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/
-6. 复制:$JPUSH_PLUGIN_DIR/www/JPushPlugin.js 到 assets/www/plugins/cn.jpush.phonegap.JPushPlugin.www/
-   和 platform_www/plugins/cn.jpush.phonegap.JPushPlugin/www/
-   并在 JPushPlugin.js 文件的代码外添加:
-
-        cordova.define("cn.jpush.phonegap.JPushPlugin.JPushPlugin", function(require, exports, module) {
-            // 代码
-        });
-
-7. 修改 AndroidManifest.xml 在 manifest 节点下添加以下权限
-
-		<!-- Required 一些系统要求的权限,如访问网络等-->
-		<uses-permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE"/>
-		<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
-		<uses-permission android:name="android.permission.INTERNET"/>
-		<uses-permission android:name="android.permission.WAKE_LOCK"/>
-		<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-		<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-		<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
-		<uses-permission android:name="android.permission.VIBRATE"/>
-		<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
-		<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-		<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
-		<permission
-		      android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE"
-		      android:protectionLevel="signature"/>
-
-7. 修改 AndroidManifest.xml 在 manifest/application 节点下添加SDK相关组件声明
-
-		<activity
-			android:name="cn.jpush.android.ui.PushActivity"
-			android:theme="@android:style/Theme.Translucent.NoTitleBar"
-			android:configChanges="orientation|keyboardHidden">
-			<intent-filter>
-				<action android:name="cn.jpush.android.ui.PushActivity"/>
-
-				<category android:name="android.intent.category.DEFAULT"/>
-				<category android:name="$PACKAGE_NAME"/>
-			</intent-filter>
-		</activity>
-
-		<!-- Required  SDK 核心功能-->
-		<service
-			android:name="cn.jpush.android.service.DownloadService"
-			android:enabled="true"
-			android:exported="false">
-		</service>
-
-		<!-- Required SDK 核心功能-->
-		<service
-			android:name="cn.jpush.android.service.PushService"
-			android:enabled="true"
-			android:exported="false">
-			<intent-filter>
-				<action android:name="cn.jpush.android.intent.REGISTER"/>
-				<action android:name="cn.jpush.android.intent.REPORT"/>
-				<action android:name="cn.jpush.android.intent.PushService"/>
-				<action android:name="cn.jpush.android.intent.PUSH_TIME"/>
-			</intent-filter>
-		</service>
-
-		<!-- Required SDK 核心功能-->
-		<receiver
-			android:name="cn.jpush.android.service.PushReceiver"
-			android:enabled="true">
-			<intent-filter android:priority="1000">
-				<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>
-
-				<!--Required  显示通知栏 -->
-				<category android:name="$PACKAGE_NAME"/>
-			</intent-filter>
-
-			<intent-filter>
-				<action android:name="android.intent.action.USER_PRESENT"/>
-				<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
-			</intent-filter>
-
-			<!-- Optional -->
-			<intent-filter>
-				<action android:name="android.intent.action.PACKAGE_ADDED"/>
-				<action android:name="android.intent.action.PACKAGE_REMOVED"/>
-				<data android:scheme="package"/>
-			</intent-filter>
-		</receiver>
-
-		<!-- User defined.  For test only  用户自定义的广播接收器 -->
-		<receiver
-			android:name="cn.jpush.phonegap.MyReceiver"
-			android:enabled="true">
-			<intent-filter android:priority="1000">
-				<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY"/>
-
-				<!-- Required  显示通知栏 -->
-				<category android:name="$PACKAGE_NAME"/>
-			</intent-filter>
-
-			<intent-filter>
-				<action android:name="cn.jpush.android.intent.REGISTRATION"/>
-
-				<!-- Required  用户注册 SDK 的intent -->
-				<action android:name="cn.jpush.android.intent.UNREGISTRATION"/>
-				<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED"/>
-
-				<!-- Required  用户接收 SDK 消息的intent -->
-				<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED"/>
-
-				<!-- Required  用户接收 SDK 通知栏信息的intent -->
-				<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED"/>
-
-				<!-- Required  用户打开自定义通知栏的intent -->
-				<action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK"/>
-
-				<!-- Optional 用户接受 Rich Push Javascript 回调函数的intent -->
-				<category android:name="$PACKAGE_NAME"/>
-			</intent-filter>
-		</receiver>
-
-		<!-- Required SDK核心功能-->
-		<receiver
-			android:name="cn.jpush.android.service.AlarmReceiver"/>
-
-		<!-- Required. Enable it you can get statistics data with channel -->
-		<meta-data
-	 		android:name="JPUSH_CHANNEL" android:value="developer-default"/>
-
-		<meta-data
-			android:name="JPUSH_APPKEY" android:value="299d0fee887820e7d90a68b2"/>

+ 416 - 214
miaomiao/plugins/jpush-phonegap-plugin/doc/Common_detail_api.md

@@ -1,15 +1,52 @@
 # 通用 API 说明(同时适用于 Android 和 iOS 系统)
 # 通用 API 说明(同时适用于 Android 和 iOS 系统)
 
 
-- [停止与恢复推送服务](#停止与恢复推送服务)
+- [注册成功事件](#注册成功事件)
+  - [jpush.receiveRegistrationId](#jpushreceiveregistrationid)
+- [初始化、停止与恢复推送服务](#初始化停止与恢复推送服务)
+  - [init](#init)
+  - [stopPush](#stoppush)
+  - [resumePush](#resumepush)
+  - [isPushStopped](#ispushstopped)
+- [开启 Debug 模式](#开启-debug-模式)
+  - [setDebugMode](#setdebugmode)
 - [获取 RegistrationID](#获取-registrationid)
 - [获取 RegistrationID](#获取-registrationid)
+  - [getRegistrationID](#getregistrationid)
 - [设置别名与标签](#设置别名与标签)
 - [设置别名与标签](#设置别名与标签)
+  - [setAlias](#setalias)
+  - [deleteAlias](#deletealias)
+  - [getAlias](#getalias)
+  - [setTags](#settags)
+  - [addTags](#addtags)
+  - [deleteTags](#deletetags)
+  - [cleanTags](#cleantags)
+  - [getAllTags](#getalltags)
+  - [checkTagBindState](#checktagbindstate)
 - [获取点击通知内容](#获取点击通知内容)
 - [获取点击通知内容](#获取点击通知内容)
+  - [event - jpush.openNotification](#event---jpushopennotification)
 - [获取通知内容](#获取通知内容)
 - [获取通知内容](#获取通知内容)
+  - [event - jpush.receiveNotification](#event---jpushreceivenotification)
 - [获取自定义消息推送内容](#获取自定义消息推送内容)
 - [获取自定义消息推送内容](#获取自定义消息推送内容)
+  - [event - jpush.receiveMessage](#event---jpushreceivemessage)
 - [判断系统设置中是否允许当前应用推送](#判断系统设置中是否允许当前应用推送)
 - [判断系统设置中是否允许当前应用推送](#判断系统设置中是否允许当前应用推送)
 
 
-## 停止与恢复推送服务
-### API - init
+## 注册成功事件
+
+### jpush.receiveRegistrationId
+
+集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时,JPush 服务器会给客户端返回一个唯一的该设备的标识 - Registration ID。
+此时就会触发这个事件(注意只有第一次会触发该事件,之后如果想要取到 Registration Id,可以直接调用 `getRegistrationID` 方法)。
+
+#### 代码示例
+
+```js
+document.addEventListener('jpush.receiveRegistrationId', function (event) {
+  console.log(event.registrationId)
+}, false)
+```
+
+## 初始化、停止与恢复推送服务
+
+### init
 
 
 调用此 API,用来开启 JPush SDK 提供的推送服务。
 调用此 API,用来开启 JPush SDK 提供的推送服务。
 
 
@@ -23,90 +60,93 @@
 
 
 #### 接口定义
 #### 接口定义
 
 
-	window.plugins.jPushPlugin.init()
-
-### API - stopPush
-+ Android 平台:
-
-	+ 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
-
-	+ 调用了本 API 后,JPush 推送服务完全被停止,具体表现为:
+```js
+window.JPush.init()
+```
 
 
-		+ JPush Service 不在后台运行。
-		+ 收不到推送消息。
-		+ 不能通过 JPushInterface.init 恢复,需要调用 resumePush 恢复。
-		+ 极光推送所有的其他 API 调用都无效。
+### stopPush
 
 
-+ iOS 平台:
+- Android:
+  - 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
+  - 调用了本 API 后,JPush 推送服务完全被停止,具体表现为:
+    - JPush Service 不在后台运行。
+    - 收不到推送消息。
+    - 不能通过 `init` 方法恢复,而需要调用 `resumePush` 恢复。
+    - 极光推送其他所有的 API 调用都无效。
 
 
-	+ 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。**建议设置一个 UI 界面, 提醒用户在 设置-通知 中关闭推送服务**。
+- iOS:
+  - 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。**建议设置一个 UI 界面, 提醒用户在 设置-通知 中关闭推送服务**。
 
 
 #### 接口定义
 #### 接口定义
 
 
-    window.plugins.jPushPlugin.stopPush()
+```js
+window.JPush.stopPush()
+```
 
 
-### API - resumePush
+### resumePush
 
 
 恢复推送服务。调用了此 API 后:
 恢复推送服务。调用了此 API 后:
 
 
-+ Android 平台:
-
-	+ 极光推送完全恢复正常工作。
-
-+ iOS 平台:
+- Android 平台:
+  - 极光推送完全恢复正常工作。
 
 
-	+ 重新去 APNS 注册。
+- iOS 平台:
+  - 重新去 APNS 注册。
 
 
 #### 接口定义
 #### 接口定义
 
 
-	window.plugins.jPushPlugin.resumePush()
-
-### API - isPushStopped
-
-+ Android 平台:
+```js
+window.JPush.resumePush()
+```
 
 
-	+ 用来检查 Push Service 是否已经被停止。
+### isPushStopped
 
 
-+ iOS 平台:
+- Android 平台:
+  - 用来检查 Push Service 是否已经被停止。
 
 
-	+ 平台检查推送服务是否注册。
+- iOS 平台:
+  - 平台检查推送服务是否注册。
 
 
 #### 接口定义
 #### 接口定义
 
 
-    window.plugins.jPushPlugin.isPushStopped(callback)
+```js
+window.JPush.isPushStopped(callback)
+```
 
 
 #### 参数说明
 #### 参数说明
 
 
-+ callback: 回调函数,用来通知 JPush 的推送服务是否开启。
+- callback: 回调函数,用来通知 JPush 的推送服务是否开启。
 
 
 #### 代码示例
 #### 代码示例
 
 
-	window.plugins.jPushPlugin.isPushStopped(function (result) {
-	   if (result == 0) {
-		    // 开启
-		 } else {
-		    // 关闭
-		 }
-    })
+```js
+window.JPush.isPushStopped(function (result) {
+  if (result == 0) {
+    // 开启
+  } else {
+    // 关闭
+  }
+})
+```
 
 
 ## 开启 Debug 模式
 ## 开启 Debug 模式
-### API - setDebugMode
+### setDebugMode
 用于开启 Debug 模式,显示更多的日志信息。
 用于开启 Debug 模式,显示更多的日志信息。
 
 
-#### 接口定义
+#### 代码示例
 
 
-		JPushPlugin.prototype.setDebugMode(isOpen)
+```js
+window.JPush.setDebugMode(true)
+```
 
 
 #### 参数说明
 #### 参数说明
-- isOpen: true,开启 Debug 模式;false,关闭 Debug 模式,不显示错误信息之外的日志信息。
 
 
-#### 代码示例
-
-		window.plugins.jPushPlugin.setDebugMode(true)
+- true: 开启 Debug 模式;
+- false: 关闭 Debug 模式,不显示错误信息之外的日志信息。
 
 
 ## 获取 RegistrationID
 ## 获取 RegistrationID
 
 
-### API - getRegistrationID
+### getRegistrationID
 
 
 RegistrationID 定义:
 RegistrationID 定义:
 
 
@@ -117,7 +157,9 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
 
 
 #### 接口定义
 #### 接口定义
 
 
-	JPushPlugin.prototype.getRegistrationID(callback)
+```js
+window.JPush.getRegistrationID(callback)
+```
 
 
 #### 返回值
 #### 返回值
 
 
@@ -125,14 +167,14 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
 
 
 #### 代码示例
 #### 代码示例
 
 
-     window.plugins.jPushPlugin.getRegistrationID(function(data) {
-       console.log("JPushPlugin:registrationID is " + data)
-     })
+```js
+window.JPush.getRegistrationID(function(rId) {
+  console.log("JPushPlugin:registrationID is " + rId)
+})
+```
 
 
 ## 设置别名与标签
 ## 设置别名与标签
 
 
-### API - setTagsWithAlias, setTags, setAlias
-
 提供几个相关 API 用来设置别名(alias)与标签(tags)。
 提供几个相关 API 用来设置别名(alias)与标签(tags)。
 
 
 这几个 API 可以在 App 里任何地方调用。
 这几个 API 可以在 App 里任何地方调用。
@@ -159,201 +201,357 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
 
 
 举例: game, old_page, women。
 举例: game, old_page, women。
 
 
-#### 接口定义
+> 以下方法的错误回调均包含 `sequence` 和 `code` 属性。其中 code 为错误码,具体定义可参考[官方文档](https://docs.jiguang.cn/jpush/client/Android/android_api/#_133)。
+
+### setAlias
+
+设置别名。注意这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
+
+#### 代码示例
 
 
 ```js
 ```js
-JPushPlugin.prototype.setTagsWithAlias(tags, alias, successCallback, errorCallback)
-JPushPlugin.prototype.setTags(tags, successCallback, errorCallback)
-JPushPlugin.prototype.setAlias(alias, successCallback, errorCallback)
+window.JPush.setAlias({ sequence: 1, alias: 'your_alias' },
+  (result) => {
+    var sequence = result.sequence
+    var alias = result.alias
+  }, (error) => {
+    var sequence = error.sequence
+    var errorCode = error.code
+  })
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
-* tags:
-	* 参数类型为数组。
-	* nil 此次调用不设置此值。
-	* 空集合表示取消之前的设置。
-	* 每次调用至少设置一个 tag,覆盖之前的设置,不是新增。
-	* 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
-	* 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag,但总长度不得超过1K字节(判断长度需采用 UTF-8 编码)。
-	* 单个设备最多支持设置 100 个 tag,App 全局 tag 数量无限制。
-* alias:
-	* 参数类型为字符串。
-	* nil 此次调用不设置此值。
-	* 空字符串 ("")表示取消之前的设置。
-	* 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
-	* 限制:alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
+
+- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
+- alias: string
+  - 每次调用设置有效的别名将覆盖之前的设置。
+  - 有效的别名组成:字母(区分大小写)、数字、下划线、汉字、特殊字符@!#$&*+=.|。
+  - 限制:alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
+
+### deleteAlias
+
+删除别名。
 
 
 #### 代码示例
 #### 代码示例
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.setTagsWithAlias([tag1, tag2], alias1, function () {
-  // success callback.
-}, function (errorMsg) {
-  // errorMsg 格式为 'errorCode: error message'.
-})
+window.JPush.deleteAlias({ sequence: 1 },
+  (result) => {
+    var sequence = result.sequence
+  }, (error) => {
+    var sequence = error.sequence
+    var errorCode = error.code
+  })
 ```
 ```
 
 
-#### 错误码定义
+#### 参数说明
+
+- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
+
+### getAlias
+
+查询别名。
+
+#### 代码示例
+
+```js
+window.JPush.getAlias({ sequence: 1 },
+  (result) => {
+    var sequence = result.sequence
+    var alias = result.alias
+  }, (error) => {
+    var sequence = error.sequence
+    var errorCode = error.code
+  })
+```
+
+#### 参数说明
+
+- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
+
+### setTags
+
+设置标签。注意这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
+
+#### 代码示例
+
+```js
+window.JPush.setTags({ sequence: 1, tags: ['tag1', 'tag2'] },
+  (result) => {
+    var sequence = result.sequence
+    var tags = result.tags  // 数组类型
+  }, (error) => {
+    var sequence = error.sequence
+    var errorCode = error.code
+  })
+```
+
+#### 参数说明
+
+- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
+- tags: Array,标签数组。
 
 
-|Code|描述                   		       |详细解释 |
-|----|:----------------------------------------|:--------|
-|6001|无效的设置,tag / alias 不应参数都为 null。  |   	 |
-|6002|设置超时。			       	       |建议重试。|
-|6003|alias 字符串不合法。	               |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
-|6004|alias超长。			       |最多 40个字节,中文 UTF-8 是 3 个字节。|
-|6005|某一个 tag 字符串不合法。		       |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
-|6006|某一个 tag 超长。			       |一个 tag 最多 40个字节,中文 UTF-8 是 3 个字节。|
-|6007|tags 数量超出限制,最多 100 个。	       |这是一台设备的限制,一个应用全局的标签数量无限制。|
-|6008|tag / alias 超出总长度限制。	       	       |总长度最多 1K 字节。|
-|6011|10s内设置 tag 或 alias 大于 3 次。	       |短时间内操作过于频繁。|
+### addTags
 
 
+新增标签。
+
+#### 代码示例
+
+```js
+window.JPush.addTags({ sequence: 1, tags: ['tag1', 'tag2'] },
+  (result) => {
+    var sequence = result.sequence
+    var tags = result.tags  // 数组类型
+  }, (error) => {
+    var sequence = error.sequence
+    var errorCode = error.code
+  })
+```
+
+#### 参数说明
+
+- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
+- tags: Array,标签数组。
+
+### deleteTags
+
+删除指定标签。
+
+#### 代码示例
+
+```js
+window.JPush.deleteTags({ sequence: 1, tags: ['tag1', 'tag2'] },
+  (result) => {
+    var sequence = result.sequence
+  }, (error) => {
+    var sequence = error.sequence
+    var errorCode = error.code
+  })
+```
+
+#### 参数说明
+
+- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
+- tags: Array,标签数组。
+
+### cleanTags
+
+清除所有标签。
+
+#### 代码示例
+
+```js
+window.JPush.cleanTags({ sequence: 1 },
+  (result) => {
+    var sequence = result.sequence
+  }, (error) => {
+    var sequence = error.sequence
+    var errorCode = error.code
+  })
+```
+
+#### 参数说明
+
+- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
+
+### getAllTags
+
+获取当前绑定的所有标签。
+
+#### 代码示例
+
+```js
+window.JPush.getAllTags({ sequence: 1 },
+  (result) => {
+    var sequence = result.sequence
+    var tags = result.tags
+  }, (error) => {
+    var sequence = error.sequence
+    var errorCode = error.code
+  })
+```
+
+#### 参数说明
+
+- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
+
+### checkTagBindState
+
+查询指定tag与当前用户绑定的状态。
+
+#### 代码示例
+
+```js
+window.JPush.checkTagBindState({ sequence: 1, tag: 'tag1' },
+  (result) => {
+    var sequence = result.sequence
+  }, (error) => {
+    var sequence = error.sequence
+    var errorCode = error.code
+  })
+```
+
+#### 参数说明
+
+- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
+- tag: string,待查询的 tag。
 
 
 ## 获取点击通知内容
 ## 获取点击通知内容
 
 
 ### event - jpush.openNotification
 ### event - jpush.openNotification
 
 
-点击通知进入应用程序时会出发改事件。
+点击通知进入应用程序时触发
 
 
 #### 代码示例
 #### 代码示例
 
 
 - 在你需要接收通知的的 js 文件中加入:
 - 在你需要接收通知的的 js 文件中加入:
 
 
-        document.addEventListener("jpush.openNotification", function (event) {
-	      var alertContent
-          if(device.platform == "Android") {
-            alertContent = event.alert
-          } else {
-            alertContent = event.aps.alert
-          }
-	    }, false)
-
-> ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.openNotification,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
-
-+ Android:
-
-		{
-			"title": "title",
-			"alert":"ding",
-			"extras":{
-				"yourKey": "yourValue",
-			    "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"
-			}
-		}
-
-+ iOS:
-
-		{
-			"aps":{
-			  	"badge": 1,
-			  	"sound": "default",
-			  	"alert": "今天去哪儿"
-			 },
-			"key1": "value1",
-			"key2": "value2",
-			"_j_msgid": 154604475
-		}
+```js
+document.addEventListener("jpush.openNotification", function (event) {
+  var alertContent
+  if(device.platform == "Android") {
+    alertContent = event.alert
+  } else {
+    alertContent = event.aps.alert
+  }
+}, false)
+```
+
+- Android:
+
+```json
+{
+  "title": "title",
+  "alert":"ding",
+  "extras":{
+  "yourKey": "yourValue",
+    "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"
+  }
+}
+```
+
+- iOS:
+
+```json
+{
+  "aps": {
+    "badge": 1,
+    "sound": "default",
+    "alert": "今天去哪儿"
+  },
+  "key1": "value1",
+  "key2": "value2",
+  "_j_msgid": 154604475
+}
+```
 
 
 ## 获取通知内容
 ## 获取通知内容
 
 
 ### event - jpush.receiveNotification
 ### event - jpush.receiveNotification
 
 
-收到通知时会触发该事件。
+收到通知时触发。
 
 
 #### 代码示例
 #### 代码示例
 
 
 - 在你需要接收通知的的 js 文件中加入:
 - 在你需要接收通知的的 js 文件中加入:
 
 
-		  document.addEventListener("jpush.receiveNotification", function (event) {
-		    var alertContent
-	        if(device.platform == "Android") {
-	          alertContent = event.alert
-	        } else {
-	          alertContent = event.aps.alert
-	        }
-	        alert("open Notificaiton:" + alertContent)
-		  }, false)
-
-
-> ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveNotification,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
-
-+ Android:
-
-		{
-			"title": "title",
-			"alert":"ding",
-			"extras":{
-				"yourKey": "yourValue",
-			    "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"
-			}
-		}
-
-+ iOS:
-
-		{
-			"aps":{
-				"badge":1,
-				"sound":"default",
-				"alert":"今天去哪儿"
-			},
-			"key1":"value1",
-			"key2":"value2",
-			"_j_msgid":154604475
-		}
+```js
+document.addEventListener("jpush.receiveNotification", function (event) {
+  var alertContent
+  if(device.platform == "Android") {
+    alertContent = event.alert
+  } else {
+    alertContent = event.aps.alert
+  }
+  alert("open Notification:" + alertContent)
+}, false)
+```
 
 
+- Android:
+
+```json
+{
+  "title": "title",
+  "alert":"ding",
+  "extras":{
+    "yourKey": "yourValue",
+    "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"
+  }
+}
+```
+
+- iOS:
+
+```json
+{
+  "aps":{
+    "badge":1,
+    "sound":"default",
+    "alert":"今天去哪儿"
+  },
+  "key1":"value1",
+  "key2":"value2",
+  "_j_msgid":154604475
+}
+```
 
 
 ## 获取自定义消息推送内容
 ## 获取自定义消息推送内容
 
 
 ### event - jpush.receiveMessage
 ### event - jpush.receiveMessage
 
 
-收到自定义消息时触发这个事件,推荐使用事件的方式传递。
+收到自定义消息时触发,推荐使用事件的方式传递。
 
 
-但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
+但同时保留了 `receiveMessageIniOSCallback` 的回调函数,兼容以前的代码。
 
 
 #### 代码示例
 #### 代码示例
 
 
 - 在你需要接收通知的的 js 文件中加入:
 - 在你需要接收通知的的 js 文件中加入:
 
 
-	    document.addEventListener("jpush.receiveMessage", function (event) {
-	      var message
-          if(device.platform == "Android") {
-            message = event.message;
-          } else {
-            message = event.content;
-          }      
-	    }, false)
-
-> ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveMessage,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
-
-+ Android:
+```js
+document.addEventListener("jpush.receiveMessage", function (event) {
+  var message
+  if(device.platform == "Android") {
+    message = event.message;
+  } else {
+    message = event.content;
+  }
+}, false)
+```
 
 
-		{
-			"message":"今天去哪儿",
-			"extras"{
-				"yourKey": "yourValue",
-				"cn.jpush.android.MSG_ID":"154378013",
-				"cn.jpush.android.CONTENT_TYPE":"",
-				"cn.jpush.android.EXTRA":{"key":"不添没有"}
-			}
-		}
+- Android:
+
+```json
+{
+  "message":"今天去哪儿",
+  "extras"{
+    "yourKey": "yourValue",
+    "cn.jpush.android.MSG_ID":"154378013",
+    "cn.jpush.android.CONTENT_TYPE":"",
+    "cn.jpush.android.EXTRA":{ "key":"不添加没有" }
+  }
+}
+```
 
 
-+ iOS:
+- iOS:
 
 
-		{
-			 "content":"今天去哪儿",
-			 "extras":{"key":"不填写没有"}
-		}
+```json
+{
+  "content":"今天去哪儿",
+  "extras":{ "key":"不添加没有" }
+}
+```
 
 
 ## 判断系统设置中是否允许当前应用推送
 ## 判断系统设置中是否允许当前应用推送
 ### API - getUserNotificationSettings
 ### API - getUserNotificationSettings
@@ -363,17 +561,21 @@ window.plugins.jPushPlugin.setTagsWithAlias([tag1, tag2], alias1, function () {
 
 
 在 iOS 中,返回值为 0 时,代表系统设置中关闭了推送;大于 0 时,代表打开了推送,且能够根据返回值判断具体通知形式:
 在 iOS 中,返回值为 0 时,代表系统设置中关闭了推送;大于 0 时,代表打开了推送,且能够根据返回值判断具体通知形式:
 
 
-	UIRemoteNotificationTypeNone    = 0,		// 0
-	UIRemoteNotificationTypeBadge   = 1 << 0,	// 1
-	UIRemoteNotificationTypeSound   = 1 << 1,	// 2
-	UIRemoteNotificationTypeAlert   = 1 << 2,	// 4
-	UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3	// 8
+```js
+UIRemoteNotificationTypeNone    = 0,      // 0
+UIRemoteNotificationTypeBadge   = 1 << 0, // 1
+UIRemoteNotificationTypeSound   = 1 << 1, // 2
+UIRemoteNotificationTypeAlert   = 1 << 2, // 4
+UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3 // 8
+```
 
 
 #### 代码示例
 #### 代码示例
 
 
-	window.plugins.jPushPlugin.getUserNotificationSettings(function(result) {
-		if(result == 0) {
-			// 系统设置中已关闭应用推送。
-		} else if(result > 0) {
-			// 系统设置中打开了应用推送。
-		})
+```js
+window.JPush.getUserNotificationSettings(function(result) {
+  if(result == 0) {
+    // 系统设置中已关闭应用推送。
+  } else if(result > 0) {
+    // 系统设置中打开了应用推送。
+  })
+```

+ 213 - 325
miaomiao/plugins/jpush-phonegap-plugin/doc/iOS_API.md

@@ -3,7 +3,6 @@
 - [延迟注册和启动推送通知服务](#延迟注册和启动推送通知服务)
 - [延迟注册和启动推送通知服务](#延迟注册和启动推送通知服务)
 - [开始与停止推送服务](#开始与停止推送服务)
 - [开始与停止推送服务](#开始与停止推送服务)
 - [获取 RegistrationID](#获取-registrationid)
 - [获取 RegistrationID](#获取-registrationid)
-- [别名与标签](#别名与标签)
 - [获取 APNS 推送内容](#获取-apns-推送内容)
 - [获取 APNS 推送内容](#获取-apns-推送内容)
   - [点击推送通知](#点击推送通知)
   - [点击推送通知](#点击推送通知)
   - [前台收到推送](#前台收到推送)
   - [前台收到推送](#前台收到推送)
@@ -20,7 +19,6 @@
 - [获取用户推送设置](#获取用户推送设置)
 - [获取用户推送设置](#获取用户推送设置)
 - [监听事件统一说明](#监听事件统一说明)
 - [监听事件统一说明](#监听事件统一说明)
 
 
-
 ## 延迟注册和启动推送通知服务
 ## 延迟注册和启动推送通知服务
 
 
 本插件默认在 App 启动完成之后,立即「注册苹果通知服务」+「启动 JPush SDK」,其中:
 本插件默认在 App 启动完成之后,立即「注册苹果通知服务」+「启动 JPush SDK」,其中:
@@ -30,8 +28,8 @@
 
 
 开发者可以根据自己的需求,延迟注册和启动,需做以下操作:
 开发者可以根据自己的需求,延迟注册和启动,需做以下操作:
 
 
-1. 查找并配置 `PushConfig.plist` 文件中的 `Delay` 字段为 `YES`,表明会延迟使用,此时插件不再自动注册、启动通知。
-2. 在需要注册并启动通知的地方调用 API - startJPushSDK。
+1.查找并配置 `PushConfig.plist` 文件中的 `Delay` 字段为 `YES`,表明会延迟使用,此时插件不再自动注册、启动通知。
+2.在需要注册并启动通知的地方调用 API - `startJPushSDK`
 
 
 ### API - startJPushSDK
 ### API - startJPushSDK
 
 
@@ -39,11 +37,10 @@
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.startJPushSDK()
+```js
+window.JPush.startJPushSDK()
 ```
 ```
 
 
-
 ## 开始与停止推送服务
 ## 开始与停止推送服务
 
 
 ### API - init
 ### API - init
@@ -52,18 +49,16 @@ window.plugins.jPushPlugin.startJPushSDK()
 
 
 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
 
 
-```
 本功能是一个完全本地的状态操作。也就是说:停止推送服务的状态不会保存到服务器上。
 本功能是一个完全本地的状态操作。也就是说:停止推送服务的状态不会保存到服务器上。
 如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
 如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
 JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
 JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
 本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
 本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
 恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
 恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
-```
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.init()
+```js
+window.JPush.init()
 ```
 ```
 
 
 ### API - stopPush
 ### API - stopPush
@@ -73,7 +68,9 @@ window.plugins.jPushPlugin.init()
 
 
 #### 接口定义
 #### 接口定义
 
 
-  window.plugins.jPushPlugin.stopPush()
+```js
+window.JPush.stopPush()
+```
 
 
 ### API - resumePush
 ### API - resumePush
 
 
@@ -81,8 +78,8 @@ window.plugins.jPushPlugin.init()
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.resumePush()
+```js
+window.JPush.resumePush()
 ```
 ```
 
 
 ### API - isPushStopped
 ### API - isPushStopped
@@ -91,8 +88,8 @@ iOS平台,检查推送服务是否停止。
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.isPushStopped(callback)
+```js
+window.JPush.isPushStopped(callback)
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
@@ -102,13 +99,13 @@ window.plugins.jPushPlugin.isPushStopped(callback)
 #### 代码示例
 #### 代码示例
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.isPushStopped(function(data) {
-	  if(data > 0) {
-	    // 已关闭
-	  } else {
-	    // 已开启
-	  }
-  })
+window.JPush.isPushStopped(function(data) {
+  if(data > 0) {
+  // 已关闭
+  } else {
+  // 已开启
+  }
+})
 ```
 ```
 
 
 ## 获取 RegistrationID
 ## 获取 RegistrationID
@@ -125,7 +122,7 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
 #### 接口定义
 #### 接口定义
 
 
 ```js
 ```js
-JPushPlugin.prototype.getRegistrationID(callback)
+JPushPlugin.getRegistrationID(callback)
 ```
 ```
 
 
 #### 返回值
 #### 返回值
@@ -135,122 +132,50 @@ JPushPlugin.prototype.getRegistrationID(callback)
 #### 调用示例
 #### 调用示例
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.getRegistrationID(function(data) {
-	console.log("JPushPlugin:registrationID is " + data)
+window.JPush.getRegistrationID(function(data) {
+  console.log("JPushPlugin:registrationID is " + data)
 })
 })
 ```
 ```
 
 
-
-
-## 别名与标签
-
-### API - setTagsWithAlias, setTags, setAlias
-
-提供几个相关 API 用来设置别名(alias)与标签(tags)。
-
-这几个 API 可以在 App 里任何地方调用。
-
-**别名 Alias**
-
-为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
-
-每个用户只能指定一个别名。
-
-同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
-
-系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端 API 会同时给这多个用户发送消息。
-
-举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时,发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端 API 发通知到客户端提醒用户。
-
-**标签 Tag**
-
-为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push 消息。
-
-可为每个用户打多个标签。
-
-不同应用程序、不同的用户,可以打同样的标签。
-
-举例: game, old_page, women。
-
-#### 接口定义
-
-```
-JPushPlugin.prototype.setTagsWithAlias(tags, alias, successCallback, errorCallback)
-JPushPlugin.prototype.setTags(tags, successCallback)
-JPushPlugin.prototype.setAlias(alias, errorCallback)
-```
-
-#### 参数说明
-
-- tags:
-  - 参数类型为数组。
-  - nil 此次调用不设置此值。
-  - 空集合表示取消之前的设置。
-  - 每次调用至少设置一个 tag,覆盖之前的设置,不是新增。
-  - 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
-  - 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag,但总长度不得超过1K字节(判断长度需采用UTF-8编码)。
-  - 单个设备最多支持设置 100 个 tag,App 全局 tag 数量无限制。
-- alias:
-  - 参数类型为字符串。
-  - nil 此次调用不设置此值。
-  - 空字符串 ("")表示取消之前的设置。
-  - 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
-  - 限制:alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
-
-#### 错误码定义
-
-| Code | 描述                          | 详细解释                              |
-| ---- | :-------------------------- | :-------------------------------- |
-| 6001 | 无效的设置,tag/alias 不应参数都为 null |                                   |
-| 6002 | 设置超时                        | 建议重试。                             |
-| 6003 | alias 字符串不合法                | 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。   |
-| 6004 | alias超长                     | 最多 40个字节	中文 UTF-8 是 3 个字节。        |
-| 6005 | 某一个 tag 字符串不合法              | 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。   |
-| 6006 | 某一个 tag 超长                  | 一个 tag 最多 40个字节	中文 UTF-8 是 3 个字节。 |
-| 6007 | tags 数量超出限制(最多 100 个)       | 这是一台设备的限制。一个应用全局的标签数量无限制。         |
-| 6008 | tag/alias 超出总长度限制           | 总长度最多 1K 字节。                      |
-| 6011 | 10s内设置tag或alias大于3次         | 短时间内操作过于频繁。                       |
-
 ## 获取 APNS 推送内容
 ## 获取 APNS 推送内容
 
 
 ### 点击推送通知
 ### 点击推送通知
 
 
 #### event - jpush.openNotification
 #### event - jpush.openNotification
 
 
-点击通知启动或唤醒应用程序时会出发该事件
+点击通知(包括 localNotification 和 remoteNotification)启动或唤醒应用程序时会触发该事件
 
 
 #### 代码示例
 #### 代码示例
 
 
 - 在你需要接收通知的的 js 文件中加入:
 - 在你需要接收通知的的 js 文件中加入:
 
 
-  ```js
-  document.addEventListener("jpush.openNotification", onOpenNotification, false)
-  ```
+```js
+document.addEventListener("jpush.openNotification", onOpenNotification, false)
+```
 
 
 - onOpenNotification 需要这样写:
 - onOpenNotification 需要这样写:
 
 
-  ```js
-  var onOpenNotification = function(event) {
-  	var alertContent
-  	alertContent = event.aps.alert
-  	alert("open Notificaiton:" + alertContent)
-  }
-  ```
+```js
+var onOpenNotification = function(event) {
+  var alertContent = event.aps.alert
+  alert("open notification:" + alertContent)
+}
+```
 
 
 - event 举例:
 - event 举例:
 
 
-  ```json
-  {
-  	"aps":{
-  		  "badge":1,
-  		  "sound":"default",
-  		  "alert":"今天去哪儿"
-  	},
-  	"key1":"value1",
-  	"key2":"value2",
-  	"_j_msgid":154604475
-  }
-  ```
+```json
+{
+  "aps":{
+    "badge":1,
+      "sound":"default",
+        "alert":"今天去哪儿"
+  },
+  "key1":"value1",
+  "key2":"value2",
+  "_j_msgid":154604475
+}
+```
 
 
 ### 前台收到推送
 ### 前台收到推送
 
 
@@ -262,34 +187,33 @@ JPushPlugin.prototype.setAlias(alias, errorCallback)
 
 
 - 在你需要接收通知的的 js 文件中加入:
 - 在你需要接收通知的的 js 文件中加入:
 
 
-  ```js
-  document.addEventListener("jpush.receiveNotification", onReceiveNotification, false)
-  ```
+```js
+document.addEventListener("jpush.receiveNotification", onReceiveNotification, false)
+```
 
 
 - onReceiveNotification 需要这样写:
 - onReceiveNotification 需要这样写:
 
 
-  ```js
-  var onReceiveNotification = function(event) {
-  	var alertContent
-  	alertContent = event.aps.alert
-  	alert("open Notificaiton:" + alertContent)
-  }
-  ```
+```js
+var onReceiveNotification = function(event) {
+  var alertContent = event.aps.alert
+  alert("open Notification:" + alertContent)
+}
+```
 
 
 - event 举例
 - event 举例
 
 
-  ```json
-  {
-  	"aps":{
-  		  "badge":1,
-  		  "sound":"default",
-  		  "alert":"今天去哪儿"
-  	},
-  	"key1":"value1",
-  	"key2":"value2",
-  	"_j_msgid":154604475
-  }
-  ```
+```json
+{
+  "aps":{
+    "badge":1,
+    "sound":"default",
+    "alert":"今天去哪儿"
+  },
+  "key1":"value1",
+  "key2":"value2",
+  "_j_msgid":154604475
+}
+```
 
 
 ### 后台收到推送
 ### 后台收到推送
 
 
@@ -301,100 +225,92 @@ JPushPlugin.prototype.setAlias(alias, errorCallback)
 
 
 - 在你需要接收通知的的 js 文件中加入:
 - 在你需要接收通知的的 js 文件中加入:
 
 
-  ```js
-  document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false)
-  ```
+```js
+document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false)
+```
 
 
 - onBackgroundNotification 需要这样写:
 - onBackgroundNotification 需要这样写:
 
 
-  ```js
-  var onBackgroundNotification = function(event) {
-  	var alertContent
-  	alertContent = event.aps.alert
-  	alert("open Notificaiton:" + alertContent)
-  }
-  ```
-
+```js
+var onBackgroundNotification = function(event) {
+  var alertContent = event.aps.alert
+  alert("open Notification:" + alertContent)
+}
+```
 
 
 - event 举例
 - event 举例
 
 
-  ```json
-  {
-  	"aps":{
-  		  "badge":1,
-  		  "sound":"default",
-  		  "alert":"今天去哪儿"
-  	},
-  	"key1":"value1",
-  	"key2":"value2",
-  	"_j_msgid":154604475
-  }
-  ```
-
-
-
-
-
-## 获取自定义消息内容
+```json
+{
+  "aps":{
+    "badge":1,
+    "sound":"default",
+    "alert":"今天去哪儿"
+  },
+  "key1":"value1",
+  "key2":"value2",
+  "_j_msgid":154604475
+}
+```
 
 
 ### event - jpush.receiveMessage
 ### event - jpush.receiveMessage
 
 
-收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
+收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 `receiveMessageIniOSCallback` 的回调函数,兼容以前的代码。
 
 
 #### 代码示例
 #### 代码示例
 
 
 - 在你需要接收通知的的 js 文件中加入:
 - 在你需要接收通知的的 js 文件中加入:
 
 
-  ```js
-  document.addEventListener("jpush.receiveMessage", onReceiveMessage, false)
-  ```
+```js
+document.addEventListener("jpush.receiveMessage", onReceiveMessage, false)
+```
 
 
 - onReceiveMessage 需要这样写:
 - onReceiveMessage 需要这样写:
 
 
-  ```js
-  var onReceiveMessage = function(event) {
-  	try {
-  		var message = event.content
-  		$("#messageResult").html(message)
-  	} catch(exception) {
-  		console.log("JPushPlugin:onReceiveMessage-->" + exception);
-  	}
+```js
+var onReceiveMessage = function(event) {
+  try {
+    var message = event.content
+    $("#messageResult").html(message)
+  } catch(exception) {
+    console.log("JPushPlugin:onReceiveMessage-->" + exception);
   }
   }
-  ```
+}
+```
 
 
 - event 举例:
 - event 举例:
 
 
-  ```json
+```json
+{
+  "content":"今天去哪儿",
+  "extras":
   {
   {
-  	"content":"今天去哪儿",
-  	"extras":
-  	{
-  		"key":"不填写没有"
-  	}
+    "key":"不填写没有"
   }
   }
-  ```
+}
+```
 
 
 ## 设置Badge
 ## 设置Badge
 
 
 ### API - setBadge, resetBadge
 ### API - setBadge, resetBadge
 
 
 JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
 JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
-(本接口不会直接改变应用本地的角标值. 要修改本地 badege 值,使用 setApplicationIconBadgeNumber)
+(本接口不会直接改变应用本地的角标值. 要修改本地 badge 值,使用 `setApplicationIconBadgeNumber`
 
 
 实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。
 实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。
 
 
 #### 接口定义
 #### 接口定义
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.prototype.setBadge(value)
-window.plugins.jPushPlugin.prototype.resetBadge()
+window.JPush.setBadge(value)
+window.JPush.resetBadge()
 ```
 ```
 
 
-resetBadge 相当于 setBadge(0)。
+`resetBadge` 相当于 `setBadge(0)`
 
 
 #### 参数说明
 #### 参数说明
 
 
-value 取值范围:[0,99999]
+value 取值范围:0 ~ 99999
 
 
 #### 返回值
 #### 返回值
 
 
@@ -403,8 +319,8 @@ value 取值范围:[0,99999]。
 #### 代码示例
 #### 代码示例
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.setBadge(5)
-window.plugins.jPushPlugin.resetBadge()
+window.JPush.setBadge(5)
+window.JPush.resetBadge()
 ```
 ```
 
 
 ### API - setApplicationIconBadgeNumber
 ### API - setApplicationIconBadgeNumber
@@ -414,17 +330,17 @@ window.plugins.jPushPlugin.resetBadge()
 #### 接口定义
 #### 接口定义
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.prototype.setApplicationIconBadgeNumber(badge)
+window.JPush.setApplicationIconBadgeNumber(badge)
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
 
 
-- badge: 整型,例如 0,1,2(当 badge 为 0 时,角标被清除)。
+- badge: 整型,例如 0, 1, 2(当 badge 为 0 时,角标被清除)。
 
 
 #### 代码示例
 #### 代码示例
 
 
-```
-window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0)
+```js
+window.JPush.setApplicationIconBadgeNumber(0)
 ```
 ```
 
 
 ### API - getApplicationIconBadgeNumber
 ### API - getApplicationIconBadgeNumber
@@ -433,8 +349,8 @@ window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0)
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.getApplicationIconBadgeNumber(callback)
+```js
+window.JPush.getApplicationIconBadgeNumber(callback)
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
@@ -444,8 +360,8 @@ window.plugins.jPushPlugin.prototype.getApplicationIconBadgeNumber(callback)
 #### 代码示例
 #### 代码示例
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data) {
-  console.log(data)
+window.JPush.getApplicationIconBadgeNumber(function(badgeNum) {
+  console.log(badgeNum)
 })
 })
 ```
 ```
 
 
@@ -458,12 +374,12 @@ window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data) {
 #### 接口定义
 #### 接口定义
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
+window.JPush.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
 
 
-- delayTime: 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可。
+- delayTime: 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可,单位为秒
 - content: 本地推送需要显示的内容。
 - content: 本地推送需要显示的内容。
 - badge: 角标的数字。如果不需要改变角标传-1。数值类型或纯数字的字符型均可。
 - badge: 角标的数字。如果不需要改变角标传-1。数值类型或纯数字的字符型均可。
 - notificationID: 本地推送标识符,字符串。
 - notificationID: 本地推送标识符,字符串。
@@ -472,7 +388,7 @@ window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, conte
 #### 代码示例
 #### 代码示例
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.addLocalNotificationForIOS(24*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
+window.JPush.addLocalNotificationForIOS(24*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
 ```
 ```
 
 
 ### API - deleteLocalNotificationWithIdentifierKeyInIOS
 ### API - deleteLocalNotificationWithIdentifierKeyInIOS
@@ -482,7 +398,7 @@ window.plugins.jPushPlugin.addLocalNotificationForIOS(24*60*60, "本地推送内
 #### 接口定义
 #### 接口定义
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey)
+window.JPush.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey)
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
@@ -491,8 +407,8 @@ window.plugins.jPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInI
 
 
 #### 代码示例
 #### 代码示例
 
 
-```
-window.plugins.jPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS("identifier")
+```js
+window.JPush.deleteLocalNotificationWithIdentifierKeyInIOS("identifier")
 ```
 ```
 
 
 ### API - clearAllLocalNotifications
 ### API - clearAllLocalNotifications
@@ -501,17 +417,15 @@ window.plugins.jPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS("identi
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.clearAllLocalNotifications()
+```js
+window.JPush.clearAllLocalNotifications()
 ```
 ```
 
 
 #### 代码示例
 #### 代码示例
 
 
+```js
+window.JPush.clearAllLocalNotifications()
 ```
 ```
-window.plugins.jPushPlugin.clearAllLocalNotifications()
-```
-
-
 
 
 ## 获取本地通知内容
 ## 获取本地通知内容
 
 
@@ -519,17 +433,37 @@ window.plugins.jPushPlugin.clearAllLocalNotifications()
 
 
 监听 `jpush.receiveLocalNotification` 事件获取,「App 在后台时点击通知横幅」或「App 在前台时收到」均会触发该事件。
 监听 `jpush.receiveLocalNotification` 事件获取,「App 在后台时点击通知横幅」或「App 在前台时收到」均会触发该事件。
 
 
+#### 代码示例
 
 
+- 在你需要接收通知的的 js 文件中加入:
 
 
-### iOS 10 收到本地通知
+```js
+document.addEventListener("jpush.receiveLocalNotification", onLocalNotification, false)
+```
 
 
-监听 [jpush.receiveNotification](#前台收到推送)、[jpush.openNotification](点击推送通知),获取推送内容后,通过获取到的 `__JPUSHNotificationKey` 字段([本地通知](#本地通知) 设置的 `notificationID`)来判断是本地通知,并处理。
+- onLocalNotification 需要这样写:
+
+```js
+var onLocalNotification = function(event) {
+  alert("receive Local Notification:" + JSON.stringify(event))
+}
+```
 
 
+- event 举例
 
 
+```json
+{
+    badge = 1;
+    content = "Hello JPush";
+    extras =     {
+        "__JPUSHNotificationKey" = notificationIdentify_1;
+    };
+}
+```
 
 
-### 点击本地通知横幅启动 App
+### iOS 10 收到本地通知
 
 
-监听 `jpush.startLocalNotification` 事件。
+监听 [jpush.receiveNotification](#前台收到推送)、[jpush.openNotification](点击推送通知),获取推送内容后,通过获取到的 `__JPUSHNotificationKey` 字段([本地通知](#本地通知) 设置的 `notificationID`)来判断是本地通知,并处理
 
 
 
 
 
 
@@ -542,16 +476,16 @@ window.plugins.jPushPlugin.clearAllLocalNotifications()
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.startLogPageView(pageName)
-window.plugins.jPushPlugin.prototype.stopLogPageView(pageName)
-window.plugins.jPushPlugin.prototype.beginLogPageView(pageName, duration)
+```js
+window.JPush.startLogPageView(pageName)
+window.JPush.stopLogPageView(pageName)
+window.JPush.beginLogPageView(pageName, duration)
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
 
 
-- pageName: 需要统计页面自定义名称
-- duration: 自定义的页面时间
+- pageName: 需要统计页面自定义名称
+- duration: 自定义的页面时间
 
 
 #### 调用说明
 #### 调用说明
 
 
@@ -561,10 +495,10 @@ window.plugins.jPushPlugin.prototype.beginLogPageView(pageName, duration)
 
 
 #### 代码示例
 #### 代码示例
 
 
-```
-window.plugins.jPushPlugin.beginLogPageView("newPage", 5);
-window.plugins.jPushPlugin.startLogPageView("onePage");
-window.plugins.jPushPlugin.stopLogPageView("onePage");
+```js
+window.JPush.beginLogPageView("newPage", 5);
+window.JPush.startLogPageView("onePage");
+window.JPush.stopLogPageView("onePage");
 ```
 ```
 
 
 ## 日志等级设置
 ## 日志等级设置
@@ -573,18 +507,12 @@ window.plugins.jPushPlugin.stopLogPageView("onePage");
 
 
 用于开启 Debug 模式,显示更多的日志信息。
 用于开启 Debug 模式,显示更多的日志信息。
 
 
-建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 setLogOFF 是相反的一对。
+建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 `setLogOFF` 是相反的一对。
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.setDebugModeFromIos()
-```
-
-#### 代码示例
-
-```
-window.plugins.jPushPlugin.setDebugModeFromIos();
+```js
+window.JPush.setDebugModeFromIos();
 ```
 ```
 
 
 ### API - setLogOFF
 ### API - setLogOFF
@@ -595,14 +523,8 @@ window.plugins.jPushPlugin.setDebugModeFromIos();
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.setLogOFF()
-```
-
-#### 代码示例
-
-```
-window.plugins.jPushPlugin.setLogOFF();
+```js
+window.JPush.setLogOFF();
 ```
 ```
 
 
 ### API - setCrashLogON
 ### API - setCrashLogON
@@ -613,14 +535,8 @@ window.plugins.jPushPlugin.setLogOFF();
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.setCrashLogON()
-```
-
-#### 代码示例
-
-```
-window.plugins.jPushPlugin.setCrashLogON();
+```js
+window.JPush.setCrashLogON();
 ```
 ```
 
 
 ## 地理位置上报
 ## 地理位置上报
@@ -631,8 +547,8 @@ window.plugins.jPushPlugin.setCrashLogON();
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.setLocation(latitude, longitude)
+```js
+window.JPush.prototype.setLocation(latitude, longitude)
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
@@ -640,12 +556,6 @@ window.plugins.jPushPlugin.prototype.setLocation(latitude, longitude)
 - latitude: 地理位置纬度,数值类型或纯数字的字符型均可。
 - latitude: 地理位置纬度,数值类型或纯数字的字符型均可。
 - longitude: 地理位置精度,数值类型或纯数字的字符型均可。
 - longitude: 地理位置精度,数值类型或纯数字的字符型均可。
 
 
-#### 代码示例
-
-```
-window.plugins.jPushPlugin.setLocation(39.26,115.25);
-```
-
 ## 设备平台判断
 ## 设备平台判断
 
 
 ### API - isPlatformIOS
 ### API - isPlatformIOS
@@ -654,22 +564,20 @@ window.plugins.jPushPlugin.setLocation(39.26,115.25);
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.isPlatformIOS()
+```js
+window.JPush.isPlatformIOS()
 ```
 ```
 
 
 #### 代码示例
 #### 代码示例
 
 
 ```js
 ```js
-if(window.plugins.jPushPlugin.isPlatformIOS()) {
-	// iOS
+if(window.JPush.isPlatformIOS()) {
+  // iOS
 } else {
 } else {
-	// Android
+  // Android
 }
 }
 ```
 ```
 
 
-
-
 ## iOS 10 进阶推送特性
 ## iOS 10 进阶推送特性
 
 
 ### API - addDismissActions
 ### API - addDismissActions
@@ -686,8 +594,8 @@ if(window.plugins.jPushPlugin.isPlatformIOS()) {
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.addDismissActions(actions, categoryId);
+```js
+window.JPush.addDismissActions(actions, categoryId);
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
@@ -708,7 +616,9 @@ window.plugins.jPushPlugin.prototype.addDismissActions(actions, categoryId);
 #### 代码示例
 #### 代码示例
 
 
 ```js
 ```js
-window.plugins.jPushPlugin.addDismissActions([{"title":"t1", "identifier":"id1", "option":"0"}, {"title":"t2", "identifier":"id2", "option":"3", "type":"textInput", "textInputButtonTitle":"回复", "textInputPlaceholder":"点此输入回复内容"}], "categoryId_t1_t2");
+window.JPush.addDismissActions([
+  {"title":"t1", "identifier":"id1", "option":"0"},
+  {"title":"t2", "identifier":"id2", "option":"3", "type":"textInput", "textInputButtonTitle":"回复", "textInputPlaceholder":"点此输入回复内容"}], "categoryId_t1_t2");
 ```
 ```
 
 
 ### API - addNotificationActions
 ### API - addNotificationActions
@@ -725,8 +635,8 @@ iPhone 6s 及以后设备且 iOS 9 以后系统支持 3d-touch。
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId)
+```js
+window.JPush.addNotificationActions(actions, categoryId)
 ```
 ```
 
 
 #### 参数说明
 #### 参数说明
@@ -745,23 +655,23 @@ window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId)
 
 
 #### 配置方法
 #### 配置方法
 
 
-1. 首先配置好 iOS 项目的证书。如下图所示没有任何异常警告:
+1.首先配置好 iOS 项目的证书。如下图所示没有任何异常警告:
 
 
    ![](res/MediaAttachments_01.png)
    ![](res/MediaAttachments_01.png)
 
 
-2. 打开 iOS Xcode Project - File - New - Target - iOS - Notification Service Extension - Next - Product Name 填写 `jpushNotificationService` - Finish,如下图所示: ![](res/MediaAttachments_02.png)
+2.打开 iOS Xcode Project - File - New - Target - iOS - Notification Service Extension - Next - Product Name 填写 `jpushNotificationService` - Finish,如下图所示: ![](res/MediaAttachments_02.png)
 
 
    ![MediaAttachments_03](res/MediaAttachments_03.png)
    ![MediaAttachments_03](res/MediaAttachments_03.png)
 
 
    ![MediaAttachments_04](res/MediaAttachments_04.png)
    ![MediaAttachments_04](res/MediaAttachments_04.png)
 
 
-3. 在 Xcode 工程目录左侧系统自动创建了 jpushNotificationService 文件夹及三个文件,下载本插件目录 `jpush-phonegap-plugin/src/ios/notificationService/` 下的 `NotificationService.h`、`NotificationService.m` 文件,全部复制替换对应文件内代码。
+3.在 Xcode 工程目录左侧系统自动创建了 jpushNotificationService 文件夹及三个文件,下载本插件目录 `jpush-phonegap-plugin/src/ios/notificationService/` 下的 `NotificationService.h`、`NotificationService.m` 文件,全部复制替换对应文件内代码。
 
 
-4. 在 Xcode 中拖拽图片、gif、audio、video 等资源文件至 `jpushNotificationService` 文件夹目录下,弹出菜单选择如下: ![MediaAttachments_06](res/MediaAttachments_06.png)
+4.在 Xcode 中拖拽图片、gif、audio、video 等资源文件至 `jpushNotificationService` 文件夹目录下,弹出菜单选择如下: ![MediaAttachments_06](res/MediaAttachments_06.png)
 
 
-5. 在极光控制台 - 发送通知 - 可选设置 - mutable-content 打勾。
+5.在极光控制台 - 发送通知 - 可选设置 - mutable-content 打勾。
 
 
-6. 添加附加字段, key 为 `JPushPluginAttachment` ,value 为资源名称如 `aPic.png`,该资源必须在第 4 步中已经添加至工程,且文件名和拓展名完全对应。5、6 如下图所示:
+6.添加附加字段, key 为 `JPushPluginAttachment` ,value 为资源名称如 `aPic.png`,该资源必须在第 4 步中已经添加至工程,且文件名和拓展名完全对应。5、6 如下图所示:
 
 
     ![MediaAttachments_05](res/MediaAttachments_05.png)
     ![MediaAttachments_05](res/MediaAttachments_05.png)
 
 
@@ -769,15 +679,15 @@ window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId)
 
 
    ```json
    ```json
    {
    {
-   	aps:{
-   		alert:{...},
-   		mutable-content:1 //必须
-   	}
-   	JPushPluginAttachment:aPic.png //必须
+    aps:{
+      alert:{...},
+      mutable-content:1 //必须
+    }
+    JPushPluginAttachment:aPic.png //必须
    }
    }
    ```
    ```
 
 
-7. 立即发送。
+7.立即发送。
 
 
 ## 获取用户推送设置
 ## 获取用户推送设置
 
 
@@ -787,8 +697,8 @@ window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId)
 
 
 #### 接口定义
 #### 接口定义
 
 
-```
-window.plugins.jPushPlugin.prototype.getUserNotificationSettings(callback)
+```js
+window.JPush.getUserNotificationSettings(callback)
 ```
 ```
 
 
 #### 返回值
 #### 返回值
@@ -814,52 +724,30 @@ window.plugins.jPushPlugin.prototype.getUserNotificationSettings(callback)
     - UNAlertStyleAlert = 2
     - UNAlertStyleAlert = 2
 
 
-
-
 ## 监听事件统一说明
 ## 监听事件统一说明
 
 
 可在 js 监听全部事件如下:
 可在 js 监听全部事件如下:
 
 
-##### jpush.receiveNotification
-
-> [前台收到远程通知](#前台收到推送)
->
-> [iOS 10 前台收到本地通知](#ios-10-收到本地通知)
-
-
-
-##### jpush.openNotification
-
-> [点击远程通知横幅使 App「进入前台」或「启动」](#点击推送通知)
->
-> [iOS 10 点击本地通知横幅使 App「进入前台」或「启动」](#ios-10-收到本地通知)
-
-
-
-##### jpush.backgroundNotification
-
-> [iOS 7 以后后台收到远程通知](#后台收到推送)
-
-
-
-##### jpush.setTagsWithAlias
-
-> [设置标签别名回调](#返回值说明)
-
+### jpush.receiveNotification
 
 
+[前台收到远程通知](#前台收到推送)
 
 
-##### jpush.receiveMessage
+[iOS 10 前台收到本地通知](#ios-10-收到本地通知)
 
 
-> [获取自定义消息内容](#获取自定义消息内容)
+### jpush.openNotification
 
 
+[点击远程通知横幅使 App「进入前台」或「启动」](#点击推送通知)
 
 
+[iOS 10 点击本地通知横幅使 App「进入前台」或「启动」](#ios-10-收到本地通知)
 
 
-##### jpush.startLocalNotification
+### jpush.backgroundNotification
 
 
-> [点击本地通知横幅启动 App](#点击本地通知横幅启动-app)
+[iOS 7 以后后台收到远程通知](#后台收到推送)
 
 
+### jpush.receiveMessage
 
 
+[获取自定义消息内容](#获取自定义消息内容)
 
 
-##### jpush.receiveLocalNotification
+### jpush.receiveLocalNotification
 
 
-> [iOS 10 before 收到本地通知](#ios-10-before-收到本地通知)
+[iOS 10 before 收到本地通知](#ios-10-before-收到本地通知)

+ 0 - 41
miaomiao/plugins/jpush-phonegap-plugin/doc/iOS_install.md

@@ -1,41 +0,0 @@
-## iOS 手动安装
-
-> **不建议使用手动安装,请参照 README.md 进行自动安装。**
-
-
-
-1. 下载 JPush PhoneGap Plugin 插件,并解压
-2. 将 [/src/ios](/src/ios) 文件夹及内容在 xcode 中拖到你的工程里,并配置 [/src/ios/PushConfig.plist](/src/ios/PushConfig.plist) 中相应参数:
-
-   Appkey:      应用标识 
-   Channel:     渠道标识
-   IsProduction:是否生产环境
-   IsIDFA:      是否使用 IDFA 启动 sdk
-3. 打开 xcode,点击工程目录中顶部的 工程,选择(Target -> Build Phases -> Link Binary With Libraries),添加以下框架:
-
-   CFNetwork.framework
-   CoreFoundation.framework
-   CoreTelephony.framework
-   SystemConfiguration.framework
-   CoreGraphics.framework
-   Foundation.framework
-   UIKit.framework
-   AdSupport.framework
-   libz.tbd(若存在 libz.dylib 则替换为 libz.tbd)
-   UserNotifications.framework
-   libresolv.tbd
-4. 修改 phonegap config.xml 文件以添加 JPushPlugin 插件
-
-```xml
-<feature name="JPushPlugin">
-    <param name="ios-package" value="JPushPlugin" />
-    <param name="onload" value="true" />
-</feature>
-```
-5. 将 [/www/JPushPlugin.js](/www/JPushPlugin.js) 在 xcode 中拖到工程的 www 目录下面  
-6. 在需要使用插件处加入以下代码,并根据 [iOS API](/doc/iOS_API.md) 文档说明调用相应接口
-
-```xml
-<script type="text/javascript" src="JPushPlugin.js"></script>
-```
-

+ 233 - 168
miaomiao/plugins/jpush-phonegap-plugin/example/index.html

@@ -1,201 +1,266 @@
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html>
 <html>
-
-<head>
+  
+  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-    <title>JPush Phonegap Simple Demo</title>
-    <link href="css/jquery.mobile-1.1.1.css" rel="stylesheet" type="text/css" />
-    <script type="text/javascript" src="js/jquery.js"></script>
-    <script type="text/javascript" src="js/jquery.mobile-1.1.1.js"></script>
-    <script type="text/javascript" src="cordova.js"></script>
-    <script type="text/javascript">
+      <title>JPush Phonegap Simple Demo</title>
+      <link href="css/jquery.mobile-1.1.1.css" rel="stylesheet" type="text/css" />
+      <script type="text/javascript" src="js/jquery.js"></script>
+      <script type="text/javascript" src="js/jquery.mobile-1.1.1.js"></script>
+      <script type="text/javascript" src="cordova.js"></script>
+      <script type="text/javascript">
+
         var onDeviceReady = function() {
         var onDeviceReady = function() {
-            console.log("JPushPlugin:Device ready!");
-            initiateUI();
-        };
+          document.addEventListener("jpush.receiveRegistrationId", function (event) {
+                alert("receiveRegistrationId" + JSON.stringify(event));
+                $("#registrationId").html(event.registrationId);
+            }, false)
 
 
+          initiateUI();
+        };
+      
         var getRegistrationID = function() {
         var getRegistrationID = function() {
-            window.plugins.jPushPlugin.getRegistrationID(onGetRegistrationID);
+          window.JPush.getRegistrationID(onGetRegistrationID);
         };
         };
-
+      
         var onGetRegistrationID = function(data) {
         var onGetRegistrationID = function(data) {
-            try {
-                console.log("JPushPlugin:registrationID is " + data);
-
-                if (data.length == 0) {
-                    var t1 = window.setTimeout(getRegistrationID, 1000);
-                }
-                $("#registrationId").html(data);
-            } catch (exception) {
-                console.log(exception);
+          try {
+            console.log("JPushPlugin:registrationID is " + data);
+            
+            if (data.length == 0) {
+              var t1 = window.setTimeout(getRegistrationID, 1000);
             }
             }
-        };
 
 
+            $("#registrationId").html(data);
+          } catch (exception) {
+            console.log(exception);
+          }
+        };
+      
         var onTagsWithAlias = function(event) {
         var onTagsWithAlias = function(event) {
-            try {
-                console.log("onTagsWithAlias");
-                var result = "result code:" + event.resultCode + " ";
-                result += "tags:" + event.tags + " ";
-                result += "alias:" + event.alias + " ";
-                $("#tagAliasResult").html(result);
-            } catch (exception) {
-                console.log(exception)
-            }
+          try {
+            console.log("onTagsWithAlias");
+            var result = "result code:" + event.resultCode + " ";
+            result += "tags:" + event.tags + " ";
+            result += "alias:" + event.alias + " ";
+            $("#tagAliasResult").html(result);
+          } catch (exception) {
+            console.log(exception)
+          }
         };
         };
-
+      
         var onOpenNotification = function(event) {
         var onOpenNotification = function(event) {
-            try {
-                var alertContent;
-                if (device.platform == "Android") {
-                    alertContent = event.alert;
-                } else {
-                    alertContent = event.aps.alert;
-                }
-                alert("open Notification:" + alertContent);
-            } catch (exception) {
-                console.log("JPushPlugin:onOpenNotification" + exception);
+          try {
+            var alertContent;
+            if (device.platform == "Android") {
+              alertContent = event.alert;
+            } else {
+              alertContent = event.aps.alert;
             }
             }
+            alert("open Notification:" + alertContent);
+          } catch (exception) {
+            console.log("JPushPlugin:onOpenNotification" + exception);
+          }
         };
         };
-
+        
         var onReceiveNotification = function(event) {
         var onReceiveNotification = function(event) {
-            try {
-                var alertContent;
-                if (device.platform == "Android") {
-                    alertContent = event.alert;
-                } else {
-                    alertContent = event.aps.alert;
-                }
-                $("#notificationResult").html(alertContent);
-            } catch (exception) {
-                console.log(exception)
+          try {
+            var alertContent;
+            if (device.platform == "Android") {
+              alertContent = event.alert;
+            } else {
+              alertContent = event.aps.alert;
             }
             }
+            $("#notificationResult").html(alertContent);
+          } catch (exception) {
+            console.log(exception)
+          }
         };
         };
-
+      
         var onReceiveMessage = function(event) {
         var onReceiveMessage = function(event) {
-            try {
-                var message;
-                if (device.platform == "Android") {
-                    message = event.message;
-                } else {
-                    message = event.content;
-                }
-                $("#messageResult").html(message);
-            } catch (exception) {
-                console.log("JPushPlugin:onReceiveMessage-->" + exception);
+          try {
+            var message;
+            if (device.platform == "Android") {
+              message = event.message;
+            } else {
+              message = event.content;
             }
             }
+            $("#messageResult").html(message);
+          } catch (exception) {
+            console.log("JPushPlugin:onReceiveMessage-->" + exception);
+          }
         };
         };
-
+      
         var initiateUI = function() {
         var initiateUI = function() {
+          try {
+            window.JPush.init();
+            window.JPush.setDebugMode(true);
+            window.setTimeout(getRegistrationID, 1000);
+
+            if (device.platform != "Android") {
+              window.JPush.setApplicationIconBadgeNumber(0);
+            }
+          } catch (exception) {
+            console.log(exception);
+          }
+
+          $("#setTags").click(function(ev) {
             try {
             try {
-                window.plugins.jPushPlugin.init();
-                window.setTimeout(getRegistrationID, 1000);
-                if (device.platform != "Android") {
-                    window.plugins.jPushPlugin.setDebugModeFromIos();
-                    window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0);
-                } else {
-                    window.plugins.jPushPlugin.setDebugMode(true);
-                    window.plugins.jPushPlugin.setStatisticsOpen(true);
-                }
+              var tag1 = $("#tagText1").val()
+              var tag2 = $("#tagText2").val()
+              var tag3 = $("#tagText3").val()
+              var tags = []
+                                            
+              if (tag1) {
+                tags.push(tag1)
+              }
+              if (tag2) {
+                tags.push(tag2)
+              }
+              if (tag3) {
+                tags.push(tag3)
+              }
+
+              window.JPush.setTags({ sequence: 1, tags: tags },
+                function (result) {
+                  $("#tagsResult").html(result.tags)
+                }, function (error) {
+                  alert(error.code)
+                })
             } catch (exception) {
             } catch (exception) {
-                console.log(exception);
+              console.log(exception)
             }
             }
-            $("#setTagWithAliasButton").click(function(ev) {
-                try {
-                    var tag1 = $("#tagText1").attr("value");
-                    var tag2 = $("#tagText2").attr("value");
-                    var tag3 = $("#tagText3").attr("value");
-                    var alias = $("#aliasText").attr("value");
-                    var tags = [];
+          })
 
 
-                    if (tag1 != "") {
-                        tags.push(tag1);
-                    }
-                    if (tag2 != "") {
-                        tags.push(tag2);
-                    }
-                    if (tag3 != "") {
-                        tags.push(tag3);
-                    }
-                    window.plugins.jPushPlugin.setTagsWithAlias(tags, alias, function () {
-                      // Success callback
-                      console.log(tags + ' - ' + alias)
-                    });
-                } catch (exception) {
-                    console.log(exception);
-                }
-            })
-        };
+          $("#getAllTags").click(function (event) {
+            window.JPush.getAllTags({ sequence: 2 },
+              function (result) {
+                $("#tagsResult").html(result.tags)
+              }, function (error) {
+                alert(error.code)
+              })
+          })
+
+          $("#cleanTags").click(function (event) {
+            window.JPush.cleanTags({ sequence: 2 },
+              function (result) {
+                alert(result.sequence)
+                $("#tagsResult").html("")
+              }, function (error) {
+                alert(error.code)
+              })
+          })
+
+          $("#setAlias").click(function (event) {
+            var alias = $("#aliasText").val()
+            window.JPush.setAlias({ sequence: 1, alias: alias },
+              function (result) {
+                $("#aliasResult").html(result.alias)
+              }, function (error){
+                alert(error.code)
+              })
+          })
 
 
-        document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false);
+          $("#getAlias").click(function (event) {
+            window.JPush.getAlias({ sequence: 2 },
+              function (result) {
+                alert(JSON.stringify(result));
+              }, function (error) {
+                alert(error.code)
+              })
+          });
+
+          $("#deleteAlias").click(function (event) {
+            window.JPush.deleteAlias({ sequence: 3 },
+              function (result) {
+                alert(JSON.stringify(result));
+              }, function (error) {
+                alert(error.code)
+              })
+          });
+        };
+      
         document.addEventListener("deviceready", onDeviceReady, false);
         document.addEventListener("deviceready", onDeviceReady, false);
         document.addEventListener("jpush.openNotification", onOpenNotification, false);
         document.addEventListener("jpush.openNotification", onOpenNotification, false);
         document.addEventListener("jpush.receiveNotification", onReceiveNotification, false);
         document.addEventListener("jpush.receiveNotification", onReceiveNotification, false);
         document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
         document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
-    </script>
-</head>
-
-<body>
+      </script>
+  </head>
+  
+  <body>
     <div data-role="page" id="page">
     <div data-role="page" id="page">
-        <div data-role="content">
-            <form>
-                <div class="ui-body ui-body-b">
-                    <div data-role="fieldcontain">
-                        <center>
-                            <h3>JPushPlugin Example</h3>
-                        </center>
-                        <span name="alias" id="alias"></span>
-                        <hr/>
-                        <label>RegistrationID: </label>
-                        <label id="registrationId">null</label>
-                    </div>
-                    <div data-role="fieldcontain">
-                        <label>Tags: </label>
-                        <table>
-                            <tr>
-                                <td>
-                                    <input type="text" id="tagText1" />
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <input type="text" id="tagText2" />
-                                </td>
-                            </tr>
-                            <tr>
-                                <td>
-                                    <input type="text" id="tagText3" />
-                                </td>
-                            </tr>
-                        </table>
-                        <label>Alias: </label>
-                        <table>
-                            <tr>
-                                <td>
-                                    <input type="text" id="aliasText" />
-                                </td>
-                            </tr>
-                        </table>
-                    </div>
-                    <div data-role="fieldcontain">
-                        <input type="button" id="setTagWithAliasButton"
-                            value="Add tag and alias" />
-                    </div>
-                    <div data-role="fieldcontain">
-                        <label id="tagAliasPrompt">设置tag/alias结果:</label>
-                        <label id="tagAliasResult">null</label>
-                    </div>
-                    <div data-role="fieldcontain">
-                        <label id="notificationPrompt">接受的通知内容:</label>
-                        <label id="notificationResult">null</label>
-                    </div>
-                    <div data-role="fieldcontain">
-                        <label id="messagePrompt">接受的自定义消息:</label>
-                        <label id="messageResult">null</label>
-                    </div>
-                </div>
-            </form>
-        </div>
-    </div>
-</body>
+      <div data-role="content">
+        <form>
+          <div class="ui-body ui-body-b">
+            <div data-role="fieldcontain">
+              <center>
+                <h3>JPushPlugin Example</h3>
+              </center>
+              <span name="alias" id="alias"></span>
+              <hr/>
+              <label>RegistrationID: </label>
+              <label id="registrationId">null</label>
+            </div>
+            <div data-role="fieldcontain">
+              <label>Tags: </label>
+              <table>
+                <tr>
+                  <td>
+                    <input type="text" id="tagText1" />
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <input type="text" id="tagText2" />
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <input type="text" id="tagText3" />
+                  </td>
+                </tr>
+              </table>
+              <label>Alias: </label>
+              <table>
+                <tr>
+                  <td>
+                    <input type="text" id="aliasText" />
+                  </td>
+                </tr>
+              </table>
+            </div>
 
 
-</html>
+            <div data-role="fieldcontain">
+              <input type="button" id="setTags" value="Set tags" />
+              <input type="button" id="getAllTags" value="Get all tags" />
+              <input type="button" id="cleanTags" value="Clean tags" />
+            </div>
+              
+            <div data-role="fieldcontain">
+              <input type="button" id="setAlias" value="Set alias" />
+              <input type="button" id="getAlias" value="Get alias" />
+              <input type="button" id="deleteAlias" value="Delete alias" />
+            </div>
+
+            <div data-role="fieldcontain">
+              <label id="tagsPrompt">设置 Tag 的结果:</label>
+              <label id="tagsResult">null</label>
+            </div>
+            <div data-role="fieldcontain">
+              <label id="aliasPrompt">设置 Alias 的结果:</label>
+              <label id="aliasResult">null</label>
+            </div>
+            <div data-role="fieldcontain">
+              <label id="notificationPrompt">接受的通知内容:</label>
+              <label id="notificationResult">null</label>
+            </div>
+            <div data-role="fieldcontain">
+              <label id="messagePrompt">接受的自定义消息:</label>
+              <label id="messageResult">null</label>
+            </div>
+          </div>
+        </form>
+      </div>
+    </div>
+  </body>
+</html>

+ 25 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/app/app.component.ts

@@ -0,0 +1,25 @@
+import { Component } from '@angular/core';
+import { Platform } from 'ionic-angular';
+import { StatusBar } from '@ionic-native/status-bar';
+import { SplashScreen } from '@ionic-native/splash-screen';
+import { JPush } from '@jiguang-ionic/jpush';
+
+import { HomePage } from '../pages/home/home';
+@Component({
+  templateUrl: 'app.html'
+})
+export class MyApp {
+  rootPage:any = HomePage;
+
+  constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen, jpush: JPush) {
+    platform.ready().then(() => {
+      // Okay, so the platform is ready and our plugins are available.
+      // Here you can do any higher level native things you might need.
+      statusBar.styleDefault();
+      splashScreen.hide();
+
+      jpush.init();
+      jpush.setDebugMode(true);
+    });
+  }
+}

+ 1 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/app/app.html

@@ -0,0 +1 @@
+<ion-nav [root]="rootPage"></ion-nav>

+ 34 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/app/app.module.ts

@@ -0,0 +1,34 @@
+import { BrowserModule } from '@angular/platform-browser';
+import { ErrorHandler, NgModule } from '@angular/core';
+import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
+import { SplashScreen } from '@ionic-native/splash-screen';
+import { StatusBar } from '@ionic-native/status-bar';
+import { Device } from '@ionic-native/device';
+import { JPush } from '@jiguang-ionic/jpush';
+
+import { MyApp } from './app.component';
+import { HomePage } from '../pages/home/home';
+
+@NgModule({
+  declarations: [
+    MyApp,
+    HomePage
+  ],
+  imports: [
+    BrowserModule,
+    IonicModule.forRoot(MyApp)
+  ],
+  bootstrap: [IonicApp],
+  entryComponents: [
+    MyApp,
+    HomePage
+  ],
+  providers: [
+    StatusBar,
+    SplashScreen,
+    Device,
+    JPush,
+    {provide: ErrorHandler, useClass: IonicErrorHandler}
+  ]
+})
+export class AppModule {}

+ 36 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/pages/home/home.html

@@ -0,0 +1,36 @@
+<ion-header>
+  <ion-navbar>
+    <ion-title>
+      JPush Ionic Example
+    </ion-title>
+  </ion-navbar>
+</ion-header>
+
+<ion-content padding>
+
+  <ion-list>
+    <ion-item>
+      <div>Registration Id: {{registrationId}}</div>
+      <button ion-button full (click)="getRegistrationID()">Get Registration Id</button>
+    </ion-item>
+
+    <ion-item>
+      <button ion-button full (click)="setTags()">Set tags - Tag1, Tag2</button>
+      <button ion-button full (click)="addTags()">Add tags - Tag3, Tag4</button>
+      <button ion-button full (click)="checkTagBindState()">Check tag bind state - Tag1</button>
+      <button ion-button full (click)="deleteTags()">Delete tags - Tag4</button>
+      <button ion-button full (click)="getAllTags()">Get all tags</button>
+      <button ion-button full (click)="cleanTags()">Clean tags</button>
+    </ion-item>
+
+    <ion-item>
+      <button ion-button full (click)="setAlias()">Set Alias - TestAlias</button>
+      <button ion-button full (click)="getAlias()">Get Alias</button>
+      <button ion-button full (click)="deleteAlias()">Delete Alias</button>
+    </ion-item>
+
+    <ion-item>
+      <button ion-button full (click)="addLocalNotification()">Trigger local notification after 5 seconds</button>
+    </ion-item>
+  </ion-list>
+</ion-content>

+ 3 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/pages/home/home.scss

@@ -0,0 +1,3 @@
+page-home {
+
+}

+ 146 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/example/src/pages/home/home.ts

@@ -0,0 +1,146 @@
+import { Component } from '@angular/core';
+import { NavController } from 'ionic-angular';
+import { JPush } from '@jiguang-ionic/jpush';
+import { Device } from '@ionic-native/device';
+
+@Component({
+  selector: 'page-home',
+  templateUrl: 'home.html'
+})
+export class HomePage {
+
+  public registrationId: string;
+
+  devicePlatform: string;
+  sequence: number = 0;
+
+  tagResultHandler = function(result) {
+    var sequence: number = result.sequence;
+    var tags: Array<string> = result.tags == null ? [] : result.tags;
+    alert('Success!' + '\nSequence: ' + sequence + '\nTags: ' + tags.toString());
+  };
+
+  aliasResultHandler = function(result) {
+    var sequence: number = result.sequence;
+    var alias: string = result.alias;
+    alert('Success!' + '\nSequence: ' + sequence + '\nAlias: ' + alias);
+  };
+
+  errorHandler = function(err) {
+    var sequence: number = err.sequence;
+    var code = err.code;
+    alert('Error!' + '\nSequence: ' + sequence + '\nCode: ' + code);
+  };
+
+  constructor(public navCtrl: NavController, public jpush: JPush, device: Device) {
+
+    this.devicePlatform = device.platform;
+
+    document.addEventListener('jpush.receiveNotification', (event: any) => {
+      var content;
+      if (this.devicePlatform == 'Android') {
+        content = event.alert;
+      } else { 
+        content = event.aps.alert;
+      }
+      alert('Receive notification: ' + JSON.stringify(event));
+    }, false);
+
+    document.addEventListener('jpush.openNotification', (event: any) => {
+      var content;
+      if (this.devicePlatform == 'Android') {
+        content = event.alert;
+      } else {  // iOS
+        if (event.aps == undefined) { // 本地通知
+          content = event.content;
+        } else {  // APNS
+          content = event.aps.alert;
+        }
+      } 
+      alert('open notification: ' + JSON.stringify(event));
+    }, false);
+
+    document.addEventListener('jpush.receiveLocalNotification', (event: any) => {
+      // iOS(*,9) Only , iOS(10,*) 将在 jpush.openNotification 和 jpush.receiveNotification 中触发。
+      var content;
+      if (this.devicePlatform == 'Android') {
+      } else {
+        content = event.content;
+      } 
+      alert('receive local notification: ' + JSON.stringify(event));
+    }, false);
+  }
+
+  getRegistrationID() {
+    this.jpush.getRegistrationID()
+      .then(rId => {
+        this.registrationId = rId;
+      });
+  }
+
+  setTags() {
+    this.jpush.setTags({ sequence: this.sequence++, tags: ['Tag1', 'Tag2']})
+      .then(this.tagResultHandler)
+      .catch(this.errorHandler);
+  }
+
+  addTags() {
+    this.jpush.addTags({ sequence: this.sequence++, tags: ['Tag3', 'Tag4']})
+      .then(this.tagResultHandler)
+      .catch(this.errorHandler);
+  }
+
+  checkTagBindState() {
+    this.jpush.checkTagBindState({ sequence: this.sequence++, tag: 'Tag1' })
+      .then(result => {
+        var sequence = result.sequence;
+        var tag = result.tag;
+        var isBind = result.isBind;
+        alert('Sequence: ' + sequence + '\nTag: ' + tag + '\nIsBind: ' + isBind);
+      }).catch(this.errorHandler);
+  }
+
+  deleteTags() {
+    this.jpush.deleteTags({ sequence: this.sequence++, tags: ['Tag4']})
+      .then(this.tagResultHandler)
+      .catch(this.errorHandler);
+  }
+
+  getAllTags() {
+    this.jpush.getAllTags({ sequence: this.sequence++ })
+      .then(this.tagResultHandler)
+      .catch(this.errorHandler);
+  }
+
+  cleanTags() {
+    this.jpush.cleanTags({ sequence: this.sequence++ })
+      .then(this.tagResultHandler)
+      .catch(this.errorHandler);
+  }
+
+  setAlias() {
+    this.jpush.setAlias({ sequence: this.sequence++, alias: 'TestAlias' })
+      .then(this.aliasResultHandler)
+      .catch(this.errorHandler);
+  }
+
+  getAlias() {
+    this.jpush.getAlias({ sequence: this.sequence++ })
+      .then(this.aliasResultHandler)
+      .catch(this.errorHandler);
+  }
+
+  deleteAlias() {
+    this.jpush.deleteAlias({ sequence: this.sequence++ })
+      .then(this.aliasResultHandler)
+      .catch(this.errorHandler);
+  }
+
+  addLocalNotification() {
+    if (this.devicePlatform == 'Android') {
+      this.jpush.addLocalNotification(0, 'Hello JPush', 'JPush', 1, 5000);
+    } else {
+      this.jpush.addLocalNotificationForIOS(5, 'Hello JPush', 1, 'localNoti1');
+    }
+  }
+}

+ 171 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/index.ts

@@ -0,0 +1,171 @@
+import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core';
+import { Injectable } from '@angular/core';
+
+export interface TagOptions {
+  sequence: number;
+  tags?: Array<string>;
+}
+
+export interface AliasOptions {
+  sequence: number;
+  alias?: string;
+}
+
+@Plugin({
+  pluginName: 'JPush',
+  plugin: 'jpush-phonegap-plugin',
+  pluginRef: 'plugins.jPushPlugin',
+  repo: 'https://github.com/jpush/jpush-phonegap-plugin',
+  install: 'ionic cordova plugin add jpush-phonegap-plugin --variable APP_KEY=your_app_key',
+  installVariables: ['APP_KEY'],
+  platforms: ['Android', 'iOS']
+})
+@Injectable()
+export class JPush extends IonicNativePlugin {
+
+  @Cordova()
+  init(): Promise<any> { return; }
+
+  @Cordova()
+  setDebugMode(enable: boolean): Promise<any> { return; }
+
+  @Cordova()
+  getRegistrationID(): Promise<any> { return; }
+
+  @Cordova()
+  stopPush(): Promise<any> { return; }
+
+  @Cordova()
+  resumePush(): Promise<any> { return; }
+
+  @Cordova()
+  isPushStopped(): Promise<any> { return; }
+
+  @Cordova()
+  setTags(params: TagOptions): Promise<any> { return; }
+
+  @Cordova()
+  addTags(params: TagOptions): Promise<any> { return; }
+
+  @Cordova()
+  deleteTags(params: TagOptions): Promise<any> { return; }
+
+  @Cordova()
+  cleanTags(params: TagOptions): Promise<any> { return; }
+
+  @Cordova()
+  getAllTags(params: TagOptions): Promise<any> { return; }
+
+  /**
+   * @param params { sequence: number, tag: string }
+   */
+  @Cordova()
+  checkTagBindState(params: object): Promise<any> { return; }
+
+  @Cordova()
+  setAlias(params: AliasOptions): Promise<any> { return; }
+
+  @Cordova()
+  deleteAlias(params: AliasOptions): Promise<any> { return; }
+
+  @Cordova()
+  getAlias(params: AliasOptions): Promise<any> { return; }
+
+  /**
+   * Determinate whether the application notification has been opened.
+   * 
+   * iOS: 0: closed; >1: opened.
+   *  UIRemoteNotificationTypeNone = 0,
+   *  UIRemoteNotificationTypeBadge = 1 << 0,
+   *  UIRemoteNotificationTypeSound = 1 << 1,
+   *  UIRemoteNotificationTypeAlert = 1 << 2,
+   *  UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3
+   * 
+   * Android: 0: closed; 1: opened.
+   */
+  @Cordova()
+  getUserNotificationSettings(): Promise<any> { return; }
+
+  @Cordova()
+  clearLocalNotifications(): Promise<any> { return; }
+
+  // iOS API - start
+
+  @Cordova()
+  setBadge(badge: number): Promise<any> { return; }
+
+  @Cordova()
+  resetBadge(): Promise<any> { return; }
+
+  @Cordova()
+  setApplicationIconBadgeNumber(badge: number): Promise<any> { return; }
+
+  @Cordova()
+  getApplicationIconBadgeNumber(): Promise<any> { return; }
+
+  @Cordova()
+  addLocalNotificationForIOS(delayTime: number, content: string, badge: number, identifierKey: string, extras?: object): Promise<any> { return; }
+
+  @Cordova()
+  deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey: string): Promise<any> { return; }
+
+  @Cordova()
+  addDismissActions(actions: Array<object>, categoryId: string): Promise<any> { return; }
+
+  @Cordova()
+  addNotificationActions(actions: Array<object>, categoryId: string): Promise<any> { return; }
+
+  @Cordova()
+  setLocation(latitude: number, longitude: number): Promise<any> { return; }
+
+  @Cordova()
+  startLogPageView(pageName: string): Promise<any> { return; }
+
+  @Cordova()
+  stopLogPageView(pageName: string): Promise<any> { return; }
+
+  @Cordova()
+  beginLogPageView(pageName: string, duration: number): Promise<any> { return; }
+
+  // iOS API - end
+
+  // Android API - start
+
+  @Cordova()
+  getConnectionState(): Promise<any> { return; }
+
+  @Cordova()
+  setBasicPushNotificationBuilder(): Promise<any> { return; }
+
+  @Cordova()
+  setCustomPushNotificationBuilder(): Promise<any> { return; }
+
+  @Cordova()
+  clearAllNotification(): Promise<any> { return; }
+
+  @Cordova()
+  clearNotificationById(id: number): Promise<any> { return; }
+
+  @Cordova()
+  setLatestNotificationNum(num: number): Promise<any> { return; }
+
+  @Cordova()
+  addLocalNotification(builderId: number, content: string, title: string, notificationId: number, broadcastTime: number, extras?: string): Promise<any> { return; }
+
+  @Cordova()
+  removeLocalNotification(notificationId: number): Promise<any> { return; }
+
+  @Cordova()
+  reportNotificationOpened(msgId: number): Promise<any> { return; }
+
+  @Cordova()
+  requestPermission(): Promise<any> { return; }
+
+  @Cordova()
+  setSilenceTime(startHour: number, startMinute: number, endHour: number, endMinute: number): Promise<any> { return; }
+
+  @Cordova()
+  setPushTime(weekdays: Array<string>, startHour: number, endHour: number): Promise<any> { return; }
+
+  // Android API - end
+}

+ 67 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.d.ts

@@ -0,0 +1,67 @@
+import { IonicNativePlugin } from '@ionic-native/core';
+export interface TagOptions {
+    sequence: number;
+    tags?: Array<string>;
+}
+export interface AliasOptions {
+    sequence: number;
+    alias?: string;
+}
+export declare class JPush extends IonicNativePlugin {
+    init(): Promise<any>;
+    setDebugMode(enable: boolean): Promise<any>;
+    getRegistrationID(): Promise<any>;
+    stopPush(): Promise<any>;
+    resumePush(): Promise<any>;
+    isPushStopped(): Promise<any>;
+    setTags(params: TagOptions): Promise<any>;
+    addTags(params: TagOptions): Promise<any>;
+    deleteTags(params: TagOptions): Promise<any>;
+    cleanTags(params: TagOptions): Promise<any>;
+    getAllTags(params: TagOptions): Promise<any>;
+    /**
+     * @param params { sequence: number, tag: string }
+     */
+    checkTagBindState(params: object): Promise<any>;
+    setAlias(params: AliasOptions): Promise<any>;
+    deleteAlias(params: AliasOptions): Promise<any>;
+    getAlias(params: AliasOptions): Promise<any>;
+    /**
+     * Determinate whether the application notification has been opened.
+     *
+     * iOS: 0: closed; >1: opened.
+     *  UIRemoteNotificationTypeNone = 0,
+     *  UIRemoteNotificationTypeBadge = 1 << 0,
+     *  UIRemoteNotificationTypeSound = 1 << 1,
+     *  UIRemoteNotificationTypeAlert = 1 << 2,
+     *  UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3
+     *
+     * Android: 0: closed; 1: opened.
+     */
+    getUserNotificationSettings(): Promise<any>;
+    clearLocalNotifications(): Promise<any>;
+    setBadge(badge: number): Promise<any>;
+    resetBadge(): Promise<any>;
+    setApplicationIconBadgeNumber(badge: number): Promise<any>;
+    getApplicationIconBadgeNumber(): Promise<any>;
+    addLocalNotificationForIOS(delayTime: number, content: string, badge: number, identifierKey: string, extras?: object): Promise<any>;
+    deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey: string): Promise<any>;
+    addDismissActions(actions: Array<object>, categoryId: string): Promise<any>;
+    addNotificationActions(actions: Array<object>, categoryId: string): Promise<any>;
+    setLocation(latitude: number, longitude: number): Promise<any>;
+    startLogPageView(pageName: string): Promise<any>;
+    stopLogPageView(pageName: string): Promise<any>;
+    beginLogPageView(pageName: string, duration: number): Promise<any>;
+    getConnectionState(): Promise<any>;
+    setBasicPushNotificationBuilder(): Promise<any>;
+    setCustomPushNotificationBuilder(): Promise<any>;
+    clearAllNotification(): Promise<any>;
+    clearNotificationById(id: number): Promise<any>;
+    setLatestNotificationNum(num: number): Promise<any>;
+    addLocalNotification(builderId: number, content: string, title: string, notificationId: number, broadcastTime: number, extras?: string): Promise<any>;
+    removeLocalNotification(notificationId: number): Promise<any>;
+    reportNotificationOpened(msgId: number): Promise<any>;
+    requestPermission(): Promise<any>;
+    setSilenceTime(startHour: number, startMinute: number, endHour: number, endMinute: number): Promise<any>;
+    setPushTime(weekdays: Array<string>, startHour: number, endHour: number): Promise<any>;
+}

+ 352 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.js

@@ -0,0 +1,352 @@
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = Object.setPrototypeOf ||
+        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (this && this.__metadata) || function (k, v) {
+    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core';
+import { Injectable } from '@angular/core';
+var JPush = (function (_super) {
+    __extends(JPush, _super);
+    function JPush() {
+        return _super !== null && _super.apply(this, arguments) || this;
+    }
+    JPush.prototype.init = function () { return; };
+    JPush.prototype.setDebugMode = function (enable) { return; };
+    JPush.prototype.getRegistrationID = function () { return; };
+    JPush.prototype.stopPush = function () { return; };
+    JPush.prototype.resumePush = function () { return; };
+    JPush.prototype.isPushStopped = function () { return; };
+    JPush.prototype.setTags = function (params) { return; };
+    JPush.prototype.addTags = function (params) { return; };
+    JPush.prototype.deleteTags = function (params) { return; };
+    JPush.prototype.cleanTags = function (params) { return; };
+    JPush.prototype.getAllTags = function (params) { return; };
+    /**
+     * @param params { sequence: number, tag: string }
+     */
+    JPush.prototype.checkTagBindState = function (params) { return; };
+    JPush.prototype.setAlias = function (params) { return; };
+    JPush.prototype.deleteAlias = function (params) { return; };
+    JPush.prototype.getAlias = function (params) { return; };
+    /**
+     * Determinate whether the application notification has been opened.
+     *
+     * iOS: 0: closed; >1: opened.
+     *  UIRemoteNotificationTypeNone = 0,
+     *  UIRemoteNotificationTypeBadge = 1 << 0,
+     *  UIRemoteNotificationTypeSound = 1 << 1,
+     *  UIRemoteNotificationTypeAlert = 1 << 2,
+     *  UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3
+     *
+     * Android: 0: closed; 1: opened.
+     */
+    JPush.prototype.getUserNotificationSettings = function () { return; };
+    JPush.prototype.clearLocalNotifications = function () { return; };
+    // iOS API - start
+    JPush.prototype.setBadge = function (badge) { return; };
+    JPush.prototype.resetBadge = function () { return; };
+    JPush.prototype.setApplicationIconBadgeNumber = function (badge) { return; };
+    JPush.prototype.getApplicationIconBadgeNumber = function () { return; };
+    JPush.prototype.addLocalNotificationForIOS = function (delayTime, content, badge, identifierKey, extras) { return; };
+    JPush.prototype.deleteLocalNotificationWithIdentifierKeyInIOS = function (identifierKey) { return; };
+    JPush.prototype.addDismissActions = function (actions, categoryId) { return; };
+    JPush.prototype.addNotificationActions = function (actions, categoryId) { return; };
+    JPush.prototype.setLocation = function (latitude, longitude) { return; };
+    JPush.prototype.startLogPageView = function (pageName) { return; };
+    JPush.prototype.stopLogPageView = function (pageName) { return; };
+    JPush.prototype.beginLogPageView = function (pageName, duration) { return; };
+    // iOS API - end
+    // Android API - start
+    JPush.prototype.getConnectionState = function () { return; };
+    JPush.prototype.setBasicPushNotificationBuilder = function () { return; };
+    JPush.prototype.setCustomPushNotificationBuilder = function () { return; };
+    JPush.prototype.clearAllNotification = function () { return; };
+    JPush.prototype.clearNotificationById = function (id) { return; };
+    JPush.prototype.setLatestNotificationNum = function (num) { return; };
+    JPush.prototype.addLocalNotification = function (builderId, content, title, notificationId, broadcastTime, extras) { return; };
+    JPush.prototype.removeLocalNotification = function (notificationId) { return; };
+    JPush.prototype.reportNotificationOpened = function (msgId) { return; };
+    JPush.prototype.requestPermission = function () { return; };
+    JPush.prototype.setSilenceTime = function (startHour, startMinute, endHour, endMinute) { return; };
+    JPush.prototype.setPushTime = function (weekdays, startHour, endHour) { return; };
+    // Android API - end
+    JPush.decorators = [
+        { type: Injectable },
+    ];
+    /** @nocollapse */
+    JPush.ctorParameters = function () { return []; };
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "init", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Boolean]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setDebugMode", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "getRegistrationID", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "stopPush", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "resumePush", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "isPushStopped", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setTags", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "addTags", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "deleteTags", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "cleanTags", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "getAllTags", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "checkTagBindState", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setAlias", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "deleteAlias", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "getAlias", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "getUserNotificationSettings", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "clearLocalNotifications", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setBadge", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "resetBadge", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setApplicationIconBadgeNumber", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "getApplicationIconBadgeNumber", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number, String, Number, String, Object]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "addLocalNotificationForIOS", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [String]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "deleteLocalNotificationWithIdentifierKeyInIOS", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Array, String]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "addDismissActions", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Array, String]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "addNotificationActions", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number, Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setLocation", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [String]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "startLogPageView", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [String]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "stopLogPageView", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [String, Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "beginLogPageView", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "getConnectionState", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setBasicPushNotificationBuilder", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setCustomPushNotificationBuilder", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "clearAllNotification", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "clearNotificationById", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setLatestNotificationNum", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number, String, String, Number, Number, String]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "addLocalNotification", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "removeLocalNotification", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "reportNotificationOpened", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", []),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "requestPermission", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Number, Number, Number, Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setSilenceTime", null);
+    __decorate([
+        Cordova(),
+        __metadata("design:type", Function),
+        __metadata("design:paramtypes", [Array, Number, Number]),
+        __metadata("design:returntype", Promise)
+    ], JPush.prototype, "setPushTime", null);
+    JPush = __decorate([
+        Plugin({
+            pluginName: 'JPush',
+            plugin: 'jpush-phonegap-plugin',
+            pluginRef: 'plugins.jPushPlugin',
+            repo: 'https://github.com/jpush/jpush-phonegap-plugin',
+            install: 'ionic cordova plugin add jpush-phonegap-plugin --variable APP_KEY=your_app_key',
+            installVariables: ['APP_KEY'],
+            platforms: ['Android', 'iOS']
+        })
+    ], JPush);
+    return JPush;
+}(IonicNativePlugin));
+export { JPush };
+//# sourceMappingURL=index.js.map

File diff suppressed because it is too large
+ 0 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.js.map


File diff suppressed because it is too large
+ 0 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.metadata.json


+ 18 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/package.json

@@ -0,0 +1,18 @@
+{
+  "name": "@jiguang-ionic/jpush",
+  "version": "1.0.2",
+  "description": "JPush support for ionic-native",
+  "module": "index.js",
+  "typings": "index.d.ts",
+  "author": "hevin",
+  "license": "MIT",
+  "peerDependencies": {
+    "@ionic-native/core": "^4.2.0",
+    "@angular/core": "*",
+    "rxjs": "^5.0.1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/jpush/jpush-phonegap-plugin"
+  }
+}

+ 35 - 0
miaomiao/plugins/jpush-phonegap-plugin/issue_template.md

@@ -0,0 +1,35 @@
+**WARNING: 如果不按照这个表格,我们将无法帮助你,并将忽略你的问题。**
+
+## 你的运行环境
+
+* 插件版本:
+* 平台(Android / iOS):
+* Cordova version (```cordova -v```):
+* Cordova platform version (```cordova platform ls```):
+* Ionic Version (if using Ionic)
+
+## 期望效果
+
+告诉我们你希望达到什么效果。
+
+## 实际效果
+
+告诉我们实际是什么效果。
+
+## 重现步骤
+
+  1. ...
+  2. ...
+  3. ...
+  4. ...
+
+## 背景
+
+你尝试做过些什么?
+
+## Debug logs
+
+包括 Android 或 iOS 的日志:
+
+* iOS: XCode logs
+  * Android: $ adb logcat / Android Studio logcat

+ 2 - 2
miaomiao/plugins/jpush-phonegap-plugin/package.json

@@ -1,6 +1,6 @@
 {
 {
     "name": "jpush-phonegap-plugin",
     "name": "jpush-phonegap-plugin",
-    "version": "3.2.3",
+    "version": "3.4.2",
     "description": "JPush for cordova plugin",
     "description": "JPush for cordova plugin",
     "cordova": {
     "cordova": {
         "id": "jpush-phonegap-plugin",
         "id": "jpush-phonegap-plugin",
@@ -23,7 +23,7 @@
     ],
     ],
     "devDependencies": {
     "devDependencies": {
         "cordova-plugin-device": "*",
         "cordova-plugin-device": "*",
-        "cordova-plugin-jcore": "*"
+        "cordova-plugin-jcore": ">=1.2.0"
     },
     },
     "author": "JiGuang",
     "author": "JiGuang",
     "license": "MIT",
     "license": "MIT",

+ 51 - 46
miaomiao/plugins/jpush-phonegap-plugin/plugin.xml

@@ -2,7 +2,7 @@
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:android="http://schemas.android.com/apk/res/android"
   id="jpush-phonegap-plugin"
   id="jpush-phonegap-plugin"
-  version="3.2.3">
+  version="3.4.1">
 
 
     <name>JPush</name>
     <name>JPush</name>
     <description>JPush for cordova plugin</description>
     <description>JPush for cordova plugin</description>
@@ -38,7 +38,7 @@
         <source-file src="src/ios/Plugins/AppDelegate+JPush.m" />
         <source-file src="src/ios/Plugins/AppDelegate+JPush.m" />
 
 
         <header-file src="src/ios/lib/JPUSHService.h" />
         <header-file src="src/ios/lib/JPUSHService.h" />
-        <source-file src="src/ios/lib/jpush-ios-3.0.6.a" framework="true" />
+        <source-file src="src/ios/lib/jpush-ios-3.0.7.a" framework="true" />
         <resource-file src="src/ios/JPushConfig.plist" />
         <resource-file src="src/ios/JPushConfig.plist" />
 
 
         <framework src="CFNetwork.framework" weak="true" />
         <framework src="CFNetwork.framework" weak="true" />
@@ -57,10 +57,6 @@
         <config-file target="*JPushConfig.plist" parent="Appkey">
         <config-file target="*JPushConfig.plist" parent="Appkey">
             <string>$APP_KEY</string>
             <string>$APP_KEY</string>
         </config-file>
         </config-file>
-
-        <!-- <hook type="after_platform_add" src="hooks/iosEnablePush.js" />
-        <hook type="after_plugin_install" src="hooks/iosEnablePush.js" />
-        <hook type="before_plugin_uninstall" src="hooks/iosDisablePush.js" /> -->
     </platform>
     </platform>
 
 
     <platform name="android">
     <platform name="android">
@@ -70,26 +66,28 @@
             </feature>
             </feature>
         </config-file>
         </config-file>
 
 
-        <config-file target="AndroidManifest.xml" parent="/manifest">
-            <!-- Required  一些系统要求的权限,如访问网络等-->
+        <config-file target="AndroidManifest.xml" parent="/manifest" mode="merge">
+            <!-- Required  一些系统要求的权限,如访问网络等 -->
+            <permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE"
+               android:protectionLevel="signature" />
+
             <uses-permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE" />
             <uses-permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE" />
+
             <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
             <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
             <uses-permission android:name="android.permission.INTERNET" />
             <uses-permission android:name="android.permission.INTERNET" />
             <uses-permission android:name="android.permission.WAKE_LOCK" />
             <uses-permission android:name="android.permission.WAKE_LOCK" />
             <uses-permission android:name="android.permission.READ_PHONE_STATE" />
             <uses-permission android:name="android.permission.READ_PHONE_STATE" />
             <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
             <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
             <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
             <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+            <uses-permission android:name="android.permission.WRITE_SETTINGS" />
             <uses-permission android:name="android.permission.VIBRATE" />
             <uses-permission android:name="android.permission.VIBRATE" />
             <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
             <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
             <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
             <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-            <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
-            <uses-permission android:name="android.permission.WRITE_SETTINGS" />
-            <permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE"
-               android:protectionLevel="signature" />
+            <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
         </config-file>
         </config-file>
 
 
-        <config-file target="AndroidManifest.xml" parent="/manifest/application">
-            <!-- Required SDK核心功能-->
+        <config-file target="AndroidManifest.xml" parent="/manifest/application" mode="merge">
+            <!-- Required SDK核心功能 -->
             <activity android:name="cn.jpush.android.ui.PushActivity"
             <activity android:name="cn.jpush.android.ui.PushActivity"
                 android:theme="@android:style/Theme.Translucent.NoTitleBar"
                 android:theme="@android:style/Theme.Translucent.NoTitleBar"
                 android:configChanges="orientation|keyboardHidden">
                 android:configChanges="orientation|keyboardHidden">
@@ -100,13 +98,13 @@
                 </intent-filter>
                 </intent-filter>
             </activity>
             </activity>
 
 
-            <!-- Rich push 核心功能 since 2.0.6-->
+            <!-- Rich push 核心功能 since 2.0.6 -->
             <activity android:name="cn.jpush.android.ui.PopWinActivity"
             <activity android:name="cn.jpush.android.ui.PopWinActivity"
                 android:theme="@style/MyDialogStyle"
                 android:theme="@style/MyDialogStyle"
                 android:exported="false">
                 android:exported="false">
             </activity>
             </activity>
 
 
-            <!-- Required  SDK核心功能-->
+            <!-- Required SDK 核心功能 -->
             <service android:name="cn.jpush.android.service.DownloadService"
             <service android:name="cn.jpush.android.service.DownloadService"
                android:enabled="true"
                android:enabled="true"
                android:exported="false">
                android:exported="false">
@@ -146,7 +144,7 @@
                 </intent-filter>
                 </intent-filter>
             </receiver>
             </receiver>
 
 
-            <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
+            <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的 JPush 服务相互拉起的功能。 -->
             <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
             <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
             <service android:name="cn.jpush.android.service.DaemonService"
             <service android:name="cn.jpush.android.service.DaemonService"
                android:enabled="true"
                android:enabled="true"
@@ -157,27 +155,16 @@
                 </intent-filter>
                 </intent-filter>
             </service>
             </service>
 
 
-            <!-- User defined.  For test only  用户自定义的广播接收器 -->
+            <!-- 通知广播接收器 -->
             <receiver
             <receiver
-              android:name="cn.jiguang.cordova.push.MyReceiver"
+              android:name="cn.jiguang.cordova.push.JPushReceiver"
               android:enabled="true">
               android:enabled="true">
-                <intent-filter android:priority="1000">
-                    <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
-                    <!-- Required  显示通知栏 -->
-                    <category android:name="$PACKAGE_NAME" />
-                </intent-filter>
                 <intent-filter>
                 <intent-filter>
                     <action android:name="cn.jpush.android.intent.REGISTRATION" />
                     <action android:name="cn.jpush.android.intent.REGISTRATION" />
-                    <!-- Required  用户注册SDK的intent -->
-                    <action android:name="cn.jpush.android.intent.UNREGISTRATION" />
                     <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
                     <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
-                    <!-- Required  用户接收SDK消息的intent -->
                     <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
                     <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
-                    <!-- Required  用户接收SDK通知栏信息的intent -->
                     <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
                     <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
-                    <!-- Required  用户打开自定义通知栏的intent -->
-                    <action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" />
-                    <!-- Optional 用户接受Rich Push Javascript 回调函数的intent -->
+                    <action android:name="cn.jpush.android.intent.CONNECTION" />
                     <category android:name="$PACKAGE_NAME" />
                     <category android:name="$PACKAGE_NAME" />
                 </intent-filter>
                 </intent-filter>
             </receiver>
             </receiver>
@@ -187,30 +174,48 @@
               android:name="cn.jpush.android.service.AlarmReceiver"
               android:name="cn.jpush.android.service.AlarmReceiver"
               android:exported="false" />
               android:exported="false" />
 
 
+            <!-- since 3.0.9 Required SDK 核心功能-->
+            <provider
+                android:authorities="$PACKAGE_NAME.DataProvider"
+                android:name="cn.jpush.android.service.DataProvider"
+                android:exported="true" />
+
+            <receiver android:name="cn.jiguang.cordova.push.JPushEventReceiver">
+                <intent-filter>
+                    <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
+                    <category android:name="$PACKAGE_NAME" />
+                </intent-filter>
+            </receiver>
+
             <!-- Required. Enable it you can get statistics data with channel -->
             <!-- Required. Enable it you can get statistics data with channel -->
             <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default" />
             <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default" />
             <meta-data android:name="JPUSH_APPKEY" android:value="$APP_KEY" />
             <meta-data android:name="JPUSH_APPKEY" android:value="$APP_KEY" />
         </config-file>
         </config-file>
 
 
-        <source-file src="src/android/libs/jpush-android_v3.0.6.jar" target-dir="libs" />
+        <lib-file src="src/android/libs/jpush-android-3.1.1.jar" />
 
 
-        <source-file src="src/android/MyReceiver.java" target-dir="src/cn/jiguang/cordova/push" />
-        <source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jiguang/cordova/push" />
+        <source-file src="src/android/JPushReceiver.java" target-dir="app/src/main/java/cn/jiguang/cordova/push" />
+        <source-file src="src/android/JPushPlugin.java" target-dir="app/src/main/java/cn/jiguang/cordova/push" />
+        <source-file src="src/android/JPushEventReceiver.java" target-dir="app/src/main/java/cn/jiguang/cordova/push" />
 
 
-        <source-file src="src/android/res/drawable-hdpi/jpush_richpush_btn_selector.xml"
-          target-dir="res/drawable" />
-        <source-file src="src/android/res/drawable-hdpi/jpush_richpush_progressbar.xml"
-          target-dir="res/drawable" />
+        <resource-file src="src/android/res/drawable-hdpi/jpush_richpush_btn_selector.xml"
+          target="res/drawable/jpush_richpush_btn_selector.xml" />
+        <resource-file src="src/android/res/drawable-hdpi/jpush_richpush_progressbar.xml"
+          target="res/drawable/jpush_richpush_progressbar.xml" />
 
 
-        <source-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_back.png"
-          target-dir="res/drawable-hdpi" />
-        <source-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png"
-          target-dir="res/drawable-hdpi" />
+        <resource-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_back.png"
+          target="res/drawable-hdpi/jpush_ic_richpush_actionbar_back.png" />
+        <resource-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png"
+          target="res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png" />
 
 
-        <source-file src="src/android/res/layout/jpush_popwin_layout.xml" target-dir="res/layout" />
-        <source-file src="src/android/res/layout/jpush_webview_layout.xml" target-dir="res/layout" />
-        <source-file src="src/android/res/layout/test_notification_layout.xml" target-dir="res/layout" />
+        <resource-file src="src/android/res/layout/jpush_popwin_layout.xml" 
+          target="res/layout/jpush_popwin_layout.xml" />
+        <resource-file src="src/android/res/layout/jpush_webview_layout.xml" 
+          target="res/layout/jpush_webview_layout.xml" />
+        <resource-file src="src/android/res/layout/test_notification_layout.xml" 
+          target="res/layout/test_notification_layout.xml" />
 
 
-        <source-file src="src/android/res/values/jpush_style.xml" target-dir="res/values" />
+        <resource-file src="src/android/res/values/jpush_style.xml"
+          target="res/values/jpush_style.xml" />
     </platform>
     </platform>
 </plugin>
 </plugin>

+ 156 - 0
miaomiao/plugins/jpush-phonegap-plugin/src/android/JPushEventReceiver.java

@@ -0,0 +1,156 @@
+package cn.jiguang.cordova.push;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Log;
+
+import org.apache.cordova.CallbackContext;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Set;
+
+import cn.jpush.android.api.JPushMessage;
+import cn.jpush.android.service.JPushMessageReceiver;
+
+
+public class JPushEventReceiver extends JPushMessageReceiver {
+
+    private static final String TAG = JPushEventReceiver.class.getSimpleName();
+
+    @Override
+    public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
+        super.onTagOperatorResult(context, jPushMessage);
+
+        JSONObject resultJson = new JSONObject();
+
+        int sequence = jPushMessage.getSequence();
+        try {
+            resultJson.put("sequence", sequence);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        CallbackContext callback = JPushPlugin.eventCallbackMap.get(sequence);
+
+        if (callback == null) {
+            Log.i(TAG, "Unexpected error, callback is null!");
+            return;
+        }
+
+        if (jPushMessage.getErrorCode() == 0) { // success
+            Set<String> tags = jPushMessage.getTags();
+            JSONArray tagsJsonArr = new JSONArray();
+            for (String tag : tags) {
+                tagsJsonArr.put(tag);
+            }
+
+            try {
+                if (tagsJsonArr.length() != 0) {
+                    resultJson.put("tags", tagsJsonArr);
+                }
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+
+            callback.success(resultJson);
+
+        } else {
+            try {
+                resultJson.put("code", jPushMessage.getErrorCode());
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+
+            callback.error(resultJson);
+        }
+
+        JPushPlugin.eventCallbackMap.remove(sequence);
+    }
+
+    @Override
+    public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
+        super.onCheckTagOperatorResult(context, jPushMessage);
+
+        JSONObject resultJson = new JSONObject();
+
+        int sequence = jPushMessage.getSequence();
+        try {
+            resultJson.put("sequence", sequence);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        CallbackContext callback = JPushPlugin.eventCallbackMap.get(sequence);
+
+        if (callback == null) {
+            Log.i(TAG, "Unexpected error, callback is null!");
+            return;
+        }
+
+        if (jPushMessage.getErrorCode() == 0) {
+            try {
+                resultJson.put("tag", jPushMessage.getCheckTag());
+                resultJson.put("isBind", jPushMessage.getTagCheckStateResult());
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+            callback.success(resultJson);
+
+        } else {
+            try {
+                resultJson.put("code", jPushMessage.getErrorCode());
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+            callback.error(resultJson);
+        }
+
+        JPushPlugin.eventCallbackMap.remove(sequence);
+    }
+
+    @Override
+    public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
+        super.onAliasOperatorResult(context, jPushMessage);
+
+        JSONObject resultJson = new JSONObject();
+
+        int sequence = jPushMessage.getSequence();
+        try {
+            resultJson.put("sequence", sequence);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        CallbackContext callback = JPushPlugin.eventCallbackMap.get(sequence);
+
+        if (callback == null) {
+            Log.i(TAG, "Unexpected error, callback is null!");
+            return;
+        }
+
+        if (jPushMessage.getErrorCode() == 0) { // success
+            try {
+                if (!TextUtils.isEmpty(jPushMessage.getAlias())) {
+                    resultJson.put("alias", jPushMessage.getAlias());
+                }
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+
+            callback.success(resultJson);
+
+        } else {
+            try {
+                resultJson.put("code", jPushMessage.getErrorCode());
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+
+            callback.error(resultJson);
+        }
+
+        JPushPlugin.eventCallbackMap.remove(sequence);
+    }
+}

+ 175 - 120
miaomiao/plugins/jpush-phonegap-plugin/src/android/JPushPlugin.java

@@ -35,53 +35,26 @@ import cn.jpush.android.api.BasicPushNotificationBuilder;
 import cn.jpush.android.api.JPushInterface;
 import cn.jpush.android.api.JPushInterface;
 import cn.jpush.android.api.TagAliasCallback;
 import cn.jpush.android.api.TagAliasCallback;
 import cn.jpush.android.data.JPushLocalNotification;
 import cn.jpush.android.data.JPushLocalNotification;
+import cn.jpush.android.service.JPushMessageReceiver;
 
 
 public class JPushPlugin extends CordovaPlugin {
 public class JPushPlugin extends CordovaPlugin {
-    private final static List<String> methodList =
-            Arrays.asList(
-                    "addLocalNotification",
-                    "areNotificationEnabled",
-                    "clearAllNotification",
-                    "clearLocalNotifications",
-                    "clearNotificationById",
-                    "getNotification",
-                    "getRegistrationID",
-                    "init",
-                    "isPushStopped",
-                    "onPause",
-                    "onResume",
-                    "requestPermission",
-                    "removeLocalNotification",
-                    "reportNotificationOpened",
-                    "resumePush",
-                    "setAlias",
-                    "setBasicPushNotificationBuilder",
-                    "setCustomPushNotificationBuilder",
-                    "setDebugMode",
-                    "setLatestNotificationNum",
-                    "setPushTime",
-                    "setTags",
-                    "setTagsWithAlias",
-                    "setSilenceTime",
-                    "setStatisticsOpen",
-                    "stopPush"
-            );
-
-    private ExecutorService threadPool = Executors.newFixedThreadPool(1);
+
+    private static final String TAG = JPushPlugin.class.getSimpleName();
+
+    private Context mContext;
+
     private static JPushPlugin instance;
     private static JPushPlugin instance;
     private static Activity cordovaActivity;
     private static Activity cordovaActivity;
-    private static String TAG = "JPushPlugin";
 
 
-    private static boolean shouldCacheMsg = false;
-    private static boolean isStatisticsOpened = false;    // 是否开启统计分析功能
+    static String notificationTitle;
+    static String notificationAlert;
+    static Map<String, Object> notificationExtras = new HashMap<String, Object>();
 
 
-    public static String notificationTitle;
-    public static String notificationAlert;
-    public static Map<String, Object> notificationExtras = new HashMap<String, Object>();
+    static String openNotificationTitle;
+    static String openNotificationAlert;
+    static Map<String, Object> openNotificationExtras = new HashMap<String, Object>();
 
 
-    public static String openNotificationTitle;
-    public static String openNotificationAlert;
-    public static Map<String, Object> openNotificationExtras = new HashMap<String, Object>();
+    static Map<Integer, CallbackContext> eventCallbackMap = new HashMap<Integer, CallbackContext>();
 
 
     public JPushPlugin() {
     public JPushPlugin() {
         instance = this;
         instance = this;
@@ -89,10 +62,10 @@ public class JPushPlugin extends CordovaPlugin {
 
 
     @Override
     @Override
     public void initialize(CordovaInterface cordova, CordovaWebView webView) {
     public void initialize(CordovaInterface cordova, CordovaWebView webView) {
-        Log.i(TAG, "JPush initialize.");
-
         super.initialize(cordova, webView);
         super.initialize(cordova, webView);
-        JPushInterface.init(cordova.getActivity().getApplicationContext());
+        mContext = cordova.getActivity().getApplicationContext();
+        
+        JPushInterface.init(mContext);
 
 
         cordovaActivity = cordova.getActivity();
         cordovaActivity = cordova.getActivity();
 
 
@@ -109,21 +82,7 @@ public class JPushPlugin extends CordovaPlugin {
         }
         }
     }
     }
 
 
-    public void onPause(boolean multitasking) {
-        Log.i(TAG, "----------------  onPause");
-        shouldCacheMsg = true;
-        if (isStatisticsOpened && multitasking) {
-            JPushInterface.onPause(this.cordova.getActivity());
-        }
-    }
-
     public void onResume(boolean multitasking) {
     public void onResume(boolean multitasking) {
-        shouldCacheMsg = false;
-        Log.i(TAG, "---------------- onResume" + "-" + openNotificationAlert
-                + "-" + notificationAlert);
-        if (isStatisticsOpened && multitasking) {
-            JPushInterface.onResume(this.cordova.getActivity());
-        }
         if (openNotificationAlert != null) {
         if (openNotificationAlert != null) {
             notificationAlert = null;
             notificationAlert = null;
             transmitNotificationOpen(openNotificationTitle, openNotificationAlert,
             transmitNotificationOpen(openNotificationTitle, openNotificationAlert,
@@ -142,15 +101,14 @@ public class JPushPlugin extends CordovaPlugin {
         instance = null;
         instance = null;
     }
     }
 
 
-    private static JSONObject getMessageObject(String message,
-                                               Map<String, Object> extras) {
+    private static JSONObject getMessageObject(String message, Map<String, Object> extras) {
         JSONObject data = new JSONObject();
         JSONObject data = new JSONObject();
         try {
         try {
             data.put("message", message);
             data.put("message", message);
             JSONObject jExtras = new JSONObject();
             JSONObject jExtras = new JSONObject();
             for (Entry<String, Object> entry : extras.entrySet()) {
             for (Entry<String, Object> entry : extras.entrySet()) {
                 if (entry.getKey().equals("cn.jpush.android.EXTRA")) {
                 if (entry.getKey().equals("cn.jpush.android.EXTRA")) {
-                    JSONObject jo = null;
+                    JSONObject jo;
                     if (TextUtils.isEmpty((String) entry.getValue())) {
                     if (TextUtils.isEmpty((String) entry.getValue())) {
                         jo = new JSONObject();
                         jo = new JSONObject();
                     } else {
                     } else {
@@ -176,8 +134,7 @@ public class JPushPlugin extends CordovaPlugin {
         return data;
         return data;
     }
     }
 
 
-    private static JSONObject getNotificationObject(String title,
-                                                    String alert, Map<String, Object> extras) {
+    private static JSONObject getNotificationObject(String title, String alert, Map<String, Object> extras) {
         JSONObject data = new JSONObject();
         JSONObject data = new JSONObject();
         try {
         try {
             data.put("title", title);
             data.put("title", title);
@@ -226,8 +183,7 @@ public class JPushPlugin extends CordovaPlugin {
         });
         });
     }
     }
 
 
-    static void transmitNotificationOpen(String title, String alert,
-                                         Map<String, Object> extras) {
+    static void transmitNotificationOpen(String title, String alert, Map<String, Object> extras) {
         if (instance == null) {
         if (instance == null) {
             return;
             return;
         }
         }
@@ -244,8 +200,7 @@ public class JPushPlugin extends CordovaPlugin {
         JPushPlugin.openNotificationAlert = null;
         JPushPlugin.openNotificationAlert = null;
     }
     }
 
 
-    static void transmitNotificationReceive(String title, String alert,
-                                            Map<String, Object> extras) {
+    static void transmitNotificationReceive(String title, String alert, Map<String, Object> extras) {
         if (instance == null) {
         if (instance == null) {
             return;
             return;
         }
         }
@@ -285,10 +240,7 @@ public class JPushPlugin extends CordovaPlugin {
     @Override
     @Override
     public boolean execute(final String action, final JSONArray data,
     public boolean execute(final String action, final JSONArray data,
                            final CallbackContext callbackContext) throws JSONException {
                            final CallbackContext callbackContext) throws JSONException {
-        if (!methodList.contains(action)) {
-            return false;
-        }
-        threadPool.execute(new Runnable() {
+        cordova.getThreadPool().execute(new Runnable() {
             @Override
             @Override
             public void run() {
             public void run() {
                 try {
                 try {
@@ -304,7 +256,7 @@ public class JPushPlugin extends CordovaPlugin {
     }
     }
 
 
     void init(JSONArray data, CallbackContext callbackContext) {
     void init(JSONArray data, CallbackContext callbackContext) {
-        JPushInterface.init(this.cordova.getActivity().getApplicationContext());
+        JPushInterface.init(mContext);
     }
     }
 
 
     void setDebugMode(JSONArray data, CallbackContext callbackContext) {
     void setDebugMode(JSONArray data, CallbackContext callbackContext) {
@@ -319,18 +271,17 @@ public class JPushPlugin extends CordovaPlugin {
     }
     }
 
 
     void stopPush(JSONArray data, CallbackContext callbackContext) {
     void stopPush(JSONArray data, CallbackContext callbackContext) {
-        JPushInterface.stopPush(this.cordova.getActivity().getApplicationContext());
+        JPushInterface.stopPush(mContext);
         callbackContext.success();
         callbackContext.success();
     }
     }
 
 
     void resumePush(JSONArray data, CallbackContext callbackContext) {
     void resumePush(JSONArray data, CallbackContext callbackContext) {
-        JPushInterface.resumePush(this.cordova.getActivity().getApplicationContext());
+        JPushInterface.resumePush(mContext);
         callbackContext.success();
         callbackContext.success();
     }
     }
 
 
     void isPushStopped(JSONArray data, CallbackContext callbackContext) {
     void isPushStopped(JSONArray data, CallbackContext callbackContext) {
-        boolean isStopped = JPushInterface.isPushStopped(
-                this.cordova.getActivity().getApplicationContext());
+        boolean isStopped = JPushInterface.isPushStopped(mContext);
         if (isStopped) {
         if (isStopped) {
             callbackContext.success(1);
             callbackContext.success(1);
         } else {
         } else {
@@ -358,7 +309,7 @@ public class JPushPlugin extends CordovaPlugin {
         }
         }
         if (num != -1) {
         if (num != -1) {
             JPushInterface.setLatestNotificationNumber(
             JPushInterface.setLatestNotificationNumber(
-                    this.cordova.getActivity().getApplicationContext(), num);
+                    mContext, num);
         } else {
         } else {
             callbackContext.error("error num");
             callbackContext.error("error num");
         }
         }
@@ -384,13 +335,13 @@ public class JPushPlugin extends CordovaPlugin {
         } catch (JSONException e) {
         } catch (JSONException e) {
             callbackContext.error("error reading hour json");
             callbackContext.error("error reading hour json");
         }
         }
-        Context context = this.cordova.getActivity().getApplicationContext();
+        Context context = mContext;
         JPushInterface.setPushTime(context, days, startHour, endHour);
         JPushInterface.setPushTime(context, days, startHour, endHour);
         callbackContext.success();
         callbackContext.success();
     }
     }
 
 
     void getRegistrationID(JSONArray data, CallbackContext callbackContext) {
     void getRegistrationID(JSONArray data, CallbackContext callbackContext) {
-        Context context = this.cordova.getActivity().getApplicationContext();
+        Context context = mContext;
         String regID = JPushInterface.getRegistrationID(context);
         String regID = JPushInterface.getRegistrationID(context);
         callbackContext.success(regID);
         callbackContext.success(regID);
     }
     }
@@ -413,49 +364,167 @@ public class JPushPlugin extends CordovaPlugin {
         }
         }
     }
     }
 
 
+    void setAlias(JSONArray data, CallbackContext callbackContext) {
+        int sequence = -1;
+        String alias = null;
+
+        try {
+            JSONObject params = data.getJSONObject(0);
+            sequence = params.getInt("sequence");
+            alias = params.getString("alias");
+        } catch (JSONException e) {
+            e.printStackTrace();
+            callbackContext.error("Parameters error.");
+        }
+
+        JPushInterface.setAlias(mContext, sequence, alias);
+        eventCallbackMap.put(sequence, callbackContext);
+    }
+
+    void deleteAlias(JSONArray data, CallbackContext callbackContext) {
+        int sequence = -1;
+
+        try {
+            JSONObject params = data.getJSONObject(0);
+            sequence = params.getInt("sequence");
+        } catch (JSONException e) {
+            e.printStackTrace();
+            callbackContext.error("Parameters error.");
+        }
+
+        JPushInterface.deleteAlias(mContext, sequence);
+        eventCallbackMap.put(sequence, callbackContext);
+    }
+
+    void getAlias(JSONArray data, CallbackContext callbackContext) {
+        int sequence = -1;
+
+        try {
+            JSONObject params = data.getJSONObject(0);
+            sequence = params.getInt("sequence");
+        } catch (JSONException e) {
+            e.printStackTrace();
+            callbackContext.error("Parameters error.");
+        }
+
+        JPushInterface.getAlias(mContext, sequence);
+        eventCallbackMap.put(sequence, callbackContext);
+    }
+
     void setTags(JSONArray data, CallbackContext callbackContext) {
     void setTags(JSONArray data, CallbackContext callbackContext) {
+        int sequence = -1;
+        Set<String> tags = new HashSet<String>();
+
         try {
         try {
-            HashSet<String> tags = new HashSet<String>();
-            for (int i = 0; i < data.length(); i++) {
-                tags.add(data.getString(i));
+            JSONObject params = data.getJSONObject(0);
+            sequence = params.getInt("sequence");
+
+            JSONArray tagsArr = params.getJSONArray("tags");
+            for (int i = 0; i < tagsArr.length(); i++) {
+                tags.add(tagsArr.getString(i));
             }
             }
-            JPushInterface.setTags(this.cordova.getActivity().getApplicationContext(),
-                    tags, mTagWithAliasCallback);
-            callbackContext.success();
+
         } catch (JSONException e) {
         } catch (JSONException e) {
             e.printStackTrace();
             e.printStackTrace();
-            callbackContext.error("Error reading tags JSON");
+            callbackContext.error("Parameters error.");
         }
         }
+
+        JPushInterface.setTags(mContext, sequence, tags);
+        eventCallbackMap.put(sequence, callbackContext);
     }
     }
 
 
-    void setAlias(JSONArray data, CallbackContext callbackContext) {
+    void addTags(JSONArray data, CallbackContext callbackContext) {
+        int sequence = -1;
+        Set<String> tags = new HashSet<String>();
+
         try {
         try {
-            String alias = data.getString(0);
-            JPushInterface.setAlias(this.cordova.getActivity().getApplicationContext(),
-                    alias, mTagWithAliasCallback);
-            callbackContext.success();
+            JSONObject params = data.getJSONObject(0);
+            sequence = params.getInt("sequence");
+
+            JSONArray tagsArr = params.getJSONArray("tags");
+            for (int i = 0; i < tagsArr.length(); i++) {
+                tags.add(tagsArr.getString(i));
+            }
+
         } catch (JSONException e) {
         } catch (JSONException e) {
             e.printStackTrace();
             e.printStackTrace();
-            callbackContext.error("Error reading alias JSON");
+            callbackContext.error("Parameters error.");
         }
         }
+
+        JPushInterface.addTags(mContext, sequence, tags);
+        eventCallbackMap.put(sequence, callbackContext);
     }
     }
 
 
-    void setTagsWithAlias(JSONArray data, CallbackContext callbackContext) {
-        HashSet<String> tags = new HashSet<String>();
-        String alias;
+    void deleteTags(JSONArray data, CallbackContext callbackContext) {
+        int sequence = -1;
+        Set<String> tags = new HashSet<String>();
+
         try {
         try {
-            alias = data.getString(0);
-            JSONArray tagsArray = data.getJSONArray(1);
-            for (int i = 0; i < tagsArray.length(); i++) {
-                tags.add(tagsArray.getString(i));
+            JSONObject params = data.getJSONObject(0);
+            sequence = params.getInt("sequence");
+
+            JSONArray tagsArr = params.getJSONArray("tags");
+            for (int i = 0; i < tagsArr.length(); i++) {
+                tags.add(tagsArr.getString(i));
             }
             }
-            JPushInterface.setAliasAndTags(this.cordova.getActivity().getApplicationContext(),
-                    alias, tags, mTagWithAliasCallback);
-            callbackContext.success();
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+            callbackContext.error("Parameters error.");
+        }
+
+        JPushInterface.deleteTags(mContext, sequence, tags);
+        eventCallbackMap.put(sequence, callbackContext);
+    }
+
+    void cleanTags(JSONArray data, CallbackContext callbackContext) {
+        int sequence = -1;
+
+        try {
+            JSONObject params = data.getJSONObject(0);
+            sequence = params.getInt("sequence");
+
         } catch (JSONException e) {
         } catch (JSONException e) {
             e.printStackTrace();
             e.printStackTrace();
-            callbackContext.error("Error reading tagAlias JSON");
+            callbackContext.error("Parameters error.");
         }
         }
+
+        JPushInterface.cleanTags(mContext, sequence);
+        eventCallbackMap.put(sequence, callbackContext);
+    }
+
+    void getAllTags(JSONArray data, CallbackContext callbackContext) {
+        int sequence = -1;
+
+        try {
+            JSONObject params = data.getJSONObject(0);
+            sequence = params.getInt("sequence");
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+            callbackContext.error("Parameters error.");
+        }
+
+        JPushInterface.getAllTags(mContext, sequence);
+        eventCallbackMap.put(sequence, callbackContext);
+    }
+
+    void checkTagBindState(JSONArray data, CallbackContext callbackContext) {
+        int sequence = -1;
+        String tag = null;
+
+        try {
+            JSONObject params = data.getJSONObject(0);
+            sequence = params.getInt("sequence");
+            tag = params.getString("tag");
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+            callbackContext.error("Parameters error.");
+        }
+
+        JPushInterface.checkTagBindState(mContext, sequence, tag);
+        eventCallbackMap.put(sequence, callbackContext);
     }
     }
 
 
     void getConnectionState(JSONArray data, CallbackContext callback) {
     void getConnectionState(JSONArray data, CallbackContext callback) {
@@ -466,8 +535,7 @@ public class JPushPlugin extends CordovaPlugin {
     /**
     /**
      *   自定义通知行为,声音、震动、呼吸灯等。
      *   自定义通知行为,声音、震动、呼吸灯等。
      */
      */
-    void setBasicPushNotificationBuilder(JSONArray data,
-                                         CallbackContext callbackContext) {
+    void setBasicPushNotificationBuilder(JSONArray data, CallbackContext callbackContext) {
         BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(
         BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(
                 this.cordova.getActivity());
                 this.cordova.getActivity());
         builder.developerArg0 = "Basic builder 1";
         builder.developerArg0 = "Basic builder 1";
@@ -513,8 +581,7 @@ public class JPushPlugin extends CordovaPlugin {
         }
         }
     }
     }
 
 
-    void addLocalNotification(JSONArray data, CallbackContext callbackContext)
-            throws JSONException {
+    void addLocalNotification(JSONArray data, CallbackContext callbackContext) throws JSONException {
         int builderId = data.getInt(0);
         int builderId = data.getInt(0);
         String content = data.getString(1);
         String content = data.getString(1);
         String title = data.getString(2);
         String title = data.getString(2);
@@ -537,8 +604,7 @@ public class JPushPlugin extends CordovaPlugin {
         JPushInterface.addLocalNotification(this.cordova.getActivity(), ln);
         JPushInterface.addLocalNotification(this.cordova.getActivity(), ln);
     }
     }
 
 
-    void removeLocalNotification(JSONArray data, CallbackContext callbackContext)
-            throws JSONException {
+    void removeLocalNotification(JSONArray data, CallbackContext callbackContext) throws JSONException {
         int notificationID = data.getInt(0);
         int notificationID = data.getInt(0);
         JPushInterface.removeLocalNotification(this.cordova.getActivity(), notificationID);
         JPushInterface.removeLocalNotification(this.cordova.getActivity(), notificationID);
     }
     }
@@ -547,17 +613,6 @@ public class JPushPlugin extends CordovaPlugin {
         JPushInterface.clearLocalNotifications(this.cordova.getActivity());
         JPushInterface.clearLocalNotifications(this.cordova.getActivity());
     }
     }
 
 
-    /**
-     * 决定是否启用统计分析功能。
-     */
-    void setStatisticsOpen(JSONArray data, CallbackContext callbackContext) {
-        try {
-            isStatisticsOpened = data.getBoolean(0);
-        } catch (JSONException e) {
-            e.printStackTrace();
-        }
-    }
-
     /**
     /**
      * 设置通知静默时间
      * 设置通知静默时间
      * http://docs.jpush.io/client/android_api/#api_5
      * http://docs.jpush.io/client/android_api/#api_5
@@ -634,7 +689,7 @@ public class JPushPlugin extends CordovaPlugin {
 
 
         String pkg = context.getPackageName();
         String pkg = context.getPackageName();
         int uid = appInfo.uid;
         int uid = appInfo.uid;
-        Class appOpsClazz = null;
+        Class appOpsClazz;
 
 
         try {
         try {
             appOpsClazz = Class.forName(AppOpsManager.class.getName());
             appOpsClazz = Class.forName(AppOpsManager.class.getName());

+ 6 - 9
miaomiao/plugins/jpush-phonegap-plugin/src/android/MyReceiver.java → miaomiao/plugins/jpush-phonegap-plugin/src/android/JPushReceiver.java

@@ -11,7 +11,7 @@ import java.util.Map;
 
 
 import cn.jpush.android.api.JPushInterface;
 import cn.jpush.android.api.JPushInterface;
 
 
-public class MyReceiver extends BroadcastReceiver {
+public class JPushReceiver extends BroadcastReceiver {
 
 
     private static final List<String> IGNORED_EXTRAS_KEYS =
     private static final List<String> IGNORED_EXTRAS_KEYS =
             Arrays.asList(
             Arrays.asList(
@@ -56,17 +56,14 @@ public class MyReceiver extends BroadcastReceiver {
 
 
         Intent launch = context.getPackageManager().getLaunchIntentForPackage(
         Intent launch = context.getPackageManager().getLaunchIntentForPackage(
                 context.getPackageName());
                 context.getPackageName());
-        launch.addCategory(Intent.CATEGORY_LAUNCHER);
-        launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
-        context.startActivity(launch);
+        if (launch != null) {
+            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) {
     private void handlingNotificationReceive(Context context, Intent 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);
-
         String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
         String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
         JPushPlugin.notificationTitle = title;
         JPushPlugin.notificationTitle = title;
 
 

BIN
miaomiao/plugins/jpush-phonegap-plugin/src/android/libs/jpush-android-3.1.1.jar


BIN
miaomiao/plugins/jpush-phonegap-plugin/src/android/libs/jpush-android_v3.0.6.jar


+ 1 - 1
miaomiao/plugins/jpush-phonegap-plugin/src/ios/JPushConfig.plist

@@ -11,6 +11,6 @@
 	<key>IsIDFA</key>
 	<key>IsIDFA</key>
 	<false/>
 	<false/>
 	<key>Delay</key>
 	<key>Delay</key>
-	<false/>
+	<true/>
 </dict>
 </dict>
 </plist>
 </plist>

+ 213 - 156
miaomiao/plugins/jpush-phonegap-plugin/src/ios/Plugins/AppDelegate+JPush.m

@@ -1,156 +1,213 @@
-//
-//  AppDelegate+JPush.m
-//  delegateExtention
-//
-//  Created by 张庆贺 on 15/8/3.
-//  Copyright (c) 2015年 JPush. All rights reserved.
-//
-
-#import "AppDelegate+JPush.h"
-#import "JPushPlugin.h"
-#import <objc/runtime.h>
-#import <AdSupport/AdSupport.h>
-#import <UserNotifications/UserNotifications.h>
-#import "JPushDefine.h"
-
-@implementation AppDelegate (JPush)
-
-+(void)load{
-    Method origin1;
-    Method swizzle1;
-    origin1  = class_getInstanceMethod([self class],@selector(init));
-    swizzle1 = class_getInstanceMethod([self class], @selector(init_plus));
-    method_exchangeImplementations(origin1, swizzle1);
-}
-
--(instancetype)init_plus{
-    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:UIApplicationDidFinishLaunchingNotification object:nil];
-    return [self init_plus];
-}
-
--(void)fireOpenNotification:(NSTimer*)timer{
-    if (SharedJPushPlugin) {
-        [JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[timer.userInfo toJsonString]];
-        [timer invalidate];
-    }
-}
-
-NSDictionary *_launchOptions;
--(void)applicationDidLaunch:(NSNotification *)notification{
-
-
-    if (notification) {
-        if (notification.userInfo) {
-            NSDictionary *userInfo1 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
-            if (userInfo1.count > 0) {
-                [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(fireOpenNotification:) userInfo:userInfo1 repeats:YES];
-            }
-
-            NSDictionary *userInfo2 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
-            if (userInfo2.count > 0) {
-                [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(fireOpenNotification:) userInfo:userInfo2 repeats:YES];
-            }
-        }
-        [JPUSHService setDebugMode];
-
-        NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"];
-        NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
-        NSNumber *delay       = [plistData valueForKey:JPushConfig_Delay];
-
-        _launchOptions = notification.userInfo;
-
-        if (![delay boolValue]) {
-            [self startJPushSDK];
-        }
-    }
-}
-
--(void)startJPushSDK{
-    [self registerForRemoteNotification];
-    [JPushPlugin setupJPushSDK:_launchOptions];
-}
-
--(void)registerForRemoteNotification{
-    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
-#ifdef NSFoundationVersionNumber_iOS_9_x_Max
-        JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
-        entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
-        [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
-#endif
-    }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
-        //可以添加自定义categories
-        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
-                                                          UIUserNotificationTypeSound |
-                                                          UIUserNotificationTypeAlert)
-                                              categories:nil];
-    } else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){
-        //categories 必须为nil
-        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
-                                                          UIRemoteNotificationTypeSound |
-                                                          UIRemoteNotificationTypeAlert)
-                                              categories:nil];
-    }
-}
-
-- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
-    [JPUSHService registerDeviceToken:deviceToken];
-}
-
--(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
-    [JPUSHService handleRemoteNotification:userInfo];
-
-    [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
-}
-
--(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
-    [JPUSHService handleRemoteNotification:userInfo];
-    NSString *eventName;
-    switch ([UIApplication sharedApplication].applicationState) {
-        case UIApplicationStateInactive:
-            eventName = JPushDocumentEvent_OpenNotification;
-            break;
-        case UIApplicationStateActive:
-            eventName = JPushDocumentEvent_ReceiveNotification;
-            break;
-        case UIApplicationStateBackground:
-            eventName = JPushDocumentEvent_BackgroundNotification;
-            break;
-        default:
-            break;
-    }
-    [JPushPlugin fireDocumentEvent:eventName jsString:[userInfo toJsonString]];
-    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(30 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
-      completionHandler(UIBackgroundFetchResultNewData);
-    });
-}
-
--(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{
-    NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo];
-    [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
-    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
-}
-
--(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
-    NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:response.notification.request.content.userInfo];
-    @try {
-        [userInfo setValue:[response valueForKey:@"userText"] forKey:@"userText"];
-    } @catch (NSException *exception) { }
-    [userInfo setValue:response.actionIdentifier forKey:@"actionIdentifier"];
-    [JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo toJsonString]];
-    completionHandler();
-}
-
-- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
-    [[NSNotificationCenter defaultCenter] postNotificationName:JPushDocumentEvent_ReceiveLocalNotification object:notification.userInfo];
-}
-
-- (void)applicationWillEnterForeground:(UIApplication *)application {
-    //  [application setApplicationIconBadgeNumber:0];
-    //  [application cancelAllLocalNotifications];
-}
-
-- (void)applicationDidEnterBackground:(UIApplication *)application {
-    //  [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
-}
-
-@end
+//
+//  AppDelegate+JPush.m
+//  delegateExtention
+//
+//  Created by 张庆贺 on 15/8/3.
+//  Copyright (c) 2015年 JPush. All rights reserved.
+//
+
+#import "AppDelegate+JPush.h"
+#import "JPushPlugin.h"
+#import <objc/runtime.h>
+#import <AdSupport/AdSupport.h>
+#import <UserNotifications/UserNotifications.h>
+#import "JPushDefine.h"
+
+@implementation AppDelegate (JPush)
+
++(void)load{
+    Method origin1;
+    Method swizzle1;
+    origin1  = class_getInstanceMethod([self class],@selector(init));
+    swizzle1 = class_getInstanceMethod([self class], @selector(init_plus));
+    method_exchangeImplementations(origin1, swizzle1);
+}
+
+-(instancetype)init_plus{
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:UIApplicationDidFinishLaunchingNotification object:nil];
+    return [self init_plus];
+}
+
+NSDictionary *_launchOptions;
+-(void)applicationDidLaunch:(NSNotification *)notification{
+
+    if (!_jpushEventCache) {
+        _jpushEventCache = @{}.mutableCopy;
+    }
+
+    [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
+      NSDictionary *event = @{@"registrationId": registrationID?:@""};
+      [JPushPlugin fireDocumentEvent:JPushDocumentEvent_receiveRegistrationId jsString:[event toJsonString]];
+    }];
+  
+  if (notification != nil &&
+      [[UIDevice currentDevice].systemVersion floatValue] < 10.0) {// iOS 10 以后通过 openNotification 这个回调触发事件。
+        if (notification.userInfo) {
+          
+          if ([notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
+            [JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification
+                                  jsString:[[self jpushFormatAPNSDic: notification.userInfo[UIApplicationLaunchOptionsRemoteNotificationKey]] toJsonString]];
+          }
+          
+          if ([notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]) {
+            UILocalNotification *localNotification = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
+            NSMutableDictionary *localNotificationEvent = @{}.mutableCopy;
+            localNotificationEvent[@"content"] = localNotification.alertBody;
+            localNotificationEvent[@"badge"] = @(localNotification.applicationIconBadgeNumber);
+            localNotificationEvent[@"extras"] = localNotification.userInfo;
+
+            [JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[localNotificationEvent toJsonString]];
+          }
+        }
+    }
+  
+  [JPUSHService setDebugMode];
+  
+  NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"];
+  NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
+  NSNumber *delay       = [plistData valueForKey:JPushConfig_Delay];
+  
+  _launchOptions = notification.userInfo;
+  
+  if (![delay boolValue]) {
+    [self startJPushSDK];
+  }
+}
+
+-(void)startJPushSDK{
+    [self registerForRemoteNotification];
+    [JPushPlugin setupJPushSDK:_launchOptions];
+}
+
+- (void)jpushSDKDidLoginNotification {
+  NSDictionary *event = @{@"registrationId": JPUSHService.registrationID};
+  [JPushPlugin fireDocumentEvent:JPushDocumentEvent_receiveRegistrationId jsString:[event toJsonString]];
+}
+
+- (NSMutableDictionary *)jpushFormatAPNSDic:(NSDictionary *)dic {
+  NSMutableDictionary *extras = @{}.mutableCopy;
+  for (NSString *key in dic) {
+    if([key isEqualToString:@"_j_business"]      ||
+       [key isEqualToString:@"_j_msgid"]         ||
+       [key isEqualToString:@"_j_uid"]           ||
+       [key isEqualToString:@"actionIdentifier"] ||
+       [key isEqualToString:@"aps"]) {
+      continue;
+    }
+    extras[key] = dic[key];
+  }
+  NSMutableDictionary *formatDic = dic.mutableCopy;
+  formatDic[@"extras"] = extras;
+  return formatDic;
+}
+
+-(void)registerForRemoteNotification{
+    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
+#ifdef NSFoundationVersionNumber_iOS_9_x_Max
+        JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
+        entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
+        [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
+#endif
+    }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
+        //可以添加自定义categories
+        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
+                                                          UIUserNotificationTypeSound |
+                                                          UIUserNotificationTypeAlert)
+                                              categories:nil];
+    } else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){
+        //categories 必须为nil
+        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
+                                                          UIRemoteNotificationTypeSound |
+                                                          UIRemoteNotificationTypeAlert)
+                                              categories:nil];
+    }
+}
+
+- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
+    [JPUSHService registerDeviceToken:deviceToken];
+}
+
+-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
+    [JPUSHService handleRemoteNotification:userInfo];
+
+    [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
+}
+
+-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
+    [JPUSHService handleRemoteNotification:userInfo];
+    NSString *eventName;
+    switch ([UIApplication sharedApplication].applicationState) {
+      case UIApplicationStateBackground:
+        eventName = JPushDocumentEvent_BackgroundNotification;
+        break;
+      default:
+        eventName = JPushDocumentEvent_ReceiveNotification;
+        break;
+    }
+
+    [JPushPlugin fireDocumentEvent:eventName jsString:[[self jpushFormatAPNSDic:userInfo] toJsonString]];
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(30 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+      completionHandler(UIBackgroundFetchResultNewData);
+    });
+}
+
+-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{
+  NSMutableDictionary *userInfo = @{}.mutableCopy;
+  
+  if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
+    userInfo = [self jpushFormatAPNSDic:notification.request.content.userInfo];
+  } else {
+    UNNotificationContent *content = notification.request.content;
+    userInfo[@"content"] = content.body;
+    userInfo[@"badge"] = content.badge;
+    userInfo[@"extras"] = content.userInfo;
+    userInfo[@"identifier"] = notification.request.identifier;
+  }
+  
+  completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
+  
+  if ([userInfo[@"aps"][@"content-available"] isEqualToNumber:@(1)]) {// content-available 当用户开启后台推送是,防止触发两次事件
+    return;
+  }
+  
+  [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
+  
+}
+
+-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
+  UNNotification *notification = response.notification;
+  NSMutableDictionary *userInfo = @{}.mutableCopy;
+  
+  if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
+    userInfo = [self jpushFormatAPNSDic:notification.request.content.userInfo];
+  } else {
+    UNNotificationContent *content = notification.request.content;
+    userInfo[@"content"] = content.body;
+    userInfo[@"badge"] = content.badge;
+    userInfo[@"extras"] = content.userInfo;
+    userInfo[@"identifier"] = notification.request.identifier;
+  }
+  
+  [JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo toJsonString]];
+  completionHandler();
+}
+
+- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
+  NSMutableDictionary *localNotificationEvent = @{}.mutableCopy;
+  localNotificationEvent[@"content"] = notification.alertBody;
+  localNotificationEvent[@"badge"] = @(notification.applicationIconBadgeNumber);
+  localNotificationEvent[@"extras"] = notification.userInfo;
+  
+  [[NSNotificationCenter defaultCenter] postNotificationName:JPushDocumentEvent_ReceiveLocalNotification object:localNotificationEvent];
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application {
+    //  [application setApplicationIconBadgeNumber:0];
+    //  [application cancelAllLocalNotifications];
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application {
+    //  [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
+}
+
+@end

+ 1 - 2
miaomiao/plugins/jpush-phonegap-plugin/src/ios/Plugins/JPushDefine.h

@@ -27,7 +27,6 @@ static NSString *const JPushDocumentEvent_OpenNotification          = @"openNoti
 static NSString *const JPushDocumentEvent_BackgroundNotification    = @"backgroundNotification";
 static NSString *const JPushDocumentEvent_BackgroundNotification    = @"backgroundNotification";
 static NSString *const JPushDocumentEvent_SetTagsWithAlias          = @"setTagsWithAlias";
 static NSString *const JPushDocumentEvent_SetTagsWithAlias          = @"setTagsWithAlias";
 static NSString *const JPushDocumentEvent_ReceiveMessage            = @"receiveMessage";
 static NSString *const JPushDocumentEvent_ReceiveMessage            = @"receiveMessage";
-static NSString *const JPushDocumentEvent_StartLocalNotification    = @"startLocalNotification";
 static NSString *const JPushDocumentEvent_ReceiveLocalNotification  = @"receiveLocalNotification";
 static NSString *const JPushDocumentEvent_ReceiveLocalNotification  = @"receiveLocalNotification";
 
 
-
+static NSString *const JPushDocumentEvent_receiveRegistrationId     = @"receiveRegistrationId";

+ 102 - 94
miaomiao/plugins/jpush-phonegap-plugin/src/ios/Plugins/JPushPlugin.h

@@ -1,94 +1,102 @@
-//
-//  PushTalkPlugin.h
-//  PushTalk
-//
-//  Created by zhangqinghe on 13-12-13.
-//
-//
-
-#import <Cordova/CDV.h>
-
-@interface JPushPlugin : CDVPlugin{
-
-}
-
-//注册通知服务并启动 SDK
--(void)startJPushSDK:(CDVInvokedUrlCommand*)command;
-
-//以下为js中可调用接口
-//设置标签、别名
--(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command;
--(void)setTags:(CDVInvokedUrlCommand*)command;
--(void)setAlias:(CDVInvokedUrlCommand*)command;
-
-//获取 RegistrationID
--(void)getRegistrationID:(CDVInvokedUrlCommand*)command;
-
-//页面统计
--(void)startLogPageView:(CDVInvokedUrlCommand*)command;
--(void)stopLogPageView:(CDVInvokedUrlCommand*)command;
--(void)beginLogPageView:(CDVInvokedUrlCommand*)command;
-
-//设置角标到服务器,服务器下一次发消息时,会设置成这个值
-//本接口不会改变应用本地的角标值.
--(void)setBadge:(CDVInvokedUrlCommand*)command;
-//相当于 [setBadge:0]
--(void)resetBadge:(CDVInvokedUrlCommand*)command;
-
-//应用本地的角标值设置/获取
--(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command;
--(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command;
-
-//停止与恢复推送
--(void)stopPush:(CDVInvokedUrlCommand*)command;
--(void)resumePush:(CDVInvokedUrlCommand*)command;
--(void)isPushStopped:(CDVInvokedUrlCommand*)command;
-
-//开关日志
--(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command;
--(void)setLogOFF:(CDVInvokedUrlCommand*)command;
--(void)crashLogON:(CDVInvokedUrlCommand*)command;
-
-//本地推送
--(void)setLocalNotification:(CDVInvokedUrlCommand*)command;
--(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command;
--(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command;
-
-//地理位置上报 [latitude,longitude]
--(void)setLocation:(CDVInvokedUrlCommand*)command;
-
-//检查用户的推送设置情况
--(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command;
-
-//ios 10 APIs
--(void)addDismissActions:(CDVInvokedUrlCommand*)command;
--(void)addNotificationActions:(CDVInvokedUrlCommand*)command;
-
-/*
- *  以下为js中可监听到的事件
- *  jpush.openNotification      点击推送消息启动或唤醒app
- *  jpush.setTagsWithAlias      设置标签、别名完成
- *  jpush.receiveMessage        收到自定义消息
- *  jpush.receiveNotification   前台收到推送
- *  jpush.backgroundNotification 后台收到推送
- */
-
-# pragma mark - private
-
-+(void)fireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString;
-
-+(void)setupJPushSDK:(NSDictionary*)userInfo;
-
-@end
-
-JPushPlugin *SharedJPushPlugin;
-
-@interface NSDictionary (JPush)
--(NSString*)toJsonString;
-@end
-
-@interface NSString (JPush)
--(NSDictionary*)toDictionary;
-@end
-
-
+//
+//  PushTalkPlugin.h
+//  PushTalk
+//
+//  Created by zhangqinghe on 13-12-13.
+//
+//
+
+#import <Cordova/CDV.h>
+
+static NSMutableDictionary *_jpushEventCache;
+
+@interface JPushPlugin : CDVPlugin{
+
+}
+
+//注册通知服务并启动 SDK
+-(void)startJPushSDK:(CDVInvokedUrlCommand*)command;
+
+//以下为js中可调用接口
+//设置标签、别名
+-(void)setTags:(CDVInvokedUrlCommand*)command;
+-(void)addTags:(CDVInvokedUrlCommand*)command;
+-(void)deleteTags:(CDVInvokedUrlCommand*)command;
+-(void)cleanTags:(CDVInvokedUrlCommand*)command;
+-(void)getAllTags:(CDVInvokedUrlCommand*)command;
+-(void)checkTagBindState:(CDVInvokedUrlCommand*)command;
+
+-(void)setAlias:(CDVInvokedUrlCommand*)command;
+-(void)deleteAlias:(CDVInvokedUrlCommand*)command;
+-(void)getAlias:(CDVInvokedUrlCommand*)command;
+
+//获取 RegistrationID
+-(void)getRegistrationID:(CDVInvokedUrlCommand*)command;
+
+//页面统计
+-(void)startLogPageView:(CDVInvokedUrlCommand*)command;
+-(void)stopLogPageView:(CDVInvokedUrlCommand*)command;
+-(void)beginLogPageView:(CDVInvokedUrlCommand*)command;
+
+//设置角标到服务器,服务器下一次发消息时,会设置成这个值
+//本接口不会改变应用本地的角标值.
+-(void)setBadge:(CDVInvokedUrlCommand*)command;
+//相当于 [setBadge:0]
+-(void)resetBadge:(CDVInvokedUrlCommand*)command;
+
+//应用本地的角标值设置/获取
+-(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command;
+-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command;
+
+//停止与恢复推送
+-(void)stopPush:(CDVInvokedUrlCommand*)command;
+-(void)resumePush:(CDVInvokedUrlCommand*)command;
+-(void)isPushStopped:(CDVInvokedUrlCommand*)command;
+
+//开关日志
+-(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command;
+-(void)setLogOFF:(CDVInvokedUrlCommand*)command;
+-(void)crashLogON:(CDVInvokedUrlCommand*)command;
+
+//本地推送
+-(void)setLocalNotification:(CDVInvokedUrlCommand*)command;
+-(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command;
+-(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command;
+
+//地理位置上报 [latitude,longitude]
+-(void)setLocation:(CDVInvokedUrlCommand*)command;
+
+//检查用户的推送设置情况
+-(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command;
+
+//ios 10 APIs
+-(void)addDismissActions:(CDVInvokedUrlCommand*)command;
+-(void)addNotificationActions:(CDVInvokedUrlCommand*)command;
+
+/*
+ *  以下为js中可监听到的事件
+ *  jpush.openNotification      点击推送消息启动或唤醒app
+ *  jpush.receiveMessage        收到自定义消息
+ *  jpush.receiveNotification   前台收到推送
+ *  jpush.backgroundNotification 后台收到推送
+ */
+
+# pragma mark - private
+
++(void)fireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString;
+
++(void)setupJPushSDK:(NSDictionary*)userInfo;
+
+@end
+
+static JPushPlugin *SharedJPushPlugin;
+
+@interface NSDictionary (JPush)
+-(NSString*)toJsonString;
+@end
+
+@interface NSString (JPush)
+-(NSDictionary*)toDictionary;
+@end
+
+

+ 575 - 365
miaomiao/plugins/jpush-phonegap-plugin/src/ios/Plugins/JPushPlugin.m

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

+ 127 - 28
miaomiao/plugins/jpush-phonegap-plugin/src/ios/lib/JPUSHService.h

@@ -9,7 +9,7 @@
  * Copyright (c) 2011 ~ 2017 Shenzhen HXHG. All rights reserved.
  * Copyright (c) 2011 ~ 2017 Shenzhen HXHG. All rights reserved.
  */
  */
 
 
-#define JPUSH_VERSION_NUMBER 3.0.5
+#define JPUSH_VERSION_NUMBER 3.0.7
 
 
 #import <Foundation/Foundation.h>
 #import <Foundation/Foundation.h>
 
 
@@ -22,6 +22,10 @@
 @class UNNotification;
 @class UNNotification;
 @protocol JPUSHRegisterDelegate;
 @protocol JPUSHRegisterDelegate;
 
 
+typedef void (^JPUSHTagsOperationCompletion)(NSInteger iResCode, NSSet *iTags, NSInteger seq);
+typedef void (^JPUSHTagValidOperationCompletion)(NSInteger iResCode, NSSet *iTags, NSInteger seq, BOOL isBind);
+typedef void (^JPUSHAliasOperationCompletion)(NSInteger iResCode, NSString *iAlias, NSInteger seq);
+
 extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中
 extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中
 extern NSString *const kJPFNetworkDidSetupNotification;     // 建立连接
 extern NSString *const kJPFNetworkDidSetupNotification;     // 建立连接
 extern NSString *const kJPFNetworkDidCloseNotification;     // 关闭连接
 extern NSString *const kJPFNetworkDidCloseNotification;     // 关闭连接
@@ -137,6 +141,7 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
  * @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
  * @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
  * @param channel 发布渠道. 可选.
  * @param channel 发布渠道. 可选.
  * @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
  * @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
+ *                     App 证书环境取决于profile provision的配置,此处建议与证书环境保持一致.
  * @param advertisingIdentifier 广告标识符(IDFA) 如果不需要使用IDFA,传nil.
  * @param advertisingIdentifier 广告标识符(IDFA) 如果不需要使用IDFA,传nil.
  *
  *
  * @discussion 提供SDK启动必须的参数, 来启动 SDK.
  * @discussion 提供SDK启动必须的参数, 来启动 SDK.
@@ -186,41 +191,102 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
  */
  */
 + (void)handleRemoteNotification:(NSDictionary *)remoteInfo;
 + (void)handleRemoteNotification:(NSDictionary *)remoteInfo;
 
 
+/*!
+ * Tags操作接口
+ * 支持增加/覆盖/删除/清空/查询操作
+ * 详情请参考文档:https://docs.jiguang.cn/jpush/client/iOS/ios_api/)
+ */
 
 
-///----------------------------------------------------
-/// @name Tag alias setting 设置别名与标签
-///----------------------------------------------------
+/**
+ 增加tags
 
 
-/*!
- * 下面的接口是可选的
- * 设置标签和(或)别名(若参数为nil,则忽略;若是空对象,则清空;详情请参考文档:https://docs.jiguang.cn/jpush/client/iOS/ios_api/)
- * setTags:alias:fetchCompletionHandle:是新的设置标签别名的方法,不再需要显示声明回调函数,只需要在block里面处理设置结果即可.
- * WARN: 使用block时需要注意循环引用问题
+ @param tags 需要增加的tags集合
+ @param completion 响应回调
+ @param seq 请求序列号
  */
  */
-+ (void) setTags:(NSSet *)tags
-           alias:(NSString *)alias
-callbackSelector:(SEL)cbSelector
-          target:(id)theTarget __attribute__((deprecated("JPush 2.1.1 版本已过期")));
++ (void)addTags:(NSSet<NSString *> *)tags
+     completion:(JPUSHTagsOperationCompletion)completion
+            seq:(NSInteger)seq;
 
 
-+ (void) setTags:(NSSet *)tags
-           alias:(NSString *)alias
-callbackSelector:(SEL)cbSelector
-          object:(id)theTarget;
+/**
+ 覆盖tags
+ 调用该接口会覆盖用户所有的tags
 
 
-+ (void) setTags:(NSSet *)tags
-callbackSelector:(SEL)cbSelector
-          object:(id)theTarget;
+ @param tags 需要设置的tags集合
+ @param completion 响应回调
+ @param seq 请求序列号
+ */
++ (void)setTags:(NSSet<NSString *> *)tags
+     completion:(JPUSHTagsOperationCompletion)completion
+            seq:(NSInteger)seq;
 
 
-+ (void)setTags:(NSSet *)tags
-          alias:(NSString *)alias
-    fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler;
+/**
+ 删除指定tags
 
 
-+ (void)  setTags:(NSSet *)tags
-aliasInbackground:(NSString *)alias;
+ @param tags 需要删除的tags集合
+ @param completion 响应回调
+ @param seq 请求序列号
+ */
++ (void)deleteTags:(NSSet<NSString *> *)tags
+        completion:(JPUSHTagsOperationCompletion)completion
+               seq:(NSInteger)seq;
+
+/**
+ 清空所有tags
+ @param completion 响应回调
+ @param seq 请求序列号
+ */
++ (void)cleanTags:(JPUSHTagsOperationCompletion)completion
+              seq:(NSInteger)seq;
 
 
+/**
+ 查询全部tags
+
+ @param completion 响应回调,请在回调中获取查询结果
+ @param seq 请求序列号
+ */
++ (void)getAllTags:(JPUSHTagsOperationCompletion)completion
+               seq:(NSInteger)seq;
+
+/**
+ 验证tag是否绑定
+ 
+ @param completion 响应回调,回调中查看是否绑定
+ @param seq 请求序列号
+ */
++ (void)validTag:(NSString *)tag
+      completion:(JPUSHTagValidOperationCompletion)completion
+             seq:(NSInteger)seq;
+
+/**
+ 设置Alias
+
+ @param alias 需要设置的alias
+ @param completion 响应回调
+ @param seq 请求序列号
+ */
 + (void)setAlias:(NSString *)alias
 + (void)setAlias:(NSString *)alias
-callbackSelector:(SEL)cbSelector
-          object:(id)theTarget;
+      completion:(JPUSHAliasOperationCompletion)completion
+             seq:(NSInteger)seq;
+
+/**
+ 删除alias
+
+ @param completion 响应回调
+ @param seq 请求序列号
+ */
++ (void)deleteAlias:(JPUSHAliasOperationCompletion)completion
+                seq:(NSInteger)seq;
+
+/**
+ 查询当前alias
+
+ @param completion 响应回调
+ @param seq 请求序列号
+ */
++ (void)getAlias:(JPUSHAliasOperationCompletion)completion
+             seq:(NSInteger)seq;
+
 
 
 /*!
 /*!
  * @abstract 过滤掉无效的 tags
  * @abstract 过滤掉无效的 tags
@@ -230,7 +296,6 @@ callbackSelector:(SEL)cbSelector
  */
  */
 + (NSSet *)filterValidTags:(NSSet *)tags;
 + (NSSet *)filterValidTags:(NSSet *)tags;
 
 
-
 ///----------------------------------------------------
 ///----------------------------------------------------
 /// @name Stats 统计功能
 /// @name Stats 统计功能
 ///----------------------------------------------------
 ///----------------------------------------------------
@@ -471,6 +536,40 @@ callbackSelector:(SEL)cbSelector
  */
  */
 + (void)setLogOFF;
 + (void)setLogOFF;
 
 
+
+///----------------------------------------------------
+///********************下列方法已过期********************
+///**************请使用新版tag/alias操作接口**************
+///----------------------------------------------------
+/// @name Tag alias setting 设置别名与标签
+///----------------------------------------------------
+
+/*!
+ * 下面的接口是可选的
+ * 设置标签和(或)别名(若参数为nil,则忽略;若是空对象,则清空;详情请参考文档:https://docs.jiguang.cn/jpush/client/iOS/ios_api/)
+ * setTags:alias:fetchCompletionHandle:是新的设置标签别名的方法,不再需要显示声明回调函数,只需要在block里面处理设置结果即可.
+ * WARN: 使用block时需要注意循环引用问题
+ */
++ (void) setTags:(NSSet *)tags
+           alias:(NSString *)alias
+callbackSelector:(SEL)cbSelector
+          target:(id)theTarget __attribute__((deprecated("JPush 2.1.1 版本已过期")));
++ (void) setTags:(NSSet *)tags
+           alias:(NSString *)alias
+callbackSelector:(SEL)cbSelector
+          object:(id)theTarget __attribute__((deprecated("JPush 3.0.6 版本已过期")));
++ (void) setTags:(NSSet *)tags
+callbackSelector:(SEL)cbSelector
+          object:(id)theTarget __attribute__((deprecated("JPush 3.0.6 版本已过期")));
++ (void)setTags:(NSSet *)tags
+          alias:(NSString *)alias
+fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler __attribute__((deprecated("JPush 3.0.6 版本已过期")));
++ (void)  setTags:(NSSet *)tags
+aliasInbackground:(NSString *)alias __attribute__((deprecated("JPush 3.0.6 版本已过期")));
++ (void)setAlias:(NSString *)alias
+callbackSelector:(SEL)cbSelector
+          object:(id)theTarget __attribute__((deprecated("JPush 3.0.6 版本已过期")));
+
 @end
 @end
 
 
 @class UNUserNotificationCenter;
 @class UNUserNotificationCenter;

BIN
miaomiao/plugins/jpush-phonegap-plugin/src/ios/lib/jpush-ios-3.0.6.a → miaomiao/plugins/jpush-phonegap-plugin/src/ios/lib/jpush-ios-3.0.7.a


+ 77 - 29
miaomiao/plugins/jpush-phonegap-plugin/www/JPushPlugin.js

@@ -70,26 +70,87 @@ JPushPlugin.prototype.clearLocalNotifications = function () {
   }
   }
 }
 }
 
 
-JPushPlugin.prototype.setTagsWithAlias = function (tags, alias, successCallback, errorCallback) {
-  if (tags == null) {
-    this.setAlias(alias)
-    return
-  }
-  if (alias == null) {
-    this.setTags(tags)
-    return
-  }
-  var arrayTagWithAlias = [tags]
-  arrayTagWithAlias.unshift(alias)
-  this.callNative('setTagsWithAlias', arrayTagWithAlias, successCallback, errorCallback)
+/**
+ * 设置标签。
+ * 注意:该接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
+ * 
+ * @param params = { 'sequence': number, 'tags': ['tag1', 'tag2'] }
+ */
+JPushPlugin.prototype.setTags = function (params, successCallback, errorCallback) {
+  this.callNative('setTags', [params], successCallback, errorCallback)
+}
+
+/**
+ * 新增标签。
+ * 
+ * @param params = { 'sequence': number, 'tags': ['tag1', 'tag2'] }
+ */
+JPushPlugin.prototype.addTags = function (params, successCallback, errorCallback) {
+  this.callNative('addTags', [params], successCallback, errorCallback)
+}
+
+/**
+ * 删除指定标签。
+ * 
+ * @param params = { 'sequence': number, 'tags': ['tag1', 'tag2'] }
+ */
+JPushPlugin.prototype.deleteTags = function (params, successCallback, errorCallback) {
+  this.callNative('deleteTags', [params], successCallback, errorCallback)
+}
+
+/**
+ * 清除所有标签。
+ * 
+ * @param params = { 'sequence': number }
+ */
+JPushPlugin.prototype.cleanTags = function (params, successCallback, errorCallback) {
+  this.callNative('cleanTags', [params], successCallback, errorCallback)
+}
+
+/**
+ * 查询所有标签。
+ * 
+ * @param params = { 'sequence': number }
+ */
+JPushPlugin.prototype.getAllTags = function (params, successCallback, errorCallback) {
+  this.callNative('getAllTags', [params], successCallback, errorCallback)
+}
+
+/**
+ * 查询指定标签与当前用户的绑定状态。
+ * 
+ * @param params = { 'sequence': number, 'tag': string }
+ */
+JPushPlugin.prototype.checkTagBindState = function (params, successCallback, errorCallback) {
+  this.callNative('checkTagBindState', [params], successCallback, errorCallback)
 }
 }
 
 
-JPushPlugin.prototype.setTags = function (tags, successCallback, errorCallback) {
-  this.callNative('setTags', tags, successCallback, errorCallback)
+/**
+ * 设置别名。
+ * 注意:该接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
+ * 
+ * @param params = { 'sequence': number, 'alias': string }
+ */
+JPushPlugin.prototype.setAlias = function (params, successCallback, errorCallback) {
+  this.callNative('setAlias', [params], successCallback, errorCallback)
 }
 }
 
 
-JPushPlugin.prototype.setAlias = function (alias, successCallback, errorCallback) {
-  this.callNative('setAlias', [alias], successCallback, errorCallback)
+/**
+ * 删除别名。
+ * 
+ * @param params = { 'sequence': number }
+ */
+JPushPlugin.prototype.deleteAlias = function (params, successCallback, errorCallback) {
+  this.callNative('deleteAlias', [params], successCallback, errorCallback)
+}
+
+/**
+ * 查询当前绑定的别名。
+ * 
+ * @param params = { 'sequence': number }
+ */
+JPushPlugin.prototype.getAlias = function (params, successCallback, errorCallback) {
+  this.callNative('getAlias', [params], successCallback, errorCallback)
 }
 }
 
 
 // 判断系统设置中是否对本应用启用通知。
 // 判断系统设置中是否对本应用启用通知。
@@ -236,21 +297,18 @@ JPushPlugin.prototype.receiveRegistrationIdInAndroidCallback = function (data) {
 
 
 JPushPlugin.prototype.receiveMessageInAndroidCallback = function (data) {
 JPushPlugin.prototype.receiveMessageInAndroidCallback = function (data) {
   data = JSON.stringify(data)
   data = JSON.stringify(data)
-  console.log('JPushPlugin:receiveMessageInAndroidCallback: ' + data)
   this.receiveMessage = JSON.parse(data)
   this.receiveMessage = JSON.parse(data)
   cordova.fireDocumentEvent('jpush.receiveMessage', this.receiveMessage)
   cordova.fireDocumentEvent('jpush.receiveMessage', this.receiveMessage)
 }
 }
 
 
 JPushPlugin.prototype.openNotificationInAndroidCallback = function (data) {
 JPushPlugin.prototype.openNotificationInAndroidCallback = function (data) {
   data = JSON.stringify(data)
   data = JSON.stringify(data)
-  console.log('JPushPlugin:openNotificationInAndroidCallback: ' + data)
   this.openNotification = JSON.parse(data)
   this.openNotification = JSON.parse(data)
   cordova.fireDocumentEvent('jpush.openNotification', this.openNotification)
   cordova.fireDocumentEvent('jpush.openNotification', this.openNotification)
 }
 }
 
 
 JPushPlugin.prototype.receiveNotificationInAndroidCallback = function (data) {
 JPushPlugin.prototype.receiveNotificationInAndroidCallback = function (data) {
   data = JSON.stringify(data)
   data = JSON.stringify(data)
-  console.log('JPushPlugin:receiveNotificationInAndroidCallback: ' + data)
   this.receiveNotification = JSON.parse(data)
   this.receiveNotification = JSON.parse(data)
   cordova.fireDocumentEvent('jpush.receiveNotification', this.receiveNotification)
   cordova.fireDocumentEvent('jpush.receiveNotification', this.receiveNotification)
 }
 }
@@ -293,16 +351,6 @@ JPushPlugin.prototype.reportNotificationOpened = function (msgID) {
   }
   }
 }
 }
 
 
-/**
- *是否开启统计分析功能,用于“用户使用时长”,“活跃用户”,“用户打开次数”的统计,并上报到服务器上,
- *在 Portal 上展示给开发者。
- */
-JPushPlugin.prototype.setStatisticsOpen = function (mode) {
-  if (device.platform === 'Android') {
-    this.callNative('setStatisticsOpen', [mode], null)
-  }
-}
-
 /**
 /**
  * 用于在 Android 6.0 及以上系统,申请一些权限
  * 用于在 Android 6.0 及以上系统,申请一些权限
  * 具体可看:http://docs.jpush.io/client/android_api/#android-60
  * 具体可看:http://docs.jpush.io/client/android_api/#android-60

+ 6 - 5
miaomiao/www/js/app.js

@@ -1,4 +1,4 @@
-(function () {
+(function () {
     angular.module('app', ['ionic', 'app.controllers', 'app.services', 'app.filters', 'app.directives'])
     angular.module('app', ['ionic', 'app.controllers', 'app.services', 'app.filters', 'app.directives'])
       .config(["$ionicConfigProvider", function ($ionicConfigProvider) {
       .config(["$ionicConfigProvider", function ($ionicConfigProvider) {
           //ionic全局配置
           //ionic全局配置
@@ -84,9 +84,9 @@
                   // alert("receiveMessageIniOSCallback是" + +JSON.stringify(event));
                   // alert("receiveMessageIniOSCallback是" + +JSON.stringify(event));
                };
                };
                var openNotification = function (obj) {
                var openNotification = function (obj) {
-                   window.plugins.jPushPlugin.setBadge(0); 
-                   window.plugins.jPushPlugin.resetBadge();  
-                   window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0); 
+                   // window.plugins.jPushPlugin.setBadge(0); 
+                   // window.plugins.jPushPlugin.resetBadge();  
+                   // window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0); 
 
 
                    // alert("openNotification是" +JSON.stringify(res));
                    // alert("openNotification是" +JSON.stringify(res));
                   console.log("openNotification是" +JSON.stringify(obj)+'window.appIsOpen:'+window.appIsOpen);
                   console.log("openNotification是" +JSON.stringify(obj)+'window.appIsOpen:'+window.appIsOpen);
@@ -112,8 +112,9 @@
                    window.alert('result code:' + event.resultCode + ' tags:' + event.tags + ' alias:' + event.alias);
                    window.alert('result code:' + event.resultCode + ' tags:' + event.tags + ' alias:' + event.alias);
                };
                };
                if (window.cordova) {
                if (window.cordova) {
-
                    window.plugins.jPushPlugin.setBadge(0); 
                    window.plugins.jPushPlugin.setBadge(0); 
+                   window.plugins.jPushPlugin.resetBadge();  
+                   window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0); 
                    jpushService.init({
                    jpushService.init({
                        stac: setTagsWithAliasCallback,
                        stac: setTagsWithAliasCallback,
                        oniac: openNotificationInAndroid,
                        oniac: openNotificationInAndroid,

Some files were not shown because too many files changed in this diff