Compare commits

...

77 Commits

Author SHA1 Message Date
Hevin 3bf9dae294 Merge branch 'dev' 2017-06-22 12:31:18 +08:00
Hevin ca88f5878a Update npm version 2017-06-22 12:31:00 +08:00
Hevin 8d9a7fa8b0 Add getConnectionState API 2017-06-22 12:30:47 +08:00
Hevin dead85a931 Merge branch 'dev' 2017-06-21 13:05:04 +08:00
Hevin 95330b11ed Fix spelling error 2017-06-21 13:04:42 +08:00
hevin cba5ffbabb Merge branch 'dev' 2017-06-14 14:02:52 +08:00
hevin d524d8db00 Update README 2017-06-14 14:02:19 +08:00
hevin e8417df550 Merge branch 'master' into dev 2017-06-06 13:54:48 +08:00
Hevin 89293001e8 Merge pull request #235 from snipking/master
After hook to turn on 'Push Notification' switch on Xcode 8
2017-06-06 13:47:46 +08:00
Hevin 78222b7123 Merge branch 'dev' 2017-06-06 09:55:11 +08:00
Hevin 1fb48e886f Remove community link 2017-06-06 09:50:26 +08:00
DerekChia jingqiang.jia@hand-china.com 28a9c298c8 Remove useless execution path log 2017-06-05 22:09:22 +08:00
DerekChia jingqiang.jia@hand-china.com c65c5a4057 After hook to turn on 'Push Notification' switch on Xcode 8 2017-06-05 21:55:55 +08:00
hevin 6a47116b82 Merge branch 'dev' 2017-06-05 19:51:34 +08:00
hevin 68b217d8a8 Remove unused link 2017-06-05 19:49:33 +08:00
hevin 13b36b746c Merge branch 'dev' 2017-05-31 17:37:08 +08:00
hevin b234861e44 Fix package name 2017-05-31 17:34:53 +08:00
hevin 2287ef10dd Optimize ios native methods
- setTags
- setAlias
- setTagsWithAlias
2017-05-26 20:46:21 +08:00
Hevin 2a05ea1784 Merge branch 'master' into dev 2017-05-26 16:18:08 +08:00
Hevin 9d3d32d725 Optimize API
- setTags
- setAlias
- setTagsAndAlias
2017-05-26 16:17:54 +08:00
hevin 3c88e87b17 Merge branch 'dev' 2017-05-24 14:46:02 +08:00
hevin b3b2af1520 Change package name 2017-05-24 14:43:22 +08:00
hevin 6e8b5931fb Update package name & npm version 2017-05-24 11:20:52 +08:00
hevin 23ed4817a4 Update .gitignore 2017-05-16 22:15:59 +08:00
Hevin 9a1da318cc Merge remote-tracking branch 'refs/remotes/origin/master' into dev 2017-05-15 16:15:00 +08:00
lhw5123 2fab3a9e60 Update npm version. 2017-05-10 17:29:31 +08:00
lhw5123 a032906b1f Merge branch 'dev' 2017-05-10 16:53:03 +08:00
lhw5123 d362ee788b Update Android SDK to v3.0.6 2017-05-10 16:51:28 +08:00
huangminlinux 50588d593c update jpush to 3.0.5 2017-05-03 16:33:44 +08:00
lhw5123 ea06f04415 Merge branch 'dev' 2017-05-02 23:24:40 +08:00
Hevin e4d8752065 Update android sdk to v3.0.5 2017-05-02 17:53:16 +08:00
Hevin 9765352969 Merge remote-tracking branch 'refs/remotes/origin/dev' 2017-04-13 13:52:02 +08:00
Hevin 0589ac82ea Update Android API doc 2017-04-13 13:50:26 +08:00
Hevin ff1fa91d67 Update API doc 2017-04-13 13:44:55 +08:00
lhw5123 14f91aacf8 Change plugin name. 2017-03-30 10:30:27 +08:00
lhw5123 15c403a471 Merge branch 'master' into dev 2017-03-29 15:30:05 +08:00
lhw5123 8b0b8cc26f Change npm dependencies. 2017-03-29 15:29:20 +08:00
pikacode 78e2e9736e Merge branch 'dev' 2017-03-27 16:32:53 +08:00
pikacode a8daded81b iOS - fix #220 2017-03-27 16:32:28 +08:00
Hevin 18f69303ce Update Android SDK to v3.0.3 2017-03-16 14:18:04 +08:00
Hevin 390fbb9fda Add jpush.receiveRegistrationId event. 2017-03-16 10:56:04 +08:00
Hevin 3a4ceb32ce Merge remote-tracking branch 'refs/remotes/origin/dev' 2017-03-09 17:22:58 +08:00
Hevin 20ab9319bc Resolve conflicts. 2017-03-09 17:19:59 +08:00
Hevin ef33ad5a85 Sync plugin.xml with jmessage-phonegap-plugin 2017-03-09 17:18:10 +08:00
Hevin c355cd2b9f Update plugin.xml
Change android config.
2017-03-06 16:43:14 +08:00
pikacode 2463368cc1 Merge branch 'dev' 2017-03-01 16:56:14 +08:00
pikacode 7279fdd0ce update README 2017-03-01 16:55:27 +08:00
pikacode 75cb7dfe97 Merge branch 'dev' 2017-03-01 16:53:49 +08:00
pikacode 3b25b73adf iOS 分离 JCore 2017-03-01 16:53:05 +08:00
Hevin 2b2189f6cb Android 分离 jcore 2017-03-01 16:43:00 +08:00
pikacode a48915f115 Merge branch 'dev' 2017-03-01 16:18:26 +08:00
pikacode 1fe6d0da8c iOS - update
1.更新 SDK 3.0.2
2017-02-20 13:25:41 +08:00
Hevin Lau 42790c71f3 统一 API,规范代码格式
- setDebugMode
- clearLocalNotifications
2017-01-17 22:59:13 +08:00
pikacode 7d868be664 Merge branch 'dev' 2017-01-17 16:57:25 +08:00
pikacode 7b65a1f469 iOS update SDK
1.JPush 3.0.1,JCore 1.1.0
2017-01-17 14:45:17 +08:00
pikacode 20d93c0047 iOS - update 2017-01-17 14:45:16 +08:00
Hevin Lau b1a77669a2 Merge branch 'dev' 2017-01-09 10:37:49 +08:00
Hevin Lau 1cf537dacb Update android sdk to 3.0.1 2017-01-08 18:07:06 +08:00
pikacode 575fe40faf iOS - update
1.修改文件名
2016-12-30 12:32:47 +08:00
pikacode 6734bf9160 iOS - fix #194 2016-12-30 12:29:43 +08:00
pikacode fbfe621aa3 Merge branch 'dev' 2016-12-22 16:38:01 +08:00
pikacode df6adddc75 iOS - fix #196 2016-12-19 15:24:04 +08:00
Hevin Lau 974838d5de Merge branch 'dev' 2016-12-18 20:29:40 +08:00
Hevin Lau 727af516e8 Update version number. 2016-12-18 20:26:07 +08:00
pikacode 423304c5dc Merge branch 'dev' 2016-12-15 16:02:27 +08:00
pikacode 5d7181a659 update package.json 2016-12-15 16:01:51 +08:00
pikacode eb0595e5c0 iOS - add API
1.增加延迟启动 API
2.增加 doc 说明
3.优化代码
2016-12-15 14:51:15 +08:00
pikacode c2f1bc86bf Merge branch 'dev' 2016-12-12 10:45:48 +08:00
pikacode 30fbc6094f iOS - fix #191 2016-12-12 10:41:38 +08:00
pikacode d39dea2441 Merge branch 'dev' 2016-12-09 10:13:56 +08:00
pikacode abfcd3c93a iOS - update
1.fix a bug
2016-12-08 15:31:13 +08:00
pikacode 399d159757 Merge branch 'dev' 2016-12-08 10:34:48 +08:00
pikacode b96e36d6aa iOS - fix #188 2016-12-08 10:33:36 +08:00
Hevin 78310e5c69 Merge remote-tracking branch 'refs/remotes/origin/dev' 2016-12-07 00:20:56 +08:00
Hevin fbad235605 Update README
更新 README 徽章中的版本号。
2016-12-07 00:12:36 +08:00
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
31 changed files with 835 additions and 277 deletions
+39 -1
View File
@@ -1 +1,39 @@
.DS_Store # Created by https://www.gitignore.io/api/macos,apachecordova
### ApacheCordova ###
# Apache Cordova generated files and directories
bin/*
!/plugins
!/plugins/android.json
!/plugins/fetch.json
plugins/*
platforms/*
### macOS ###
*.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# End of https://www.gitignore.io/api/macos,apachecordova
+26 -7
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.7-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases) [![release](https://img.shields.io/badge/release-3.1.8-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)
@@ -17,16 +17,23 @@
- 通过 Cordova Plugins 安装,要求 Cordova CLI 5.0+ - 通过 Cordova Plugins 安装,要求 Cordova CLI 5.0+
cordova plugin add jpush-phonegap-plugin --variable API_KEY=your_jpush_appkey ```
cordova plugin add jpush-phonegap-plugin --variable APP_KEY=your_jpush_appkey
```
- 或直接通过 url 安装: - 或直接通过 url 安装:
cordova plugin add https://github.com/jpush/jpush-phonegap-plugin.git --variable API_KEY=your_jpush_appkey ```
cordova plugin add https://github.com/jpush/jpush-phonegap-plugin.git --variable APP_KEY=your_jpush_appkey
```
- 或下载到本地安装: - 或下载到本地安装:
cordova plugin add Your_Plugin_Path --variable API_KEY=your_jpush_appkey ```
cordova plugin add Your_Plugin_Path --variable APP_KEY=your_jpush_appkey
```
> 如果你的 Cordova 版本 >= v7.0.0,在安装插件和添加 platform 时,在命令行最后加上 --nofetch,否则极大可能会报错。
## Usage ## Usage
### API ### API
@@ -45,7 +52,7 @@
该项目基于 Cordova 实现,目前无法使用 PhoneGap build 云服务进行打包,建议使用本地环境进行打包。 该项目基于 Cordova 实现,目前无法使用 PhoneGap build 云服务进行打包,建议使用本地环境进行打包。
## FAQ ## FAQ
> 如果遇到了疑问,请优先参考 Demo 和 API 文档。若还无法解决,可访问[极光社区](http://community.jiguang.cn/)或 [Issues](https://github.com/jpush/jpush-phonegap-plugin/issues) 提问。 > 如果遇到了疑问,请优先参考 Demo 和 API 文档。若还无法解决,可 [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*
@@ -62,10 +69,22 @@ Android 的推送通过长连接的方式实现,只有在连接保持的情况
或者自己实现应用保活,网上有很多相关文章(不推荐)。 或者自己实现应用保活,网上有很多相关文章(不推荐)。
> 为什么 QQ、微信之类的应用退出后还能够收到通知?因为这些大厂应用,手机厂商默认都会加入自启动白名单中,也不会在应用退出后杀死它们的相关服务。 > 为什么 QQ、微信之类的应用退出后还能够收到通知?因为这些大厂应用,手机厂商默认都会加入自启动白名单中,也不会在应用退出后杀死它们的相关服务。
如果你多加留意,就会发现非大厂的应用如果你一段时间不用都是收不到推送的。 > 如果你多加留意,就会发现非大厂的应用如果你一段时间不用都是收不到推送的。
### iOS ### iOS
#### 打包时遇到 i386 打包失败怎么办?
```
cordova platform update ios
```
#### ionic 2 如何调用 API
[issue 179](https://github.com/jpush/jpush-phonegap-plugin/issues/179)
#### PushConfig.plist 文件中的字段都是什么意思? #### PushConfig.plist 文件中的字段都是什么意思?
- Appkey:应用标识。 - Appkey:应用标识。
- Channel:渠道标识。 - Channel:渠道标识。
- IsProduction:是否生产环境。 - IsProduction:是否生产环境。
@@ -84,7 +103,7 @@ Android 的推送通过长连接的方式实现,只有在连接保持的情况
## Support ## Support
- QQ 群:413602425 - QQ 群:413602425
- [JPush 官网文档](https://docs.jiguang.cn/jpush/guideline/intro/) - [JPush 官网文档](https://docs.jiguang.cn/jpush/guideline/intro/)
- [极光社区](http://community.jiguang.cn/) - [极光社区](http://community.jiguang.cn/)
## Contribute ## Contribute
Please contribute! [Look at the issues](https://github.com/jpush/jpush-phonegap-plugin/issues). Please contribute! [Look at the issues](https://github.com/jpush/jpush-phonegap-plugin/issues).
+20 -10
View File
@@ -1,9 +1,10 @@
# Android API简介 # Android API 简介
- [注册成功事件](#注册成功事件)
- [接收通知时获得通知的内容](#接收通知时获得通知的内容) - [接收通知时获得通知的内容](#接收通知时获得通知的内容)
- [打开通知时获得通知的内容](#打开通知时获得通知的内容) - [打开通知时获得通知的内容](#打开通知时获得通知的内容)
- [收到自定义消息时获取消息的内容](#收到自定义消息时获取消息的内容) - [收到自定义消息时获取消息的内容](#收到自定义消息时获取消息的内容)
- [获取集成日志](#获取集成日志) - [获取集成日志(同时适用于 iOS](#获取集成日志同时适用于-ios)
- [接收消息和点击通知事件](#接收消息和点击通知事件) - [接收消息和点击通知事件](#接收消息和点击通知事件)
- [统计分析](#统计分析) - [统计分析](#统计分析)
- [清除通知](#清除通知) - [清除通知](#清除通知)
@@ -14,6 +15,18 @@
- [本地通知](#本地通知) - [本地通知](#本地通知)
- [富媒体页面 JavaScript 回调 API](#富媒体页面-javascript-回调-api) - [富媒体页面 JavaScript 回调 API](#富媒体页面-javascript-回调-api)
## 注册成功事件
### jpush.receiveRegistrationId
集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时,JPush 服务器会给客户端返回一个唯一的该设备的标识 - RegistrationID。
就会触发这个事件(注意只有第一次会触发该事件,之后如果想要取到 registrationId,可以直接调用 *getRegistrationID* 方法)。
#### 代码示例
```Javascript
document.addEventListener('jpush.receiveRegistrationId', function (event) {
console.log(event.registrationId)
}, false)
```
## 接收通知时获得通知的内容 ## 接收通知时获得通知的内容
- 内容: - 内容:
@@ -39,7 +52,7 @@
- 附加字段: - 附加字段:
window.plugins.jPushPlugin.receiveMessage.extras.yourKey window.plugins.jPushPlugin.receiveMessage.extras.yourKey
## 获取集成日志 ## 获取集成日志(同时适用于 iOS
### API - setDebugMode ### API - setDebugMode
@@ -55,7 +68,6 @@
- true 显示集成日志。 - true 显示集成日志。
- false 不显示集成日志。 - false 不显示集成日志。
## 接收消息和点击通知事件 ## 接收消息和点击通知事件
### API - receiveMessageInAndroidCallback ### API - receiveMessageInAndroidCallback
@@ -82,7 +94,6 @@
- data: js 字符串。 - data: js 字符串。
## 统计分析 ## 统计分析
### API - onResume / onPause ### API - onResume / onPause
@@ -250,28 +261,27 @@ JPush SDK 提供了 2 个用于定制通知栏样式的构建类:
## 本地通知 ## 本地通知
### API - addLocalNotification, removeLocalNotification, clearLocalNotifications ### API - addLocalNotification, removeLocalNotification, clearLocalNotifications
本地通知 API 不依赖于网络,无网条件下依旧可以触发。 本地通知 API 不依赖于网络,无网条件下依旧可以触发。
本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制。 本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制。
本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响。 本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响。
三个接口的功能分别为:添加一个本地通知,除一个本地通知,除所有的本地通知。 三个接口的功能分别为:添加一个本地通知,除一个本地通知,除所有的本地通知。
#####接口定义 #### 接口定义
window.plugins.jPushPlugin.addLocalNotification(builderId, content, title, window.plugins.jPushPlugin.addLocalNotification(builderId, content, title,
notificaitonID, broadcastTime, extras) notificaitonID, broadcastTime, extras)
window.plugins.jPushPlugin.removeLocalNotification(notificationID) window.plugins.jPushPlugin.removeLocalNotification(notificationID)
window.plugins.jPushPlugin.clearLocalNotifications() window.plugins.jPushPlugin.clearLocalNotifications() // 同时适用于 iOS
#### 参数说明 #### 参数说明
- builderId: 设置本地通知样式。 - builderId: 设置本地通知样式。
- content: 设置本地通知的 content。 - content: 设置本地通知的 content。
- title: 设置本地通知的 title。 - title: 设置本地通知的 title。
- notificaitonID: 设置本地通知的 ID。 - notificaitonID: 设置本地通知的 ID(不要为 0
- broadcastTime: 设置本地通知触发时间,为距离当前时间的数值,单位是毫秒。 - broadcastTime: 设置本地通知触发时间,为距离当前时间的数值,单位是毫秒。
- extras: 设置额外的数据信息 extras 为 json 字符串。 - extras: 设置额外的数据信息 extras 为 json 字符串。
+29 -17
View File
@@ -1,4 +1,4 @@
# 通用 API 说明 # 通用 API 说明(同时适用于 Android 和 iOS 系统)
- [停止与恢复推送服务](#停止与恢复推送服务) - [停止与恢复推送服务](#停止与恢复推送服务)
- [获取 RegistrationID](#获取-registrationid) - [获取 RegistrationID](#获取-registrationid)
@@ -45,7 +45,6 @@
window.plugins.jPushPlugin.stopPush() window.plugins.jPushPlugin.stopPush()
### API - resumePush ### API - resumePush
恢复推送服务。调用了此 API 后: 恢复推送服务。调用了此 API 后:
@@ -72,7 +71,6 @@
+ 平台检查推送服务是否注册。 + 平台检查推送服务是否注册。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.isPushStopped(callback) window.plugins.jPushPlugin.isPushStopped(callback)
@@ -91,6 +89,20 @@
} }
}) })
## 开启 Debug 模式
### API - setDebugMode
用于开启 Debug 模式,显示更多的日志信息。
#### 接口定义
JPushPlugin.prototype.setDebugMode(isOpen)
#### 参数说明
- isOpen: true,开启 Debug 模式;false,关闭 Debug 模式,不显示错误信息之外的日志信息。
#### 代码示例
window.plugins.jPushPlugin.setDebugMode(true)
## 获取 RegistrationID ## 获取 RegistrationID
@@ -149,9 +161,11 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 接口定义 #### 接口定义
JPushPlugin.prototype.setTagsWithAlias(tags, alias) ```js
JPushPlugin.prototype.setTags(tags) JPushPlugin.prototype.setTagsWithAlias(tags, alias, successCallback, errorCallback)
JPushPlugin.prototype.setAlias(alias) JPushPlugin.prototype.setTags(tags, successCallback, errorCallback)
JPushPlugin.prototype.setAlias(alias, successCallback, errorCallback)
```
#### 参数说明 #### 参数说明
* tags: * tags:
@@ -169,17 +183,15 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
* 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。 * 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
* 限制:alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。 * 限制:alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
#### 返回值说明 #### 代码示例
函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果: ```js
window.plugins.jPushPlugin.setTagsWithAlias([tag1, tag2], alias1, function () {
document.addEventListener("jpush.setTagsWithAlias", function(event) { // success callback.
console.log("onTagsWithAlias") }, function (errorMsg) {
var result = "result code:" + event.resultCode + " " // errorMsg 格式为 'errorCode: error message'.
result += "tags:" + event.tags + " " })
result += "alias:" + event.alias + " " ```
$("#tagAliasResult").html(result)
}, false)
#### 错误码定义 #### 错误码定义
@@ -211,7 +223,7 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
if(device.platform == "Android") { if(device.platform == "Android") {
alertContent = event.alert alertContent = event.alert
} else { } else {
lertContent = event.aps.alert alertContent = event.aps.alert
} }
}, false) }, false)
+27
View File
@@ -1,5 +1,6 @@
# iOS API # iOS API
- [延迟注册和启动推送通知服务](#延迟注册和启动推送通知服务)
- [开始与停止推送服务](#开始与停止推送服务) - [开始与停止推送服务](#开始与停止推送服务)
- [获取 RegistrationID](#获取-registrationid) - [获取 RegistrationID](#获取-registrationid)
- [别名与标签](#别名与标签) - [别名与标签](#别名与标签)
@@ -19,6 +20,32 @@
- [获取用户推送设置](#获取用户推送设置) - [获取用户推送设置](#获取用户推送设置)
- [监听事件统一说明](#监听事件统一说明) - [监听事件统一说明](#监听事件统一说明)
## 延迟注册和启动推送通知服务
本插件默认在 App 启动完成之后,立即「注册苹果通知服务」+「启动 JPush SDK」,其中:
- 「注册苹果通知服务」会弹出提示窗口向用户请求权限。
- 「启动 JPush SDK」是使用 JPush 各项 API 的必要条件。
开发者可以根据自己的需求,延迟注册和启动,需做以下操作:
1. 查找并配置 `PushConfig.plist` 文件中的 `Delay` 字段为 `YES`,表明会延迟使用,此时插件不再自动注册、启动通知。
2. 在需要注册并启动通知的地方调用 API - startJPushSDK。
### API - startJPushSDK
注册苹果通知服务,并启动 JPush SDK。
#### 接口定义
```
window.plugins.jPushPlugin.startJPushSDK()
```
## 开始与停止推送服务 ## 开始与停止推送服务
### API - init ### API - init
+4 -1
View File
@@ -116,7 +116,10 @@
if (tag3 != "") { if (tag3 != "") {
tags.push(tag3); tags.push(tag3);
} }
window.plugins.jPushPlugin.setTagsWithAlias(tags, alias); window.plugins.jPushPlugin.setTagsWithAlias(tags, alias, function () {
// Success callback
console.log(tags + ' - ' + alias)
});
} catch (exception) { } catch (exception) {
console.log(exception); console.log(exception);
} }
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
</dict>
</plist>
+85
View File
@@ -0,0 +1,85 @@
/*
* Author: Derek Chia <snipking@gmail.com>
* common functions for cordova plugin after hook
*/
const fs = require('fs');
const path = require('path');
module.exports.addAPNSinEntitlements = (entitlementPath, isProduction) => {
fs.readFile(entitlementPath, "utf8", function(err, data) {
if (err) {
throw err;
}
console.log("Reading entitlements file asynchronously");
let toInsert = '<key>aps-environment</key>\n' +
'\t\t<string>development</string>';
if(isProduction) {
toInsert = '<key>aps-environment</key>\n' +
'\t\t<string>production</string>';
}
let re1 = new RegExp('<key>aps-environment<\/key>(.|[\r\n])*<string>.*<\/string>');
let matched = data.match(re1);
let result;
if (matched === null) {
if(data.match(/<\/dict>/g)) {
result = data.replace(/<\/dict>/, '\t' + toInsert + '\n\t</dict>');
} else if(data.match(/<dict\/>/g)) {
result = data.replace(/<dict\/>/, '\t<dict>\n\t\t' + toInsert + '\n\t</dict>');
}
} else {
result = data.replace(re1, toInsert);
}
// write result to entitlements file
fs.writeFile(entitlementPath, result, {"encoding": 'utf8'}, function(err) {
if (err) {
throw err;
}
console.log(entitlementPath + " written successfully");
});
});
}
module.exports.removeAPNSinEntitlements = (entitlementPath) => {
fs.readFile(entitlementPath, "utf8", function(err, data) {
if (err) {
throw err;
}
console.log("Reading entitlements file asynchronously");
let re1 = new RegExp('<key>aps-environment<\/key>(.|[\r\n])*<string>.*<\/string>');
let matched = data.match(re1);
let result;
if (matched != null) {
result = data.replace(re1, "");
}
// write result to entitlements file
fs.writeFile(entitlementPath, result, {"encoding": 'utf8'}, function(err) {
if (err) {
throw err;
}
console.log(entitlementPath + " written successfully");
});
});
}
module.exports.getXcodeProjName = (searchPath) => {
if(searchPath == null || searchPath == undefined) {
searchPath = './';
}
let resultFolderName = null;
let folderNames = fs.readdirSync(searchPath).filter(file => fs.lstatSync(path.join(searchPath, file)).isDirectory());
let folderNamesReg = new RegExp('.*\.xcodeproj', 'g') // get filder name like `*.xcodeproj`
for(let folderName of folderNames) {
if(folderName.match(folderNamesReg)) {
resultFolderName = folderName;
break;
}
}
return resultFolderName.substr(0, resultFolderName.length - 10);
}
+64
View File
@@ -0,0 +1,64 @@
/*
* Author: Derek Chia <snipking@gmail.com>
* Cordova plugin after hook to disable `Push Notification` capability for XCode 8
*/
const fs = require('fs');
const path = require('path');
let commonFuncs = require('./common');
/**
* remove APNS env from cordova project Entitlements-Debug.plist and Entitlements-Release.plist
* This two file will work when xcode archive app
*/
let disablePushNotificationForCI = (basePath, xcodeprojName) => {
commonFuncs.removeAPNSinEntitlements(basePath + xcodeprojName + '/Entitlements-Debug.plist');
commonFuncs.removeAPNSinEntitlements(basePath + xcodeprojName + '/Entitlements-Release.plist');
}
/**
* remove APNS env to entitlement file; disable Push Notification capability in .pbxproj file
* This two file will work when xcode archive app
*/
let disablePushNotificationForXCode = (entitlementsPath, pbxprojPath) => {
/**
* remove APNS env to entitlement file
*/
if( fs.existsSync(entitlementsPath) ) {
commonFuncs.removeAPNSinEntitlements(entitlementsPath);
}
/**
* disable Push Notification capability in .pbxproj file
* equally disable "Push Notification" switch in xcode
*/
fs.readFile(pbxprojPath, "utf8", function(err, data) {
if (err) {
throw err;
}
console.log("Reading pbxproj file asynchronously");
// turn off Push Notification Capability
let re4rep = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*SystemCapabilities(.|[\r\n])*com\.apple\.Push = {(.|[\r\n])*enabled = [01]');
let parts = re4rep.exec(data);
result = data.replace(re4rep, parts[0].substr(0, parts[0].length - 1) + '0');
// write result to project.pbxproj
fs.writeFile(pbxprojPath, result, {"encoding": 'utf8'}, function(err) {
if (err) {
throw err;
}
console.log(pbxprojPath + " written successfully");
});
});
}
let basePath = './platforms/ios/';
let buildType = 'dev';
let xcodeprojName = commonFuncs.getXcodeProjName(basePath);
let pbxprojPath = basePath + xcodeprojName + '.xcodeproj/project.pbxproj';
let entitlementsPath = basePath + xcodeprojName + '/' + xcodeprojName + '.entitlements';
disablePushNotificationForCI(basePath, xcodeprojName);
disablePushNotificationForXCode(entitlementsPath, pbxprojPath);
+167
View File
@@ -0,0 +1,167 @@
/*
* Author: Derek Chia <snipking@gmail.com>
* Cordova plugin after hook to enable `Push Notification` capability for XCode 8
*/
const fs = require('fs');
const path = require('path');
let commonFuncs = require('./common');
/**
* add APNS env to cordova project Entitlements-Debug.plist and Entitlements-Release.plist
* This two file will work when xcode archive app
*/
let enablePushNotificationForCI = (basePath, xcodeprojName) => {
commonFuncs.addAPNSinEntitlements(basePath + xcodeprojName + '/Entitlements-Debug.plist', false);
commonFuncs.addAPNSinEntitlements(basePath + xcodeprojName + '/Entitlements-Release.plist', true);
}
/**
* add APNS env to entitlement file; enable Push Notification capability in .pbxproj file
* This two file will work when xcode archive app
*/
let enablePushNotificationForXCode = (entitlementsPath, pbxprojPath, cordovaBuildConfig) => {
console.log('will enable push notification capability for XCode');
let needAddEntitlementToPbxproj = false;
/**
* add APNS env to entitlement file
* without this file will cause a worning in xcode
*/
if( fs.existsSync(entitlementsPath) ) {
commonFuncs.addAPNSinEntitlements(entitlementsPath, false);
} else {
// copy default entitlements file
fs.readFile(__dirname + '/apns.entitlements', 'utf8', function(err, data) {
if (err) {
throw err;
}
fs.writeFileSync(entitlementsPath, data);
console.log(entitlementsPath + " written successfully");
});
needAddEntitlementToPbxproj = true;
}
/**
* enable Push Notification capability in .pbxproj file
* equally enable "Push Notification" switch in xcode
*/
fs.readFile(pbxprojPath, "utf8", function(err, data) {
if (err) {
throw err;
}
console.log("Reading pbxproj file asynchronously");
// add Push Notification Capability
let re1 = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes', 'g');
let re1rep = new RegExp('isa = PBXProject;(.|[\r\n])*attributes = {', 'g');
let re2 = new RegExp('(?:isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*)SystemCapabilities', 'g');
let re2rep = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes = {', 'g');
let re3 = new RegExp('(?:isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*SystemCapabilities(.|[\r\n])*)com\.apple\.Push', 'g');
let re3rep = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*SystemCapabilities = {', 'g');
let re4rep = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*SystemCapabilities(.|[\r\n])*com\.apple\.Push = {(.|[\r\n])*enabled = [01]');
let matched = data.match(re1);
let result;
if (matched === null) {
console.log('re1 not match, no TargetAttributes');
result = data.replace(re1rep, 'isa = PBXProject;\n' +
'\t\t\tattributes = {\n' +
'\t\t\t\tTargetAttributes = {\n' +
'\t\t\t\t\t1D6058900D05DD3D006BFB54 = {\n' +
'\t\t\t\t\t\tDevelopmentTeam = ' + cordovaBuildConfig.ios.release.developmentTeam + ';\n' +
'\t\t\t\t\t\tSystemCapabilities = {\n' +
'\t\t\t\t\t\t\tcom.apple.Push = {\n' +
'\t\t\t\t\t\t\t\tenabled = 1;\n' +
'\t\t\t\t\t\t\t};\n' +
'\t\t\t\t\t\t};\n' +
'\t\t\t\t\t};\n' +
'\t\t\t\t};');
} else {
matched = data.match(re2);
if(matched === null) {
console.log('re2 not match, nothing under TargetAttributes');
let parts = re2rep.exec(data);
result = data.replace(re2rep, parts[0] + '\n' + '\t\t\t\t\t1D6058900D05DD3D006BFB54 = {\n' +
'\t\t\t\t\t\tDevelopmentTeam = ' + cordovaBuildConfig.ios.release.developmentTeam + ';\n' +
'\t\t\t\t\t\tSystemCapabilities = {\n' +
'\t\t\t\t\t\t\tcom.apple.Push = {\n' +
'\t\t\t\t\t\t\t\tenabled = 1;\n' +
'\t\t\t\t\t\t\t};\n' +
'\t\t\t\t\t\t};\n' +
'\t\t\t\t\t};');
} else {
matched = data.match(re3);
if(matched === null) {
console.log('re3 not match, no com.apple.Push defined');
let parts = re3rep.exec(data);
result = data.replace(re3rep, parts[0] + '\n' + '\t\t\t\t\t\t\tcom.apple.Push = {\n' +
'\t\t\t\t\t\t\t\tenabled = 1;\n' +
'\t\t\t\t\t\t\t};');
} else {
console.log('just enable com.apple.Push');
let parts = re4rep.exec(data);
result = data.replace(re4rep, parts[0].substr(0, parts[0].length - 1) + '1');
}
}
}
// add entitlements
if (needAddEntitlementToPbxproj) {
let pathArray = entitlementsPath.split("/");
let entitlementsFileName = pathArray[pathArray.length - 1];
let projectFolderName = pathArray[pathArray.length - 2];
result = result.replace(new RegExp('\\/\\* Begin PBXFileReference section \\*\\/'), '/* Begin PBXFileReference section */\n' +
'\t\tD7BB385F1E4DB54800345BF4 /* ' + entitlementsFileName + ' */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = "' + entitlementsFileName + '"; path = "' + projectFolderName + '/' + entitlementsFileName + '"; sourceTree = "<group>"; };');
result = result.replace(new RegExp('\\/\\* CustomTemplate \\*\\/.*\n.*isa = PBXGroup;.*\n.*children = \\('), '/* CustomTemplate */ = {\n' +
'\t\t\tisa = PBXGroup;\n' +
'\t\t\tchildren = (\n' +
'\t\t\t\tD7BB385F1E4DB54800345BF4 /* ' + entitlementsFileName + ' */,');
let re5rep = new RegExp('\\/\\* Debug \\*\\/.*\n.*isa = XCBuildConfiguration;.*\n.*\n.*buildSettings = {');
let parts = result.match(re5rep);
result = result.replace(re5rep, parts + '\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = "' + projectFolderName + '/' + entitlementsFileName + '";');
let re6rep = new RegExp('\\/\\* Release \\*\\/.*\n.*isa = XCBuildConfiguration;.*\n.*\n.*buildSettings = {');
parts = result.match(re6rep);
result = result.replace(re6rep, parts + '\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = "' + projectFolderName + '/' + entitlementsFileName + '";');
}
// write result to project.pbxproj
fs.writeFile(pbxprojPath, result, {"encoding": 'utf8'}, function(err) {
if (err) {
throw err;
}
console.log(pbxprojPath + " written successfully");
});
});
}
let basePath = './platforms/ios/';
let buildType = 'dev';
let xcodeprojName = commonFuncs.getXcodeProjName(basePath);
let pbxprojPath = basePath + xcodeprojName + '.xcodeproj/project.pbxproj';
let entitlementsPath = basePath + xcodeprojName + '/' + xcodeprojName + '.entitlements';
let cordovaBuildConfigPath = './build.json'
let cordovaBuildConfig = null;
let willEnablePushNotificationForXCode = true;
try { // try to read ios developmentTeam from build.json
cordovaBuildConfig = JSON.parse(fs.readFileSync(cordovaBuildConfigPath, "utf8"));
} catch(e) {
console.log("Do not detected 'build.json' to get ios developent team. \n" +
"Will not enable XCode Push Notification Capability. \n" +
"Will only enable Push Notification for CI by add config to '" + basePath + xcodeprojName + "/Entitlements-Debug.plist' and '" + basePath + xcodeprojName + "/Entitlements-Release.plist' \n" +
"Please add 'build.json' to cordova project root folder to make after hook fullly functional. \n" +
"Reference [1]https://cordova.apache.org/docs/en/latest/reference/cordova-cli/#cordova-build-command \n" +
"Reference [2]https://cordova.apache.org/docs/en/latest/guide/platforms/ios/#signing-an-app");
willEnablePushNotificationForXCode = false;
}
enablePushNotificationForCI(basePath, xcodeprojName);
if(willEnablePushNotificationForXCode) {
enablePushNotificationForXCode(entitlementsPath, pbxprojPath, cordovaBuildConfig);
}
+32 -37
View File
@@ -1,39 +1,34 @@
{ {
"name": "jpush-phonegap-plugin", "name": "jpush-phonegap-plugin",
"version": "2.2.8", "version": "3.1.8",
"description": "JPush for cordova plugin", "description": "JPush for cordova plugin",
"cordova": { "cordova": {
"id": "jpush-phonegap-plugin", "id": "jpush-phonegap-plugin",
"platforms": [ "platforms": [
"ios", "ios",
"android" "android"
] ]
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/jpush/jpush-phonegap-plugin.git" "url": "git+https://github.com/jpush/jpush-phonegap-plugin.git"
}, },
"keywords": [ "keywords": [
"JPush", "JPush",
"push", "push",
"Push", "Push",
"ecosystem:cordova", "ecosystem:cordova",
"cordova-ios", "cordova-ios",
"cordova-android" "cordova-android"
], ],
"engines": [ "devDependencies": {
{ "cordova-plugin-device": "*",
"name": "cordova", "cordova-plugin-jcore": "*"
"version": ">=3.0" },
} "author": "JiGuang",
], "license": "MIT",
"peerDependencies": { "bugs": {
"cordova-plugin-device": ">=1.0.0" "url": "https://github.com/jpush/jpush-phonegap-plugin/issues"
}, },
"author": "JiGuang", "homepage": "https://github.com/jpush/jpush-phonegap-plugin#readme"
"license": "MIT",
"bugs": {
"url": "https://github.com/jpush/jpush-phonegap-plugin/issues"
},
"homepage": "https://github.com/jpush/jpush-phonegap-plugin#readme"
} }
+45 -30
View File
@@ -2,15 +2,15 @@
<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.7"> version="3.1.8">
<name>JPush Plugin</name> <name>JPush</name>
<description>JPush for cordova plugin</description> <description>JPush for cordova plugin</description>
<author>JPush</author> <author>JPush</author>
<keywords>JPush,push</keywords> <keywords>JPush,push</keywords>
<license>MIT License</license> <license>MIT License</license>
<preference name="API_KEY" /> <preference name="APP_KEY" />
<engines> <engines>
<engine name="cordova" version=">=3.0" /> <engine name="cordova" version=">=3.0" />
@@ -18,6 +18,7 @@
<!-- dependencies --> <!-- dependencies -->
<dependency id="cordova-plugin-device" /> <dependency id="cordova-plugin-device" />
<dependency id="cordova-plugin-jcore" />
<js-module src="www/JPushPlugin.js" name="JPushPlugin"> <js-module src="www/JPushPlugin.js" name="JPushPlugin">
<clobbers target="JPush" /> <clobbers target="JPush" />
@@ -37,9 +38,8 @@
<source-file src="src/ios/Plugins/AppDelegate+JPush.m" /> <source-file src="src/ios/Plugins/AppDelegate+JPush.m" />
<header-file src="src/ios/lib/JPUSHService.h" /> <header-file src="src/ios/lib/JPUSHService.h" />
<source-file src="src/ios/lib/jpush-ios-3.0.0.a" framework="true" /> <source-file src="src/ios/lib/jpush-ios-3.0.5.a" framework="true" />
<source-file src="src/ios/lib/jcore-ios-1.0.0.a" framework="true" /> <resource-file src="src/ios/JPushConfig.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" />
@@ -54,16 +54,19 @@
<framework src="UserNotifications.framework" weak="true" /> <framework src="UserNotifications.framework" weak="true" />
<framework src="libresolv.tbd" weak="true" /> <framework src="libresolv.tbd" weak="true" />
<config-file target="*JPushConfig.plist" parent="Appkey">
<config-file target="*PushConfig.plist" parent="Appkey"> <string>$APP_KEY</string>
<string>$API_KEY</string>
</config-file> </config-file>
<hook type="after_platform_add" src="hooks/iosEnablePush.js" />
<hook type="after_plugin_install" src="hooks/iosEnablePush.js" />
<hook type="before_plugin_uninstall" src="hooks/iosDisablePush.js" />
</platform> </platform>
<platform name="android"> <platform name="android">
<config-file target="res/xml/config.xml" parent="/*"> <config-file target="res/xml/config.xml" parent="/*">
<feature name="JPushPlugin"> <feature name="JPushPlugin">
<param name="android-package" value="cn.jpush.phonegap.JPushPlugin" /> <param name="android-package" value="cn.jiguang.cordova.push.JPushPlugin" />
</feature> </feature>
</config-file> </config-file>
@@ -81,8 +84,10 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
<permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE" android:protectionLevel="signature" /> <permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
</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" <activity android:name="cn.jpush.android.ui.PushActivity"
@@ -110,7 +115,8 @@
<!-- Required SDK 核心功能--> <!-- Required SDK 核心功能-->
<service android:name="cn.jpush.android.service.PushService" <service android:name="cn.jpush.android.service.PushService"
android:enabled="true" android:enabled="true"
android:exported="false"> android:exported="false"
android:process=":remote">
<intent-filter> <intent-filter>
<action android:name="cn.jpush.android.intent.REGISTER" /> <action android:name="cn.jpush.android.intent.REGISTER" />
<action android:name="cn.jpush.android.intent.REPORT" /> <action android:name="cn.jpush.android.intent.REPORT" />
@@ -121,10 +127,11 @@
<!-- Required SDK核心功能--> <!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.PushReceiver" <receiver android:name="cn.jpush.android.service.PushReceiver"
android:enabled="true"> android:enabled="true"
android:exported="false">
<intent-filter android:priority="1000"> <intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<!--Required 显示通知栏 --> <!--Required 显示通知栏 -->
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<category android:name="$PACKAGE_NAME" /> <category android:name="$PACKAGE_NAME" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
@@ -135,12 +142,15 @@
<intent-filter> <intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" /> <action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 --> <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
<!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 --> <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
<service android:name="cn.jpush.android.service.DaemonService" android:enabled="true" android:exported="true"> <service android:name="cn.jpush.android.service.DaemonService"
android:enabled="true"
android:exported="true">
<intent-filter> <intent-filter>
<action android:name="cn.jpush.android.intent.DaemonService" /> <action android:name="cn.jpush.android.intent.DaemonService" />
<category android:name="$PACKAGE_NAME" /> <category android:name="$PACKAGE_NAME" />
@@ -148,7 +158,9 @@
</service> </service>
<!-- User defined. For test only 用户自定义的广播接收器 --> <!-- User defined. For test only 用户自定义的广播接收器 -->
<receiver android:name="cn.jpush.phonegap.MyReceiver" android:enabled="true"> <receiver
android:name="cn.jiguang.cordova.push.MyReceiver"
android:enabled="true">
<intent-filter android:priority="1000"> <intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<!-- Required 显示通知栏 --> <!-- Required 显示通知栏 -->
@@ -169,28 +181,31 @@
<category android:name="$PACKAGE_NAME" /> <category android:name="$PACKAGE_NAME" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<!-- Required SDK核心功能--> <!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.AlarmReceiver" /> <receiver
android:name="cn.jpush.android.service.AlarmReceiver"
android:exported="false" />
<!-- Required. Enable it you can get statistics data with channel --> <!-- Required. Enable it you can get statistics data with channel -->
<meta-data android:name="JPUSH_CHANNEL" android:value="developer-default" /> <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default" />
<meta-data android:name="JPUSH_APPKEY" android:value="$API_KEY" /> <meta-data android:name="JPUSH_APPKEY" android:value="$APP_KEY" />
</config-file> </config-file>
<source-file src="src/android/libs/jpush-android-2.2.0.jar" target-dir="libs" /> <source-file src="src/android/libs/jpush-android_v3.0.6.jar" target-dir="libs" />
<source-file src="src/android/libs/armeabi/libjpush220.so" target-dir="libs/armeabi" />
<source-file src="src/android/libs/armeabi-v7a/libjpush220.so" target-dir="libs/armeabi-v7a" />
<source-file src="src/android/libs/arm64-v8a/libjpush220.so" target-dir="libs/arm64-v8a" />
<source-file src="src/android/libs/x86/libjpush220.so" target-dir="libs/x86" />
<source-file src="src/android/libs/x86_64/libjpush220.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/jiguang/cordova/push" />
<source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jpush/phonegap" /> <source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jiguang/cordova/push" />
<source-file src="src/android/res/drawable-hdpi/jpush_richpush_btn_selector.xml" target-dir="res/drawable" /> <source-file src="src/android/res/drawable-hdpi/jpush_richpush_btn_selector.xml"
<source-file src="src/android/res/drawable-hdpi/jpush_richpush_progressbar.xml" target-dir="res/drawable" /> 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/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_back.png"
<source-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png" target-dir="res/drawable-hdpi" /> 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_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/jpush_webview_layout.xml" target-dir="res/layout" />
+27 -3
View File
@@ -1,4 +1,4 @@
package cn.jpush.phonegap; package cn.jiguang.cordova.push;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
@@ -262,6 +262,26 @@ public class JPushPlugin extends CordovaPlugin {
JPushPlugin.notificationAlert = null; JPushPlugin.notificationAlert = null;
} }
static void transmitReceiveRegistrationId(String rId) {
if (instance == null) {
return;
}
JSONObject data = new JSONObject();
try {
data.put("registrationId", rId);
} catch (JSONException e) {
e.printStackTrace();
}
String format = "window.plugins.jPushPlugin.receiveRegistrationIdInAndroidCallback(%s);";
final String js = String.format(format, data.toString());
cordovaActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
instance.webView.loadUrl("javascript:" + js);
}
});
}
@Override @Override
public boolean execute(final String action, final JSONArray data, public boolean execute(final String action, final JSONArray data,
final CallbackContext callbackContext) throws JSONException { final CallbackContext callbackContext) throws JSONException {
@@ -438,6 +458,11 @@ public class JPushPlugin extends CordovaPlugin {
} }
} }
void getConnectionState(JSONArray data, CallbackContext callback) {
boolean isConnected = JPushInterface.getConnectionState(cordovaActivity.getApplicationContext());
callback.success(String.valueOf(isConnected));
}
/** /**
* 自定义通知行为,声音、震动、呼吸灯等。 * 自定义通知行为,声音、震动、呼吸灯等。
*/ */
@@ -479,6 +504,7 @@ public class JPushPlugin extends CordovaPlugin {
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
callbackContext.error("error reading id json"); callbackContext.error("error reading id json");
return;
} }
if (notificationId != -1) { if (notificationId != -1) {
JPushInterface.clearNotificationById(this.cordova.getActivity(), notificationId); JPushInterface.clearNotificationById(this.cordova.getActivity(), notificationId);
@@ -617,7 +643,6 @@ public class JPushPlugin extends CordovaPlugin {
Field opValue = appOpsClazz.getDeclaredField(appOpsServiceId); Field opValue = appOpsClazz.getDeclaredField(appOpsServiceId);
int value = opValue.getInt(Integer.class); int value = opValue.getInt(Integer.class);
Object result = checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg); Object result = checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg);
return Integer.parseInt(result.toString()) == AppOpsManager.MODE_ALLOWED; return Integer.parseInt(result.toString()) == AppOpsManager.MODE_ALLOWED;
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
e.printStackTrace(); e.printStackTrace();
@@ -632,5 +657,4 @@ public class JPushPlugin extends CordovaPlugin {
} }
return true; return true;
} }
} }
+13 -21
View File
@@ -1,18 +1,18 @@
package cn.jpush.phonegap; package cn.jiguang.cordova.push;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import cn.jpush.android.api.JPushInterface; import cn.jpush.android.api.JPushInterface;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver { public class MyReceiver extends BroadcastReceiver {
private static String TAG = "JPushPlugin";
private static final List<String> IGNORED_EXTRAS_KEYS = private static final List<String> IGNORED_EXTRAS_KEYS =
Arrays.asList( Arrays.asList(
"cn.jpush.android.TITLE", "cn.jpush.android.TITLE",
@@ -24,18 +24,15 @@ public class MyReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); String action = intent.getAction();
if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(action)) { if (action.equals(JPushInterface.ACTION_REGISTRATION_ID)) {
String rId = intent.getStringExtra(JPushInterface.EXTRA_REGISTRATION_ID);
JPushPlugin.transmitReceiveRegistrationId(rId);
} else if (action.equals(JPushInterface.ACTION_MESSAGE_RECEIVED)) {
handlingMessageReceive(intent); handlingMessageReceive(intent);
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(action)) { } else if (action.equals(JPushInterface.ACTION_NOTIFICATION_RECEIVED)) {
handlingNotificationReceive(context, intent); handlingNotificationReceive(context, intent);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(action)) { } else if (action.equals(JPushInterface.ACTION_NOTIFICATION_OPENED)) {
handlingNotificationOpen(context, intent); handlingNotificationOpen(context, intent);
} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(action)) {
// 当在 HTML 页面中调用 JPushWeb.triggerNativeAction(String params) 方法时触发此方法,
// 再进行相关的操作。
} else {
Log.d(TAG, "Unhandled intent - " + action);
} }
} }
@@ -46,8 +43,6 @@ public class MyReceiver extends BroadcastReceiver {
} }
private void handlingNotificationOpen(Context context, Intent intent) { private void handlingNotificationOpen(Context context, Intent intent) {
Log.i(TAG, "---------------- handlingNotificationOpen");
String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE); String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
JPushPlugin.openNotificationTitle = title; JPushPlugin.openNotificationTitle = title;
@@ -60,15 +55,13 @@ public class MyReceiver extends BroadcastReceiver {
JPushPlugin.transmitNotificationOpen(title, alert, extras); JPushPlugin.transmitNotificationOpen(title, alert, extras);
Intent launch = context.getPackageManager().getLaunchIntentForPackage( Intent launch = context.getPackageManager().getLaunchIntentForPackage(
context.getPackageName()); context.getPackageName());
launch.addCategory(Intent.CATEGORY_LAUNCHER); launch.addCategory(Intent.CATEGORY_LAUNCHER);
launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(launch); context.startActivity(launch);
} }
private void handlingNotificationReceive(Context context, Intent intent) { private void handlingNotificationReceive(Context context, Intent intent) {
Log.i(TAG, "---------------- handlingNotificationReceive");
Intent launch = context.getPackageManager().getLaunchIntentForPackage( Intent launch = context.getPackageManager().getLaunchIntentForPackage(
context.getPackageName()); context.getPackageName());
launch.addCategory(Intent.CATEGORY_LAUNCHER); launch.addCategory(Intent.CATEGORY_LAUNCHER);
@@ -99,5 +92,4 @@ public class MyReceiver extends BroadcastReceiver {
} }
return extrasMap; return extrasMap;
} }
} }
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.
@@ -5,10 +5,12 @@
<key>Appkey</key> <key>Appkey</key>
<string></string> <string></string>
<key>Channel</key> <key>Channel</key>
<string>Subscription</string> <string>channel name</string>
<key>IsProduction</key> <key>IsProduction</key>
<false/> <false/>
<key>IsIDFA</key> <key>IsIDFA</key>
<false/> <false/>
<key>Delay</key>
<false/>
</dict> </dict>
</plist> </plist>
+1
View File
@@ -12,4 +12,5 @@
@interface AppDelegate (JPush) <JPUSHRegisterDelegate> @interface AppDelegate (JPush) <JPUSHRegisterDelegate>
-(void)registerForRemoteNotification; -(void)registerForRemoteNotification;
-(void)startJPushSDK;
@end @end
+32 -8
View File
@@ -28,24 +28,48 @@
return [self init_plus]; return [self init_plus];
} }
-(void)fireOpenNotification:(NSTimer*)timer{
if (SharedJPushPlugin) {
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[timer.userInfo toJsonString]];
[timer invalidate];
}
}
NSDictionary *_launchOptions;
-(void)applicationDidLaunch:(NSNotification *)notification{ -(void)applicationDidLaunch:(NSNotification *)notification{
if (notification) { if (notification) {
if (notification.userInfo) { if (notification.userInfo) {
NSDictionary *userInfo1 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; NSDictionary *userInfo1 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo1.count > 0) { if (userInfo1.count > 0) {
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo1 toJsonString]]; [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(fireOpenNotification:) userInfo:userInfo1 repeats:YES];
} }
NSDictionary *userInfo2 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]; NSDictionary *userInfo2 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (userInfo2.count > 0) { if (userInfo2.count > 0) {
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_StartLocalNotification jsString:[userInfo1 toJsonString]]; [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(fireOpenNotification:) userInfo:userInfo2 repeats:YES];
} }
} }
[JPUSHService setDebugMode]; [JPUSHService setDebugMode];
[self registerForRemoteNotification];
[JPushPlugin setupJPushSDK:notification.userInfo]; NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"];
NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
NSNumber *delay = [plistData valueForKey:JPushConfig_Delay];
_launchOptions = notification.userInfo;
if (![delay boolValue]) {
[self startJPushSDK];
}
} }
} }
-(void)startJPushSDK{
[self registerForRemoteNotification];
[JPushPlugin setupJPushSDK:_launchOptions];
}
-(void)registerForRemoteNotification{ -(void)registerForRemoteNotification{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
#ifdef NSFoundationVersionNumber_iOS_9_x_Max #ifdef NSFoundationVersionNumber_iOS_9_x_Max
@@ -75,7 +99,7 @@
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
[JPUSHService handleRemoteNotification:userInfo]; [JPUSHService handleRemoteNotification:userInfo];
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]]; [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
} }
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
@@ -94,13 +118,13 @@
default: default:
break; break;
} }
[SharedJPushPlugin jpushFireDocumentEvent:eventName jsString:[userInfo toJsonString]]; [JPushPlugin fireDocumentEvent:eventName jsString:[userInfo toJsonString]];
completionHandler(UIBackgroundFetchResultNewData); completionHandler(UIBackgroundFetchResultNewData);
} }
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{ -(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo]; NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo];
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]]; [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
} }
@@ -110,7 +134,7 @@
[userInfo setValue:[response valueForKey:@"userText"] forKey:@"userText"]; [userInfo setValue:[response valueForKey:@"userText"] forKey:@"userText"];
} @catch (NSException *exception) { } } @catch (NSException *exception) { }
[userInfo setValue:response.actionIdentifier forKey:@"actionIdentifier"]; [userInfo setValue:response.actionIdentifier forKey:@"actionIdentifier"];
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo toJsonString]]; [JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo toJsonString]];
completionHandler(); completionHandler();
} }
+3 -2
View File
@@ -15,15 +15,16 @@
#define WEAK_SELF(weakSelf) __weak __typeof(&*self)weakSelf = self; #define WEAK_SELF(weakSelf) __weak __typeof(&*self)weakSelf = self;
static NSString *const JPushConfig_FileName = @"JPushConfig";
static NSString *const JPushConfig_Appkey = @"Appkey"; static NSString *const JPushConfig_Appkey = @"Appkey";
static NSString *const JPushConfig_Channel = @"Channel"; static NSString *const JPushConfig_Channel = @"Channel";
static NSString *const JPushConfig_IsProduction = @"IsProduction"; static NSString *const JPushConfig_IsProduction = @"IsProduction";
static NSString *const JPushConfig_IsIDFA = @"IsIDFA"; static NSString *const JPushConfig_IsIDFA = @"IsIDFA";
static NSString *const JPushConfig_FileName = @"PushConfig"; static NSString *const JPushConfig_Delay = @"Delay";
static NSString *const JPushDocumentEvent_ReceiveNotification = @"receiveNotification"; static NSString *const JPushDocumentEvent_ReceiveNotification = @"receiveNotification";
static NSString *const JPushDocumentEvent_OpenNotification = @"openNotification"; static NSString *const JPushDocumentEvent_OpenNotification = @"openNotification";
static NSString *const JPushDocumentEvent_BackgroundNotification = @"backgroundNotification"; static NSString *const JPushDocumentEvent_BackgroundNotification = @"backgroundNotification";
static NSString *const JPushDocumentEvent_SetTagsWithAlias = @"setTagsWithAlias"; static NSString *const JPushDocumentEvent_SetTagsWithAlias = @"setTagsWithAlias";
static NSString *const JPushDocumentEvent_ReceiveMessage = @"receiveMessage"; static NSString *const JPushDocumentEvent_ReceiveMessage = @"receiveMessage";
static NSString *const JPushDocumentEvent_StartLocalNotification = @"startLocalNotification"; static NSString *const JPushDocumentEvent_StartLocalNotification = @"startLocalNotification";
+5 -2
View File
@@ -12,6 +12,9 @@
} }
//注册通知服务并启动 SDK
-(void)startJPushSDK:(CDVInvokedUrlCommand*)command;
//以下为js中可调用接口 //以下为js中可调用接口
//设置标签、别名 //设置标签、别名
-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command; -(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command;
@@ -72,13 +75,13 @@
# pragma mark - private # pragma mark - private
-(void)jpushFireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString; +(void)fireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString;
+(void)setupJPushSDK:(NSDictionary*)userInfo; +(void)setupJPushSDK:(NSDictionary*)userInfo;
@end @end
static JPushPlugin *SharedJPushPlugin; JPushPlugin *SharedJPushPlugin;
@interface NSDictionary (JPush) @interface NSDictionary (JPush)
-(NSString*)toJsonString; -(NSString*)toJsonString;
+71 -27
View File
@@ -1,3 +1,4 @@
// //
// PushTalkPlugin.m // PushTalkPlugin.m
// PushTalk // PushTalk
@@ -38,6 +39,10 @@
@implementation JPushPlugin @implementation JPushPlugin
-(void)startJPushSDK:(CDVInvokedUrlCommand*)command{
[(AppDelegate*)[UIApplication sharedApplication].delegate startJPushSDK];
}
#pragma mark- 外部接口 #pragma mark- 外部接口
-(void)stopPush:(CDVInvokedUrlCommand*)command{ -(void)stopPush:(CDVInvokedUrlCommand*)command{
[[UIApplication sharedApplication]unregisterForRemoteNotifications]; [[UIApplication sharedApplication]unregisterForRemoteNotifications];
@@ -60,7 +65,7 @@
- (void)pluginInitialize { - (void)pluginInitialize {
NSLog(@"### pluginInitialize "); NSLog(@"### pluginInitialize ");
SharedJPushPlugin = self; [self initPlugin];
} }
#else #else
@@ -69,38 +74,70 @@
NSLog(@"### initWithWebView "); NSLog(@"### initWithWebView ");
if (self=[super initWithWebView:theWebView]) { if (self=[super initWithWebView:theWebView]) {
} }
[self initPlugin];
return self; return self;
} }
#endif #endif
-(void)jpushFireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString{ -(void)initPlugin{
if (!SharedJPushPlugin) {
SharedJPushPlugin = self;
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(networkDidReceiveMessage:)
name:kJPFNetworkDidReceiveMessageNotification
object:nil];
}
+(void)fireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString{
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.%@',%@)", eventName, jsString]]; [SharedJPushPlugin.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.%@',%@)", eventName, jsString]];
}); });
} }
-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{ -(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{
NSString *alias = [command argumentAtIndex:0]; NSString *alias = [command argumentAtIndex:0];
NSArray *tags = [command argumentAtIndex:1]; NSArray *tags = [command argumentAtIndex:1];
[JPUSHService setTags:[NSSet setWithArray:tags] [JPUSHService setTags:[NSSet setWithArray:tags]
alias:alias alias:alias
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) {
object:self]; CDVPluginResult *result;
if (iResCode == 0) {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:nil];
} else {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:nil];
}
}];
} }
-(void)setTags:(CDVInvokedUrlCommand *)command{ -(void)setTags:(CDVInvokedUrlCommand*)command{
NSArray *tags = command.arguments; NSArray *tags = command.arguments;
[JPUSHService setTags:[NSSet setWithArray:tags] [JPUSHService setTags:[NSSet setWithArray:tags]
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) alias:nil
object:self]; fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) {
CDVPluginResult *result;
if (iResCode == 0) {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:nil];
} else {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:nil];
}
}];
} }
-(void)setAlias:(CDVInvokedUrlCommand *)command{ -(void)setAlias:(CDVInvokedUrlCommand*)command{
NSString *alias = [command argumentAtIndex:0]; NSString *alias = [command argumentAtIndex:0];
[JPUSHService setAlias:alias [JPUSHService setTags:nil
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:) alias:alias
object:self]; fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) {
CDVPluginResult *result;
if (iResCode == 0) {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:nil];
} else {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:nil];
}
}];
} }
-(void)getRegistrationID:(CDVInvokedUrlCommand*)command{ -(void)getRegistrationID:(CDVInvokedUrlCommand*)command{
@@ -133,12 +170,12 @@
[JPUSHService resetBadge]; [JPUSHService resetBadge];
} }
-(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command{ -(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command{
NSNumber *badge = [command argumentAtIndex:0]; NSNumber *badge = [command argumentAtIndex:0];
[UIApplication sharedApplication].applicationIconBadgeNumber = badge.intValue; [UIApplication sharedApplication].applicationIconBadgeNumber = badge.intValue;
} }
-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command { -(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command {
NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber; NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber;
NSNumber *number = [NSNumber numberWithInteger:num]; NSNumber *number = [NSNumber numberWithInteger:num];
[self handleResultWithValue:number command:command]; [self handleResultWithValue:number command:command];
@@ -236,16 +273,22 @@
NSString *textInputPlaceholder = dict[@"textInputPlaceholder"]; NSString *textInputPlaceholder = dict[@"textInputPlaceholder"];
UNTextInputNotificationAction *inputAction = [UNTextInputNotificationAction actionWithIdentifier:identifier title:title options:option.integerValue textInputButtonTitle:textInputButtonTitle textInputPlaceholder:textInputPlaceholder]; UNTextInputNotificationAction *inputAction = [UNTextInputNotificationAction actionWithIdentifier:identifier title:title options:option.integerValue textInputButtonTitle:textInputButtonTitle textInputPlaceholder:textInputPlaceholder];
[actions addObject:inputAction]; [actions addObject:inputAction];
}else{ } else {
UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:title title:title options:option.integerValue]; UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:title title:title options:option.integerValue];
[actions addObject:action]; [actions addObject:action];
} }
} }
UNNotificationCategory *category; UNNotificationCategory *category;
if (dimiss) { if (dimiss) {
category = [UNNotificationCategory categoryWithIdentifier:categoryId actions:actions intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction]; category = [UNNotificationCategory categoryWithIdentifier:categoryId
}else{ actions:actions
category = [UNNotificationCategory categoryWithIdentifier:categoryId actions:actions intentIdentifiers:@[] options:UNNotificationCategoryOptionNone]; intentIdentifiers:@[]
options:UNNotificationCategoryOptionCustomDismissAction];
} else {
category = [UNNotificationCategory categoryWithIdentifier:categoryId
actions:actions
intentIdentifiers:@[]
options:UNNotificationCategoryOptionNone];
} }
[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:category]]; [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:category]];
} }
@@ -266,7 +309,7 @@
NSNumber *isIDFA = [plistData valueForKey:JPushConfig_IsIDFA]; NSNumber *isIDFA = [plistData valueForKey:JPushConfig_IsIDFA];
NSString *advertisingId = nil; NSString *advertisingId = nil;
if(isIDFA.boolValue){ if(isIDFA.boolValue) {
advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
} }
[JPUSHService setupWithOption:userInfo [JPUSHService setupWithOption:userInfo
@@ -277,7 +320,7 @@
} }
#pragma mark 将参数返回给js #pragma mark 将参数返回给js
-(void)handleResultWithValue:(id)value command:(CDVInvokedUrlCommand*)command{ -(void)handleResultWithValue:(id)value command:(CDVInvokedUrlCommand*)command {
CDVPluginResult *result = nil; CDVPluginResult *result = nil;
CDVCommandStatus status = CDVCommandStatus_OK; CDVCommandStatus status = CDVCommandStatus_OK;
@@ -301,17 +344,18 @@
} }
#pragma mark 设置标签及别名回调 #pragma mark 设置标签及别名回调
-(void)tagsWithAliasCallback:(int)resultCode tags:(NSSet *)tags alias:(NSString *)alias{ -(void)tagsWithAliasCallback:(int)resultCode tags:(NSSet *)tags alias:(NSString *)alias {
NSDictionary *dict = @{@"resultCode":[NSNumber numberWithInt:resultCode], if (resultCode == 0) { // Success
@"tags" :tags == nil ? [NSNull null] : [tags allObjects],
@"alias" :alias == nil ? [NSNull null] : alias } else {
};
[self jpushFireDocumentEvent:JPushDocumentEvent_SetTagsWithAlias jsString:[dict toJsonString]]; }
} }
- (void)networkDidReceiveMessage:(NSNotification *)notification { - (void)networkDidReceiveMessage:(NSNotification *)notification {
if (notification && notification.userInfo) { if (notification && notification.userInfo) {
[self jpushFireDocumentEvent:JPushDocumentEvent_ReceiveMessage jsString:[notification.userInfo toJsonString]]; [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveMessage
jsString:[notification.userInfo toJsonString]];
} }
} }
+3 -3
View File
@@ -6,10 +6,10 @@
* | | | | / /\ \ | | | | \ \______| | * | | | | / /\ \ | | | | \ \______| |
* | | | | /_/ \_\ | | | | \_________| * | | | | /_/ \_\ | | | | \_________|
* *
* Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved. * Copyright (c) 2011 ~ 2017 Shenzhen HXHG. All rights reserved.
*/ */
#define JPUSH_VERSION_NUMBER 3.0.0 #define JPUSH_VERSION_NUMBER 3.0.5
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@@ -456,7 +456,7 @@ callbackSelector:(SEL)cbSelector
* *
* SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志. * SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志.
* *
* 调用本接口可打开日志级别为: Debug, 打印调试日志. * 请在SDK启动后调用本接口,调用本接口可打开日志级别为: Debug, 打印调试日志.
*/ */
+ (void)setDebugMode; + (void)setDebugMode;
Binary file not shown.
+126 -102
View File
@@ -7,49 +7,70 @@ JPushPlugin.prototype.openNotification = {}
JPushPlugin.prototype.receiveNotification = {} JPushPlugin.prototype.receiveNotification = {}
JPushPlugin.prototype.isPlatformIOS = function () { JPushPlugin.prototype.isPlatformIOS = function () {
var isPlatformIOS = device.platform == 'iPhone' || return (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
} }
JPushPlugin.prototype.error_callback = function (msg) { JPushPlugin.prototype.errorCallback = function (msg) {
console.log('Javascript Callback Error: ' + msg) console.log('JPush Callback Error: ' + msg)
} }
JPushPlugin.prototype.call_native = function (name, args, callback) { JPushPlugin.prototype.callNative = function (name, args, successCallback, errorCallback) {
ret = cordova.exec(callback, this.error_callback, 'JPushPlugin', name, args) if (errorCallback) {
return ret cordova.exec(successCallback, errorCallback, 'JPushPlugin', name, args)
}
// public methods
JPushPlugin.prototype.init = function () {
if (this.isPlatformIOS()) {
this.call_native('initial', [], null)
} else { } else {
this.call_native('init', [], null) cordova.exec(successCallback, this.errorCallback, 'JPushPlugin', name, args)
} }
} }
JPushPlugin.prototype.getRegistrationID = function (callback) { // Common methods
this.call_native('getRegistrationID', [], callback) JPushPlugin.prototype.init = function () {
if (this.isPlatformIOS()) {
this.callNative('initial', [], null)
} else {
this.callNative('init', [], null)
}
}
JPushPlugin.prototype.setDebugMode = function (mode) {
if (device.platform === 'Android') {
this.callNative('setDebugMode', [mode], null)
} else {
if (mode === true) {
this.setDebugModeFromIos()
} else {
this.setLogOFF()
}
}
}
JPushPlugin.prototype.getRegistrationID = function (successCallback) {
this.callNative('getRegistrationID', [], successCallback)
} }
JPushPlugin.prototype.stopPush = function () { JPushPlugin.prototype.stopPush = function () {
this.call_native('stopPush', [], null) this.callNative('stopPush', [], null)
} }
JPushPlugin.prototype.resumePush = function () { JPushPlugin.prototype.resumePush = function () {
this.call_native('resumePush', [], null) this.callNative('resumePush', [], null)
} }
JPushPlugin.prototype.isPushStopped = function (callback) { JPushPlugin.prototype.isPushStopped = function (successCallback) {
this.call_native('isPushStopped', [], callback) this.callNative('isPushStopped', [], successCallback)
} }
// iOS methods JPushPlugin.prototype.clearLocalNotifications = function () {
JPushPlugin.prototype.setTagsWithAlias = function (tags, alias) { if (device.platform === 'Android') {
this.callNative('clearLocalNotifications', [], null)
} else {
this.clearAllLocalNotifications()
}
}
JPushPlugin.prototype.setTagsWithAlias = function (tags, alias, successCallback, errorCallback) {
if (tags == null) { if (tags == null) {
this.setAlias(alias) this.setAlias(alias)
return return
@@ -60,142 +81,156 @@ JPushPlugin.prototype.setTagsWithAlias = function (tags, alias) {
} }
var arrayTagWithAlias = [tags] var arrayTagWithAlias = [tags]
arrayTagWithAlias.unshift(alias) arrayTagWithAlias.unshift(alias)
this.call_native('setTagsWithAlias', arrayTagWithAlias, null) this.callNative('setTagsWithAlias', arrayTagWithAlias, successCallback, errorCallback)
} }
JPushPlugin.prototype.setTags = function (tags) { JPushPlugin.prototype.setTags = function (tags, successCallback, errorCallback) {
this.call_native('setTags', tags, null) this.callNative('setTags', tags, successCallback, errorCallback)
} }
JPushPlugin.prototype.setAlias = function (alias) { JPushPlugin.prototype.setAlias = function (alias, successCallback, errorCallback) {
this.call_native('setAlias', [alias], null) this.callNative('setAlias', [alias], successCallback, errorCallback)
}
// 判断系统设置中是否对本应用启用通知。
// iOS: 返回值如果大于 0,代表通知开启;0: 通知关闭。
// UIRemoteNotificationTypeNone = 0,
// UIRemoteNotificationTypeBadge = 1 << 0,
// UIRemoteNotificationTypeSound = 1 << 1,
// UIRemoteNotificationTypeAlert = 1 << 2,
// UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3,
// Android: 返回值 1 代表通知启用;0: 通知关闭。
JPushPlugin.prototype.getUserNotificationSettings = function (successCallback) {
if (this.isPlatformIOS()) {
this.callNative('getUserNotificationSettings', [], successCallback)
} else if (device.platform === 'Android') {
this.callNative('areNotificationEnabled', [], successCallback)
}
}
// iOS methods
JPushPlugin.prototype.startJPushSDK = function () {
this.callNative('startJPushSDK', [], null)
} }
JPushPlugin.prototype.setBadge = function (value) { JPushPlugin.prototype.setBadge = function (value) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('setBadge', [value], null) this.callNative('setBadge', [value], null)
} }
} }
JPushPlugin.prototype.resetBadge = function () { JPushPlugin.prototype.resetBadge = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('resetBadge', [], null) this.callNative('resetBadge', [], null)
} }
} }
JPushPlugin.prototype.setDebugModeFromIos = function () { JPushPlugin.prototype.setDebugModeFromIos = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('setDebugModeFromIos', [], null) this.callNative('setDebugModeFromIos', [], null)
} }
} }
JPushPlugin.prototype.setLogOFF = function () { JPushPlugin.prototype.setLogOFF = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('setLogOFF', [], null) this.callNative('setLogOFF', [], null)
} }
} }
JPushPlugin.prototype.setCrashLogON = function () { JPushPlugin.prototype.setCrashLogON = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('crashLogON', [], null) this.callNative('crashLogON', [], 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()) {
this.call_native('setLocalNotification', [delayTime, content, badge, notificationID, extras], null) this.callNative('setLocalNotification', [delayTime, content, badge, notificationID, extras], null)
} }
} }
JPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS = function (identifierKey) { JPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS = function (identifierKey) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('deleteLocalNotificationWithIdentifierKey', [identifierKey], null) this.callNative('deleteLocalNotificationWithIdentifierKey', [identifierKey], null)
} }
} }
JPushPlugin.prototype.clearAllLocalNotifications = function () { JPushPlugin.prototype.clearAllLocalNotifications = function () {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('clearAllLocalNotifications', [], null) this.callNative('clearAllLocalNotifications', [], null)
} }
} }
JPushPlugin.prototype.setLocation = function (latitude, longitude) { JPushPlugin.prototype.setLocation = function (latitude, longitude) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('setLocation', [latitude, longitude], null) this.callNative('setLocation', [latitude, longitude], null)
} }
} }
JPushPlugin.prototype.startLogPageView = function (pageName) { JPushPlugin.prototype.startLogPageView = function (pageName) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('startLogPageView', [pageName], null) this.callNative('startLogPageView', [pageName], null)
} }
} }
JPushPlugin.prototype.stopLogPageView = function (pageName) { JPushPlugin.prototype.stopLogPageView = function (pageName) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('stopLogPageView', [pageName], null) this.callNative('stopLogPageView', [pageName], null)
} }
} }
JPushPlugin.prototype.beginLogPageView = function (pageName, duration) { JPushPlugin.prototype.beginLogPageView = function (pageName, duration) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('beginLogPageView', [pageName, duration], null) this.callNative('beginLogPageView', [pageName, duration], null)
} }
} }
JPushPlugin.prototype.setApplicationIconBadgeNumber = function (badge) { JPushPlugin.prototype.setApplicationIconBadgeNumber = function (badge) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('setApplicationIconBadgeNumber', [badge], null) this.callNative('setApplicationIconBadgeNumber', [badge], null)
} }
} }
JPushPlugin.prototype.getApplicationIconBadgeNumber = function (callback) { JPushPlugin.prototype.getApplicationIconBadgeNumber = function (callback) {
if (this.isPlatformIOS()) { if (this.isPlatformIOS()) {
this.call_native('getApplicationIconBadgeNumber', [], callback) this.callNative('getApplicationIconBadgeNumber', [], callback)
}
}
// 判断系统设置中是否对本应用启用通知。
// iOS: 返回值如果大于 0,代表通知开启;0: 通知关闭。
// UIRemoteNotificationTypeNone = 0,
// UIRemoteNotificationTypeBadge = 1 << 0,
// UIRemoteNotificationTypeSound = 1 << 1,
// UIRemoteNotificationTypeAlert = 1 << 2,
// UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3,
// Android: 返回值 1 代表通知启用、0: 通知关闭。
JPushPlugin.prototype.getUserNotificationSettings = function (callback) {
if (this.isPlatformIOS()) {
this.call_native('getUserNotificationSettings', [], callback)
} else if (device.platform == 'Android') {
this.call_native('areNotificationEnabled', [], callback)
} }
} }
JPushPlugin.prototype.addDismissActions = function (actions, categoryId) { JPushPlugin.prototype.addDismissActions = function (actions, categoryId) {
this.call_native('addDismissActions', [actions, categoryId]) this.callNative('addDismissActions', [actions, categoryId])
} }
JPushPlugin.prototype.addNotificationActions = function (actions, categoryId) { JPushPlugin.prototype.addNotificationActions = function (actions, categoryId) {
this.call_native('addNotificationActions', [actions, categoryId]) this.callNative('addNotificationActions', [actions, categoryId])
} }
// Android methods // Android methods
JPushPlugin.prototype.setDebugMode = function (mode) { JPushPlugin.prototype.getConnectionState = function (successCallback) {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('setDebugMode', [mode], null) this.callNative('getConnectionState', [], successCallback)
} }
} }
JPushPlugin.prototype.setBasicPushNotificationBuilder = function () { JPushPlugin.prototype.setBasicPushNotificationBuilder = function () {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('setBasicPushNotificationBuilder', [], null) this.callNative('setBasicPushNotificationBuilder', [], null)
} }
} }
JPushPlugin.prototype.setCustomPushNotificationBuilder = function () { JPushPlugin.prototype.setCustomPushNotificationBuilder = function () {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('setCustomPushNotificationBuilder', [], null) this.callNative('setCustomPushNotificationBuilder', [], null)
}
}
JPushPlugin.prototype.receiveRegistrationIdInAndroidCallback = function (data) {
if (device.platform === 'Android') {
data = JSON.stringify(data)
var event = JSON.parse(data)
cordova.fireDocumentEvent('jpush.receiveRegistrationId', event)
} }
} }
@@ -221,51 +256,40 @@ JPushPlugin.prototype.receiveNotificationInAndroidCallback = function (data) {
} }
JPushPlugin.prototype.clearAllNotification = function () { JPushPlugin.prototype.clearAllNotification = function () {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('clearAllNotification', [], null) this.callNative('clearAllNotification', [], null)
} }
} }
JPushPlugin.prototype.clearNotificationById = function (notificationId) { JPushPlugin.prototype.clearNotificationById = function (id) {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('clearNotificationById', [notificationId], null) this.callNative('clearNotificationById', [id], null)
} }
} }
JPushPlugin.prototype.setLatestNotificationNum = function (num) { JPushPlugin.prototype.setLatestNotificationNum = function (num) {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('setLatestNotificationNum', [num], null) this.callNative('setLatestNotificationNum', [num], null)
}
}
JPushPlugin.prototype.setDebugMode = function (mode) {
if (device.platform == 'Android') {
this.call_native('setDebugMode', [mode], null)
} }
} }
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') {
this.call_native('addLocalNotification', [builderId, content, title, notificationID, broadcastTime, extras], null) this.callNative('addLocalNotification',
[builderId, content, title, notificationID, broadcastTime, extras], null)
} }
} }
JPushPlugin.prototype.removeLocalNotification = function (notificationID) { JPushPlugin.prototype.removeLocalNotification = function (notificationID) {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('removeLocalNotification', [notificationID], null) this.callNative('removeLocalNotification', [notificationID], null)
}
}
JPushPlugin.prototype.clearLocalNotifications = function () {
if (device.platform == 'Android') {
this.call_native('clearLocalNotifications', [], null)
} }
} }
JPushPlugin.prototype.reportNotificationOpened = function (msgID) { JPushPlugin.prototype.reportNotificationOpened = function (msgID) {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('reportNotificationOpened', [msgID], null) this.callNative('reportNotificationOpened', [msgID], null)
} }
} }
@@ -274,8 +298,8 @@ JPushPlugin.prototype.reportNotificationOpened = function (msgID) {
*在 Portal 上展示给开发者。 *在 Portal 上展示给开发者。
*/ */
JPushPlugin.prototype.setStatisticsOpen = function (mode) { JPushPlugin.prototype.setStatisticsOpen = function (mode) {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('setStatisticsOpen', [mode], null) this.callNative('setStatisticsOpen', [mode], null)
} }
} }
@@ -284,20 +308,20 @@ JPushPlugin.prototype.setStatisticsOpen = function (mode) {
* 具体可看: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.callNative('requestPermission', [], null)
} }
} }
JPushPlugin.prototype.setSilenceTime = function (startHour, startMinute, endHour, endMinute) { JPushPlugin.prototype.setSilenceTime = function (startHour, startMinute, endHour, endMinute) {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('setSilenceTime', [startHour, startMinute, endHour, endMinute], null) this.callNative('setSilenceTime', [startHour, startMinute, endHour, endMinute], null)
} }
} }
JPushPlugin.prototype.setPushTime = function (weekdays, startHour, endHour) { JPushPlugin.prototype.setPushTime = function (weekdays, startHour, endHour) {
if (device.platform == 'Android') { if (device.platform === 'Android') {
this.call_native('setPushTime', [weekdays, startHour, endHour], null) this.callNative('setPushTime', [weekdays, startHour, endHour], null)
} }
} }