Mike 7 år sedan
förälder
incheckning
316b825dc6
60 ändrade filer med 3370 tillägg och 1989 borttagningar
  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

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

+ 3 - 3
miaomiao/plugins/android.json

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

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

xqd xqd
@@ -1,6 +1,6 @@
 # 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)
 [![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)
 - 极光短信验证码(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
 
 极光开发者服务 SDK 采用了模块化的使用模式,即一个核心(JCore)+ N 种服务(JPush,JMessage...)的使用方式,方便开发者使用某一项服务或多项服务,极大的优化了多模块同时使用时功能模块重复的问题。如下图:

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

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

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

xqd xqd
@@ -2,7 +2,7 @@
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
      xmlns:android="http://schemas.android.com/apk/res/android"
      id="cordova-plugin-jcore"
-     version="1.1.8">
+     version="1.2.0">
 
     <name>JCore</name>
     <description>Cordova plugin for jcore</description>
@@ -15,18 +15,18 @@
     </engines>
 
     <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 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>
 </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

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

+ 8 - 8
miaomiao/plugins/ios.json

xqd
@@ -45,26 +45,26 @@
         "cordova-plugin-video-editor": {
             "PACKAGE_NAME": "com.miaomiao.app"
         },
+        "cordova-plugin-wechat": {
+            "WECHATAPPID": "wxc5181c0d406023e6",
+            "PACKAGE_NAME": "com.miaomiao.app"
+        },
         "cordova-plugin-whitelist": {
             "PACKAGE_NAME": "com.miaomiao.app"
         },
         "ionic-plugin-keyboard": {
             "PACKAGE_NAME": "com.miaomiao.app"
         },
+        "jpush-phonegap-plugin": {
+            "APP_KEY": "69838317211448192366f9d8",
+            "PACKAGE_NAME": "com.miaomiao.app"
+        },
         "phonegap-plugin-barcodescanner": {
             "CAMERA_USAGE_DESCRIPTION": " ",
             "PACKAGE_NAME": "com.miaomiao.app"
         },
         "cordova-plugin-jcore": {
             "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": {

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

xqd xqd xqd xqd xqd
@@ -1,7 +1,7 @@
 # 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)
-[![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)
 [![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-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
 
+> 注意:
+> - 应用的包名一定要和 APP_KEY 对应应用的包名一致,否则极光推送服务无法注册成功。
+> - 在使用 8 或以上版本的 Xcode 调试 iOS 项目时,需要先在项目配置界面的 Capabilities 中打开 Push Notifications 开关。
+
 - 通过 Cordova Plugins 安装,要求 Cordova CLI 5.0+:
 
   ```shell
@@ -28,10 +36,31 @@
 - 或下载到本地安装:
 
   ```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
 
@@ -63,15 +92,22 @@
 
 右键单击工程名 -> Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add。
 
+#### 无法获取到 Registration Id
+
+检查 AppKey 和应用包名是否对应、是否调用了 `init` 方法。
+
 #### 如何自定义通知声音?
 
 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) 插件保证应用的后台运行。
 
+#### 如何让通知内容像 iOS 一样自动换行展示?
+
+[#267](https://github.com/jpush/jpush-phonegap-plugin/issues/267)
+
 #### 关闭 App 后收不到通知
 
-Android 的推送通过长连接的方式实现,只有在连接保持的情况下才能收到通知。而有的第三方 ROM 会限制一般应用服务的自启动,也就是
-在退出应用后,应用的所有服务均被杀死,且无法自启动,所以就会收不到通知。
+Android 的推送通过长连接的方式实现,只有在保持连接的情况下才能收到通知。而有的第三方 ROM 会限制一般应用服务的自启动,也就是在退出应用后,应用的所有服务均被杀死,且无法自启动,所以就会收不到通知。
 
 目前 JPush 是做了应用互相拉起机制的,也就是当用户打开其他集成了 JPush 的应用时,你的应用也能同时收到推送消息。
 
@@ -90,10 +126,6 @@ Android 的推送通过长连接的方式实现,只有在连接保持的情况
 cordova platform update ios
 ```
 
-#### ionic 2 如何调用 API?
-
-[issue 179](https://github.com/jpush/jpush-phonegap-plugin/issues/179)
-
 #### PushConfig.plist 文件中的字段都是什么意思?
 
 - Appkey:应用标识。

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

xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -1,56 +1,11 @@
 # 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)
 
@@ -60,88 +15,15 @@ document.addEventListener('jpush.receiveRegistrationId', function (event) {
 
 #### 接口定义
 
-	window.plugins.jPushPlugin.setDebugMode(mode)
+```js
+window.JPush.setDebugMode(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
 
@@ -149,13 +31,14 @@ document.addEventListener('jpush.receiveRegistrationId', function (event) {
 
 #### 接口定义
 
-	window.plugins.jPushPlugin.reportNotificationOpened(msgID)
+```js
+window.JPush.reportNotificationOpened(msgID)
+```
 
 #### 参数说明
 
 - msgID: 收到的通知或者自定义消息的 id。
 
-
 ##  清除通知
 
 ### API - clearAllNotification
@@ -166,36 +49,46 @@ document.addEventListener('jpush.receiveRegistrationId', function (event) {
 
 #### 接口定义
 
-	window.plugins.jPushPlugin.clearAllNotification()
+```js
+window.JPush.clearAllNotification()
+```
 
 ### API - clearNotificationById
 根据通知 Id 清除通知(包括本地通知)。
 
 #### 接口定义
 
-    window.plugins.jPushPlugin.clearNotificationById(notificationId)
+```js
+window.JPush.clearNotificationById(notificationId)
+```
 
 #### 参数说明
 - notificationId:int,通知的 id。
 
 #### 代码示例
 
-    window.plugins.jPushPlugin.clearNotificationById(1)
+```js
+window.JPush.clearNotificationById(1)
+```
 
 ## 设置允许推送时间
 
 ### API - setPushTime
+
 默认情况下用户在任何时间都允许推送。即任何时候有推送下来,客户端都会收到,并展示。
 开发者可以调用此 API 来设置允许推送的时间。
 如果不在该时间段内收到消息,当前的行为是:推送到的通知会被扔掉。
 
 #### 接口定义
 
-    window.plugins.jPushPlugin.setPushTime(days, startHour, endHour)
+```js
+window.JPush.setPushTime(days, startHour, endHour)
+```
 
 #### 参数说明
+
 - days: 数组,0 表示星期天,1 表示星期一,以此类推(7天制,数组中值的范围为 0 到 6 )。
-数组的值为 null, 表示任何时间都可以收到消息和通知,数组的 size 为 0,则表示任何时间都收不到消息和通知。
+  数组的值为 null, 表示任何时间都可以收到消息和通知,数组的 size 为 0,则表示任何时间都收不到消息和通知。
 - startHour: 整形,允许推送的开始时间 (24 小时制:startHour 的范围为 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 )。
 - endMinute: 整形,静音时段的结束时间 - 分钟(范围:0~59 )。
 
-
 ##  通知栏样式定制
 
+目前 REST API 与极光控制台均已支持「大文本通知栏样」、「文本条目通知栏样式」和「大图片通知栏样式」。可直接推送对应样式
+的通知。
+
+此外也能够通过设置 Notification 的 flag 来控制通知提醒方式,具体用法可参考 [后台 REST API](https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push/#notification)。
+
 ### 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: 保存的条数。
 
-
 ##  本地通知
 ### API - addLocalNotification, removeLocalNotification, clearLocalNotifications
 本地通知 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: 设置本地通知样式。
 - content: 设置本地通知的 content。
 - title: 设置本地通知的 title。
-- notificaitonID: 设置本地通知的 ID(不要为 0)。
+- notificationID: 设置本地通知的 ID(不要为 0)。
 - 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

xqd
@@ -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

xqd xqd xqd xqd xqd xqd
@@ -1,15 +1,52 @@
 # 通用 API 说明(同时适用于 Android 和 iOS 系统)
 
-- [停止与恢复推送服务](#停止与恢复推送服务)
+- [注册成功事件](#注册成功事件)
+  - [jpush.receiveRegistrationId](#jpushreceiveregistrationid)
+- [初始化、停止与恢复推送服务](#初始化停止与恢复推送服务)
+  - [init](#init)
+  - [stopPush](#stoppush)
+  - [resumePush](#resumepush)
+  - [isPushStopped](#ispushstopped)
+- [开启 Debug 模式](#开启-debug-模式)
+  - [setDebugMode](#setdebugmode)
 - [获取 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 提供的推送服务。
 
@@ -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 后:
 
-+ 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 模式
-### API - setDebugMode
+### setDebugMode
 用于开启 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
 
-### API - getRegistrationID
+### getRegistrationID
 
 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 可以在 App 里任何地方调用。
@@ -159,201 +201,357 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
 
 举例: game, old_page, women。
 
-#### 接口定义
+> 以下方法的错误回调均包含 `sequence` 和 `code` 属性。其中 code 为错误码,具体定义可参考[官方文档](https://docs.jiguang.cn/jpush/client/Android/android_api/#_133)。
+
+### setAlias
+
+设置别名。注意这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
+
+#### 代码示例
 
 ```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
-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
 
-点击通知进入应用程序时会出发改事件。
+点击通知进入应用程序时触发
 
 #### 代码示例
 
 - 在你需要接收通知的的 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
 
-收到通知时会触发该事件。
+收到通知时触发。
 
 #### 代码示例
 
 - 在你需要接收通知的的 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
 
-收到自定义消息时触发这个事件,推荐使用事件的方式传递。
+收到自定义消息时触发,推荐使用事件的方式传递。
 
-但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
+但同时保留了 `receiveMessageIniOSCallback` 的回调函数,兼容以前的代码。
 
 #### 代码示例
 
 - 在你需要接收通知的的 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
@@ -363,17 +561,21 @@ window.plugins.jPushPlugin.setTagsWithAlias([tag1, tag2], alias1, function () {
 
 在 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

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -3,7 +3,6 @@
 - [延迟注册和启动推送通知服务](#延迟注册和启动推送通知服务)
 - [开始与停止推送服务](#开始与停止推送服务)
 - [获取 RegistrationID](#获取-registrationid)
-- [别名与标签](#别名与标签)
 - [获取 APNS 推送内容](#获取-apns-推送内容)
   - [点击推送通知](#点击推送通知)
   - [前台收到推送](#前台收到推送)
@@ -20,7 +19,6 @@
 - [获取用户推送设置](#获取用户推送设置)
 - [监听事件统一说明](#监听事件统一说明)
 
-
 ## 延迟注册和启动推送通知服务
 
 本插件默认在 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
 
@@ -39,11 +37,10 @@
 
 #### 接口定义
 
-```
-window.plugins.jPushPlugin.startJPushSDK()
+```js
+window.JPush.startJPushSDK()
 ```
 
-
 ## 开始与停止推送服务
 
 ### API - init
@@ -52,18 +49,16 @@ window.plugins.jPushPlugin.startJPushSDK()
 
 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
 
-```
 本功能是一个完全本地的状态操作。也就是说:停止推送服务的状态不会保存到服务器上。
 如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
 JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
 本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
 恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
-```
 
 #### 接口定义
 
-```
-window.plugins.jPushPlugin.init()
+```js
+window.JPush.init()
 ```
 
 ### API - stopPush
@@ -73,7 +68,9 @@ window.plugins.jPushPlugin.init()
 
 #### 接口定义
 
-  window.plugins.jPushPlugin.stopPush()
+```js
+window.JPush.stopPush()
+```
 
 ### API - resumePush
 
@@ -81,8 +78,8 @@ window.plugins.jPushPlugin.init()
 
 #### 接口定义
 
-```
-window.plugins.jPushPlugin.resumePush()
+```js
+window.JPush.resumePush()
 ```
 
 ### 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
-window.plugins.jPushPlugin.isPushStopped(function(data) {
-	  if(data > 0) {
-	    // 已关闭
-	  } else {
-	    // 已开启
-	  }
-  })
+window.JPush.isPushStopped(function(data) {
+  if(data > 0) {
+  // 已关闭
+  } else {
+  // 已开启
+  }
+})
 ```
 
 ## 获取 RegistrationID
@@ -125,7 +122,7 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
 #### 接口定义
 
 ```js
-JPushPlugin.prototype.getRegistrationID(callback)
+JPushPlugin.getRegistrationID(callback)
 ```
 
 #### 返回值
@@ -135,122 +132,50 @@ JPushPlugin.prototype.getRegistrationID(callback)
 #### 调用示例
 
 ```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 推送内容
 
 ### 点击推送通知
 
 #### event - jpush.openNotification
 
-点击通知启动或唤醒应用程序时会出发该事件
+点击通知(包括 localNotification 和 remoteNotification)启动或唤醒应用程序时会触发该事件
 
 #### 代码示例
 
 - 在你需要接收通知的的 js 文件中加入:
 
-  ```js
-  document.addEventListener("jpush.openNotification", onOpenNotification, false)
-  ```
+```js
+document.addEventListener("jpush.openNotification", onOpenNotification, false)
+```
 
 - 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 举例:
 
-  ```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
-  document.addEventListener("jpush.receiveNotification", onReceiveNotification, false)
-  ```
+```js
+document.addEventListener("jpush.receiveNotification", onReceiveNotification, false)
+```
 
 - 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 举例
 
-  ```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
-  document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false)
-  ```
+```js
+document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false)
+```
 
 - 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 举例
 
-  ```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
 
-收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
+收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 `receiveMessageIniOSCallback` 的回调函数,兼容以前的代码。
 
 #### 代码示例
 
 - 在你需要接收通知的的 js 文件中加入:
 
-  ```js
-  document.addEventListener("jpush.receiveMessage", onReceiveMessage, false)
-  ```
+```js
+document.addEventListener("jpush.receiveMessage", onReceiveMessage, false)
+```
 
 - 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 举例:
 
-  ```json
+```json
+{
+  "content":"今天去哪儿",
+  "extras":
   {
-  	"content":"今天去哪儿",
-  	"extras":
-  	{
-  		"key":"不填写没有"
-  	}
+    "key":"不填写没有"
   }
-  ```
+}
+```
 
 ## 设置Badge
 
 ### API - setBadge, resetBadge
 
 JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
-(本接口不会直接改变应用本地的角标值. 要修改本地 badege 值,使用 setApplicationIconBadgeNumber)
+(本接口不会直接改变应用本地的角标值. 要修改本地 badge 值,使用 `setApplicationIconBadgeNumber`
 
 实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。
 
 #### 接口定义
 
 ```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
-window.plugins.jPushPlugin.setBadge(5)
-window.plugins.jPushPlugin.resetBadge()
+window.JPush.setBadge(5)
+window.JPush.resetBadge()
 ```
 
 ### API - setApplicationIconBadgeNumber
@@ -414,17 +330,17 @@ window.plugins.jPushPlugin.resetBadge()
 #### 接口定义
 
 ```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
@@ -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
-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
-window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
+window.JPush.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
 ```
 
 #### 参数说明
 
-- delayTime: 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可。
+- delayTime: 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可,单位为秒
 - content: 本地推送需要显示的内容。
 - badge: 角标的数字。如果不需要改变角标传-1。数值类型或纯数字的字符型均可。
 - notificationID: 本地推送标识符,字符串。
@@ -472,7 +388,7 @@ window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, conte
 #### 代码示例
 
 ```js
-window.plugins.jPushPlugin.addLocalNotificationForIOS(24*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
+window.JPush.addLocalNotificationForIOS(24*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
 ```
 
 ### API - deleteLocalNotificationWithIdentifierKeyInIOS
@@ -482,7 +398,7 @@ window.plugins.jPushPlugin.addLocalNotificationForIOS(24*60*60, "本地推送内
 #### 接口定义
 
 ```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
@@ -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 在前台时收到」均会触发该事件。
 
+#### 代码示例
 
+- 在你需要接收通知的的 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 模式,显示更多的日志信息。
 
-建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 setLogOFF 是相反的一对。
+建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 `setLogOFF` 是相反的一对。
 
 #### 接口定义
 
-```
-window.plugins.jPushPlugin.prototype.setDebugModeFromIos()
-```
-
-#### 代码示例
-
-```
-window.plugins.jPushPlugin.setDebugModeFromIos();
+```js
+window.JPush.setDebugModeFromIos();
 ```
 
 ### 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
@@ -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: 地理位置纬度,数值类型或纯数字的字符型均可。
 - longitude: 地理位置精度,数值类型或纯数字的字符型均可。
 
-#### 代码示例
-
-```
-window.plugins.jPushPlugin.setLocation(39.26,115.25);
-```
-
 ## 设备平台判断
 
 ### API - isPlatformIOS
@@ -654,22 +564,20 @@ window.plugins.jPushPlugin.setLocation(39.26,115.25);
 
 #### 接口定义
 
-```
-window.plugins.jPushPlugin.prototype.isPlatformIOS()
+```js
+window.JPush.isPlatformIOS()
 ```
 
 #### 代码示例
 
 ```js
-if(window.plugins.jPushPlugin.isPlatformIOS()) {
-	// iOS
+if(window.JPush.isPlatformIOS()) {
+  // iOS
 } else {
-	// Android
+  // Android
 }
 ```
 
-
-
 ## iOS 10 进阶推送特性
 
 ### 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
-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
@@ -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)
 
-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_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)
 
@@ -769,15 +679,15 @@ window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId)
 
    ```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
 
-
-
 ## 监听事件统一说明
 
 可在 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

xqd
@@ -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

xqd
@@ -1,201 +1,266 @@
 <!DOCTYPE html>
 <html>
-
-<head>
+  
+  <head>
     <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() {
-            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() {
-            window.plugins.jPushPlugin.getRegistrationID(onGetRegistrationID);
+          window.JPush.getRegistrationID(onGetRegistrationID);
         };
-
+      
         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) {
-            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) {
-            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) {
-            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) {
-            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() {
+          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 {
-                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) {
-                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("jpush.openNotification", onOpenNotification, false);
         document.addEventListener("jpush.receiveNotification", onReceiveNotification, false);
         document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
-    </script>
-</head>
-
-<body>
+      </script>
+  </head>
+  
+  <body>
     <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

xqd
@@ -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

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

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

xqd
@@ -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

xqd
@@ -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

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

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

xqd
@@ -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

xqd
@@ -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

xqd
@@ -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

xqd
@@ -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

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.js.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
miaomiao/plugins/jpush-phonegap-plugin/ionic/jpush/index.metadata.json


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

xqd
@@ -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

xqd
@@ -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

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

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

xqd xqd xqd xqd xqd xqd xqd xqd
@@ -2,7 +2,7 @@
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
   xmlns:android="http://schemas.android.com/apk/res/android"
   id="jpush-phonegap-plugin"
-  version="3.2.3">
+  version="3.4.1">
 
     <name>JPush</name>
     <description>JPush for cordova plugin</description>
@@ -38,7 +38,7 @@
         <source-file src="src/ios/Plugins/AppDelegate+JPush.m" />
 
         <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" />
 
         <framework src="CFNetwork.framework" weak="true" />
@@ -57,10 +57,6 @@
         <config-file target="*JPushConfig.plist" parent="Appkey">
             <string>$APP_KEY</string>
         </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 name="android">
@@ -70,26 +66,28 @@
             </feature>
         </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="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.WRITE_SETTINGS" />
             <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" />
-            <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 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"
                 android:theme="@android:style/Theme.Translucent.NoTitleBar"
                 android:configChanges="orientation|keyboardHidden">
@@ -100,13 +98,13 @@
                 </intent-filter>
             </activity>
 
-            <!-- Rich push 核心功能 since 2.0.6-->
+            <!-- Rich push 核心功能 since 2.0.6 -->
             <activity android:name="cn.jpush.android.ui.PopWinActivity"
                 android:theme="@style/MyDialogStyle"
                 android:exported="false">
             </activity>
 
-            <!-- Required  SDK核心功能-->
+            <!-- Required SDK 核心功能 -->
             <service android:name="cn.jpush.android.service.DownloadService"
                android:enabled="true"
                android:exported="false">
@@ -146,7 +144,7 @@
                 </intent-filter>
             </receiver>
 
-            <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
+            <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的 JPush 服务相互拉起的功能。 -->
             <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
             <service android:name="cn.jpush.android.service.DaemonService"
                android:enabled="true"
@@ -157,27 +155,16 @@
                 </intent-filter>
             </service>
 
-            <!-- User defined.  For test only  用户自定义的广播接收器 -->
+            <!-- 通知广播接收器 -->
             <receiver
-              android:name="cn.jiguang.cordova.push.MyReceiver"
+              android:name="cn.jiguang.cordova.push.JPushReceiver"
               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 -->
+                    <action android:name="cn.jpush.android.intent.CONNECTION" />
                     <category android:name="$PACKAGE_NAME" />
                 </intent-filter>
             </receiver>
@@ -187,30 +174,48 @@
               android:name="cn.jpush.android.service.AlarmReceiver"
               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 -->
             <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default" />
             <meta-data android:name="JPUSH_APPKEY" android:value="$APP_KEY" />
         </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>
 </plugin>

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

xqd
@@ -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

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -35,53 +35,26 @@ import cn.jpush.android.api.BasicPushNotificationBuilder;
 import cn.jpush.android.api.JPushInterface;
 import cn.jpush.android.api.TagAliasCallback;
 import cn.jpush.android.data.JPushLocalNotification;
+import cn.jpush.android.service.JPushMessageReceiver;
 
 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 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() {
         instance = this;
@@ -89,10 +62,10 @@ public class JPushPlugin extends CordovaPlugin {
 
     @Override
     public void initialize(CordovaInterface cordova, CordovaWebView webView) {
-        Log.i(TAG, "JPush initialize.");
-
         super.initialize(cordova, webView);
-        JPushInterface.init(cordova.getActivity().getApplicationContext());
+        mContext = cordova.getActivity().getApplicationContext();
+        
+        JPushInterface.init(mContext);
 
         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) {
-        shouldCacheMsg = false;
-        Log.i(TAG, "---------------- onResume" + "-" + openNotificationAlert
-                + "-" + notificationAlert);
-        if (isStatisticsOpened && multitasking) {
-            JPushInterface.onResume(this.cordova.getActivity());
-        }
         if (openNotificationAlert != null) {
             notificationAlert = null;
             transmitNotificationOpen(openNotificationTitle, openNotificationAlert,
@@ -142,15 +101,14 @@ public class JPushPlugin extends CordovaPlugin {
         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();
         try {
             data.put("message", message);
             JSONObject jExtras = new JSONObject();
             for (Entry<String, Object> entry : extras.entrySet()) {
                 if (entry.getKey().equals("cn.jpush.android.EXTRA")) {
-                    JSONObject jo = null;
+                    JSONObject jo;
                     if (TextUtils.isEmpty((String) entry.getValue())) {
                         jo = new JSONObject();
                     } else {
@@ -176,8 +134,7 @@ public class JPushPlugin extends CordovaPlugin {
         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();
         try {
             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) {
             return;
         }
@@ -244,8 +200,7 @@ public class JPushPlugin extends CordovaPlugin {
         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) {
             return;
         }
@@ -285,10 +240,7 @@ public class JPushPlugin extends CordovaPlugin {
     @Override
     public boolean execute(final String action, final JSONArray data,
                            final CallbackContext callbackContext) throws JSONException {
-        if (!methodList.contains(action)) {
-            return false;
-        }
-        threadPool.execute(new Runnable() {
+        cordova.getThreadPool().execute(new Runnable() {
             @Override
             public void run() {
                 try {
@@ -304,7 +256,7 @@ public class JPushPlugin extends CordovaPlugin {
     }
 
     void init(JSONArray data, CallbackContext callbackContext) {
-        JPushInterface.init(this.cordova.getActivity().getApplicationContext());
+        JPushInterface.init(mContext);
     }
 
     void setDebugMode(JSONArray data, CallbackContext callbackContext) {
@@ -319,18 +271,17 @@ public class JPushPlugin extends CordovaPlugin {
     }
 
     void stopPush(JSONArray data, CallbackContext callbackContext) {
-        JPushInterface.stopPush(this.cordova.getActivity().getApplicationContext());
+        JPushInterface.stopPush(mContext);
         callbackContext.success();
     }
 
     void resumePush(JSONArray data, CallbackContext callbackContext) {
-        JPushInterface.resumePush(this.cordova.getActivity().getApplicationContext());
+        JPushInterface.resumePush(mContext);
         callbackContext.success();
     }
 
     void isPushStopped(JSONArray data, CallbackContext callbackContext) {
-        boolean isStopped = JPushInterface.isPushStopped(
-                this.cordova.getActivity().getApplicationContext());
+        boolean isStopped = JPushInterface.isPushStopped(mContext);
         if (isStopped) {
             callbackContext.success(1);
         } else {
@@ -358,7 +309,7 @@ public class JPushPlugin extends CordovaPlugin {
         }
         if (num != -1) {
             JPushInterface.setLatestNotificationNumber(
-                    this.cordova.getActivity().getApplicationContext(), num);
+                    mContext, num);
         } else {
             callbackContext.error("error num");
         }
@@ -384,13 +335,13 @@ public class JPushPlugin extends CordovaPlugin {
         } catch (JSONException e) {
             callbackContext.error("error reading hour json");
         }
-        Context context = this.cordova.getActivity().getApplicationContext();
+        Context context = mContext;
         JPushInterface.setPushTime(context, days, startHour, endHour);
         callbackContext.success();
     }
 
     void getRegistrationID(JSONArray data, CallbackContext callbackContext) {
-        Context context = this.cordova.getActivity().getApplicationContext();
+        Context context = mContext;
         String regID = JPushInterface.getRegistrationID(context);
         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) {
+        int sequence = -1;
+        Set<String> tags = new HashSet<String>();
+
         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) {
             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 {
-            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) {
             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 {
-            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) {
             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) {
@@ -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(
                 this.cordova.getActivity());
         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);
         String content = data.getString(1);
         String title = data.getString(2);
@@ -537,8 +604,7 @@ public class JPushPlugin extends CordovaPlugin {
         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);
         JPushInterface.removeLocalNotification(this.cordova.getActivity(), notificationID);
     }
@@ -547,17 +613,6 @@ public class JPushPlugin extends CordovaPlugin {
         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
@@ -634,7 +689,7 @@ public class JPushPlugin extends CordovaPlugin {
 
         String pkg = context.getPackageName();
         int uid = appInfo.uid;
-        Class appOpsClazz = null;
+        Class appOpsClazz;
 
         try {
             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

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

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

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

xqd
@@ -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

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

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

xqd
@@ -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

xqd
@@ -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

xqd xqd xqd xqd xqd xqd
@@ -9,7 +9,7 @@
  * 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>
 
@@ -22,6 +22,10 @@
 @class UNNotification;
 @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 kJPFNetworkDidSetupNotification;     // 建立连接
 extern NSString *const kJPFNetworkDidCloseNotification;     // 关闭连接
@@ -137,6 +141,7 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
  * @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
  * @param channel 发布渠道. 可选.
  * @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
+ *                     App 证书环境取决于profile provision的配置,此处建议与证书环境保持一致.
  * @param advertisingIdentifier 广告标识符(IDFA) 如果不需要使用IDFA,传nil.
  *
  * @discussion 提供SDK启动必须的参数, 来启动 SDK.
@@ -186,41 +191,102 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
  */
 + (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
-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
@@ -230,7 +296,6 @@ callbackSelector:(SEL)cbSelector
  */
 + (NSSet *)filterValidTags:(NSSet *)tags;
 
-
 ///----------------------------------------------------
 /// @name Stats 统计功能
 ///----------------------------------------------------
@@ -471,6 +536,40 @@ callbackSelector:(SEL)cbSelector
  */
 + (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
 
 @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

xqd xqd xqd
@@ -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) {
   data = JSON.stringify(data)
-  console.log('JPushPlugin:receiveMessageInAndroidCallback: ' + data)
   this.receiveMessage = JSON.parse(data)
   cordova.fireDocumentEvent('jpush.receiveMessage', this.receiveMessage)
 }
 
 JPushPlugin.prototype.openNotificationInAndroidCallback = function (data) {
   data = JSON.stringify(data)
-  console.log('JPushPlugin:openNotificationInAndroidCallback: ' + data)
   this.openNotification = JSON.parse(data)
   cordova.fireDocumentEvent('jpush.openNotification', this.openNotification)
 }
 
 JPushPlugin.prototype.receiveNotificationInAndroidCallback = function (data) {
   data = JSON.stringify(data)
-  console.log('JPushPlugin:receiveNotificationInAndroidCallback: ' + data)
   this.receiveNotification = JSON.parse(data)
   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 及以上系统,申请一些权限
  * 具体可看:http://docs.jpush.io/client/android_api/#android-60

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

xqd xqd xqd
@@ -1,4 +1,4 @@
-(function () {
+(function () {
     angular.module('app', ['ionic', 'app.controllers', 'app.services', 'app.filters', 'app.directives'])
       .config(["$ionicConfigProvider", function ($ionicConfigProvider) {
           //ionic全局配置
@@ -84,9 +84,9 @@
                   // alert("receiveMessageIniOSCallback是" + +JSON.stringify(event));
                };
                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));
                   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);
                };
                if (window.cordova) {
-
                    window.plugins.jPushPlugin.setBadge(0); 
+                   window.plugins.jPushPlugin.resetBadge();  
+                   window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0); 
                    jpushService.init({
                        stac: setTagsWithAliasCallback,
                        oniac: openNotificationInAndroid,

Vissa filer visades inte eftersom för många filer har ändrats