Compare commits

...

33 Commits

Author SHA1 Message Date
Hevin fa8700f05d Merge remote-tracking branch 'refs/remotes/origin/dev' 2016-12-06 23:53:31 +08:00
Hevin cf7a481921 Update Android SDK to 3.0.0 & npm version. 2016-12-06 23:49:22 +08:00
pikacode 7f0eb6166d Merge branch 'dev' 2016-12-06 14:33:34 +08:00
pikacode dfaf84b695 iOS - update SDK 3.0.0 2016-12-06 14:25:15 +08:00
pikacode b67b022db3 update demo 2016-12-06 13:59:33 +08:00
pikacode 309131e944 iOS - update
1.增加本地通知事件
2.更新 doc
3.fix bug
2016-12-06 13:56:27 +08:00
Hevin e153e6685c Merge remote-tracking branch 'refs/remotes/origin/dev' 2016-12-05 17:50:28 +08:00
Hevin 7ca29c3397 Update README.
增加对于 App 关闭后就收不到通知的说明。
2016-12-05 17:44:36 +08:00
Hevin 1339c0dde4 Merge remote-tracking branch 'refs/remotes/origin/dev' 2016-12-05 14:44:08 +08:00
Hevin 637624edab Update Android_detail_api.md & Optimize JPushPlugin.js 2016-12-05 14:43:08 +08:00
Hevin 3adbc003b0 Update Common_detail_api.md
规范文档格式。
2016-11-30 16:29:36 +08:00
Hevin Lau a88765e3ec Update README 2016-11-30 15:57:39 +08:00
Hevin Lau 27b9ded064 更新文档、改正语法错误、规范格式 2016-11-30 15:55:32 +08:00
pikacode 6d0dce371e iOS - update
1.更新 SDK
2.删除过期方法
3.更新过期方法
4.删除重复方法
5.发现并修复 bug
6.优化代码
7.更新 doc
2016-11-29 17:48:07 +08:00
Hevin 67e899fa72 Merge remote-tracking branch 'refs/remotes/origin/dev' 2016-11-23 10:13:15 +08:00
Hevin 1cbd1b6e9d Update README 2016-11-23 10:11:21 +08:00
Hevin 62dca46c8e Merge remote-tracking branch 'refs/remotes/origin/dev' 2016-11-04 17:04:38 +08:00
Hevin 7ce63d7cb9 Update README & npm version. 2016-11-04 17:02:56 +08:00
Hevin 54743f8bf5 Update Andoird SDK to v2.2.0 2016-11-04 12:24:26 +08:00
pikacode 27c5d80655 Merge branch 'dev' 2016-10-17 14:29:02 +08:00
pikacode fe63a9f47f iOS - update README.md
1.更新 README.md
2016-10-17 14:28:34 +08:00
pikacode 86fa5f3c23 Merge branch 'dev' 2016-10-17 14:25:58 +08:00
pikacode 1afa09cf25 iOS - update README.md
1.更新 README.md
2016-10-17 14:07:52 +08:00
Hevin Lau 4e579e6947 Merge branch 'dev' 2016-10-17 10:46:39 +08:00
pikacode ff8032e88c Merge branch 'dev' 2016-10-17 10:06:06 +08:00
Hevin Lau 9df019fb98 Update version number. 2016-10-17 10:05:51 +08:00
pikacode 29cbfc5448 Update iOS_API.md 2016-10-14 10:46:24 +08:00
pikacode 9b38c7744c Update iOS_API.md 2016-10-14 10:29:18 +08:00
pikacode cffcbc1a08 iOS - update doc 2016-10-14 10:23:48 +08:00
pikacode ca72e500d1 iOS - doc update 2016-10-14 10:15:40 +08:00
pikacode 1a8cba8e75 iOS - add APIs & doc
1.增加 API - addDismissActions
2.增加 API - addNotificationActions
3.增加封装类 NotificationService
4.更新对应文档
2016-10-13 09:49:56 +08:00
Hevin 9887672545 Merge remote-tracking branch 'refs/remotes/origin/master' into dev 2016-09-26 12:37:08 +08:00
Hevin c627166521 Update Android doc. 2016-09-26 12:34:59 +08:00
52 changed files with 1382 additions and 1091 deletions
+29 -10
View File
@@ -2,7 +2,7 @@
[![Build Status](https://travis-ci.org/jpush/jpush-phonegap-plugin.svg?branch=master)](https://travis-ci.org/jpush/jpush-phonegap-plugin) [![Build Status](https://travis-ci.org/jpush/jpush-phonegap-plugin.svg?branch=master)](https://travis-ci.org/jpush/jpush-phonegap-plugin)
[![QQ Group](https://img.shields.io/badge/QQ%20Group-413602425-red.svg)]() [![QQ Group](https://img.shields.io/badge/QQ%20Group-413602425-red.svg)]()
[![release](https://img.shields.io/badge/release-2.2.4-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases) [![release](https://img.shields.io/badge/release-2.2.7-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases)
[![platforms](https://img.shields.io/badge/platforms-iOS%7CAndroid-lightgrey.svg)](https://github.com/jpush/jpush-phonegap-plugin) [![platforms](https://img.shields.io/badge/platforms-iOS%7CAndroid-lightgrey.svg)](https://github.com/jpush/jpush-phonegap-plugin)
[![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1) [![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1)
@@ -30,9 +30,9 @@
## Usage ## Usage
### API ### API
- [公共 API](/doc/Common_detail_api.md) - [Common](/doc/Common_detail_api.md)
- [iOS API](/doc/iOS_API.md) - [iOS](/doc/iOS_API.md)
- [Android API](/doc/Android_detail_api.md) - [Android](/doc/Android_detail_api.md)
### Demo ### Demo
插件项目中包含一个简单的 Demo。若想参考,可以在 */example* 文件夹内找到并拷贝以下文件: 插件项目中包含一个简单的 Demo。若想参考,可以在 */example* 文件夹内找到并拷贝以下文件:
@@ -48,23 +48,42 @@
> 如果遇到了疑问,请优先参考 Demo 和 API 文档。若还无法解决,可访问[极光社区](http://community.jiguang.cn/)或 [Issues](https://github.com/jpush/jpush-phonegap-plugin/issues) 提问。 > 如果遇到了疑问,请优先参考 Demo 和 API 文档。若还无法解决,可访问[极光社区](http://community.jiguang.cn/)或 [Issues](https://github.com/jpush/jpush-phonegap-plugin/issues) 提问。
### Android ### Android
#### 在 Eclipse 中 import 工程之后出现:*Type CallbackContext cannot be resolved to a type* #### 在 Eclipse 中 import 工程之后出现:*Type CallbackContext cannot be resolved to a type*
右键单击工程名 -> Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add。 右键单击工程名 -> Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add。
#### 关闭 App 后收不到通知
Android 的推送通过长连接的方式实现,只有在连接保持的情况下才能收到通知。而有的第三方 ROM 会限制一般应用服务的自启动,也就是
在退出应用后,应用的所有服务均被杀死,且无法自启动,所以就会收不到通知。
目前 JPush 是做了应用互相拉起机制的,也就是当用户打开其他集成了 JPush 的应用时,你的应用也能同时收到推送消息。
如果你的应用希望随时都能收到推送,官方推荐是通过文案的方式引导用户在设置中允许你的应用能够自启动,常见机型的设置方法可以参考[这里](https://docs.jiguang.cn/jpush/client/Android/android_faq/#_2)。
或者自己实现应用保活,网上有很多相关文章(不推荐)。
> 为什么 QQ、微信之类的应用退出后还能够收到通知?因为这些大厂应用,手机厂商默认都会加入自启动白名单中,也不会在应用退出后杀死它们的相关服务。
如果你多加留意,就会发现非大厂的应用如果你一段时间不用都是收不到推送的。
### iOS ### iOS
#### PushConfig.plist 文件中的字段都是什么意思? #### PushConfig.plist 文件中的字段都是什么意思?
- APP_KEY:应用标识。 - Appkey:应用标识。
- CHANNEL:渠道标识。 - Channel:渠道标识。
- IsProduction:是否生产环境。 - IsProduction:是否生产环境。
- IsIDFA:是否使用 IDFA 启动 SDK。 - IsIDFA:是否使用 IDFA 启动 SDK。
#### 收不到推送了。 #### 刚集成完插件收不到推送怎么办?
请首先按照正确方式再次配置证书、描述文件,具体可参考 [iOS 证书设置指南](http://docs.jpush.io/client/ios_tutorials/#ios_1)。 请首先按照正确方式再次配置证书、描述文件,具体可参考 [iOS 证书设置指南](https://docs.jiguang.cn/jpush/client/iOS/ios_cer_guide/)。
#### iOS 集成插件白屏、或无法启动插件、或打包报错无法找到需要引入的文件怎么办?
按照以下步骤逐个尝试:
- 升级至 Xcode 8
- 先删除插件、再重装插件
- 先使用 `cordova platform add ios`,后使用 `cordova plugin add`
## Support ## Support
- QQ 群:413602425 - QQ 群:413602425
- [JPush 官网文档](http://docs.jpush.io/) - [JPush 官网文档](https://docs.jiguang.cn/jpush/guideline/intro/)
- [极光社区](http://community.jiguang.cn/) - [极光社区](http://community.jiguang.cn/)
## Contribute ## Contribute
+14 -1
View File
@@ -157,6 +157,19 @@
window.plugins.jPushPlugin.clearAllNotification() window.plugins.jPushPlugin.clearAllNotification()
### API - clearNotificationById
根据通知 Id 清除通知(包括本地通知)。
#### 接口定义
window.plugins.jPushPlugin.clearNotificationById(notificationId)
#### 参数说明
- notificationIdint,通知的 id。
#### 代码示例
window.plugins.jPushPlugin.clearNotificationById(1)
## 设置允许推送时间 ## 设置允许推送时间
@@ -201,7 +214,7 @@
当用户需要定制默认的通知栏样式时,则可调用此方法。 当用户需要定制默认的通知栏样式时,则可调用此方法。
需要用户去自定义 ../JPushPlugin.java 中的同名方法代码,然后再在 js 端 调用该方法。 需要用户去自定义 ../JPushPlugin.java 中的同名方法代码,然后再在 js 端 调用该方法。
具体用法可参考[官方文档](http://docs.jpush.io/client/android_tutorials/#_11)。 具体用法可参考[官方文档](http://docs.jiguang.cn/jpush/client/Android/android_api/#api_6)。
JPush SDK 提供了 2 个用于定制通知栏样式的构建类: JPush SDK 提供了 2 个用于定制通知栏样式的构建类:
+46 -75
View File
@@ -17,11 +17,9 @@
本功能是一个完全本地的状态操作,也就是说:停止推送服务的状态不会保存到服务器上。 本功能是一个完全本地的状态操作,也就是说:停止推送服务的状态不会保存到服务器上。
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据, 如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,JPush SDK 会恢复正常的默认行为(因为保存在本地的状态数据被清除掉了)。
JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息, 本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
#### 接口定义 #### 接口定义
@@ -41,8 +39,7 @@ JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数
+ iOS 平台: + iOS 平台:
+ 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。 + 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。**建议设置一个 UI 界面, 提醒用户在 设置-通知 中关闭推送服务**。
+ 推荐:设置一个 UI 界面, 提醒用户在 设置-通知 中关闭推送服务。
#### 接口定义 #### 接口定义
@@ -59,7 +56,7 @@ JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数
+ iOS 平台: + iOS 平台:
+ 重新去APNS注册。 + 重新去 APNS 注册。
#### 接口定义 #### 接口定义
@@ -78,7 +75,7 @@ JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.isPushStopped(callback) window.plugins.jPushPlugin.isPushStopped(callback)
#### 参数说明 #### 参数说明
@@ -116,14 +113,9 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.getRegistrationID(onGetRegistradionID); window.plugins.jPushPlugin.getRegistrationID(function(data) {
var onGetRegistradionID = function(data) { console.log("JPushPlugin:registrationID is " + data)
try { })
console.log("JPushPlugin:registrationID is " + data);
} catch(exception) {
console.log(exception);
}
}
## 设置别名与标签 ## 设置别名与标签
@@ -143,7 +135,7 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端 API 会同时给这多个用户发送消息。 系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端 API 会同时给这多个用户发送消息。
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时,发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端 API 发通知到客户端提醒用户。 举例:在一个用户要登录的游戏中,可能设置别名为 userId。游戏运营时,发现该用户 3 天没有玩游戏了,则根据 userId 调用服务器端 API 发通知到客户端提醒用户。
**标签 Tag**: **标签 Tag**:
@@ -181,18 +173,13 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果: 函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果:
document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false); document.addEventListener("jpush.setTagsWithAlias", function(event) {
var onTagsWithAlias = function(event) { console.log("onTagsWithAlias")
try { var result = "result code:" + event.resultCode + " "
console.log("onTagsWithAlias"); result += "tags:" + event.tags + " "
var result = "result code:" + event.resultCode + " "; result += "alias:" + event.alias + " "
result += "tags:" + event.tags + " "; $("#tagAliasResult").html(result)
result += "alias:" + event.alias + " "; }, false)
$("#tagAliasResult").html(result);
} catch(exception) {
console.log(exception);
}
}
#### 错误码定义 #### 错误码定义
@@ -219,19 +206,16 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.openNotification", onOpenNotification, false); document.addEventListener("jpush.openNotification", function (event) {
var alertContent
if(device.platform == "Android") {
alertContent = event.alert
} else {
lertContent = event.aps.alert
}
}, false)
- onOpenNotification 需要这样写: > ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.openNotification,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
var alertContent;
if(device.platform == "Android") {
alertContent = event.alert;
} else {
alertContent = event.aps.alert;
}
alert("open Notificaiton:" + alertContent);
ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.openNotification,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
+ Android: + Android:
@@ -273,19 +257,18 @@ ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.o
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false); 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)
- onReceiveNotification 需要这样写: > ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveNotification,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
var alertContent;
if(device.platform == "Android") {
alertContent = event.alert;
} else {
alertContent = event.aps.alert;
}
alert("open Notificaiton:" + alertContent);
ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveNotification,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
+ Android: + Android:
@@ -330,26 +313,16 @@ ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.r
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false); document.addEventListener("jpush.receiveMessage", function (event) {
var message
if(device.platform == "Android") {
message = event.message;
} else {
message = event.content;
}
}, false)
- onReceiveMessage 需要这样写: > ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveMessage,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
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);
}
}
ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveMessage
直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
+ Android: + Android:
@@ -370,7 +343,6 @@ ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.r
"extras":{"key":"不填写没有"} "extras":{"key":"不填写没有"}
} }
## 判断系统设置中是否允许当前应用推送 ## 判断系统设置中是否允许当前应用推送
### API - getUserNotificationSettings ### API - getUserNotificationSettings
判断系统设置中是否允许当前应用推送。 判断系统设置中是否允许当前应用推送。
@@ -392,5 +364,4 @@ ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.r
// 系统设置中已关闭应用推送。 // 系统设置中已关闭应用推送。
} else if(result > 0) { } else if(result > 0) {
// 系统设置中打开了应用推送。 // 系统设置中打开了应用推送。
} })
});
+478 -191
View File
@@ -4,22 +4,26 @@
- [获取 RegistrationID](#获取-registrationid) - [获取 RegistrationID](#获取-registrationid)
- [别名与标签](#别名与标签) - [别名与标签](#别名与标签)
- [获取 APNS 推送内容](#获取-apns-推送内容) - [获取 APNS 推送内容](#获取-apns-推送内容)
- [点击推送通知](#点击推送通知) - [点击推送通知](#点击推送通知)
- [前台收到推送](#前台收到推送) - [前台收到推送](#前台收到推送)
- [后台收到推送](#后台收到推送) - [后台收到推送](#后台收到推送)
- [获取自定义消息内容](#获取自定义消息内容) - [获取自定义消息内容](#获取自定义消息内容)
- [设置Badge](#设置badge) - [设置Badge](#设置badge)
- [本地通知](#本地通知) - [本地通知](#本地通知)
- [获取本地通知内容](#获取本地通知内容)
- [页面的统计](#页面的统计) - [页面的统计](#页面的统计)
- [日志等级设置](#日志等级设置) - [日志等级设置](#日志等级设置)
- [地理位置上报](#地理位置上报) - [地理位置上报](#地理位置上报)
- [设备平台判断](#设备平台判断) - [设备平台判断](#设备平台判断)
- [iOS 10 进阶推送特性](#ios-10-进阶推送特性)
- [获取用户推送设置](#获取用户推送设置)
- [监听事件统一说明](#监听事件统一说明)
## 开始与停止推送服务 ## 开始与停止推送服务
### API - init ### API - init
调用此 API,用来开启 JPush SDK 提供的推送服务。 调用此 API用来开启 JPush SDK 提供的推送服务。
开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
@@ -33,8 +37,9 @@ JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.init() ```
window.plugins.jPushPlugin.init()
```
### API - stopPush ### API - stopPush
@@ -43,8 +48,7 @@ JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.stopPush() window.plugins.jPushPlugin.stopPush()
### API - resumePush ### API - resumePush
@@ -52,7 +56,10 @@ JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.resumePush() ```
window.plugins.jPushPlugin.resumePush()
```
### API - isPushStopped ### API - isPushStopped
@@ -61,23 +68,25 @@ iOS平台,检查推送服务是否停止。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.isPushStopped(callback) ```
window.plugins.jPushPlugin.isPushStopped(callback)
```
#### 参数说明 #### 参数说明
- callback 回调函数,用来通知 JPush 的推送服务是否开启。 - callback 回调函数,用来通知 JPush 的推送服务是否开启。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.isPushStopped(callback)
var callback = function(data) {
if(data > 0) {
// 已关闭
} else {
// 已开启
}
}
```js
window.plugins.jPushPlugin.isPushStopped(function(data) {
if(data > 0) {
// 已关闭
} else {
// 已开启
}
})
```
## 获取 RegistrationID ## 获取 RegistrationID
@@ -92,7 +101,9 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 接口定义 #### 接口定义
JPushPlugin.prototype.getRegistrationID(callback) ```js
JPushPlugin.prototype.getRegistrationID(callback)
```
#### 返回值 #### 返回值
@@ -100,14 +111,13 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 调用示例 #### 调用示例
window.plugins.jPushPlugin.getRegistrationID(onGetRegistradionID); ```js
var onGetRegistradionID = function(data) { window.plugins.jPushPlugin.getRegistrationID(function(data) {
try { console.log("JPushPlugin:registrationID is " + data)
console.log("JPushPlugin:registrationID is " + data); })
} catch(exception) { ```
console.log(exception);
}
}
## 别名与标签 ## 别名与标签
@@ -141,57 +151,57 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 接口定义 #### 接口定义
JPushPlugin.prototype.setTagsWithAlias(tags, alias) ```
JPushPlugin.prototype.setTags(tags) JPushPlugin.prototype.setTagsWithAlias(tags, alias)
JPushPlugin.prototype.setAlias(alias) JPushPlugin.prototype.setTags(tags)
JPushPlugin.prototype.setAlias(alias)
```
#### 参数说明 #### 参数说明
* tags:
* 参数类型为数组。 - tags:
* nil 此次调用不设置此值 - 参数类型为数组
* 空集合表示取消之前的设置 - nil 此次调用不设置此值
* 每次调用至少设置一个 tag,覆盖之前的设置,不是新增 - 空集合表示取消之前的设置
* 有效的标签组成:字母(区分大小写)、数字、下划线、汉字 - 每次调用至少设置一个 tag,覆盖之前的设置,不是新增
* 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag,但总长度不得超过1K字节(判断长度需采用UTF-8编码) - 有效的标签组成:字母(区分大小写)、数字、下划线、汉字
* 单个设备最多支持设置 100 个 tag,App 全局 tag 数量无限制 - 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag,但总长度不得超过1K字节(判断长度需采用UTF-8编码)
* alias: - 单个设备最多支持设置 100 个 tag,App 全局 tag 数量无限制。
* 参数类型为字符串。 - alias:
* nil 此次调用不设置此值 - 参数类型为字符串
* 空字符串 ("")表示取消之前的设置 - nil 此次调用不设置此值
* 有效的别名组成:字母(区分大小写)、数字、下划线、汉字 - 空字符串 ("")表示取消之前的设置
* 限制:alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码) - 有效的别名组成:字母(区分大小写)、数字、下划线、汉字
- 限制:alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
#### 返回值说明 #### 返回值说明
函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果。 函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果。
document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false); ```js
var onTagsWithAlias = function(event) { var onTagsWithAlias = function(event) {
try { console.log("onTagsWithAlias")
console.log("onTagsWithAlias"); var result = "result code:"+event.resultCode + " "
var result = "result code:"+event.resultCode + " "; result += "tags:" + event.tags + " "
result += "tags:" + event.tags + " "; result += "alias:" + event.alias + " "
result += "alias:" + event.alias + " "; $("#tagAliasResult").html(result)
$("#tagAliasResult").html(result); }
} catch(exception) { document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false)
console.log(exception) ```
}
}
#### 错误码定义 #### 错误码定义
|Code|描述 |详细解释 | | Code | 描述 | 详细解释 |
|----|:----------------------------------------|:--------| | ---- | :-------------------------- | :-------------------------------- |
|6001|无效的设置,tag/alias 不应参数都为 null | | | 6001 | 无效的设置,tag/alias 不应参数都为 null | |
|6002|设置超时 |建议重试。| | 6002 | 设置超时 | 建议重试。 |
|6003|alias 字符串不合法 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。| | 6003 | alias 字符串不合法 | 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。 |
|6004|alias超长 |最多 40个字节 中文 UTF-8 是 3 个字节。| | 6004 | alias超长 | 最多 40个字节 中文 UTF-8 是 3 个字节。 |
|6005|某一个 tag 字符串不合法 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。| | 6005 | 某一个 tag 字符串不合法 | 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。 |
|6006|某一个 tag 超长 |一个 tag 最多 40个字节 中文 UTF-8 是 3 个字节。| | 6006 | 某一个 tag 超长 | 一个 tag 最多 40个字节 中文 UTF-8 是 3 个字节。 |
|6007|tags 数量超出限制(最多 100 个) |这是一台设备的限制。一个应用全局的标签数量无限制。| | 6007 | tags 数量超出限制(最多 100 个) | 这是一台设备的限制。一个应用全局的标签数量无限制。 |
|6008|tag/alias 超出总长度限制 |总长度最多 1K 字节。| | 6008 | tag/alias 超出总长度限制 | 总长度最多 1K 字节。 |
|6011|10s内设置tag或alias大于3次 |短时间内操作过于频繁。| | 6011 | 10s内设置tag或alias大于3次 | 短时间内操作过于频繁。 |
## 获取 APNS 推送内容 ## 获取 APNS 推送内容
@@ -205,28 +215,34 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.openNotification", onOpenNotification, false); ```js
document.addEventListener("jpush.openNotification", onOpenNotification, false)
```
- onOpenNotification 需要这样写: - onOpenNotification 需要这样写:
var onOpenNotification = function(event) { ```js
var alertContent; var onOpenNotification = function(event) {
alertContent = event.aps.alert; var alertContent
alert("open Notificaiton:" + alertContent); alertContent = event.aps.alert
} alert("open Notificaiton:" + alertContent)
}
```
- event 举例: - event 举例:
{ ```json
"aps":{ {
"badge":1, "aps":{
"sound":"default", "badge":1,
"alert":"今天去哪儿" "sound":"default",
}, "alert":"今天去哪儿"
"key1":"value1", },
"key2":"value2", "key1":"value1",
"_j_msgid":154604475 "key2":"value2",
} "_j_msgid":154604475
}
```
### 前台收到推送 ### 前台收到推送
@@ -238,140 +254,150 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false); ```js
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false)
```
- onReceiveNotification 需要这样写: - onReceiveNotification 需要这样写:
var onReceiveNotification = function(event) { ```js
var alertContent; var onReceiveNotification = function(event) {
alertContent = event.aps.alert; var alertContent
alert("open Notificaiton:" + alertContent); alertContent = event.aps.alert
} alert("open Notificaiton:" + alertContent)
}
```
- event 举例 - event 举例
{ ```json
"aps":{ {
"badge":1, "aps":{
"sound":"default", "badge":1,
"alert":"今天去哪儿" "sound":"default",
}, "alert":"今天去哪儿"
"key1":"value1", },
"key2":"value2", "key1":"value1",
"_j_msgid":154604475 "key2":"value2",
} "_j_msgid":154604475
}
```
### 后台收到推送 ### 后台收到推送
#### event - jpush.backgroundNotification #### event - jpush.backgroundNotification
应用程序处于后台时收到推送会触发该事件,可以在后台执行一段代码。具体配置参考 [iOS 7 Background Remote Notification](http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification) 应用程序处于后台时收到推送会触发该事件,可以在后台执行一段代码。具体配置参考 [iOS 7 Background Remote Notification](https://docs.jiguang.cn/jpush/client/iOS/ios_new_fetures/#ios-7-background-remote-notification)
#### 代码示例 #### 代码示例
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false); ```js
document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false)
```
- onBackgroundNotification 需要这样写: - onBackgroundNotification 需要这样写:
var onBackgroundNotification = function(event) { ```js
var alertContent; var onBackgroundNotification = function(event) {
alertContent = event.aps.alert; var alertContent
alert("open Notificaiton:" + alertContent); alertContent = event.aps.alert
} alert("open Notificaiton:" + alertContent)
}
```
+ event 举例
{ - event 举例
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
#### API - receiveMessageIniOSCallback ```json
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
```
用于 iOS 收到应用内消息的回调函数(请注意和通知的区别),该函数不需要主动调用
不推荐使用回调函数
##### 接口定义
JPushPlugin.prototype.receiveMessageIniOSCallback(data)
##### 参数说明
- data: 是一个 js 字符串使用如下代码解析,js 具体 key 根据应用内消息来确定:
var bToObj = JSON.parse(data);
## 获取自定义消息内容 ## 获取自定义消息内容
### event - jpush.receiveMessage ### event - jpush.receiveMessage
收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。 收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
#### 代码示例 #### 代码示例
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false); ```js
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false)
```
- onReceiveMessage 需要这样写: - onReceiveMessage 需要这样写:
var onReceiveMessage = function(event) { ```js
try{ var onReceiveMessage = function(event) {
var message; try {
message = event.content; var message = event.content
$("#messageResult").html(message); $("#messageResult").html(message)
}catch(exception) { } catch(exception) {
console.log("JPushPlugin:onReceiveMessage-->" + exception); console.log("JPushPlugin:onReceiveMessage-->" + exception);
} }
} }
```
- event 举例: - event 举例:
{ ```json
"content":"今天去哪儿", {
"extras": "content":"今天去哪儿",
{ "extras":
"key":"不填写没有" {
} "key":"不填写没有"
} }
}
```
## 设置Badge ## 设置Badge
### API - setBadge, resetBadge ### API - setBadge, resetBadge
JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器, JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
(本接口不会直接改变应用本地的角标值. 要修改本地 badege 值,使用 setApplicationIconBadgeNumber (本接口不会直接改变应用本地的角标值. 要修改本地 badege 值,使用 setApplicationIconBadgeNumber
实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。 实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.setBadge(value) ```js
window.plugins.jPushPlugin.prototype.reSetBadge() window.plugins.jPushPlugin.prototype.setBadge(value)
window.plugins.jPushPlugin.prototype.reSetBadge()
```
resetBadge相当于setBadge(0)。 resetBadge 相当于 setBadge(0)。
#### 参数说明 #### 参数说明
value 取值范围:[0,99999]。 value 取值范围:[0,99999]。
#### 返回值 #### 返回值
无,控制台会有 log 打印设置结果。 无,控制台会有 log 打印设置结果。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.setBadge(5); ```js
window.plugins.jPushPlugin.reSetBadge(); window.plugins.jPushPlugin.setBadge(5)
window.plugins.jPushPlugin.reSetBadge()
```
### API - setApplicationIconBadgeNumber ### API - setApplicationIconBadgeNumber
@@ -379,7 +405,9 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.setApplicationIconBadgeNumber(badge) ```js
window.plugins.jPushPlugin.prototype.setApplicationIconBadgeNumber(badge)
```
#### 参数说明 #### 参数说明
@@ -387,7 +415,9 @@ value 取值范围:[0,99999]。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0); ```
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0)
```
### API - getApplicationIconBadgeNumber ### API - getApplicationIconBadgeNumber
@@ -395,7 +425,9 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.getApplicationIconBadgeNumber(callback) ```
window.plugins.jPushPlugin.prototype.getApplicationIconBadgeNumber(callback)
```
#### 参数说明 #### 参数说明
@@ -403,10 +435,11 @@ value 取值范围:[0,99999]。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data) { ```js
console.log(data); window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data) {
}); console.log(data)
})
```
## 本地通知 ## 本地通知
@@ -416,7 +449,9 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras) ```js
window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
```
#### 参数说明 #### 参数说明
@@ -428,7 +463,9 @@ value 取值范围:[0,99999]。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.addLocalNotificationForIOS(6*60*60, "本地推送内容", 1, "notiId", {"key":"value"}); ```js
window.plugins.jPushPlugin.addLocalNotificationForIOS(24*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
```
### API - deleteLocalNotificationWithIdentifierKeyInIOS ### API - deleteLocalNotificationWithIdentifierKeyInIOS
@@ -436,7 +473,9 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey) ```js
window.plugins.jPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey)
```
#### 参数说明 #### 参数说明
@@ -444,7 +483,9 @@ value 取值范围:[0,99999]。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS("identifier"); ```
window.plugins.jPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS("identifier")
```
### API - clearAllLocalNotifications ### API - clearAllLocalNotifications
@@ -452,11 +493,36 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.clearAllLocalNotifications() ```
window.plugins.jPushPlugin.prototype.clearAllLocalNotifications()
```
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.clearAllLocalNotifications(); ```
window.plugins.jPushPlugin.clearAllLocalNotifications()
```
## 获取本地通知内容
### iOS 10 before 收到本地通知
监听 `jpush.receiveLocalNotification` 事件获取,「App 在后台时点击通知横幅」或「App 在前台时收到」均会触发该事件。
### iOS 10 收到本地通知
监听 [jpush.receiveNotification](#前台收到推送)、[jpush.openNotification](点击推送通知),获取推送内容后,通过获取到的 `__JPUSHNotificationKey` 字段([本地通知](#本地通知) 设置的 `notificationID`)来判断是本地通知,并处理。
### 点击本地通知横幅启动 App
监听 `jpush.startLocalNotification` 事件。
## 页面的统计 ## 页面的统计
@@ -468,9 +534,11 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.startLogPageView(pageName) ```
window.plugins.jPushPlugin.prototype.stopLogPageView(pageName) window.plugins.jPushPlugin.prototype.startLogPageView(pageName)
window.plugins.jPushPlugin.prototype.beginLogPageView(pageName, duration) window.plugins.jPushPlugin.prototype.stopLogPageView(pageName)
window.plugins.jPushPlugin.prototype.beginLogPageView(pageName, duration)
```
#### 参数说明 #### 参数说明
@@ -478,16 +546,18 @@ value 取值范围:[0,99999]。
- duration: 自定义的页面时间 - duration: 自定义的页面时间
#### 调用说明 #### 调用说明
应在所有的需要统计得页面得 viewWillAppear 和 viewWillDisappear 加入 startLogPageView 和 stopLogPageView 来统计当前页面的停留时间。 应在所有的需要统计得页面得 viewWillAppear 和 viewWillDisappear 加入 startLogPageView 和 stopLogPageView 来统计当前页面的停留时间。
或者直接使用 beginLogPageView 来自定义加入页面和时间信息。 或者直接使用 beginLogPageView 来自定义加入页面和时间信息。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.beginLogPageView("newPage", 5); ```
window.plugins.jPushPlugin.startLogPageView("onePage"); window.plugins.jPushPlugin.beginLogPageView("newPage", 5);
window.plugins.jPushPlugin.stopLogPageView("onePage"); window.plugins.jPushPlugin.startLogPageView("onePage");
window.plugins.jPushPlugin.stopLogPageView("onePage");
```
## 日志等级设置 ## 日志等级设置
@@ -499,11 +569,15 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.setDebugModeFromIos() ```
window.plugins.jPushPlugin.prototype.setDebugModeFromIos()
```
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.setDebugModeFromIos(); ```
window.plugins.jPushPlugin.setDebugModeFromIos();
```
### API - setLogOFF ### API - setLogOFF
@@ -513,11 +587,15 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.setLogOFF() ```
window.plugins.jPushPlugin.prototype.setLogOFF()
```
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.setLogOFF(); ```
window.plugins.jPushPlugin.setLogOFF();
```
### API - setCrashLogON ### API - setCrashLogON
@@ -527,11 +605,15 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.setCrashLogON() ```
window.plugins.jPushPlugin.prototype.setCrashLogON()
```
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.setCrashLogON(); ```
window.plugins.jPushPlugin.setCrashLogON();
```
## 地理位置上报 ## 地理位置上报
@@ -541,7 +623,9 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.setLocation(latitude, longitude) ```
window.plugins.jPushPlugin.prototype.setLocation(latitude, longitude)
```
#### 参数说明 #### 参数说明
@@ -550,7 +634,9 @@ value 取值范围:[0,99999]。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.setLocation(39.26,115.25); ```
window.plugins.jPushPlugin.setLocation(39.26,115.25);
```
## 设备平台判断 ## 设备平台判断
@@ -560,12 +646,213 @@ value 取值范围:[0,99999]。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.prototype.isPlatformIOS() ```
window.plugins.jPushPlugin.prototype.isPlatformIOS()
```
#### 代码示例 #### 代码示例
if(window.plugins.jPushPlugin.isPlatformIOS()) { ```js
// iOS if(window.plugins.jPushPlugin.isPlatformIOS()) {
} else { // iOS
// Android } else {
} // Android
}
```
## iOS 10 进阶推送特性
### API - addDismissActions
添加通知操作,是展示在锁屏推送侧滑界面、通知中心推送侧滑界面、推送横幅下拉界面(iPhone 6s before)的按钮操作。
一条推送最多只能展示 2 个操作(在锁屏推送侧滑界面、通知中心推送侧滑界面会额外自动展示一个「清除」操作),超出的操作不会被展示。
建议在 App 初次启动时立刻调用本 API。
效果如下图所示:
![DismissActions_00](res/DismissActions_00.PNG)
#### 接口定义
```
window.plugins.jPushPlugin.prototype.addDismissActions(actions, categoryId);
```
#### 参数说明
- actions:包含最多 2 个字典的数组,多余的字典无效,所有字段均为字符串,字段如下:
- title:必填,标题。
- identifier:必填,标识,获取 APNS 推送内容的时候可以通过该字段判断点击的是推送条目还是某项操作。
- option:必填,取值如下:
- UNNotificationActionOptionNone = 0
- UNNotificationActionOptionAuthenticationRequired = (1 << 0), Whether this action should require unlocking before being performed.
- UNNotificationActionOptionDestructive = (1 << 1), Whether this action should be indicated as destructive.
- UNNotificationActionOptionForeground = (1 << 2), Whether this action should cause the application to launch in the foreground.
- type:可选,值为 "textInput" 时,会创建一个可快速回复的操作。
- textInputButtonTitle:可选,快捷回复的回复按键标题。
- textInputPlaceholder:可选,快捷回复输入框占位符。
- categoryIdcategory id,用于标记这一组操作,推送时的 `payload` 添加 `category` 字段(在极光控制台 - 发送通知 - 可选设置 - category ),即可展示相应的这一组操作。例:id1 对应 [操作A,操作B],id2 对应 [操作A, 操作C]。
#### 代码示例
```js
window.plugins.jPushPlugin.addDismissActions([{"title":"t1", "identifier":"id1", "option":"0"}, {"title":"t2", "identifier":"id2", "option":"3", "type":"textInput", "textInputButtonTitle":"回复", "textInputPlaceholder":"点此输入回复内容"}], "categoryId_t1_t2");
```
### API - addNotificationActions
轻触推送横幅,展示的更多操作。
iPhone 6s 及以后设备且 iOS 9 以后系统支持 3d-touch。
建议在 App 初次启动时立刻调用本 API。
效果如下图所示:
![NotificationActions_00](res/NotificationActions_00.png)
#### 接口定义
```
window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId)
```
#### 参数说明
参数同 API - addDismissActions
#### 代码示例
代码示例同 API - addDismissActions
### Media Attachments
(iOS 10)在手机锁屏界面和通知中心界面的推送条目、应用菜单界面的推送横幅上,展示图片、gif、audio、video 等富媒体。效果如下图所示:
![MediaAttachments_00](res/MediaAttachments_00.gif)
#### 配置方法
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)
![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` 文件,全部复制替换对应文件内代码。
4. 在 Xcode 中拖拽图片、gif、audio、video 等资源文件至 `jpushNotificationService` 文件夹目录下,弹出菜单选择如下: ![MediaAttachments_06](res/MediaAttachments_06.png)
5. 在极光控制台 - 发送通知 - 可选设置 - mutable-content 打勾。
6. 添加附加字段, key 为 `JPushPluginAttachment` value 为资源名称如 `aPic.png`,该资源必须在第 4 步中已经添加至工程,且文件名和拓展名完全对应。5、6 如下图所示:
![MediaAttachments_05](res/MediaAttachments_05.png)
另,5、6 亦可通过服务端自定义的 payload 实现,如下所示:
```json
{
aps:{
alert:{...},
mutable-content:1 //必须
}
JPushPluginAttachment:aPic.png //必须
}
```
7. 立即发送。
## 获取用户推送设置
### API - getUserNotificationSettings
获取用户对本 App 的推送设置情况。
#### 接口定义
```
window.plugins.jPushPlugin.prototype.getUserNotificationSettings(callback)
```
#### 返回值
- iOS 10 before
- UIRemoteNotificationTypeNone = 0
- UIRemoteNotificationTypeBadge = 1 << 0
- UIRemoteNotificationTypeSound = 1 << 1
- UIRemoteNotificationTypeAlert = 1 << 2
- UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3
- iOS 10 after
- 字段 authorizationStatus,取值如下:
- UNAuthorizationStatusNotDetermined = 0, The user has not yet made a choice regarding whether the application may post user notifications.
- UNAuthorizationStatusDenied = 1, The application is not authorized to post user notifications.
- UNAuthorizationStatusAuthorized = 2, The application is authorized to post user notifications.
- 字段 soundSetting、badgeSetting、alertSetting、notificationCenterSetting、lockScreenSetting、carPlaySetting,取值如下:
- UNNotificationSettingNotSupported = 0, The application does not support this notification type.
- UNNotificationSettingDisabled = 1, The notification setting is turned off.
- UNNotificationSettingEnabled = 2, The notification setting is turned on.
- 字段 alertStyle,取值如下:
- UNAlertStyleNone = 0
- UNAlertStyleBanner = 1
- UNAlertStyleAlert = 2
## 监听事件统一说明
可在 js 监听全部事件如下:
##### jpush.receiveNotification
> [前台收到远程通知](#前台收到推送)
>
> [iOS 10 前台收到本地通知](#ios-10-收到本地通知)
##### jpush.openNotification
> [点击远程通知横幅使 App「进入前台」或「启动」](#点击推送通知)
>
> [iOS 10 点击本地通知横幅使 App「进入前台」或「启动」](#ios-10-收到本地通知)
##### jpush.backgroundNotification
> [iOS 7 以后后台收到远程通知](#后台收到推送)
##### jpush.setTagsWithAlias
> [设置标签别名回调](#返回值说明)
##### jpush.receiveMessage
> [获取自定义消息内容](#获取自定义消息内容)
##### jpush.startLocalNotification
> [点击本地通知横幅启动 App](#点击本地通知横幅启动-app)
##### jpush.receiveLocalNotification
> [iOS 10 before 收到本地通知](#ios-10-before-收到本地通知)
+31 -25
View File
@@ -1,35 +1,41 @@
## iOS 手动安装 ## iOS 手动安装
- 下载 JPush PhoneGap Plugin 插件,并解压 > **不建议使用手动安装,请参照 README.md 进行自动安装。**
- 将 [/src/ios](/src/ios) 文件夹及内容在 xcode 中拖到你的工程里,并配置 [/src/ios/PushConfig.plist](/src/ios/PushConfig.plist) 中相应参数:
APP_KEY 应用标识
CHANNEL 渠道标识
IsProduction:是否生产环境
IsIDFA 是否使用 IDFA 启动 sdk
- 打开 xcode,点击工程目录中顶部的 工程,选择(Target -> Build Phases -> Link Binary With Libraries),添加以下框架: 1. 下载 JPush PhoneGap Plugin 插件,并解压
2. 将 [/src/ios](/src/ios) 文件夹及内容在 xcode 中拖到你的工程里,并配置 [/src/ios/PushConfig.plist](/src/ios/PushConfig.plist) 中相应参数:
CFNetwork.framework Appkey 应用标识
CoreFoundation.framework Channel 渠道标识
CoreTelephony.framework IsProduction:是否生产环境
SystemConfiguration.framework IsIDFA 是否使用 IDFA 启动 sdk
CoreGraphics.framework 3. 打开 xcode,点击工程目录中顶部的 工程,选择(Target -> Build Phases -> Link Binary With Libraries),添加以下框架:
Foundation.framework
UIKit.framework
AdSupport.framework
libz.tbd(若存在 libz.dylib 则替换为 libz.tbd)
- 修改 phonegap config.xml 文件以添加 JPushPlugin 插件 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 插件
<feature name="JPushPlugin"> ```xml
<param name="ios-package" value="JPushPlugin" /> <feature name="JPushPlugin">
<param name="onload" value="true" /> <param name="ios-package" value="JPushPlugin" />
</feature> <param name="onload" value="true" />
</feature>
```
5. 将 [/www/JPushPlugin.js](/www/JPushPlugin.js) 在 xcode 中拖到工程的 www 目录下面
6. 在需要使用插件处加入以下代码,并根据 [iOS API](/doc/iOS_API.md) 文档说明调用相应接口
- 将 [/www/JPushPlugin.js](/www/JPushPlugin.js) 在 xcode 中拖到工程的 www 目录下面 ```xml
<script type="text/javascript" src="JPushPlugin.js"></script>
```
- 在需要使用插件处加入以下代码,并根据 [iOS API](/doc/iOS_API.md) 文档说明调用相应接口
<script type="text/javascript" src="JPushPlugin.js"></script>
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

+1 -1
View File
@@ -88,7 +88,7 @@
var initiateUI = function() { var initiateUI = function() {
try { try {
window.plugins.jPushPlugin.init(); window.plugins.jPushPlugin.init();
getRegistrationID(); window.setTimeout(getRegistrationID, 1000);
if (device.platform != "Android") { if (device.platform != "Android") {
window.plugins.jPushPlugin.setDebugModeFromIos(); window.plugins.jPushPlugin.setDebugModeFromIos();
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0); window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0);
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jpush-phonegap-plugin", "name": "jpush-phonegap-plugin",
"version": "2.2.6", "version": "2.2.8",
"description": "JPush for cordova plugin", "description": "JPush for cordova plugin",
"cordova": { "cordova": {
"id": "jpush-phonegap-plugin", "id": "jpush-phonegap-plugin",
+32 -22
View File
@@ -2,7 +2,7 @@
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
id="jpush-phonegap-plugin" id="jpush-phonegap-plugin"
version="2.2.5"> version="3.0.1">
<name>JPush Plugin</name> <name>JPush Plugin</name>
<description>JPush for cordova plugin</description> <description>JPush for cordova plugin</description>
@@ -30,14 +30,17 @@
</feature> </feature>
</config-file> </config-file>
<header-file src="src/ios/Plugins/JPushDefine.h" />
<header-file src="src/ios/Plugins/JPushPlugin.h" /> <header-file src="src/ios/Plugins/JPushPlugin.h" />
<source-file src="src/ios/Plugins/JPushPlugin.m" /> <source-file src="src/ios/Plugins/JPushPlugin.m" />
<header-file src="src/ios/lib/JPUSHService.h" />
<source-file src="src/ios/lib/jpush-ios-2.1.9.a" framework="true" />
<header-file src="src/ios/Plugins/AppDelegate+JPush.h" /> <header-file src="src/ios/Plugins/AppDelegate+JPush.h" />
<source-file src="src/ios/Plugins/AppDelegate+JPush.m" /> <source-file src="src/ios/Plugins/AppDelegate+JPush.m" />
<header-file src="src/ios/lib/JPUSHService.h" />
<source-file src="src/ios/lib/jpush-ios-3.0.0.a" framework="true" />
<source-file src="src/ios/lib/jcore-ios-1.0.0.a" framework="true" />
<resource-file src="src/ios/PushConfig.plist" /> <resource-file src="src/ios/PushConfig.plist" />
<framework src="CFNetwork.framework" weak="true" /> <framework src="CFNetwork.framework" weak="true" />
<framework src="CoreFoundation.framework" weak="true" /> <framework src="CoreFoundation.framework" weak="true" />
<framework src="CoreTelephony.framework" weak="true" /> <framework src="CoreTelephony.framework" weak="true" />
@@ -49,9 +52,10 @@
<framework src="libz.tbd" weak="true" /> <framework src="libz.tbd" weak="true" />
<framework src="AdSupport.framework" weak="true" /> <framework src="AdSupport.framework" weak="true" />
<framework src="UserNotifications.framework" weak="true" /> <framework src="UserNotifications.framework" weak="true" />
<framework src="libresolv.tbd" weak="true" />
<config-file target="*PushConfig.plist" parent="APP_KEY"> <config-file target="*PushConfig.plist" parent="Appkey">
<string>$API_KEY</string> <string>$API_KEY</string>
</config-file> </config-file>
</platform> </platform>
@@ -81,7 +85,9 @@
</config-file> </config-file>
<config-file target="AndroidManifest.xml" parent="/manifest/application"> <config-file target="AndroidManifest.xml" parent="/manifest/application">
<!-- Required SDK核心功能--> <!-- Required SDK核心功能-->
<activity android:name="cn.jpush.android.ui.PushActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="orientation|keyboardHidden"> <activity android:name="cn.jpush.android.ui.PushActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden">
<intent-filter> <intent-filter>
<action android:name="cn.jpush.android.ui.PushActivity" /> <action android:name="cn.jpush.android.ui.PushActivity" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
@@ -90,7 +96,9 @@
</activity> </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 android:name="cn.jpush.android.ui.PopWinActivity"
android:theme="@style/MyDialogStyle"
android:exported="false">
</activity> </activity>
<!-- Required SDK核心功能--> <!-- Required SDK核心功能-->
@@ -168,25 +176,27 @@
<meta-data android:name="JPUSH_APPKEY" android:value="$API_KEY" /> <meta-data android:name="JPUSH_APPKEY" android:value="$API_KEY" />
</config-file> </config-file>
<source-file src="src/android/jpush-android-2.1.9.jar" target-dir="libs" /> <source-file src="src/android/libs/jpush-android_v3.0.0.jar" target-dir="libs" />
<source-file src="src/android/armeabi/libjpush219.so" target-dir="libs/armeabi" /> <source-file src="src/android/libs/jcore-android_v1.0.0.jar" target-dir="libs" />
<source-file src="src/android/armeabi-v7a/libjpush219.so" target-dir="libs/armeabi-v7a" /> <source-file src="src/android/libs/armeabi/libjcore100.so" target-dir="libs/armeabi" />
<source-file src="src/android/arm64-v8a/libjpush219.so" target-dir="libs/arm64-v8a" /> <source-file src="src/android/libs/armeabi-v7a/libjcore100.so" target-dir="libs/armeabi-v7a" />
<source-file src="src/android/x86/libjpush219.so" target-dir="libs/x86" /> <source-file src="src/android/libs/arm64-v8a/libjcore100.so" target-dir="libs/arm64-v8a" />
<source-file src="src/android/x86_64/libjpush219.so" target-dir="libs/x86_64" /> <source-file src="src/android/libs/x86/libjcore100.so" target-dir="libs/x86" />
<source-file src="src/android/libs/x86_64/libjcore100.so" target-dir="libs/x86_64" />
<source-file src="src/android/MyReceiver.java" target-dir="src/cn/jpush/phonegap" /> <source-file src="src/android/MyReceiver.java" target-dir="src/cn/jpush/phonegap" />
<source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jpush/phonegap" /> <source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jpush/phonegap" />
<source-file src="src/android/test_notification_layout.xml" target-dir="res/layout" />
<source-file src="src/android/jpush_notification_icon.png" target-dir="res/drawable" />
<!-- Rich Push resources --> <source-file src="src/android/res/drawable-hdpi/jpush_richpush_btn_selector.xml" target-dir="res/drawable" />
<source-file src="src/android/ic_richpush_actionbar_back.png" target-dir="res/drawable" /> <source-file src="src/android/res/drawable-hdpi/jpush_richpush_progressbar.xml" target-dir="res/drawable" />
<source-file src="src/android/ic_richpush_actionbar_divider.png" target-dir="res/drawable" />
<source-file src="src/android/richpush_btn_selector.xml" target-dir="res/drawable" />
<source-file src="src/android/jpush_popwin_layout.xml" target-dir="res/layout" />
<source-file src="src/android/jpush_webview_layout.xml" target-dir="res/layout" />
<source-file src="src/android/jpush_style.xml" target-dir="res/values" />
<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" />
<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" />
<source-file src="src/android/res/values/jpush_style.xml" target-dir="res/values" />
</platform> </platform>
</plugin> </plugin>
+3
View File
@@ -438,6 +438,9 @@ public class JPushPlugin extends CordovaPlugin {
} }
} }
/**
* 自定义通知行为,声音、震动、呼吸灯等。
*/
void setBasicPushNotificationBuilder(JSONArray data, void setBasicPushNotificationBuilder(JSONArray data,
CallbackContext callbackContext) { CallbackContext callbackContext) {
BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder( BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 695 B

After

Width:  |  Height:  |  Size: 695 B

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 181 B

@@ -5,7 +5,7 @@
android:state_focused="true" android:state_focused="true"
android:state_enabled="true" android:state_enabled="true"
android:state_pressed="false" android:state_pressed="false"
android:drawable="@drawable/ic_richpush_actionbar_back" /> android:drawable="@drawable/jpush_ic_richpush_actionbar_back" />
<!-- 按下时的背景图片 --> <!-- 按下时的背景图片 -->
<item <item
android:state_enabled="true" android:state_enabled="true"
@@ -17,5 +17,5 @@
android:state_checked="true" android:state_checked="true"
android:drawable="@android:color/darker_gray" /> android:drawable="@android:color/darker_gray" />
<!-- 默认时的背景图片 --> <!-- 默认时的背景图片 -->
<item android:drawable="@drawable/ic_richpush_actionbar_back" /> <item android:drawable="@drawable/jpush_ic_richpush_actionbar_back" />
</selector> </selector>
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 背景 gradient是渐变,corners定义的是圆角 -->
<item android:id="@android:id/background">
<shape>
<solid android:color="#ffffff" />
</shape>
</item>
<!-- 进度条 -->
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="#4393ea" />
</shape>
</clip>
</item>
</layer-list>
@@ -18,7 +18,7 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginLeft="9dp" android:layout_marginLeft="9dp"
android:layout_marginRight="10dp" android:layout_marginRight="10dp"
android:background="@drawable/richpush_btn_selector" /> android:background="@drawable/jpush_richpush_btn_selector" />
<ImageView <ImageView
android:id="@+id/imgView" android:id="@+id/imgView"
@@ -27,7 +27,7 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_toRightOf="@id/imgRichpushBtnBack" android:layout_toRightOf="@id/imgRichpushBtnBack"
android:clickable="false" android:clickable="false"
android:src="@drawable/ic_richpush_actionbar_divider" /> android:src="@drawable/jpush_ic_richpush_actionbar_divider" />
<TextView <TextView
android:id="@+id/tvRichpushTitle" android:id="@+id/tvRichpushTitle"
@@ -35,6 +35,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginLeft="7dp" android:layout_marginLeft="7dp"
android:layout_marginRight="5dp"
android:layout_toRightOf="@id/imgView" android:layout_toRightOf="@id/imgView"
android:clickable="false" android:clickable="false"
android:text=" " android:text=" "
@@ -42,6 +43,13 @@
android:textColor="#ffffff" /> android:textColor="#ffffff" />
</RelativeLayout> </RelativeLayout>
<ProgressBar
android:id="@+id/pushPrograssBar"
android:layout_width="match_parent"
android:layout_height="1dp"
android:progress="0"
android:progressDrawable="@drawable/jpush_richpush_progressbar"
style="?android:attr/progressBarStyleHorizontal" />
<WebView <WebView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
Binary file not shown.
Binary file not shown.
+15 -15
View File
@@ -1,15 +1,15 @@
// //
// AppDelegate+JPush.h // AppDelegate+JPush.h
// delegateExtention // delegateExtention
// //
// Created by 张庆贺 on 15/8/3. // Created by 张庆贺 on 15/8/3.
// Copyright (c) 2015年 JPush. All rights reserved. // Copyright (c) 2015年 JPush. All rights reserved.
// //
#import "AppDelegate.h" #import "AppDelegate.h"
#import <UserNotifications/UserNotifications.h> #import <UserNotifications/UserNotifications.h>
#import "JPUSHService.h" #import "JPUSHService.h"
@interface AppDelegate (JPush) <JPUSHRegisterDelegate> @interface AppDelegate (JPush) <JPUSHRegisterDelegate>
-(void)registerForIos10RemoteNotification; -(void)registerForRemoteNotification;
@end @end
+130 -98
View File
@@ -1,98 +1,130 @@
// //
// AppDelegate+JPush.m // AppDelegate+JPush.m
// delegateExtention // delegateExtention
// //
// Created by 张庆贺 on 15/8/3. // Created by 张庆贺 on 15/8/3.
// Copyright (c) 2015年 JPush. All rights reserved. // Copyright (c) 2015年 JPush. All rights reserved.
// //
#import "AppDelegate+JPush.h" #import "AppDelegate+JPush.h"
#import "JPushPlugin.h" #import "JPushPlugin.h"
#import <objc/runtime.h> #import <objc/runtime.h>
#import <AdSupport/AdSupport.h> #import <AdSupport/AdSupport.h>
#import <UserNotifications/UserNotifications.h> #import <UserNotifications/UserNotifications.h>
#import "JPushDefine.h"
@implementation AppDelegate (JPush)
@implementation AppDelegate (JPush)
+(void)load{
+(void)load{ Method origin1;
Method swizzle1;
Method origin; origin1 = class_getInstanceMethod([self class],@selector(init));
Method swizzle; swizzle1 = class_getInstanceMethod([self class], @selector(init_plus));
method_exchangeImplementations(origin1, swizzle1);
origin=class_getInstanceMethod([self class],@selector(init)); }
swizzle=class_getInstanceMethod([self class], @selector(init_plus));
method_exchangeImplementations(origin, swizzle); -(instancetype)init_plus{
} [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:UIApplicationDidFinishLaunchingNotification object:nil];
return [self init_plus];
-(instancetype)init_plus{ }
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:UIApplicationDidFinishLaunchingNotification object:nil];
return [self init_plus]; -(void)applicationDidLaunch:(NSNotification *)notification{
} if (notification) {
if (notification.userInfo) {
-(void)applicationDidLaunch:(NSNotification *)notification{ NSDictionary *userInfo1 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (notification) { if (userInfo1.count > 0) {
[self registerForIos10RemoteNotification]; [SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo1 toJsonString]];
[JPushPlugin setLaunchOptions:notification.userInfo]; }
} NSDictionary *userInfo2 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
} if (userInfo2.count > 0) {
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_StartLocalNotification jsString:[userInfo1 toJsonString]];
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { }
[JPUSHService registerDeviceToken:deviceToken]; }
} [JPUSHService setDebugMode];
[self registerForRemoteNotification];
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ [JPushPlugin setupJPushSDK:notification.userInfo];
[JPUSHService handleRemoteNotification:userInfo]; }
[[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveNotification object:userInfo]; }
}
-(void)registerForRemoteNotification{
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
[JPUSHService handleRemoteNotification:userInfo]; #ifdef NSFoundationVersionNumber_iOS_9_x_Max
[[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveNotification object:userInfo]; JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
completionHandler(UIBackgroundFetchResultNewData); entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
} [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
#endif
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
[JPUSHService showLocalNotificationAtFront:notification identifierKey:nil]; //可以添加自定义categories
} [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
- (void)applicationWillEnterForeground:(UIApplication *)application { UIUserNotificationTypeAlert)
// [application setApplicationIconBadgeNumber:0]; categories:nil];
// [application cancelAllLocalNotifications]; } else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){
} //categories 必须为nil
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
- (void)applicationDidEnterBackground:(UIApplication *)application { UIRemoteNotificationTypeSound |
// [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; UIRemoteNotificationTypeAlert)
} categories:nil];
}
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{ }
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo]; - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[JPUSHService registerDeviceToken:deviceToken];
[userInfo setValue:kJPushPluginiOS10ForegroundReceiveNotification forKey:@"JPushNotificationType"]; }
[[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginiOS10ForegroundReceiveNotification object:userInfo]; -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
} [SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
}
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:response.notification.request.content.userInfo]; -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
[userInfo setValue:kJPushPluginiOS10ClickNotification forKey:@"JPushNotificationType"]; [JPUSHService handleRemoteNotification:userInfo];
[[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginiOS10ClickNotification object:userInfo]; NSString *eventName;
switch ([UIApplication sharedApplication].applicationState) {
completionHandler(); case UIApplicationStateInactive:
} eventName = JPushDocumentEvent_OpenNotification;
break;
-(void)registerForIos10RemoteNotification{ case UIApplicationStateActive:
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { eventName = JPushDocumentEvent_ReceiveNotification;
#ifdef NSFoundationVersionNumber_iOS_9_x_Max break;
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init]; case UIApplicationStateBackground:
entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound; eventName = JPushDocumentEvent_BackgroundNotification;
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self]; break;
#endif default:
} break;
} }
[SharedJPushPlugin jpushFireDocumentEvent:eventName jsString:[userInfo toJsonString]];
@end completionHandler(UIBackgroundFetchResultNewData);
}
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo];
[SharedJPushPlugin jpushFireDocumentEvent: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"];
[SharedJPushPlugin jpushFireDocumentEvent: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
+32
View File
@@ -0,0 +1,32 @@
//
// ConstantDef.h
// jmessage
//
// Created by ljg on 16/1/19.
//
//
#ifndef ConstantDef_h
#define ConstantDef_h
#endif /* ConstantDef_h */
#define WEAK_SELF(weakSelf) __weak __typeof(&*self)weakSelf = self;
static NSString *const JPushConfig_Appkey = @"Appkey";
static NSString *const JPushConfig_Channel = @"Channel";
static NSString *const JPushConfig_IsProduction = @"IsProduction";
static NSString *const JPushConfig_IsIDFA = @"IsIDFA";
static NSString *const JPushConfig_FileName = @"PushConfig";
static NSString *const JPushDocumentEvent_ReceiveNotification = @"receiveNotification";
static NSString *const JPushDocumentEvent_OpenNotification = @"openNotification";
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";
+91 -76
View File
@@ -1,76 +1,91 @@
// //
// PushTalkPlugin.h // PushTalkPlugin.h
// PushTalk // PushTalk
// //
// Created by zhangqinghe on 13-12-13. // Created by zhangqinghe on 13-12-13.
// //
// //
#import <Cordova/CDV.h> #import <Cordova/CDV.h>
#define kJPushPluginReceiveNotification @"JPushPluginReceiveNofication" @interface JPushPlugin : CDVPlugin{
#define kJPushPluginiOS10ForegroundReceiveNotification @"kJPushPluginiOS10ForegroundReceiveNotification"
#define kJPushPluginiOS10ClickNotification @"kJPushPluginiOS10ClickNotification" }
//以下为js中可调用接口
@interface JPushPlugin : CDVPlugin{ //设置标签、别名
-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command;
} -(void)setTags:(CDVInvokedUrlCommand*)command;
-(void)setAlias:(CDVInvokedUrlCommand*)command;
+(void)setLaunchOptions:(NSDictionary *)theLaunchOptions;
//获取 RegistrationID
//以下为js中可调用接口 -(void)getRegistrationID:(CDVInvokedUrlCommand*)command;
//设置标签、别名
-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command; //页面统计
-(void)setTags:(CDVInvokedUrlCommand*)command; -(void)startLogPageView:(CDVInvokedUrlCommand*)command;
-(void)setAlias:(CDVInvokedUrlCommand*)command; -(void)stopLogPageView:(CDVInvokedUrlCommand*)command;
-(void)beginLogPageView:(CDVInvokedUrlCommand*)command;
//获取 RegistrationID
-(void)getRegistrationID:(CDVInvokedUrlCommand*)command; //设置角标到服务器,服务器下一次发消息时,会设置成这个值
//本接口不会改变应用本地的角标值.
//页面统计 -(void)setBadge:(CDVInvokedUrlCommand*)command;
-(void)startLogPageView:(CDVInvokedUrlCommand*)command; //相当于 [setBadge:0]
-(void)stopLogPageView:(CDVInvokedUrlCommand*)command; -(void)resetBadge:(CDVInvokedUrlCommand*)command;
-(void)beginLogPageView:(CDVInvokedUrlCommand*)command;
//应用本地的角标值设置/获取
//设置角标到服务器,服务器下一次发消息时,会设置成这个值 -(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command;
//本接口不会改变应用本地的角标值. -(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command;
-(void)setBadge:(CDVInvokedUrlCommand*)command;
//相当于 [setBadge:0] //停止与恢复推送
-(void)resetBadge:(CDVInvokedUrlCommand*)command; -(void)stopPush:(CDVInvokedUrlCommand*)command;
-(void)resumePush:(CDVInvokedUrlCommand*)command;
//应用本地的角标值设置/获取 -(void)isPushStopped:(CDVInvokedUrlCommand*)command;
-(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command;
-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command; //开关日志
-(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command;
//停止与恢复推送 -(void)setLogOFF:(CDVInvokedUrlCommand*)command;
-(void)stopPush:(CDVInvokedUrlCommand*)command; -(void)crashLogON:(CDVInvokedUrlCommand*)command;
-(void)resumePush:(CDVInvokedUrlCommand*)command;
-(void)isPushStopped:(CDVInvokedUrlCommand*)command; //本地推送
-(void)setLocalNotification:(CDVInvokedUrlCommand*)command;
//开关日志 -(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command;
-(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command; -(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command;
-(void)setLogOFF:(CDVInvokedUrlCommand*)command;
-(void)crashLogON:(CDVInvokedUrlCommand*)command; //地理位置上报 [latitude,longitude]
-(void)setLocation:(CDVInvokedUrlCommand*)command;
//本地推送
-(void)setLocalNotification:(CDVInvokedUrlCommand*)command; //检查用户的推送设置情况
-(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command; -(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command;
-(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command;
//ios 10 APIs
//地理位置上报 [latitude,longitude] -(void)addDismissActions:(CDVInvokedUrlCommand*)command;
-(void)setLocation:(CDVInvokedUrlCommand*)command; -(void)addNotificationActions:(CDVInvokedUrlCommand*)command;
//检查用户的推送设置情况 /*
-(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command; * 以下为js中可监听到的事件
* jpush.openNotification 点击推送消息启动或唤醒app
/* * jpush.setTagsWithAlias 设置标签、别名完成
* 以下为js中可监听到的事件 * jpush.receiveMessage 收到自定义消息
* jpush.openNotification 点击推送消息启动或唤醒app * jpush.receiveNotification 前台收到推送
* jpush.setTagsWithAlias 设置标签、别名完成 * jpush.backgroundNotification 后台收到推送
* jpush.receiveMessage 收到自定义消息 */
* jpush.receiveNotification 前台收到推送
* jpush.backgroundNotification 后台收到推送 # pragma mark - private
*/
-(void)jpushFireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString;
@end
+(void)setupJPushSDK:(NSDictionary*)userInfo;
@end
static JPushPlugin *SharedJPushPlugin;
@interface NSDictionary (JPush)
-(NSString*)toJsonString;
@end
@interface NSString (JPush)
-(NSDictionary*)toDictionary;
@end
+318 -446
View File
@@ -1,446 +1,318 @@
// //
// PushTalkPlugin.m // PushTalkPlugin.m
// PushTalk // PushTalk
// //
// Created by zhangqinghe on 13-12-13. // Created by zhangqinghe on 13-12-13.
// //
// //
#import "JPushPlugin.h" #import "JPushPlugin.h"
#import "JPUSHService.h" #import "JPUSHService.h"
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import <AdSupport/AdSupport.h> #import <AdSupport/AdSupport.h>
#import <UserNotifications/UserNotifications.h> #import <UserNotifications/UserNotifications.h>
#import "AppDelegate+JPush.h" #import "AppDelegate+JPush.h"
#import "JPushDefine.h"
static NSString *const JP_APP_KEY = @"APP_KEY";
static NSString *const JP_APP_CHANNEL = @"CHANNEL"; @implementation NSDictionary (JPush)
static NSString *const JP_APP_ISPRODUCTION = @"IsProduction"; -(NSString*)toJsonString{
static NSString *const JP_APP_ISIDFA = @"IsIDFA"; NSError *error;
static NSString *const JPushConfigFileName = @"PushConfig"; NSData *data = [NSJSONSerialization dataWithJSONObject:self options:0 error:&error];
static NSDictionary *_launchOptions = nil; NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
return jsonString;
#define WEAK_SELF(weakSelf) __weak __typeof(&*self)weakSelf = self; }
@end
@implementation NSDictionary (JPush)
-(NSString*)toJsonString{ @implementation NSString (JPush)
NSError *error; -(NSDictionary*)toDictionary{
NSData *data = [NSJSONSerialization dataWithJSONObject:self options:0 error:&error]; NSError *error;
NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSData *jsonData = [self dataUsingEncoding:NSUTF8StringEncoding];
return jsonString; NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
} return dict;
@end }
@end
@implementation NSString (JPush)
-(NSDictionary*)toDictionary{ @interface JPushPlugin()
NSError *error;
NSData *jsonData = [self dataUsingEncoding:NSUTF8StringEncoding]; @end
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
return dict; @implementation JPushPlugin
}
@end #pragma mark- 外部接口
-(void)stopPush:(CDVInvokedUrlCommand*)command{
@interface JPushPlugin() [[UIApplication sharedApplication]unregisterForRemoteNotifications];
}
@end
-(void)resumePush:(CDVInvokedUrlCommand*)command{
@implementation JPushPlugin [(AppDelegate*)[UIApplication sharedApplication].delegate registerForRemoteNotification];
}
#pragma mark- 外部接口
-(void)stopPush:(CDVInvokedUrlCommand*)command{ -(void)isPushStopped:(CDVInvokedUrlCommand*)command{
[[UIApplication sharedApplication]unregisterForRemoteNotifications]; NSNumber *result = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications] ? @(0) : @(1);
} [self handleResultWithValue:result command:command];
}
-(void)resumePush:(CDVInvokedUrlCommand*)command{
[JPushPlugin registerForRemoteNotification]; -(void)initial:(CDVInvokedUrlCommand*)command{
} //do nithng,because Cordova plugin use lazy load mode.
}
-(void)isPushStopped:(CDVInvokedUrlCommand*)command{
NSNumber *result; #ifdef __CORDOVA_4_0_0
if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) {
result = @(0); - (void)pluginInitialize {
}else{ NSLog(@"### pluginInitialize ");
result = @(1); SharedJPushPlugin = self;
} }
[self handleResultWithValue:result command:command];
} #else
-(void)initial:(CDVInvokedUrlCommand*)command{ - (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{
//do nithng,because Cordova plugin use lazy load mode. NSLog(@"### initWithWebView ");
} if (self=[super initWithWebView:theWebView]) {
}
return self;
#ifdef __CORDOVA_4_0_0 }
- (void)pluginInitialize { #endif
NSLog(@"### pluginInitialize ");
[self initNotifications]; -(void)jpushFireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString{
} dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.%@',%@)", eventName, jsString]];
#else });
}
- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{
NSLog(@"### initWithWebView "); -(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{
if (self=[super initWithWebView:theWebView]) { NSString *alias = [command argumentAtIndex:0];
[self initNotifications]; NSArray *tags = [command argumentAtIndex:1];
} [JPUSHService setTags:[NSSet setWithArray:tags]
return self; alias:alias
} callbackSelector:@selector(tagsWithAliasCallback:tags:alias:)
object:self];
}
#endif
-(void)setTags:(CDVInvokedUrlCommand *)command{
-(void)initNotifications { NSArray *tags = command.arguments;
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; [JPUSHService setTags:[NSSet setWithArray:tags]
[defaultCenter addObserver:self callbackSelector:@selector(tagsWithAliasCallback:tags:alias:)
selector:@selector(networkDidReceiveMessage:) object:self];
name:kJPFNetworkDidReceiveMessageNotification }
object:nil];
-(void)setAlias:(CDVInvokedUrlCommand *)command{
[defaultCenter addObserver:self NSString *alias = [command argumentAtIndex:0];
selector:@selector(networkDidReceiveNotification:) [JPUSHService setAlias:alias
name:kJPushPluginReceiveNotification callbackSelector:@selector(tagsWithAliasCallback:tags:alias:)
object:nil]; object:self];
}
[defaultCenter addObserver:self
selector:@selector(networkDidReceiveNotification:) -(void)getRegistrationID:(CDVInvokedUrlCommand*)command{
name:kJPushPluginiOS10ForegroundReceiveNotification NSString* registrationID = [JPUSHService registrationID];
object:nil]; [self handleResultWithValue:registrationID command:command];
}
[defaultCenter addObserver:self
selector:@selector(networkDidReceiveNotification:) -(void)startLogPageView:(CDVInvokedUrlCommand*)command{
name:kJPushPluginiOS10ClickNotification NSString * pageName = [command argumentAtIndex:0];
object:nil]; [JPUSHService startLogPageView:pageName];
}
if (_launchOptions) { -(void)stopLogPageView:(CDVInvokedUrlCommand*)command{
NSDictionary *userInfo = [_launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; NSString * pageName = [command argumentAtIndex:0];
if ([userInfo count] >0) { [JPUSHService stopLogPageView:pageName];
dispatch_async(dispatch_get_main_queue(), ^{ }
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.openNotification',%@)",[userInfo toJsonString]]];
}); -(void)beginLogPageView:(CDVInvokedUrlCommand*)command{
} NSString *pageName = [command argumentAtIndex:0];
NSNumber *duration = [command argumentAtIndex:1];
} [JPUSHService beginLogPageView:pageName duration:duration.intValue];
} }
-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{ -(void)setBadge:(CDVInvokedUrlCommand*)command{
NSArray *arguments = command.arguments; NSNumber *badge = [command argumentAtIndex:0];
NSString *alias; [JPUSHService setBadge:badge.intValue];
NSArray *tags; }
if (!arguments || [arguments count] < 2) {
NSLog(@"#### setTagsWithAlias param is less"); -(void)resetBadge:(CDVInvokedUrlCommand*)command{
return ; [JPUSHService resetBadge];
}else{ }
alias = arguments[0];
tags = arguments[1]; -(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command{
} NSNumber *badge = [command argumentAtIndex:0];
[UIApplication sharedApplication].applicationIconBadgeNumber = badge.intValue;
NSLog(@"#### setTagsWithAlias alias is %@, tags is %@",alias,tags); }
[JPUSHService setTags:[NSSet setWithArray:tags] -(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command {
alias:alias NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber;
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) NSNumber *number = [NSNumber numberWithInteger:num];
object:self]; [self handleResultWithValue:number command:command];
} }
-(void)setTags:(CDVInvokedUrlCommand *)command{ -(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{
[JPUSHService setDebugMode];
NSArray *tags = command.arguments; }
NSLog(@"#### setTags %@",tags); -(void)setLogOFF:(CDVInvokedUrlCommand*)command{
[JPUSHService setLogOFF];
[JPUSHService setTags:[NSSet setWithArray:tags] }
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:)
object:self]; -(void)crashLogON:(CDVInvokedUrlCommand*)command{
[JPUSHService crashLogON];
} }
-(void)setAlias:(CDVInvokedUrlCommand *)command{ -(void)setLocalNotification:(CDVInvokedUrlCommand*)command{
NSLog(@"ios 10 after please use UNNotificationRequest to set local notification, see apple doc to learn more");
NSLog(@"#### setAlias %@",command.arguments);
[JPUSHService setAlias:command.arguments[0] NSDate *date = [NSDate dateWithTimeIntervalSinceNow:[[command argumentAtIndex:0] intValue]];
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) NSString *alert = [command argumentAtIndex:1];
object:self]; NSNumber *badge = [command argumentAtIndex:2];
} NSString *idKey = [command argumentAtIndex:3];
NSDictionary *dict = [command argumentAtIndex:4];
-(void)getRegistrationID:(CDVInvokedUrlCommand*)command{ [JPUSHService setLocalNotification:date alertBody:alert badge:badge.intValue alertAction:nil identifierKey:idKey userInfo:dict soundName:nil];
NSString* registrationID = [JPUSHService registrationID]; }
NSLog(@"### getRegistrationID %@",registrationID);
[self handleResultWithValue:registrationID command:command]; -(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{
} NSString *identifier = [command argumentAtIndex:0];
JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new];
-(void)startLogPageView:(CDVInvokedUrlCommand*)command{ jpid.identifiers = @[identifier];
NSArray *arguments = command.arguments; [JPUSHService removeNotification:jpid];
if (!arguments || [arguments count] < 1) { }
NSLog(@"startLogPageView argument error");
return ; -(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{
} [JPUSHService removeNotification:nil];
NSString * pageName = arguments[0]; }
if (pageName) {
[JPUSHService startLogPageView:pageName]; -(void)setLocation:(CDVInvokedUrlCommand*)command{
} NSNumber *latitude = [command argumentAtIndex:0];
} NSNumber *longitude = [command argumentAtIndex:1];
[JPUSHService setLatitude:latitude.doubleValue longitude:longitude.doubleValue];
-(void)stopLogPageView:(CDVInvokedUrlCommand*)command{ }
NSArray *arguments = command.arguments;
if (!arguments || [arguments count] < 1) { -(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command{
NSLog(@"stopLogPageView argument error"); if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
return ; UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
} WEAK_SELF(weakSelf);
NSString * pageName = arguments[0]; [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (pageName) { NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[JPUSHService stopLogPageView:pageName]; dict[@"authorizationStatus"] = @(settings.authorizationStatus);
} dict[@"soundSetting"] = @(settings.soundSetting);
dict[@"badgeSetting"] = @(settings.badgeSetting);
} dict[@"alertSetting"] = @(settings.alertSetting);
dict[@"notificationCenterSetting"] = @(settings.notificationCenterSetting);
-(void)beginLogPageView:(CDVInvokedUrlCommand*)command{ dict[@"lockScreenSetting"] = @(settings.lockScreenSetting);
NSArray *arguments = command.arguments; dict[@"carPlaySetting"] = @(settings.carPlaySetting);
if (!arguments || [arguments count] < 2) { dict[@"alertStyle"] = @(settings.alertStyle);
NSLog(@"beginLogPageView argument error"); [weakSelf handleResultWithValue:dict command:command];
return ; }];
} }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
NSString * pageName = arguments[0]; UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
int duration = [arguments[0] intValue]; UIUserNotificationType type = settings.types;
if (pageName) { NSNumber *number = [NSNumber numberWithInteger:type];
[JPUSHService beginLogPageView:pageName duration:duration]; [self handleResultWithValue:number command:command];
} }else{
} UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
NSNumber *number = [NSNumber numberWithInteger:type];
-(void)setBadge:(CDVInvokedUrlCommand*)command{ [self handleResultWithValue:number command:command];
NSArray *argument = command.arguments; }
if ([argument count] < 1) { }
NSLog(@"setBadge argument error!");
return; #pragma mark - ios 10 APIs
}
NSNumber *badge = argument[0]; -(void)addDismissActions:(CDVInvokedUrlCommand*)command{
[JPUSHService setBadge:[badge intValue]]; [self addActions:command dismiss:YES];
} }
-(void)resetBadge:(CDVInvokedUrlCommand*)command{ -(void)addNotificationActions:(CDVInvokedUrlCommand*)command{
[JPUSHService resetBadge]; [self addActions:command dismiss:NO];
} }
-(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command{ -(void)addActions:(CDVInvokedUrlCommand*)command dismiss:(BOOL)dimiss{
// NSArray *actionsData = [command argumentAtIndex:0];
NSArray *argument = command.arguments; NSString *categoryId = [command argumentAtIndex:1];
if ([argument count] < 1) { NSMutableArray *actions = [NSMutableArray array];
NSLog(@"setBadge argument error!"); for (NSDictionary *dict in actionsData) {
return; NSString *title = dict[@"title"];
} NSString *identifier = dict[@"identifier"];
NSNumber *badge = [argument objectAtIndex:0]; NSString *option = dict[@"option"];
[UIApplication sharedApplication].applicationIconBadgeNumber = [badge intValue]; NSString *type = dict[@"type"];
} if ([type isEqualToString:@"textInput"]) {
NSString *textInputButtonTitle = dict[@"textInputButtonTitle"];
-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command { NSString *textInputPlaceholder = dict[@"textInputPlaceholder"];
NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber; UNTextInputNotificationAction *inputAction = [UNTextInputNotificationAction actionWithIdentifier:identifier title:title options:option.integerValue textInputButtonTitle:textInputButtonTitle textInputPlaceholder:textInputPlaceholder];
NSNumber *number = [NSNumber numberWithInteger:num]; [actions addObject:inputAction];
[self handleResultWithValue:number command:command]; }else{
} UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:title title:title options:option.integerValue];
[actions addObject:action];
-(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{ }
[JPUSHService setDebugMode]; }
} UNNotificationCategory *category;
if (dimiss) {
-(void)setLogOFF:(CDVInvokedUrlCommand*)command{ category = [UNNotificationCategory categoryWithIdentifier:categoryId actions:actions intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
[JPUSHService setLogOFF]; }else{
} category = [UNNotificationCategory categoryWithIdentifier:categoryId actions:actions intentIdentifiers:@[] options:UNNotificationCategoryOptionNone];
}
-(void)crashLogON:(CDVInvokedUrlCommand*)command{ [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:category]];
[JPUSHService crashLogON]; }
}
#pragma mark - 内部方法
-(void)setLocalNotification:(CDVInvokedUrlCommand*)command{
NSArray *arguments = command.arguments; +(void)setupJPushSDK:(NSDictionary*)userInfo{
NSDate *date = arguments[0] == [NSNull null] ? nil : [NSDate dateWithTimeIntervalSinceNow:[((NSString*)arguments[0]) intValue]]; NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"];
NSString *alertBody = arguments[1] == [NSNull null] ? nil : (NSString*)arguments[1]; if (plistPath == nil) {
int badge = arguments[2] == [NSNull null] ? 0 : [(NSString*)arguments[2] intValue]; NSLog(@"error: PushConfig.plist not found");
NSString *idKey = arguments[3] == [NSNull null] ? nil : (NSString*)arguments[3]; assert(0);
NSDictionary *dict = arguments[4] == [NSNull null] ? nil : (NSDictionary*)arguments[4]; }
[JPUSHService setLocalNotification:date alertBody:alertBody badge:badge alertAction:nil identifierKey:idKey userInfo:dict soundName:nil];
} NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
NSString *appkey = [plistData valueForKey:JPushConfig_Appkey];
-(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{ NSString *channel = [plistData valueForKey:JPushConfig_Channel];
NSString *identifier = [command argumentAtIndex:0]; NSNumber *isProduction = [plistData valueForKey:JPushConfig_IsProduction];
if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0) { NSNumber *isIDFA = [plistData valueForKey:JPushConfig_IsIDFA];
JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new];
jpid.identifiers = @[identifier]; NSString *advertisingId = nil;
[JPUSHService removeNotification:jpid]; if(isIDFA.boolValue){
}else{ advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
[JPUSHService deleteLocalNotificationWithIdentifierKey:identifier]; }
} [JPUSHService setupWithOption:userInfo
} appKey:appkey
channel:channel
-(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{ apsForProduction:[isProduction boolValue]
[JPUSHService clearAllLocalNotifications]; advertisingIdentifier:advertisingId];
} }
-(void)setLocation:(CDVInvokedUrlCommand*)command{ #pragma mark 将参数返回给js
[JPUSHService setLatitude:[((NSString*)command.arguments[0]) doubleValue] longitude:[((NSString*)command.arguments[1]) doubleValue]]; -(void)handleResultWithValue:(id)value command:(CDVInvokedUrlCommand*)command{
} CDVPluginResult *result = nil;
CDVCommandStatus status = CDVCommandStatus_OK;
-(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { if ([value isKindOfClass:[NSString class]]) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; value = [value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
WEAK_SELF(weakSelf); } else if ([value isKindOfClass:[NSNull class]]) {
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { value = nil;
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; }
dict[@"authorizationStatus"] = @(settings.authorizationStatus);
dict[@"soundSetting"] = @(settings.soundSetting); if ([value isKindOfClass:[NSObject class]]) {
dict[@"badgeSetting"] = @(settings.badgeSetting); result = [CDVPluginResult resultWithStatus:status messageAsString:value];//NSObject 类型都可以
dict[@"alertSetting"] = @(settings.alertSetting); } else {
dict[@"notificationCenterSetting"] = @(settings.notificationCenterSetting); NSLog(@"Cordova callback block returned unrecognized type: %@", NSStringFromClass([value class]));
dict[@"lockScreenSetting"] = @(settings.lockScreenSetting); result = nil;
dict[@"carPlaySetting"] = @(settings.carPlaySetting); }
dict[@"alertStyle"] = @(settings.alertStyle);
[weakSelf handleResultWithValue:dict command:command]; if (!result) {
}]; result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
}else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { }
UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings]; [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
UIUserNotificationType type = settings.types; }
NSNumber *number = [NSNumber numberWithInteger:type];
[self handleResultWithValue:number command:command]; #pragma mark 设置标签及别名回调
}else{ -(void)tagsWithAliasCallback:(int)resultCode tags:(NSSet *)tags alias:(NSString *)alias{
UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; NSDictionary *dict = @{@"resultCode":[NSNumber numberWithInt:resultCode],
NSNumber *number = [NSNumber numberWithInteger:type]; @"tags" :tags == nil ? [NSNull null] : [tags allObjects],
[self handleResultWithValue:number command:command]; @"alias" :alias == nil ? [NSNull null] : alias
} };
} [self jpushFireDocumentEvent:JPushDocumentEvent_SetTagsWithAlias jsString:[dict toJsonString]];
}
#pragma mark - 内部方法
+(void)setLaunchOptions:(NSDictionary *)theLaunchOptions{ - (void)networkDidReceiveMessage:(NSNotification *)notification {
_launchOptions = theLaunchOptions; if (notification && notification.userInfo) {
[self jpushFireDocumentEvent:JPushDocumentEvent_ReceiveMessage jsString:[notification.userInfo toJsonString]];
[JPUSHService setDebugMode]; }
}
[JPushPlugin registerForRemoteNotification];
@end
//read appkey and channel from PushConfig.plist
NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfigFileName ofType:@"plist"];
if (plistPath == nil) {
NSLog(@"error: PushConfig.plist not found");
assert(0);
}
NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
NSString * appkey = [plistData valueForKey:JP_APP_KEY];
NSString * channel = [plistData valueForKey:JP_APP_CHANNEL];
NSNumber * isProduction = [plistData valueForKey:JP_APP_ISPRODUCTION];
NSNumber *isIDFA = [plistData valueForKey:JP_APP_ISIDFA];
NSString *advertisingId = nil;
if(isIDFA){
advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}
[JPUSHService setupWithOption:_launchOptions
appKey:appkey
channel:channel
apsForProduction:[isProduction boolValue]
advertisingIdentifier:advertisingId];
}
+(void)registerForRemoteNotification{
[(AppDelegate*)[UIApplication sharedApplication].delegate registerForIos10RemoteNotification];
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
//可以添加自定义categories
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
} else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){
//categories 必须为nil
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
}
}
#pragma mark 将参数返回给js
-(void)handleResultWithValue:(id)value command:(CDVInvokedUrlCommand*)command{
CDVPluginResult *result = nil;
CDVCommandStatus status = CDVCommandStatus_OK;
if ([value isKindOfClass:[NSString class]]) {
value = [value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
} else if ([value isKindOfClass:[NSNull class]]) {
value = nil;
}
if ([value isKindOfClass:[NSObject class]]) {
result = [CDVPluginResult resultWithStatus:status messageAsString:value];//NSObject 类型都可以
} else {
NSLog(@"Cordova callback block returned unrecognized type: %@", NSStringFromClass([value class]));
result = nil;
}
if (!result) {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}
#pragma mark 设置标签及别名回调
-(void)tagsWithAliasCallback:(int)resultCode tags:(NSSet *)tags alias:(NSString *)alias{
NSDictionary *dict = @{@"resultCode":[NSNumber numberWithInt:resultCode],
@"tags" :tags == nil ? [NSNull null] : [tags allObjects],
@"alias" :alias == nil ? [NSNull null] : alias
};
dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.setTagsWithAlias',%@)",[dict toJsonString]]];
});
}
- (void)networkDidReceiveMessage:(NSNotification *)notification {
if (notification) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.receiveMessage',%@)",[notification.userInfo toJsonString]]];
[self.commandDelegate evalJs:[NSString stringWithFormat:@"window.plugins.jPushPlugin.receiveMessageIniOSCallback('%@')",[notification.userInfo toJsonString]]];
});
}
}
-(void)networkDidReceiveNotification:(NSNotification *)notification{
NSError *error;
NSDictionary *userInfo = [notification object];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:&error];
NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
switch ([UIApplication sharedApplication].applicationState) {
case UIApplicationStateActive:{
//前台收到
dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.receiveNotification',%@)",jsonString]];
});
break;
}
case UIApplicationStateInactive:{
//后台点击
dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.openNotification',%@)",jsonString]];
});
break;
}
case UIApplicationStateBackground:{
//后台收到
dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.backgoundNotification',%@)",jsonString]];
});
break;
}
default:
//do nothing
break;
}
}
@end
+2 -2
View File
@@ -2,9 +2,9 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>APP_KEY</key> <key>Appkey</key>
<string></string> <string></string>
<key>CHANNEL</key> <key>Channel</key>
<string>Subscription</string> <string>Subscription</string>
<key>IsProduction</key> <key>IsProduction</key>
<false/> <false/>
+10 -4
View File
@@ -9,7 +9,7 @@
* Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved. * Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved.
*/ */
#define JPUSH_VERSION_NUMBER 2.1.9 #define JPUSH_VERSION_NUMBER 3.0.0
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@@ -31,6 +31,13 @@ extern NSString *const kJPFNetworkDidLoginNotification; // 登录成功
extern NSString *const kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS) extern NSString *const kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS)
extern NSString *const kJPFServiceErrorNotification; // 错误提示 extern NSString *const kJPFServiceErrorNotification; // 错误提示
typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
JPAuthorizationOptionNone = 0, // the application may not present any UI upon a notification being received
JPAuthorizationOptionBadge = (1 << 0), // the application may badge its icon upon a notification being received
JPAuthorizationOptionSound = (1 << 1), // the application may play a sound upon a notification being received
JPAuthorizationOptionAlert = (1 << 2), // the application may display an alert upon a notification being received
};
/*! /*!
* 通知注册实体类 * 通知注册实体类
*/ */
@@ -186,7 +193,7 @@ extern NSString *const kJPFServiceErrorNotification; // 错误提示
/*! /*!
* 下面的接口是可选的 * 下面的接口是可选的
* 设置标签和(或)别名(若参数为nil,则忽略;若是空对象,则清空;详情请参考文档:http://docs.jiguang.cn/client/ios_api/#api-ios * 设置标签和(或)别名(若参数为nil,则忽略;若是空对象,则清空;详情请参考文档:https://docs.jiguang.cn/jpush/client/iOS/ios_api/
* setTags:alias:fetchCompletionHandle:是新的设置标签别名的方法,不再需要显示声明回调函数,只需要在block里面处理设置结果即可. * setTags:alias:fetchCompletionHandle:是新的设置标签别名的方法,不再需要显示声明回调函数,只需要在block里面处理设置结果即可.
* WARN: 使用block时需要注意循环引用问题 * WARN: 使用block时需要注意循环引用问题
*/ */
@@ -243,7 +250,7 @@ callbackSelector:(SEL)cbSelector
+ (void)stopLogPageView:(NSString *)pageName; + (void)stopLogPageView:(NSString *)pageName;
/*! /*!
* @abstract 直接上报在页面的停留时 * @abstract 直接上报在页面的停留时
* *
* @param pageName 页面 * @param pageName 页面
* @param seconds 停留的秒数 * @param seconds 停留的秒数
@@ -364,7 +371,6 @@ callbackSelector:(SEL)cbSelector
* @abstract 删除本地推送定义 * @abstract 删除本地推送定义
* *
* @param notificationKey 本地推送标示符 * @param notificationKey 本地推送标示符
* @param myUILocalNotification 本地推送对象
* @discussion 此方法被[removeNotification:]方法取代 * @discussion 此方法被[removeNotification:]方法取代
*/ */
+ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期"))); + (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
Binary file not shown.
@@ -0,0 +1,13 @@
//
// NotificationService.h
// jpushNotificationService
//
// Created by wuxingchen on 16/10/10.
//
//
#import <UserNotifications/UserNotifications.h>
@interface NotificationService : UNNotificationServiceExtension
@end
@@ -0,0 +1,44 @@
//
// NotificationService.m
// jpushNotificationService
//
// Created by wuxingchen on 16/10/10.
//
//
#import "NotificationService.h"
#import <UIKit/UIKit.h>
@interface NotificationService ()
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
@try {
NSString *urlStr = [request.content.userInfo valueForKey:@"JPushPluginAttachment"];
NSArray *urls = [urlStr componentsSeparatedByString:@"."];
NSURL *urlNative = [[NSBundle mainBundle] URLForResource:urls[0] withExtension:urls[1]];
UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:urlStr URL:urlNative options:nil error:nil];
self.bestAttemptContent.attachments = @[attachment];
} @catch (NSException *exception) {
}
self.contentHandler(self.bestAttemptContent);
}
- (void)serviceExtensionTimeWillExpire {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
self.contentHandler(self.bestAttemptContent);
}
@end
+60 -120
View File
@@ -7,10 +7,10 @@ JPushPlugin.prototype.openNotification = {}
JPushPlugin.prototype.receiveNotification = {} JPushPlugin.prototype.receiveNotification = {}
JPushPlugin.prototype.isPlatformIOS = function () { JPushPlugin.prototype.isPlatformIOS = function () {
var isPlatformIOS = device.platform == 'iPhone' var isPlatformIOS = device.platform == 'iPhone' ||
|| device.platform == 'iPad' device.platform == 'iPad' ||
|| device.platform == 'iPod touch' device.platform == 'iPod touch' ||
|| device.platform == 'iOS' device.platform == 'iOS'
return isPlatformIOS return isPlatformIOS
} }
@@ -26,153 +26,103 @@ JPushPlugin.prototype.call_native = function (name, args, callback) {
// public methods // public methods
JPushPlugin.prototype.init = function () { JPushPlugin.prototype.init = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
var data = [] this.call_native('initial', [], null)
this.call_native('initial', data, null)
} else { } else {
data = [] this.call_native('init', [], null)
this.call_native('init', data, null)
} }
} }
JPushPlugin.prototype.getRegistrationID = function (callback) { JPushPlugin.prototype.getRegistrationID = function (callback) {
try { this.call_native('getRegistrationID', [], callback)
var data = []
this.call_native('getRegistrationID', [data], callback)
} catch(exception) {
console.log(exception)
}
} }
JPushPlugin.prototype.stopPush = function () { JPushPlugin.prototype.stopPush = function () {
data = [] this.call_native('stopPush', [], null)
this.call_native('stopPush', data, null)
} }
JPushPlugin.prototype.resumePush = function () { JPushPlugin.prototype.resumePush = function () {
data = [] this.call_native('resumePush', [], null)
this.call_native('resumePush', data, null)
} }
JPushPlugin.prototype.isPushStopped = function (callback) { JPushPlugin.prototype.isPushStopped = function (callback) {
data = [] this.call_native('isPushStopped', [], callback)
this.call_native('isPushStopped', data, callback)
} }
// iOS methods // iOS methods
JPushPlugin.prototype.setTagsWithAlias = function (tags, alias) { JPushPlugin.prototype.setTagsWithAlias = function (tags, alias) {
try { if (tags == null) {
if (tags == null) { this.setAlias(alias)
this.setAlias(alias) return
return
}
if (alias == null) {
this.setTags(tags)
return
}
var arrayTagWithAlias = [tags]
arrayTagWithAlias.unshift(alias)
this.call_native('setTagsWithAlias', arrayTagWithAlias, null)
} catch(exception) {
console.log(exception)
} }
if (alias == null) {
this.setTags(tags)
return
}
var arrayTagWithAlias = [tags]
arrayTagWithAlias.unshift(alias)
this.call_native('setTagsWithAlias', arrayTagWithAlias, null)
} }
JPushPlugin.prototype.setTags = function (tags) { JPushPlugin.prototype.setTags = function (tags) {
try { this.call_native('setTags', tags, null)
this.call_native('setTags', tags, null)
} catch(exception) {
console.log(exception)
}
} }
JPushPlugin.prototype.setAlias = function (alias) { JPushPlugin.prototype.setAlias = function (alias) {
try { this.call_native('setAlias', [alias], null)
this.call_native('setAlias', [alias], null)
} catch(exception) {
console.log(exception)
}
} }
JPushPlugin.prototype.setBadge = function (value) { JPushPlugin.prototype.setBadge = function (value) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
try { this.call_native('setBadge', [value], null)
this.call_native('setBadge', [value], null)
} catch(exception) {
console.log(exception)
}
} }
} }
JPushPlugin.prototype.resetBadge = function () { JPushPlugin.prototype.resetBadge = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
try { this.call_native('resetBadge', [], null)
var data = []
this.call_native('resetBadge', [data], null)
} catch(exception) {
console.log(exception)
}
} }
} }
JPushPlugin.prototype.setDebugModeFromIos = function () { JPushPlugin.prototype.setDebugModeFromIos = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
var data = [] this.call_native('setDebugModeFromIos', [], null)
this.call_native('setDebugModeFromIos', [data], null)
} }
} }
JPushPlugin.prototype.setLogOFF = function () { JPushPlugin.prototype.setLogOFF = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
var data = [] this.call_native('setLogOFF', [], null)
this.call_native('setLogOFF', [data], null)
} }
} }
JPushPlugin.prototype.setCrashLogON = function () { JPushPlugin.prototype.setCrashLogON = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
var data = [] this.call_native('crashLogON', [], null)
this.call_native('crashLogON', [data], null)
} }
} }
JPushPlugin.prototype.addLocalNotificationForIOS = function (delayTime, content, JPushPlugin.prototype.addLocalNotificationForIOS = function (delayTime, content,
badge, notificationID, extras) { badge, notificationID, extras) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
var data = [delayTime, content, badge, notificationID, extras] this.call_native('setLocalNotification', [delayTime, content, badge, notificationID, extras], null)
this.call_native('setLocalNotification', data, null)
} }
} }
JPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS = function ( JPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS = function (identifierKey) {
identifierKey) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
var data = [identifierKey] this.call_native('deleteLocalNotificationWithIdentifierKey', [identifierKey], null)
this.call_native('deleteLocalNotificationWithIdentifierKey', data, null)
} }
} }
JPushPlugin.prototype.clearAllLocalNotifications = function () { JPushPlugin.prototype.clearAllLocalNotifications = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
var data = [] this.call_native('clearAllLocalNotifications', [], null)
this.call_native('clearAllLocalNotifications', data, null)
} }
} }
JPushPlugin.prototype.setLocation = function (latitude, longitude) { JPushPlugin.prototype.setLocation = function (latitude, longitude) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
var data = [latitude, longitude] this.call_native('setLocation', [latitude, longitude], null)
this.call_native('setLocation', data, null)
}
}
JPushPlugin.prototype.receiveMessageIniOSCallback = function (data) {
try {
console.log('JPushPlugin:receiveMessageIniOSCallback--data:' + data)
var bToObj = JSON.parse(data)
var content = bToObj.content
console.log(content)
} catch(exception) {
console.log('JPushPlugin:receiveMessageIniOSCallback' + exception)
} }
} }
@@ -222,6 +172,14 @@ JPushPlugin.prototype.getUserNotificationSettings = function (callback) {
} }
} }
JPushPlugin.prototype.addDismissActions = function (actions, categoryId) {
this.call_native('addDismissActions', [actions, categoryId])
}
JPushPlugin.prototype.addNotificationActions = function (actions, categoryId) {
this.call_native('addNotificationActions', [actions, categoryId])
}
// Android methods // Android methods
JPushPlugin.prototype.setDebugMode = function (mode) { JPushPlugin.prototype.setDebugMode = function (mode) {
if (device.platform == 'Android') { if (device.platform == 'Android') {
@@ -231,61 +189,45 @@ JPushPlugin.prototype.setDebugMode = function (mode) {
JPushPlugin.prototype.setBasicPushNotificationBuilder = function () { JPushPlugin.prototype.setBasicPushNotificationBuilder = function () {
if (device.platform == 'Android') { if (device.platform == 'Android') {
data = [] this.call_native('setBasicPushNotificationBuilder', [], null)
this.call_native('setBasicPushNotificationBuilder', data, null)
} }
} }
JPushPlugin.prototype.setCustomPushNotificationBuilder = function () { JPushPlugin.prototype.setCustomPushNotificationBuilder = function () {
if (device.platform == 'Android') { if (device.platform == 'Android') {
data = [] this.call_native('setCustomPushNotificationBuilder', [], null)
this.call_native('setCustomPushNotificationBuilder', data, null)
} }
} }
JPushPlugin.prototype.receiveMessageInAndroidCallback = function (data) { JPushPlugin.prototype.receiveMessageInAndroidCallback = function (data) {
try { data = JSON.stringify(data)
data = JSON.stringify(data) console.log('JPushPlugin:receiveMessageInAndroidCallback: ' + data)
console.log('JPushPlugin:receiveMessageInAndroidCallback: ' + data) this.receiveMessage = JSON.parse(data)
this.receiveMessage = JSON.parse(data) cordova.fireDocumentEvent('jpush.receiveMessage', this.receiveMessage)
cordova.fireDocumentEvent('jpush.receiveMessage', this.receiveMessage)
} catch(exception) {
console.log('JPushPlugin:pushCallback ' + exception)
}
} }
JPushPlugin.prototype.openNotificationInAndroidCallback = function (data) { JPushPlugin.prototype.openNotificationInAndroidCallback = function (data) {
try { data = JSON.stringify(data)
data = JSON.stringify(data) console.log('JPushPlugin:openNotificationInAndroidCallback: ' + data)
console.log('JPushPlugin:openNotificationInAndroidCallback: ' + data) this.openNotification = JSON.parse(data)
this.openNotification = JSON.parse(data) cordova.fireDocumentEvent('jpush.openNotification', this.openNotification)
cordova.fireDocumentEvent('jpush.openNotification', this.openNotification)
} catch(exception) {
console.log(exception)
}
} }
JPushPlugin.prototype.receiveNotificationInAndroidCallback = function (data) { JPushPlugin.prototype.receiveNotificationInAndroidCallback = function (data) {
try { data = JSON.stringify(data)
data = JSON.stringify(data) console.log('JPushPlugin:receiveNotificationInAndroidCallback: ' + data)
console.log('JPushPlugin:receiveNotificationInAndroidCallback: ' + data) this.receiveNotification = JSON.parse(data)
this.receiveNotification = JSON.parse(data) cordova.fireDocumentEvent('jpush.receiveNotification', this.receiveNotification)
cordova.fireDocumentEvent('jpush.receiveNotification', this.receiveNotification)
} catch(exception) {
console.log(exception)
}
} }
JPushPlugin.prototype.clearAllNotification = function () { JPushPlugin.prototype.clearAllNotification = function () {
if (device.platform == 'Android') { if (device.platform == 'Android') {
data = [] this.call_native('clearAllNotification', [], null)
this.call_native('clearAllNotification', data, null)
} }
} }
JPushPlugin.prototype.clearNotificationById = function (notificationId) { JPushPlugin.prototype.clearNotificationById = function (notificationId) {
if (device.platform == 'Android') { if (device.platform == 'Android') {
data = []
this.call_native('clearNotificationById', [notificationId], null) this.call_native('clearNotificationById', [notificationId], null)
} }
} }
@@ -305,8 +247,7 @@ JPushPlugin.prototype.setDebugMode = function (mode) {
JPushPlugin.prototype.addLocalNotification = function (builderId, content, title, JPushPlugin.prototype.addLocalNotification = function (builderId, content, title,
notificationID, broadcastTime, extras) { notificationID, broadcastTime, extras) {
if (device.platform == 'Android') { if (device.platform == 'Android') {
data = [builderId, content, title, notificationID, broadcastTime, extras] this.call_native('addLocalNotification', [builderId, content, title, notificationID, broadcastTime, extras], null)
this.call_native('addLocalNotification', data, null)
} }
} }
@@ -318,8 +259,7 @@ JPushPlugin.prototype.removeLocalNotification = function (notificationID) {
JPushPlugin.prototype.clearLocalNotifications = function () { JPushPlugin.prototype.clearLocalNotifications = function () {
if (device.platform == 'Android') { if (device.platform == 'Android') {
data = [] this.call_native('clearLocalNotifications', [], null)
this.call_native('clearLocalNotifications', data, null)
} }
} }
@@ -340,9 +280,9 @@ JPushPlugin.prototype.setStatisticsOpen = function (mode) {
} }
/** /**
* 用于在 Android 6.0 及以上系统,申请一些权限 * 用于在 Android 6.0 及以上系统,申请一些权限
* 具体可看:http://docs.jpush.io/client/android_api/#android-60 * 具体可看:http://docs.jpush.io/client/android_api/#android-60
*/ */
JPushPlugin.prototype.requestPermission = function () { JPushPlugin.prototype.requestPermission = function () {
if (device.platform == 'Android') { if (device.platform == 'Android') {
this.call_native('requestPermission', [], null) this.call_native('requestPermission', [], null)