Compare commits

...

167 Commits

Author SHA1 Message Date
Hevin
1c3228848b build: v3.2.7 2017-10-11 14:49:07 +08:00
huangminlinux
585e2a5084 fix open local notification to launch app event bug 2017-10-11 14:28:56 +08:00
huangminlinux
c726477cfb remove jpush.startLocalNotification event in iOS docs 2017-10-11 11:29:40 +08:00
huangminlinux
3f00143a5a update doc remove startLocalNotification event 2017-10-11 11:26:46 +08:00
huangminlinux
f5ea2b5b10 ios add jpush.receiveRegistrationId event 2017-10-11 11:15:13 +08:00
Hevin
266d0cb28f Add JPushEventReceiver in manifest 2017-09-28 10:22:40 +08:00
Hevin
9f156727e7 Remove unused code 2017-09-26 17:51:25 +08:00
Hevin
155f1e2f6c Update Android SDK to v3.0.9 2017-09-26 17:48:18 +08:00
Hevin
9680e685e3 Remove unused console.log 2017-09-25 12:33:08 +08:00
Hevin
2eefd1c247 Fixed android api doc 2017-09-25 12:32:27 +08:00
Hevin
fa256bfb46 Format api doc 2017-09-23 09:11:21 +08:00
Hevin
83293656da Optimize api doc 2017-09-22 21:15:37 +08:00
Hevin
8a55aaa429 Update README 2017-09-22 20:13:25 +08:00
Hevin
b5f32e5107 Update example 2017-09-22 20:13:15 +08:00
Hevin
7afb705555 Update tag & alias api 2017-09-22 20:08:37 +08:00
Hevin
e71c6f3505 build: v3.2.4 2017-09-22 16:23:21 +08:00
Hevin
ff65c09d4e Update tag & alias api of iOS 2017-09-22 16:12:23 +08:00
Hevin
8398bb56f1 Improve example 2017-09-22 16:06:44 +08:00
Hevin
291aa7b8bf Update tag & alias methods 2017-09-21 19:20:53 +08:00
Hevin
5c00243986 Update JPUSHService.h to v3.0.6 2017-09-20 19:03:31 +08:00
Hevin
3ce2babd9b Add new tag and alias methods 2017-09-19 17:48:22 +08:00
Hevin
a27cc445ee Update Android sdk to v3.0.8 2017-09-19 17:46:49 +08:00
Hevin
e9ddd798ad Add FAQ 2017-09-19 14:33:06 +08:00
Hevin
5fca83c8b7 Optimize iOS API doc 2017-09-08 14:17:24 +08:00
Hevin
d50b74cfab Add FAQ of Android 2017-09-08 11:04:31 +08:00
Hevin
c7bc0ea4c2 Remove unused doc 2017-09-08 11:04:10 +08:00
Hevin
021725e054 Add janalytics 2017-07-21 14:11:24 +08:00
Hevin
5d27dca472 Foramt README 2017-07-21 13:53:07 +08:00
Hevin
09f98f7c38 Update version number to 3.2.3 2017-07-21 13:52:54 +08:00
Hevin
7b1a77aecb Update ios sdk to 3.0.6 2017-07-21 13:52:37 +08:00
Hevin
0436cfcf3e Update version to 3.2.2 2017-07-12 10:16:10 +08:00
huangminlinux
3c70127405 fix notification in backgroup bug 2017-07-12 10:14:50 +08:00
Hevin
9f5fccefec Update version to 3.2.1 2017-07-07 11:26:04 +08:00
Hevin
be07c7383b Update setTagsWithAlias callback. 2017-07-07 11:23:56 +08:00
huangminlinux
2df6ea47a8 fix setTags/Alias bug 2017-07-07 11:21:14 +08:00
Hevin
c72cde6632 Add new qq group & how to custom notification sound. 2017-07-04 17:43:24 +08:00
Hevin
f31881d88a Add install note. 2017-06-30 15:43:58 +08:00
Hevin
31eef706e4 Update version number 2017-06-30 15:43:38 +08:00
Hevin
2cf2bcf970 Rm ios hook 2017-06-30 15:41:14 +08:00
Hevin
5d42764438 Merge branch 'master' into dev 2017-06-30 10:57:54 +08:00
Hevin
a5a03a3214 Merge pull request #249 from snipking/master
check does `com.apple.Push` attribute exist in .pbxproj
2017-06-30 10:52:56 +08:00
DerekChia jingqiang.jia@hand-china.com
7b70564f82 add: check does com.apple.Push attribute exist in .pbxproj to avoid not found error. 2017-06-29 15:15:12 +08:00
DerekChia jingqiang.jia@hand-china.com
6059f546f6 Merge remote-tracking branch 'jpush/master' 2017-06-29 15:07:28 +08:00
Hevin
d855a07271 Merge branch 'dev' 2017-06-29 10:55:27 +08:00
Hevin
c1e70448b1 Update plugin version to 3.1.9 2017-06-29 10:55:07 +08:00
Hevin
a9f6adb7af Merge branch 'master' into dev 2017-06-29 10:04:08 +08:00
Hevin
847d94c080 Merge pull request #248 from snipking/master
fix #245
2017-06-29 09:51:55 +08:00
DerekChia jingqiang.jia@hand-china.com
c959fdddeb add: check does ios.release.developmentTeam exist in build.json
fix #245
2017-06-28 16:50:26 +08:00
DerekChia jingqiang.jia@hand-china.com
4285170332 Merge remote-tracking branch 'jpush/master' 2017-06-28 16:50:04 +08:00
Hevin
86f07c9729 Merge branch 'dev' 2017-06-28 10:00:16 +08:00
Hevin
e3d8d69147 Fix spelling error. 2017-06-28 09:59:57 +08:00
Hevin
8970e44dc1 Merge branch 'dev' 2017-06-27 10:23:48 +08:00
Hevin
7f3682e2a8 fix #244 2017-06-27 10:23:33 +08:00
Hevin
dd716aaca7 Merge branch 'master' into dev 2017-06-23 16:30:32 +08:00
Hevin
f5394d6d01 Merge pull request #243 from snipking/master
fix #242
2017-06-23 16:29:09 +08:00
DerekChia jingqiang.jia@hand-china.com
2fc0bc9213 Merge remote-tracking branch 'jpush/master' 2017-06-23 14:33:15 +08:00
4bc2fe3dc1 fix #242 2017-06-23 14:31:46 +08:00
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
DerekChia jingqiang.jia@hand-china.com
e20a10588f Merge remote-tracking branch 'jpush/master' 2017-06-06 13:57:52 +08:00
DerekChia jingqiang.jia@hand-china.com
eefc2e13cb fix typo 2017-06-06 13:57:38 +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
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
54 changed files with 3303 additions and 2071 deletions

40
.gitignore vendored
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

109
README.md
View File

@@ -1,74 +1,135 @@
# JPush PhoneGap / Cordova Plugin
[![Build Status](https://travis-ci.org/jpush/jpush-phonegap-plugin.svg?branch=master)](https://travis-ci.org/jpush/jpush-phonegap-plugin)
[![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-3.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)
[![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1)
支持 iOS, Android Cordova 推送插件。
> 如需要 IM 功能的插件,可关注 [JMessage PhoneGap Plugin](https://github.com/jpush/jmessage-phonegap-plugin)。
极光官方支持的 cordova 推送插件。
> 如需要短信验证码功能的插件,可关注 [JSMS Cordova Plugin](https://github.com/jpush/cordova-plugin-jsms)。
> QQ 交流群413602425。
- 如需要 IM 功能的插件,可关注 [jmessage-phonegap-plugin](https://github.com/jpush/jmessage-phonegap-plugin)
- 如需要短信验证码功能插件,可关注 [cordova-plugin-jsms](https://github.com/jpush/cordova-plugin-jsms)
- 如需要统计分析功能插件,可关注 [cordova-plugin-janalytics](https://github.com/jpush/cordova-plugin-janalytics)
## Install
- 通过 Cordova Plugins 安装,要求 Cordova CLI 5.0+
cordova plugin add jpush-phonegap-plugin --variable API_KEY=your_jpush_appkey
```shell
cordova plugin add jpush-phonegap-plugin --variable APP_KEY=your_jpush_appkey
```
- 或直接通过 url 安装:
cordova plugin add https://github.com/jpush/jpush-phonegap-plugin.git --variable API_KEY=your_jpush_appkey
```shell
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
```shell
cordova plugin add Your_Plugin_Path --variable APP_KEY=your_jpush_appkey
```
> 在使用 Xcode 8 调试 iOS 项目时,需要先在项目配置界面的 Capabilities 中打开 Push Notifications 开关。
## Usage
### API
- [公共 API](/doc/Common_detail_api.md)
- [iOS API](/doc/iOS_API.md)
- [Android API](/doc/Android_detail_api.md)
- [Common](/doc/Common_detail_api.md)
- [iOS](/doc/iOS_API.md)
- [Android](/doc/Android_detail_api.md)
### Demo
插件项目中包含一个简单的 Demo。若想参考可以在 */example* 文件夹内找到并拷贝以下文件:
example/index.html -> www/index.html
example/css/* -> www/css
example/js/* -> www/js
example/index.html -> www/index.html
example/css/* -> www/css
example/js/* -> www/js
### 关于 PhoneGap build 云服务
该项目基于 Cordova 实现,目前无法使用 PhoneGap build 云服务进行打包,建议使用本地环境进行打包。
## 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
#### 在 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。
#### 无法获取到 Registration Id
检查 AppKey 和应用包名是否对应、是否调用了 `init` 方法。
#### 如何自定义通知声音?
Android 因为各 Rom 的高度定制化,不像 iOS 一样能有一个统一的管理,如果在 Android 中想自定义通知铃声,推荐通过 JPush 推送自定义
消息,之后在 `jpush.receiveMessage` 事件监听中通过 [Cordova Local-Notification Plugin](https://github.com/katzer/cordova-plugin-local-notifications) 触发通知,再配合 [Cordova Background Plugin](https://github.com/katzer/cordova-plugin-background-mode) 插件保证应用的后台运行。
#### 如果让通知内容像 iOS 一样换行展示?
[#267](https://github.com/jpush/jpush-phonegap-plugin/issues/267)
#### 关闭 App 后收不到通知
Android 的推送通过长连接的方式实现,只有在连接保持的情况下才能收到通知。而有的第三方 ROM 会限制一般应用服务的自启动,也就是
在退出应用后,应用的所有服务均被杀死,且无法自启动,所以就会收不到通知。
目前 JPush 是做了应用互相拉起机制的,也就是当用户打开其他集成了 JPush 的应用时,你的应用也能同时收到推送消息。
如果你的应用希望随时都能收到推送,官方推荐是通过文案的方式引导用户在设置中允许你的应用能够自启动,常见机型的设置方法可以参考[这里](https://docs.jiguang.cn/jpush/client/Android/android_faq/#_2)。
或者自己实现应用保活,网上有很多相关文章(不推荐)。
> 为什么 QQ、微信之类的应用退出后还能够收到通知因为这些大厂应用手机厂商默认都会加入自启动白名单中也不会在应用退出后杀死它们的相关服务。
> 如果你多加留意,就会发现非大厂的应用如果你一段时间不用都是收不到推送的。
### iOS
#### 打包时遇到 i386 打包失败怎么办?
```shell
cordova platform update ios
```
#### ionic 2 如何调用 API
[issue 179](https://github.com/jpush/jpush-phonegap-plugin/issues/179)
#### PushConfig.plist 文件中的字段都是什么意思?
- APP_KEY应用标识。
- CHANNEL渠道标识。
- Appkey应用标识。
- Channel渠道标识。
- IsProduction是否生产环境。
- 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
- 删除插件、再重装插件(先使用 `cordova platform add ios`,后使用 `cordova plugin add`
## Support
- QQ 群413602425
- [JPush 官网文档](http://docs.jpush.io/)
- QQ 群413602425 / 524248013
- [JPush 官网文档](https://docs.jiguang.cn/jpush/guideline/intro/)
- [极光社区](http://community.jiguang.cn/)
## Contribute
Please contribute! [Look at the issues](https://github.com/jpush/jpush-phonegap-plugin/issues).
## License
MIT © [JiGuang](/license)

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
# 通用 API 说明
# 通用 API 说明(同时适用于 Android 和 iOS 系统)
- [停止与恢复推送服务](#停止与恢复推送服务)
- [获取 RegistrationID](#获取-registrationid)
@@ -17,83 +17,93 @@
本功能是一个完全本地的状态操作,也就是说:停止推送服务的状态不会保存到服务器上。
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,JPush SDK 会恢复正常的默认行为(因为保存在本地的状态数据被清除掉了)。
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
#### 接口定义
window.plugins.jPushPlugin.init()
```js
window.JPush.init()
```
### API - stopPush
+ Android 平台:
+ 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
- Android:
- 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
- 调用了本 API 后JPush 推送服务完全被停止,具体表现为:
- JPush Service 不在后台运行。
- 收不到推送消息。
- 不能通过 `init` 方法恢复,而需要调用 `resumePush` 恢复。
- 极光推送其他所有的 API 调用都无效。
+ 调用了本 API 后JPush 推送服务完全被停止,具体表现为:
+ JPush Service 不在后台运行。
+ 收不到推送消息。
+ 不能通过 JPushInterface.init 恢复,需要调用 resumePush 恢复。
+ 极光推送所有的其他 API 调用都无效。
+ iOS 平台:
+ 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。
+ 推荐:设置一个 UI 界面, 提醒用户在 设置-通知 中关闭推送服务。
- iOS:
- 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。**建议设置一个 UI 界面, 提醒用户在 设置-通知 中关闭推送服务**。
#### 接口定义
window.plugins.jPushPlugin.stopPush()
```js
window.JPush.stopPush()
```
### API - resumePush
恢复推送服务。调用了此 API 后:
+ Android 平台:
- Android 平台:
- 极光推送完全恢复正常工作。
+ 极光推送完全恢复正常工作。
+ iOS 平台:
+ 重新去APNS注册。
- iOS 平台:
- 重新去 APNS 注册。
#### 接口定义
window.plugins.jPushPlugin.resumePush()
```js
window.JPush.resumePush()
```
### API - isPushStopped
+ Android 平台:
+ 用来检查 Push Service 是否已经被停止。
+ iOS 平台:
+ 平台检查推送服务是否注册。
- Android 平台:
- 用来检查 Push Service 是否已经被停止。
- iOS 平台:
- 平台检查推送服务是否注册。
#### 接口定义
window.plugins.jPushPlugin.isPushStopped(callback)
```js
window.JPush.isPushStopped(callback)
```
#### 参数说明
+ callback: 回调函数,用来通知 JPush 的推送服务是否开启。
- callback: 回调函数,用来通知 JPush 的推送服务是否开启。
#### 代码示例
window.plugins.jPushPlugin.isPushStopped(function (result) {
if (result == 0) {
// 开启
} else {
// 关闭
}
})
```js
window.JPush.isPushStopped(function (result) {
if (result == 0) {
// 开启
} else {
// 关闭
}
})
```
## 开启 Debug 模式
### API - setDebugMode
用于开启 Debug 模式,显示更多的日志信息。
#### 代码示例
```js
window.JPush.setDebugMode(true)
```
#### 参数说明
- isOpen: true开启 Debug 模式false关闭 Debug 模式,不显示错误信息之外的日志信息。
## 获取 RegistrationID
@@ -108,7 +118,9 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 接口定义
JPushPlugin.prototype.getRegistrationID(callback)
```js
window.JPush.getRegistrationID(callback)
```
#### 返回值
@@ -116,19 +128,14 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 代码示例
window.plugins.jPushPlugin.getRegistrationID(onGetRegistradionID);
var onGetRegistradionID = function(data) {
try {
console.log("JPushPlugin:registrationID is " + data);
} catch(exception) {
console.log(exception);
}
}
```js
window.JPush.getRegistrationID(function(rId) {
console.log("JPushPlugin:registrationID is " + rId)
})
```
## 设置别名与标签
### API - setTagsWithAlias, setTags, setAlias
提供几个相关 API 用来设置别名alias与标签tags
这几个 API 可以在 App 里任何地方调用。
@@ -143,7 +150,7 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端 API 会同时给这多个用户发送消息。
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端 API 发通知到客户端提醒用户。
举例:在一个用户要登录的游戏中,可能设置别名为 userId。游戏运营时发现该用户 3 天没有玩游戏了,则根据 userId 调用服务器端 API 发通知到客户端提醒用户。
**标签 Tag**:
@@ -155,59 +162,200 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
举例: game, old_page, women。
#### 接口定义
> 以下方法的错误回调均包含 `sequence` 和 `code` 属性。其中 code 为错误码,具体定义可参考[官方文档](https://docs.jiguang.cn/jpush/client/Android/android_api/#_133)。
JPushPlugin.prototype.setTagsWithAlias(tags, alias)
JPushPlugin.prototype.setTags(tags)
JPushPlugin.prototype.setAlias(alias)
### setAlias
设置别名。注意这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
#### 代码示例
```js
window.JPush.setAlias({ sequence: 1, alias: 'your_alias' },
(result) => {
var sequence = result.sequence
var alias = result.alias
}, (error) => {
var sequence = error.sequence
var errorCode = error.code
})
```
#### 参数说明
* tags:
* 参数类型为数组。
* nil 此次调用不设置此值。
* 空集合表示取消之前的设置。
* 每次调用至少设置一个 tag覆盖之前的设置不是新增。
* 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
* 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag但总长度不得超过1K字节判断长度需采用 UTF-8 编码)。
* 单个设备最多支持设置 100 个 tagApp 全局 tag 数量无限制。
* alias:
* 参数类型为字符串。
* nil 此次调用不设置此值。
* 空字符串 "")表示取消之前的设置。
* 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
* 限制alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
#### 返回值说明
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
- alias: string
- 每次调用设置有效的别名将覆盖之前的设置。
- 有效的别名组成:字母(区分大小写)、数字、下划线、汉字、特殊字符@!#$&*+=.|。
- 限制alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果:
### deleteAlias
document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false);
var onTagsWithAlias = function(event) {
try {
console.log("onTagsWithAlias");
var result = "result code:" + event.resultCode + " ";
result += "tags:" + event.tags + " ";
result += "alias:" + event.alias + " ";
$("#tagAliasResult").html(result);
} catch(exception) {
console.log(exception);
}
}
删除别名。
#### 错误码定义
#### 代码示例
|Code|描述 |详细解释 |
|----|:----------------------------------------|:--------|
|6001|无效的设置tag / alias 不应参数都为 null。 | |
|6002|设置超时。 |建议重试。|
|6003|alias 字符串不合法。 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6004|alias超长。 |最多 40个字节中文 UTF-8 是 3 个字节。|
|6005|某一个 tag 字符串不合法。 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6006|某一个 tag 超长。 |一个 tag 最多 40个字节中文 UTF-8 是 3 个字节。|
|6007|tags 数量超出限制,最多 100 个。 |这是一台设备的限制,一个应用全局的标签数量无限制。|
|6008|tag / alias 超出总长度限制。 |总长度最多 1K 字节。|
|6011|10s内设置 tag 或 alias 大于 3 次。 |短时间内操作过于频繁。|
```js
window.JPush.deleteAlias({ sequence: 1 },
(result) => {
var sequence = result.sequence
}, (error) => {
var sequence = error.sequence
var errorCode = error.code
})
```
#### 参数说明
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
### getAlias
查询别名。
#### 代码示例
```js
window.JPush.getAlias({ sequence: 1 },
(result) => {
var sequence = result.sequence
var alias = result.alias
}, (error) => {
var sequence = error.sequence
var errorCode = error.code
})
```
#### 参数说明
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
### setTags
设置标签。注意这个接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
#### 代码示例
```js
window.JPush.setTags({ sequence: 1, tags: ['tag1', 'tag2'] },
(result) => {
var sequence = result.sequence
var tags = result.tags // 数组类型
}, (error) => {
var sequence = error.sequence
var errorCode = error.code
})
```
#### 参数说明
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
- tags: Array标签数组。
### addTags
新增标签。
#### 代码示例
```js
window.JPush.addTags({ sequence: 1, tags: ['tag1', 'tag2'] },
(result) => {
var sequence = result.sequence
var tags = result.tags // 数组类型
}, (error) => {
var sequence = error.sequence
var errorCode = error.code
})
```
#### 参数说明
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
- tags: Array标签数组。
### deleteTags
删除指定标签。
#### 代码示例
```js
window.JPush.deleteTags({ sequence: 1, tags: ['tag1', 'tag2'] },
(result) => {
var sequence = result.sequence
}, (error) => {
var sequence = error.sequence
var errorCode = error.code
})
```
#### 参数说明
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
- tags: Array标签数组。
### cleanTags
清除所有标签。
#### 代码示例
```js
window.JPush.cleanTags({ sequence: 1 },
(result) => {
var sequence = result.sequence
}, (error) => {
var sequence = error.sequence
var errorCode = error.code
})
```
#### 参数说明
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
### getAllTags
获取当前绑定的所有标签。
#### 代码示例
```js
window.JPush.getAllTags({ sequence: 1 },
(result) => {
var sequence = result.sequence
var tags = result.tags
}, (error) => {
var sequence = error.sequence
var errorCode = error.code
})
```
#### 参数说明
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
### checkTagBindState
查询指定tag与当前用户绑定的状态。
#### 代码示例
```js
window.JPush.checkTagBindState({ sequence: 1, tag: 'tag1' },
(result) => {
var sequence = result.sequence
}, (error) => {
var sequence = error.sequence
var errorCode = error.code
})
```
#### 参数说明
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
- tag: string待查询的 tag。
## 获取点击通知内容
@@ -219,49 +367,52 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.openNotification", onOpenNotification, false);
```js
document.addEventListener("jpush.openNotification", function (event) {
var alertContent
if(device.platform == "Android") {
alertContent = event.alert
} else {
alertContent = event.aps.alert
}
}, false)
```
- onOpenNotification 需要这样写:
> ps点击通知后传递的 json object 保存在 window.JPush.openNotification直接访问即可字段示例根据实际推送情况可能略有差别请注意。
var alertContent;
if(device.platform == "Android") {
alertContent = event.alert;
} else {
alertContent = event.aps.alert;
}
alert("open Notificaiton:" + alertContent);
- Android:
ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.openNotification直接访问即可字段示例根据实际推送情况可能略有差别请注意。
```json
{
"title": "title",
"alert":"ding",
"extras":{
"yourKey": "yourValue",
"cn.jpush.android.MSG_ID": "1691785879",
"app": "com.thi.pushtest",
"cn.jpush.android.ALERT": "ding",
"cn.jpush.android.EXTRA": {},
"cn.jpush.android.PUSH_ID": "1691785879",
"cn.jpush.android.NOTIFICATION_ID": 1691785879,
"cn.jpush.android.NOTIFICATION_TYPE": "0"
}
}
```
+ Android:
- iOS:
{
"title": "title",
"alert":"ding",
"extras":{
"yourKey": "yourValue",
"cn.jpush.android.MSG_ID": "1691785879",
"app": "com.thi.pushtest",
"cn.jpush.android.ALERT": "ding",
"cn.jpush.android.EXTRA": {},
"cn.jpush.android.PUSH_ID": "1691785879",
"cn.jpush.android.NOTIFICATION_ID": 1691785879,
"cn.jpush.android.NOTIFICATION_TYPE": "0"
}
}
+ iOS:
{
"aps":{
"badge": 1,
"sound": "default",
"alert": "今天去哪儿"
},
"key1": "value1",
"key2": "value2",
"_j_msgid": 154604475
}
```json
{
"aps": {
"badge": 1,
"sound": "default",
"alert": "今天去哪儿"
},
"key1": "value1",
"key2": "value2",
"_j_msgid": 154604475
}
```
## 获取通知内容
@@ -273,50 +424,53 @@ ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.o
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false);
```js
document.addEventListener("jpush.receiveNotification", function (event) {
var alertContent
if(device.platform == "Android") {
alertContent = event.alert
} else {
alertContent = event.aps.alert
}
alert("open Notification:" + alertContent)
}, false)
```
- onReceiveNotification 需要这样写:
> ps点击通知后传递的 json object 保存在 window.JPush.receiveNotification直接访问即可字段示例根据实际推送情况可能略有差别请注意。
var alertContent;
if(device.platform == "Android") {
alertContent = event.alert;
} else {
alertContent = event.aps.alert;
}
alert("open Notificaiton:" + alertContent);
- Android:
ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveNotification直接访问即可字段示例根据实际推送情况可能略有差别请注意。
```json
{
"title": "title",
"alert":"ding",
"extras":{
"yourKey": "yourValue",
"cn.jpush.android.MSG_ID":"1691785879",
"app":"com.thi.pushtest",
"cn.jpush.android.ALERT":"ding",
"cn.jpush.android.EXTRA":{},
"cn.jpush.android.PUSH_ID":"1691785879",
"cn.jpush.android.NOTIFICATION_ID":1691785879,
"cn.jpush.android.NOTIFICATION_TYPE":"0"
}
}
```
+ Android:
{
"title": "title",
"alert":"ding",
"extras":{
"yourKey": "yourValue",
"cn.jpush.android.MSG_ID":"1691785879",
"app":"com.thi.pushtest",
"cn.jpush.android.ALERT":"ding",
"cn.jpush.android.EXTRA":{},
"cn.jpush.android.PUSH_ID":"1691785879",
"cn.jpush.android.NOTIFICATION_ID":1691785879,
"cn.jpush.android.NOTIFICATION_TYPE":"0"
}
}
+ iOS:
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
- iOS:
```json
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
```
## 获取自定义消息推送内容
@@ -324,52 +478,47 @@ ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.r
收到自定义消息时触发这个事件,推荐使用事件的方式传递。
但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
但同时保留了 `receiveMessageIniOSCallback` 的回调函数,兼容以前的代码。
#### 代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
```js
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.JPush.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);
}
}
- Android:
ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveMessage
直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
```json
{
"message":"今天去哪儿",
"extras"{
"yourKey": "yourValue",
"cn.jpush.android.MSG_ID":"154378013",
"cn.jpush.android.CONTENT_TYPE":"",
"cn.jpush.android.EXTRA":{ "key":"不添加没有" }
}
}
```
+ Android:
{
"message":"今天去哪儿",
"extras"{
"yourKey": "yourValue",
"cn.jpush.android.MSG_ID":"154378013",
"cn.jpush.android.CONTENT_TYPE":"",
"cn.jpush.android.EXTRA":{"key":"不添没有"}
}
}
+ iOS
{
"content":"今天去哪儿",
"extras":{"key":"不填写没有"}
}
- iOS
```json
{
"content":"今天去哪儿",
"extras":{ "key":"不添加没有" }
}
```
## 判断系统设置中是否允许当前应用推送
### API - getUserNotificationSettings
@@ -379,18 +528,21 @@ ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.r
在 iOS 中,返回值为 0 时,代表系统设置中关闭了推送;大于 0 时,代表打开了推送,且能够根据返回值判断具体通知形式:
UIRemoteNotificationTypeNone = 0, // 0
UIRemoteNotificationTypeBadge = 1 << 0, // 1
UIRemoteNotificationTypeSound = 1 << 1, // 2
UIRemoteNotificationTypeAlert = 1 << 2, // 4
UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3 // 8
```js
UIRemoteNotificationTypeNone = 0, // 0
UIRemoteNotificationTypeBadge = 1 << 0, // 1
UIRemoteNotificationTypeSound = 1 << 1, // 2
UIRemoteNotificationTypeAlert = 1 << 2, // 4
UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3 // 8
```
#### 代码示例
window.plugins.jPushPlugin.getUserNotificationSettings(function(result) {
if(result == 0) {
// 系统设置中已关闭应用推送。
} else if(result > 0) {
// 系统设置中打开了应用推送。
}
});
```js
window.JPush.getUserNotificationSettings(function(result) {
if(result == 0) {
// 系统设置中已关闭应用推送。
} else if(result > 0) {
// 系统设置中打开了应用推送。
})
```

View File

@@ -1,40 +1,65 @@
# iOS API
- [延迟注册和启动推送通知服务](#延迟注册和启动推送通知服务)
- [开始与停止推送服务](#开始与停止推送服务)
- [获取 RegistrationID](#获取-registrationid)
- [别名与标签](#别名与标签)
- [获取 APNS 推送内容](#获取-apns-推送内容)
- [点击推送通知](#点击推送通知)
- [前台收到推送](#前台收到推送)
- [后台收到推送](#后台收到推送)
- [点击推送通知](#点击推送通知)
- [前台收到推送](#前台收到推送)
- [后台收到推送](#后台收到推送)
- [获取自定义消息内容](#获取自定义消息内容)
- [设置Badge](#设置badge)
- [本地通知](#本地通知)
- [获取本地通知内容](#获取本地通知内容)
- [页面的统计](#页面的统计)
- [日志等级设置](#日志等级设置)
- [地理位置上报](#地理位置上报)
- [设备平台判断](#设备平台判断)
- [iOS 10 进阶推送特性](#ios-10-进阶推送特性)
- [获取用户推送设置](#获取用户推送设置)
- [监听事件统一说明](#监听事件统一说明)
## 延迟注册和启动推送通知服务
本插件默认在 App 启动完成之后,立即「注册苹果通知服务」+「启动 JPush SDK」其中
- 「注册苹果通知服务」会弹出提示窗口向用户请求权限。
- 「启动 JPush SDK」是使用 JPush 各项 API 的必要条件。
开发者可以根据自己的需求,延迟注册和启动,需做以下操作:
1.查找并配置 `PushConfig.plist` 文件中的 `Delay` 字段为 `YES`,表明会延迟使用,此时插件不再自动注册、启动通知。
2.在需要注册并启动通知的地方调用 API - `startJPushSDK`
### API - startJPushSDK
注册苹果通知服务,并启动 JPush SDK。
#### 接口定义
```js
window.JPush.startJPushSDK()
```
## 开始与停止推送服务
### API - init
调用此 API,用来开启 JPush SDK 提供的推送服务。
调用此 API用来开启 JPush SDK 提供的推送服务。
开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
```
本功能是一个完全本地的状态操作。也就是说:停止推送服务的状态不会保存到服务器上。
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
```
#### 接口定义
window.plugins.jPushPlugin.init()
```js
window.JPush.init()
```
### API - stopPush
@@ -43,8 +68,9 @@ JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数
#### 接口定义
window.plugins.jPushPlugin.stopPush()
```js
window.JPush.stopPush()
```
### API - resumePush
@@ -52,8 +78,9 @@ JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数
#### 接口定义
window.plugins.jPushPlugin.resumePush()
```js
window.JPush.resumePush()
```
### API - isPushStopped
@@ -61,23 +88,25 @@ iOS平台检查推送服务是否停止。
#### 接口定义
window.plugins.jPushPlugin.isPushStopped(callback)
```js
window.JPush.isPushStopped(callback)
```
#### 参数说明
- callback 回调函数,用来通知 JPush 的推送服务是否开启。
#### 代码示例
window.plugins.jPushPlugin.isPushStopped(callback)
var callback = function(data) {
if(data > 0) {
// 已关闭
} else {
// 已开启
}
}
```js
window.JPush.isPushStopped(function(data) {
if(data > 0) {
// 已关闭
} else {
// 已开启
}
})
```
## 获取 RegistrationID
@@ -92,7 +121,9 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 接口定义
JPushPlugin.prototype.getRegistrationID(callback)
```js
JPushPlugin.getRegistrationID(callback)
```
#### 返回值
@@ -100,98 +131,11 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 调用示例
window.plugins.jPushPlugin.getRegistrationID(onGetRegistradionID);
var onGetRegistradionID = function(data) {
try {
console.log("JPushPlugin:registrationID is " + data);
} catch(exception) {
console.log(exception);
}
}
## 别名与标签
### API - setTagsWithAlias, setTags, setAlias
提供几个相关 API 用来设置别名alias与标签tags
这几个 API 可以在 App 里任何地方调用。
**别名 Alias**
为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
每个用户只能指定一个别名。
同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端 API 会同时给这多个用户发送消息。
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端 API 发通知到客户端提醒用户。
**标签 Tag**
为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push 消息。
可为每个用户打多个标签。
不同应用程序、不同的用户,可以打同样的标签。
举例: game, old_page, women。
#### 接口定义
JPushPlugin.prototype.setTagsWithAlias(tags, alias)
JPushPlugin.prototype.setTags(tags)
JPushPlugin.prototype.setAlias(alias)
#### 参数说明
* tags:
* 参数类型为数组。
* nil 此次调用不设置此值。
* 空集合表示取消之前的设置。
* 每次调用至少设置一个 tag覆盖之前的设置不是新增。
* 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
* 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag但总长度不得超过1K字节判断长度需采用UTF-8编码
* 单个设备最多支持设置 100 个 tagApp 全局 tag 数量无限制。
* alias:
* 参数类型为字符串。
* nil 此次调用不设置此值。
* 空字符串 "")表示取消之前的设置。
* 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
* 限制alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
#### 返回值说明
函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果。
document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false);
var onTagsWithAlias = function(event) {
try {
console.log("onTagsWithAlias");
var result = "result code:"+event.resultCode + " ";
result += "tags:" + event.tags + " ";
result += "alias:" + event.alias + " ";
$("#tagAliasResult").html(result);
} catch(exception) {
console.log(exception)
}
}
#### 错误码定义
|Code|描述 |详细解释 |
|----|:----------------------------------------|:--------|
|6001|无效的设置tag/alias 不应参数都为 null | |
|6002|设置超时 |建议重试。|
|6003|alias 字符串不合法 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6004|alias超长 |最多 40个字节 中文 UTF-8 是 3 个字节。|
|6005|某一个 tag 字符串不合法 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6006|某一个 tag 超长 |一个 tag 最多 40个字节 中文 UTF-8 是 3 个字节。|
|6007|tags 数量超出限制(最多 100 个) |这是一台设备的限制。一个应用全局的标签数量无限制。|
|6008|tag/alias 超出总长度限制 |总长度最多 1K 字节。|
|6011|10s内设置tag或alias大于3次 |短时间内操作过于频繁。|
```js
window.JPush.getRegistrationID(function(data) {
console.log("JPushPlugin:registrationID is " + data)
})
```
## 获取 APNS 推送内容
@@ -205,28 +149,33 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.openNotification", onOpenNotification, false);
```js
document.addEventListener("jpush.openNotification", onOpenNotification, false)
```
- onOpenNotification 需要这样写:
var onOpenNotification = function(event) {
var alertContent;
alertContent = event.aps.alert;
alert("open Notificaiton:" + alertContent);
}
```js
var onOpenNotification = function(event) {
var alertContent = event.aps.alert
alert("open notification:" + alertContent)
}
```
- event 举例:
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
```json
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
```
### 前台收到推送
@@ -238,140 +187,141 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false);
```js
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false)
```
- onReceiveNotification 需要这样写:
var onReceiveNotification = function(event) {
var alertContent;
alertContent = event.aps.alert;
alert("open Notificaiton:" + alertContent);
}
```js
var onReceiveNotification = function(event) {
var alertContent = event.aps.alert
alert("open Notification:" + alertContent)
}
```
- event 举例
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
```json
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
```
### 后台收到推送
#### event - jpush.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 文件中加入:
document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false);
```js
document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false)
```
- onBackgroundNotification 需要这样写:
var onBackgroundNotification = function(event) {
var alertContent;
alertContent = event.aps.alert;
alert("open Notificaiton:" + alertContent);
}
```js
var onBackgroundNotification = function(event) {
var alertContent = event.aps.alert
alert("open Notification:" + alertContent)
}
```
+ event 举例
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
#### API - receiveMessageIniOSCallback
用于 iOS 收到应用内消息的回调函数(请注意和通知的区别),该函数不需要主动调用
不推荐使用回调函数
##### 接口定义
JPushPlugin.prototype.receiveMessageIniOSCallback(data)
##### 参数说明
- data: 是一个 js 字符串使用如下代码解析js 具体 key 根据应用内消息来确定:
var bToObj = JSON.parse(data);
## 获取自定义消息内容
- event 举例
```json
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
```
### event - jpush.receiveMessage
收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 `receiveMessageIniOSCallback` 的回调函数,兼容以前的代码。
#### 代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
```js
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false)
```
- onReceiveMessage 需要这样写:
var onReceiveMessage = function(event) {
try{
var message;
message = event.content;
$("#messageResult").html(message);
}catch(exception) {
console.log("JPushPlugin:onReceiveMessage-->" + exception);
}
}
```js
var onReceiveMessage = function(event) {
try {
var message = event.content
$("#messageResult").html(message)
} catch(exception) {
console.log("JPushPlugin:onReceiveMessage-->" + exception);
}
}
```
- event 举例:
{
"content":"今天去哪儿",
"extras":
{
"key":"不填写没有"
}
}
```json
{
"content":"今天去哪儿",
"extras":
{
"key":"不填写没有"
}
}
```
## 设置Badge
### API - setBadge, resetBadge
JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,
由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
(本接口不会直接改变应用本地的角标值. 要修改本地 badege 值,使用 setApplicationIconBadgeNumber
JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
(本接口不会直接改变应用本地的角标值. 要修改本地 badge 值,使用 `setApplicationIconBadgeNumber`
实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。
#### 接口定义
window.plugins.jPushPlugin.prototype.setBadge(value)
window.plugins.jPushPlugin.prototype.reSetBadge()
```js
window.JPush.setBadge(value)
window.JPush.resetBadge()
```
resetBadge相当于setBadge(0)。
`resetBadge` 相当于 `setBadge(0)`
#### 参数说明
value 取值范围:[0,99999]。
value 取值范围0 ~ 99999。
#### 返回值
无,控制台会有 log 打印设置结果。
#### 代码示例
window.plugins.jPushPlugin.setBadge(5);
window.plugins.jPushPlugin.reSetBadge();
```js
window.JPush.setBadge(5)
window.JPush.resetBadge()
```
### API - setApplicationIconBadgeNumber
@@ -379,15 +329,19 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.setApplicationIconBadgeNumber(badge)
```js
window.JPush.setApplicationIconBadgeNumber(badge)
```
#### 参数说明
- badge: 整,例如 012当 badge 为 0 时,角标被清除)。
- badge: 整,例如 0, 1, 2当 badge 为 0 时,角标被清除)。
#### 代码示例
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0);
```js
window.JPush.setApplicationIconBadgeNumber(0)
```
### API - getApplicationIconBadgeNumber
@@ -395,7 +349,9 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.getApplicationIconBadgeNumber(callback)
```js
window.JPush.getApplicationIconBadgeNumber(callback)
```
#### 参数说明
@@ -403,10 +359,11 @@ value 取值范围:[0,99999]。
#### 代码示例
window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data) {
console.log(data);
});
```js
window.JPush.getApplicationIconBadgeNumber(function(badgeNum) {
console.log(badgeNum)
})
```
## 本地通知
@@ -416,7 +373,9 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
```js
window.JPush.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
```
#### 参数说明
@@ -428,7 +387,9 @@ value 取值范围:[0,99999]。
#### 代码示例
window.plugins.jPushPlugin.addLocalNotificationForIOS(6*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
```js
window.JPush.addLocalNotificationForIOS(24*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
```
### API - deleteLocalNotificationWithIdentifierKeyInIOS
@@ -436,7 +397,9 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey)
```js
window.JPush.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey)
```
#### 参数说明
@@ -444,7 +407,9 @@ value 取值范围:[0,99999]。
#### 代码示例
window.plugins.jPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS("identifier");
```js
window.JPush.deleteLocalNotificationWithIdentifierKeyInIOS("identifier")
```
### API - clearAllLocalNotifications
@@ -452,11 +417,26 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.clearAllLocalNotifications()
```js
window.JPush.clearAllLocalNotifications()
```
#### 代码示例
window.plugins.jPushPlugin.clearAllLocalNotifications();
```js
window.JPush.clearAllLocalNotifications()
```
## 获取本地通知内容
### iOS 10 before 收到本地通知
监听 `jpush.receiveLocalNotification` 事件获取「App 在后台时点击通知横幅」或「App 在前台时收到」均会触发该事件。
### iOS 10 收到本地通知
监听 [jpush.receiveNotification](#前台收到推送)、[jpush.openNotification](点击推送通知),获取推送内容后,通过获取到的 `__JPUSHNotificationKey` 字段([本地通知](#本地通知) 设置的 `notificationID`)来判断是本地通知,并处理。
## 页面的统计
@@ -468,26 +448,30 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.startLogPageView(pageName)
window.plugins.jPushPlugin.prototype.stopLogPageView(pageName)
window.plugins.jPushPlugin.prototype.beginLogPageView(pageName, duration)
```js
window.JPush.startLogPageView(pageName)
window.JPush.stopLogPageView(pageName)
window.JPush.beginLogPageView(pageName, duration)
```
#### 参数说明
- pageName: 需要统计页面自定义名称
- duration: 自定义的页面时间
- pageName: 需要统计页面自定义名称
- duration: 自定义的页面时间
#### 调用说明
应在所有的需要统计得页面得 viewWillAppear 和 viewWillDisappear 加入 startLogPageView 和 stopLogPageView 来统计当前页面的停留时间。
或者直接使用 beginLogPageView 来自定义加入页面和时间信息。
#### 代码示例
window.plugins.jPushPlugin.beginLogPageView("newPage", 5);
window.plugins.jPushPlugin.startLogPageView("onePage");
window.plugins.jPushPlugin.stopLogPageView("onePage");
```js
window.JPush.beginLogPageView("newPage", 5);
window.JPush.startLogPageView("onePage");
window.JPush.stopLogPageView("onePage");
```
## 日志等级设置
@@ -495,15 +479,13 @@ value 取值范围:[0,99999]。
用于开启 Debug 模式,显示更多的日志信息。
建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 setLogOFF 是相反的一对。
建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 `setLogOFF` 是相反的一对。
#### 接口定义
window.plugins.jPushPlugin.prototype.setDebugModeFromIos()
#### 代码示例
window.plugins.jPushPlugin.setDebugModeFromIos();
```js
window.JPush.setDebugModeFromIos();
```
### API - setLogOFF
@@ -513,11 +495,9 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.setLogOFF()
#### 代码示例
window.plugins.jPushPlugin.setLogOFF();
```js
window.JPush.setLogOFF();
```
### API - setCrashLogON
@@ -527,11 +507,9 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.setCrashLogON()
#### 代码示例
window.plugins.jPushPlugin.setCrashLogON();
```js
window.JPush.setCrashLogON();
```
## 地理位置上报
@@ -541,17 +519,15 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.setLocation(latitude, longitude)
```js
window.JPush.prototype.setLocation(latitude, longitude)
```
#### 参数说明
- latitude: 地理位置纬度,数值类型或纯数字的字符型均可。
- longitude: 地理位置精度,数值类型或纯数字的字符型均可。
#### 代码示例
window.plugins.jPushPlugin.setLocation(39.26,115.25);
## 设备平台判断
### API - isPlatformIOS
@@ -560,12 +536,194 @@ value 取值范围:[0,99999]。
#### 接口定义
window.plugins.jPushPlugin.prototype.isPlatformIOS()
```js
window.JPush.isPlatformIOS()
```
#### 代码示例
if(window.plugins.jPushPlugin.isPlatformIOS()) {
// iOS
} else {
// Android
}
```js
if(window.JPush.isPlatformIOS()) {
// iOS
} else {
// Android
}
```
## iOS 10 进阶推送特性
### API - addDismissActions
添加通知操作是展示在锁屏推送侧滑界面、通知中心推送侧滑界面、推送横幅下拉界面iPhone 6s before的按钮操作。
一条推送最多只能展示 2 个操作(在锁屏推送侧滑界面、通知中心推送侧滑界面会额外自动展示一个「清除」操作),超出的操作不会被展示。
建议在 App 初次启动时立刻调用本 API。
效果如下图所示:
![DismissActions_00](res/DismissActions_00.PNG)
#### 接口定义
```js
window.JPush.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.JPush.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)
#### 接口定义
```js
window.JPush.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 的推送设置情况。
#### 接口定义
```js
window.JPush.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.receiveLocalNotification
[iOS 10 before 收到本地通知](#ios-10-before-收到本地通知)

View File

@@ -1,35 +0,0 @@
## iOS 手动安装
- 下载 JPush PhoneGap Plugin 插件,并解压
- 将 [/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),添加以下框架:
CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
AdSupport.framework
libz.tbd(若存在 libz.dylib 则替换为 libz.tbd)
- 修改 phonegap config.xml 文件以添加 JPushPlugin 插件
<feature name="JPushPlugin">
<param name="ios-package" value="JPushPlugin" />
<param name="onload" value="true" />
</feature>
- 将 [/www/JPushPlugin.js](/www/JPushPlugin.js) 在 xcode 中拖到工程的 www 目录下面
- 在需要使用插件处加入以下代码,并根据 [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

View File

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

8
hooks/apns.entitlements Normal file
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>

93
hooks/common.js Normal file
View File

@@ -0,0 +1,93 @@
/*
* 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) => {
if( fs.existsSync(entitlementPath) ) {
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");
});
});
} else {
console.log("Entitlement File '" + entitlementPath + "' not found. Make sure your ios platform upper than 4.3.0");
}
}
module.exports.removeAPNSinEntitlements = (entitlementPath) => {
if( fs.existsSync(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");
});
});
} else {
console.log("Entitlement File '" + entitlementPath + "' not found. Make sure your ios platform upper than 4.3.0");
}
}
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);
}

66
hooks/iosDisablePush.js Normal file
View File

@@ -0,0 +1,66 @@
/*
* 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);
if(parts !== null && parts !== undefined && parts.length > 0) {
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);

172
hooks/iosEnablePush.js Normal file
View File

@@ -0,0 +1,172 @@
/*
* 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");
});
});
}
module.exports = (context) => {
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"));
if(cordovaBuildConfig.ios.release.developmentTeam === null && cordovaBuildConfig.ios.release.developmentTeam === undefined) {
throw 'no valid developmentTeam found in build.json';
}
} catch(e) {
console.log("Do not detected 'build.json' or ios.release.developmentTeam not avaliable in 'build.json' \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 fully 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);
}
}

View File

@@ -1,39 +1,34 @@
{
"name": "jpush-phonegap-plugin",
"version": "2.2.6",
"description": "JPush for cordova plugin",
"cordova": {
"id": "jpush-phonegap-plugin",
"platforms": [
"ios",
"android"
]
},
"repository": {
"type": "git",
"url": "git+https://github.com/jpush/jpush-phonegap-plugin.git"
},
"keywords": [
"JPush",
"push",
"Push",
"ecosystem:cordova",
"cordova-ios",
"cordova-android"
],
"engines": [
{
"name": "cordova",
"version": ">=3.0"
}
],
"peerDependencies": {
"cordova-plugin-device": ">=1.0.0"
},
"author": "JiGuang",
"license": "MIT",
"bugs": {
"url": "https://github.com/jpush/jpush-phonegap-plugin/issues"
},
"homepage": "https://github.com/jpush/jpush-phonegap-plugin#readme"
"name": "jpush-phonegap-plugin",
"version": "3.2.7",
"description": "JPush for cordova plugin",
"cordova": {
"id": "jpush-phonegap-plugin",
"platforms": [
"ios",
"android"
]
},
"repository": {
"type": "git",
"url": "git+https://github.com/jpush/jpush-phonegap-plugin.git"
},
"keywords": [
"JPush",
"push",
"Push",
"ecosystem:cordova",
"cordova-ios",
"cordova-android"
],
"devDependencies": {
"cordova-plugin-device": "*",
"cordova-plugin-jcore": "*"
},
"author": "JiGuang",
"license": "MIT",
"bugs": {
"url": "https://github.com/jpush/jpush-phonegap-plugin/issues"
},
"homepage": "https://github.com/jpush/jpush-phonegap-plugin#readme"
}

View File

@@ -2,15 +2,15 @@
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
id="jpush-phonegap-plugin"
version="2.2.5">
version="3.2.7">
<name>JPush Plugin</name>
<name>JPush</name>
<description>JPush for cordova plugin</description>
<author>JPush</author>
<keywords>JPush,push</keywords>
<license>MIT License</license>
<preference name="API_KEY" />
<preference name="APP_KEY" />
<engines>
<engine name="cordova" version=">=3.0" />
@@ -18,6 +18,7 @@
<!-- dependencies -->
<dependency id="cordova-plugin-device" />
<dependency id="cordova-plugin-jcore" />
<js-module src="www/JPushPlugin.js" name="JPushPlugin">
<clobbers target="JPush" />
@@ -30,14 +31,16 @@
</feature>
</config-file>
<header-file src="src/ios/Plugins/JPushDefine.h" />
<header-file src="src/ios/Plugins/JPushPlugin.h" />
<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" />
<source-file src="src/ios/Plugins/AppDelegate+JPush.m" />
<resource-file src="src/ios/PushConfig.plist" />
<header-file src="src/ios/lib/JPUSHService.h" />
<source-file src="src/ios/lib/jpush-ios-3.0.6.a" framework="true" />
<resource-file src="src/ios/JPushConfig.plist" />
<framework src="CFNetwork.framework" weak="true" />
<framework src="CoreFoundation.framework" weak="true" />
<framework src="CoreTelephony.framework" weak="true" />
@@ -49,39 +52,49 @@
<framework src="libz.tbd" weak="true" />
<framework src="AdSupport.framework" weak="true" />
<framework src="UserNotifications.framework" weak="true" />
<framework src="libresolv.tbd" weak="true" />
<config-file target="*PushConfig.plist" parent="APP_KEY">
<string>$API_KEY</string>
<config-file target="*JPushConfig.plist" parent="Appkey">
<string>$APP_KEY</string>
</config-file>
<!-- <hook type="after_platform_add" src="hooks/iosEnablePush.js" />
<hook type="after_plugin_install" src="hooks/iosEnablePush.js" />
<hook type="before_plugin_uninstall" src="hooks/iosDisablePush.js" /> -->
</platform>
<platform name="android">
<config-file target="res/xml/config.xml" parent="/*">
<feature name="JPushPlugin">
<param name="android-package" value="cn.jpush.phonegap.JPushPlugin" />
<param name="android-package" value="cn.jiguang.cordova.push.JPushPlugin" />
</feature>
</config-file>
<config-file target="AndroidManifest.xml" parent="/manifest">
<!-- Required 一些系统要求的权限,如访问网络等-->
<permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</config-file>
<config-file target="AndroidManifest.xml" parent="/manifest/application">
<!-- Required SDK核心功能-->
<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>
<action android:name="cn.jpush.android.ui.PushActivity" />
<category android:name="android.intent.category.DEFAULT" />
@@ -90,7 +103,9 @@
</activity>
<!-- 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>
<!-- Required SDK核心功能-->
@@ -102,7 +117,8 @@
<!-- Required SDK 核心功能-->
<service android:name="cn.jpush.android.service.PushService"
android:enabled="true"
android:exported="false">
android:exported="false"
android:process=":remote">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTER" />
<action android:name="cn.jpush.android.intent.REPORT" />
@@ -113,10 +129,11 @@
<!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.PushReceiver"
android:enabled="true">
android:enabled="true"
android:exported="false">
<intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<!--Required 显示通知栏 -->
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<category android:name="$PACKAGE_NAME" />
</intent-filter>
<intent-filter>
@@ -127,12 +144,15 @@
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<!-- 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>
<action android:name="cn.jpush.android.intent.DaemonService" />
<category android:name="$PACKAGE_NAME" />
@@ -140,7 +160,9 @@
</service>
<!-- 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">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<!-- Required 显示通知栏 -->
@@ -161,32 +183,50 @@
<category android:name="$PACKAGE_NAME" />
</intent-filter>
</receiver>
<!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.AlarmReceiver" />
<receiver
android:name="cn.jpush.android.service.AlarmReceiver"
android:exported="false" />
<!-- since 3.0.9 Required SDK 核心功能-->
<provider
android:authorities="$PACKAGE_NAME.DataProvider"
android:name="cn.jpush.android.service.DataProvider"
android:exported="true" />
<receiver android:name="cn.jiguang.cordova.push.JPushEventReceiver">
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="$PACKAGE_NAME"></category>
</intent-filter>
</receiver>
<!-- Required. Enable it you can get statistics data with channel -->
<meta-data android:name="JPUSH_CHANNEL" android:value="developer-default" />
<meta-data android:name="JPUSH_APPKEY" android:value="$API_KEY" />
<meta-data android:name="JPUSH_APPKEY" android:value="$APP_KEY" />
</config-file>
<source-file src="src/android/jpush-android-2.1.9.jar" target-dir="libs" />
<source-file src="src/android/armeabi/libjpush219.so" target-dir="libs/armeabi" />
<source-file src="src/android/armeabi-v7a/libjpush219.so" target-dir="libs/armeabi-v7a" />
<source-file src="src/android/arm64-v8a/libjpush219.so" target-dir="libs/arm64-v8a" />
<source-file src="src/android/x86/libjpush219.so" target-dir="libs/x86" />
<source-file src="src/android/x86_64/libjpush219.so" target-dir="libs/x86_64" />
<source-file src="src/android/libs/jpush-android-3.0.9.jar" target-dir="libs" />
<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/test_notification_layout.xml" target-dir="res/layout" />
<source-file src="src/android/jpush_notification_icon.png" target-dir="res/drawable" />
<source-file src="src/android/MyReceiver.java" target-dir="src/cn/jiguang/cordova/push" />
<source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jiguang/cordova/push" />
<source-file src="src/android/JPushEventReceiver.java" target-dir="src/cn/jiguang/cordova/push" />
<!-- Rich Push resources -->
<source-file src="src/android/ic_richpush_actionbar_back.png" 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_richpush_btn_selector.xml"
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_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>
</plugin>

View File

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

View File

@@ -1,4 +1,4 @@
package cn.jpush.phonegap;
package cn.jiguang.cordova.push;
import android.annotation.TargetApi;
import android.app.Activity;
@@ -35,53 +35,26 @@ import cn.jpush.android.api.BasicPushNotificationBuilder;
import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;
import cn.jpush.android.data.JPushLocalNotification;
import cn.jpush.android.service.JPushMessageReceiver;
public class JPushPlugin extends CordovaPlugin {
private final static List<String> methodList =
Arrays.asList(
"addLocalNotification",
"areNotificationEnabled",
"clearAllNotification",
"clearLocalNotifications",
"clearNotificationById",
"getNotification",
"getRegistrationID",
"init",
"isPushStopped",
"onPause",
"onResume",
"requestPermission",
"removeLocalNotification",
"reportNotificationOpened",
"resumePush",
"setAlias",
"setBasicPushNotificationBuilder",
"setCustomPushNotificationBuilder",
"setDebugMode",
"setLatestNotificationNum",
"setPushTime",
"setTags",
"setTagsWithAlias",
"setSilenceTime",
"setStatisticsOpen",
"stopPush"
);
private ExecutorService threadPool = Executors.newFixedThreadPool(1);
private static final String TAG = JPushPlugin.class.getSimpleName();
private Context mContext;
private static JPushPlugin instance;
private static Activity cordovaActivity;
private static String TAG = "JPushPlugin";
private static boolean shouldCacheMsg = false;
private static boolean isStatisticsOpened = false; // 是否开启统计分析功能
static String notificationTitle;
static String notificationAlert;
static Map<String, Object> notificationExtras = new HashMap<String, Object>();
public static String notificationTitle;
public static String notificationAlert;
public static Map<String, Object> notificationExtras = new HashMap<String, Object>();
static String openNotificationTitle;
static String openNotificationAlert;
static Map<String, Object> openNotificationExtras = new HashMap<String, Object>();
public static String openNotificationTitle;
public static String openNotificationAlert;
public static Map<String, Object> openNotificationExtras = new HashMap<String, Object>();
static Map<Integer, CallbackContext> eventCallbackMap = new HashMap<Integer, CallbackContext>();
public JPushPlugin() {
instance = this;
@@ -89,10 +62,10 @@ public class JPushPlugin extends CordovaPlugin {
@Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
Log.i(TAG, "JPush initialize.");
super.initialize(cordova, webView);
JPushInterface.init(cordova.getActivity().getApplicationContext());
mContext = cordova.getActivity().getApplicationContext();
JPushInterface.init(mContext);
cordovaActivity = cordova.getActivity();
@@ -109,21 +82,7 @@ public class JPushPlugin extends CordovaPlugin {
}
}
public void onPause(boolean multitasking) {
Log.i(TAG, "---------------- onPause");
shouldCacheMsg = true;
if (isStatisticsOpened && multitasking) {
JPushInterface.onPause(this.cordova.getActivity());
}
}
public void onResume(boolean multitasking) {
shouldCacheMsg = false;
Log.i(TAG, "---------------- onResume" + "-" + openNotificationAlert
+ "-" + notificationAlert);
if (isStatisticsOpened && multitasking) {
JPushInterface.onResume(this.cordova.getActivity());
}
if (openNotificationAlert != null) {
notificationAlert = null;
transmitNotificationOpen(openNotificationTitle, openNotificationAlert,
@@ -142,15 +101,14 @@ public class JPushPlugin extends CordovaPlugin {
instance = null;
}
private static JSONObject getMessageObject(String message,
Map<String, Object> extras) {
private static JSONObject getMessageObject(String message, Map<String, Object> extras) {
JSONObject data = new JSONObject();
try {
data.put("message", message);
JSONObject jExtras = new JSONObject();
for (Entry<String, Object> entry : extras.entrySet()) {
if (entry.getKey().equals("cn.jpush.android.EXTRA")) {
JSONObject jo = null;
JSONObject jo;
if (TextUtils.isEmpty((String) entry.getValue())) {
jo = new JSONObject();
} else {
@@ -176,8 +134,7 @@ public class JPushPlugin extends CordovaPlugin {
return data;
}
private static JSONObject getNotificationObject(String title,
String alert, Map<String, Object> extras) {
private static JSONObject getNotificationObject(String title, String alert, Map<String, Object> extras) {
JSONObject data = new JSONObject();
try {
data.put("title", title);
@@ -226,8 +183,7 @@ public class JPushPlugin extends CordovaPlugin {
});
}
static void transmitNotificationOpen(String title, String alert,
Map<String, Object> extras) {
static void transmitNotificationOpen(String title, String alert, Map<String, Object> extras) {
if (instance == null) {
return;
}
@@ -244,8 +200,7 @@ public class JPushPlugin extends CordovaPlugin {
JPushPlugin.openNotificationAlert = null;
}
static void transmitNotificationReceive(String title, String alert,
Map<String, Object> extras) {
static void transmitNotificationReceive(String title, String alert, Map<String, Object> extras) {
if (instance == null) {
return;
}
@@ -262,13 +217,30 @@ public class JPushPlugin extends CordovaPlugin {
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
public boolean execute(final String action, final JSONArray data,
final CallbackContext callbackContext) throws JSONException {
if (!methodList.contains(action)) {
return false;
}
threadPool.execute(new Runnable() {
cordova.getThreadPool().execute(new Runnable() {
@Override
public void run() {
try {
@@ -284,7 +256,7 @@ public class JPushPlugin extends CordovaPlugin {
}
void init(JSONArray data, CallbackContext callbackContext) {
JPushInterface.init(this.cordova.getActivity().getApplicationContext());
JPushInterface.init(mContext);
}
void setDebugMode(JSONArray data, CallbackContext callbackContext) {
@@ -299,18 +271,17 @@ public class JPushPlugin extends CordovaPlugin {
}
void stopPush(JSONArray data, CallbackContext callbackContext) {
JPushInterface.stopPush(this.cordova.getActivity().getApplicationContext());
JPushInterface.stopPush(mContext);
callbackContext.success();
}
void resumePush(JSONArray data, CallbackContext callbackContext) {
JPushInterface.resumePush(this.cordova.getActivity().getApplicationContext());
JPushInterface.resumePush(mContext);
callbackContext.success();
}
void isPushStopped(JSONArray data, CallbackContext callbackContext) {
boolean isStopped = JPushInterface.isPushStopped(
this.cordova.getActivity().getApplicationContext());
boolean isStopped = JPushInterface.isPushStopped(mContext);
if (isStopped) {
callbackContext.success(1);
} else {
@@ -338,7 +309,7 @@ public class JPushPlugin extends CordovaPlugin {
}
if (num != -1) {
JPushInterface.setLatestNotificationNumber(
this.cordova.getActivity().getApplicationContext(), num);
mContext, num);
} else {
callbackContext.error("error num");
}
@@ -364,13 +335,13 @@ public class JPushPlugin extends CordovaPlugin {
} catch (JSONException e) {
callbackContext.error("error reading hour json");
}
Context context = this.cordova.getActivity().getApplicationContext();
Context context = mContext;
JPushInterface.setPushTime(context, days, startHour, endHour);
callbackContext.success();
}
void getRegistrationID(JSONArray data, CallbackContext callbackContext) {
Context context = this.cordova.getActivity().getApplicationContext();
Context context = mContext;
String regID = JPushInterface.getRegistrationID(context);
callbackContext.success(regID);
}
@@ -393,31 +364,167 @@ public class JPushPlugin extends CordovaPlugin {
}
}
void setTags(JSONArray data, CallbackContext callbackContext) {
void setAlias(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
String alias = null;
try {
HashSet<String> tags = new HashSet<String>();
for (int i = 0; i < data.length(); i++) {
tags.add(data.getString(i));
}
JPushInterface.setTags(this.cordova.getActivity().getApplicationContext(),
tags, mTagWithAliasCallback);
callbackContext.success();
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
alias = params.getString("alias");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Error reading tags JSON");
callbackContext.error("Parameters error.");
}
JPushInterface.setAlias(mContext, sequence, alias);
eventCallbackMap.put(sequence, callbackContext);
}
void setAlias(JSONArray data, CallbackContext callbackContext) {
void deleteAlias(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
try {
String alias = data.getString(0);
JPushInterface.setAlias(this.cordova.getActivity().getApplicationContext(),
alias, mTagWithAliasCallback);
callbackContext.success();
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Error reading alias JSON");
callbackContext.error("Parameters error.");
}
JPushInterface.deleteAlias(mContext, sequence);
eventCallbackMap.put(sequence, callbackContext);
}
void getAlias(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.getAlias(mContext, sequence);
eventCallbackMap.put(sequence, callbackContext);
}
void setTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
Set<String> tags = new HashSet<String>();
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
JSONArray tagsArr = params.getJSONArray("tags");
for (int i = 0; i < tagsArr.length(); i++) {
tags.add(tagsArr.getString(i));
}
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.setTags(mContext, sequence, tags);
eventCallbackMap.put(sequence, callbackContext);
}
void addTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
Set<String> tags = new HashSet<String>();
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
JSONArray tagsArr = params.getJSONArray("tags");
for (int i = 0; i < tagsArr.length(); i++) {
tags.add(tagsArr.getString(i));
}
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.addTags(mContext, sequence, tags);
eventCallbackMap.put(sequence, callbackContext);
}
void deleteTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
Set<String> tags = new HashSet<String>();
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
JSONArray tagsArr = params.getJSONArray("tags");
for (int i = 0; i < tagsArr.length(); i++) {
tags.add(tagsArr.getString(i));
}
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.deleteTags(mContext, sequence, tags);
eventCallbackMap.put(sequence, callbackContext);
}
void cleanTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.cleanTags(mContext, sequence);
eventCallbackMap.put(sequence, callbackContext);
}
void getAllTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.getAllTags(mContext, sequence);
eventCallbackMap.put(sequence, callbackContext);
}
void checkTagBindState(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
String tag = null;
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
tag = params.getString("tag");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.checkTagBindState(mContext, sequence, tag);
eventCallbackMap.put(sequence, callbackContext);
}
void setTagsWithAlias(JSONArray data, CallbackContext callbackContext) {
@@ -429,7 +536,7 @@ public class JPushPlugin extends CordovaPlugin {
for (int i = 0; i < tagsArray.length(); i++) {
tags.add(tagsArray.getString(i));
}
JPushInterface.setAliasAndTags(this.cordova.getActivity().getApplicationContext(),
JPushInterface.setAliasAndTags(mContext,
alias, tags, mTagWithAliasCallback);
callbackContext.success();
} catch (JSONException e) {
@@ -438,6 +545,14 @@ public class JPushPlugin extends CordovaPlugin {
}
}
void getConnectionState(JSONArray data, CallbackContext callback) {
boolean isConnected = JPushInterface.getConnectionState(cordovaActivity.getApplicationContext());
callback.success(String.valueOf(isConnected));
}
/**
* 自定义通知行为,声音、震动、呼吸灯等。
*/
void setBasicPushNotificationBuilder(JSONArray data,
CallbackContext callbackContext) {
BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(
@@ -476,6 +591,7 @@ public class JPushPlugin extends CordovaPlugin {
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("error reading id json");
return;
}
if (notificationId != -1) {
JPushInterface.clearNotificationById(this.cordova.getActivity(), notificationId);
@@ -484,8 +600,7 @@ public class JPushPlugin extends CordovaPlugin {
}
}
void addLocalNotification(JSONArray data, CallbackContext callbackContext)
throws JSONException {
void addLocalNotification(JSONArray data, CallbackContext callbackContext) throws JSONException {
int builderId = data.getInt(0);
String content = data.getString(1);
String title = data.getString(2);
@@ -508,8 +623,7 @@ public class JPushPlugin extends CordovaPlugin {
JPushInterface.addLocalNotification(this.cordova.getActivity(), ln);
}
void removeLocalNotification(JSONArray data, CallbackContext callbackContext)
throws JSONException {
void removeLocalNotification(JSONArray data, CallbackContext callbackContext) throws JSONException {
int notificationID = data.getInt(0);
JPushInterface.removeLocalNotification(this.cordova.getActivity(), notificationID);
}
@@ -518,17 +632,6 @@ public class JPushPlugin extends CordovaPlugin {
JPushInterface.clearLocalNotifications(this.cordova.getActivity());
}
/**
* 决定是否启用统计分析功能。
*/
void setStatisticsOpen(JSONArray data, CallbackContext callbackContext) {
try {
isStatisticsOpened = data.getBoolean(0);
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
* 设置通知静默时间
* http://docs.jpush.io/client/android_api/#api_5
@@ -605,7 +708,7 @@ public class JPushPlugin extends CordovaPlugin {
String pkg = context.getPackageName();
int uid = appInfo.uid;
Class appOpsClazz = null;
Class appOpsClazz;
try {
appOpsClazz = Class.forName(AppOpsManager.class.getName());
@@ -614,7 +717,6 @@ public class JPushPlugin extends CordovaPlugin {
Field opValue = appOpsClazz.getDeclaredField(appOpsServiceId);
int value = opValue.getInt(Integer.class);
Object result = checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg);
return Integer.parseInt(result.toString()) == AppOpsManager.MODE_ALLOWED;
} catch (InvocationTargetException e) {
e.printStackTrace();
@@ -629,5 +731,4 @@ public class JPushPlugin extends CordovaPlugin {
}
return true;
}
}

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.HashMap;
import java.util.List;
import java.util.Map;
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 {
private static String TAG = "JPushPlugin";
private static final List<String> IGNORED_EXTRAS_KEYS =
Arrays.asList(
"cn.jpush.android.TITLE",
@@ -24,18 +24,15 @@ public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
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);
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(action)) {
} else if (action.equals(JPushInterface.ACTION_NOTIFICATION_RECEIVED)) {
handlingNotificationReceive(context, intent);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(action)) {
} else if (action.equals(JPushInterface.ACTION_NOTIFICATION_OPENED)) {
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) {
Log.i(TAG, "---------------- handlingNotificationOpen");
String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
JPushPlugin.openNotificationTitle = title;
@@ -60,15 +55,13 @@ public class MyReceiver extends BroadcastReceiver {
JPushPlugin.transmitNotificationOpen(title, alert, extras);
Intent launch = context.getPackageManager().getLaunchIntentForPackage(
context.getPackageName());
context.getPackageName());
launch.addCategory(Intent.CATEGORY_LAUNCHER);
launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(launch);
}
private void handlingNotificationReceive(Context context, Intent intent) {
Log.i(TAG, "---------------- handlingNotificationReceive");
Intent launch = context.getPackageManager().getLaunchIntentForPackage(
context.getPackageName());
launch.addCategory(Intent.CATEGORY_LAUNCHER);
@@ -99,5 +92,4 @@ public class MyReceiver extends BroadcastReceiver {
}
return extrasMap;
}
}

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.

View File

Before

Width:  |  Height:  |  Size: 695 B

After

Width:  |  Height:  |  Size: 695 B

View File

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 181 B

View File

@@ -5,7 +5,7 @@
android:state_focused="true"
android:state_enabled="true"
android:state_pressed="false"
android:drawable="@drawable/ic_richpush_actionbar_back" />
android:drawable="@drawable/jpush_ic_richpush_actionbar_back" />
<!-- 按下时的背景图片 -->
<item
android:state_enabled="true"
@@ -17,5 +17,5 @@
android:state_checked="true"
android:drawable="@android:color/darker_gray" />
<!-- 默认时的背景图片 -->
<item android:drawable="@drawable/ic_richpush_actionbar_back" />
<item android:drawable="@drawable/jpush_ic_richpush_actionbar_back" />
</selector>

View File

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

View File

@@ -18,7 +18,7 @@
android:layout_centerVertical="true"
android:layout_marginLeft="9dp"
android:layout_marginRight="10dp"
android:background="@drawable/richpush_btn_selector" />
android:background="@drawable/jpush_richpush_btn_selector" />
<ImageView
android:id="@+id/imgView"
@@ -27,7 +27,7 @@
android:layout_centerVertical="true"
android:layout_toRightOf="@id/imgRichpushBtnBack"
android:clickable="false"
android:src="@drawable/ic_richpush_actionbar_divider" />
android:src="@drawable/jpush_ic_richpush_actionbar_divider" />
<TextView
android:id="@+id/tvRichpushTitle"
@@ -35,6 +35,7 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="7dp"
android:layout_marginRight="5dp"
android:layout_toRightOf="@id/imgView"
android:clickable="false"
android:text=" "
@@ -42,6 +43,13 @@
android:textColor="#ffffff" />
</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
android:layout_width="match_parent"
android:layout_height="match_parent"

Binary file not shown.

Binary file not shown.

View File

@@ -2,13 +2,15 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>APP_KEY</key>
<key>Appkey</key>
<string></string>
<key>CHANNEL</key>
<string>Subscription</string>
<key>Channel</key>
<string>channel name</string>
<key>IsProduction</key>
<false/>
<key>IsIDFA</key>
<false/>
<key>Delay</key>
<false/>
</dict>
</plist>

View File

@@ -1,15 +1,16 @@
//
// AppDelegate+JPush.h
// delegateExtention
//
// Created by 张庆贺 on 15/8/3.
// Copyright (c) 2015年 JPush. All rights reserved.
//
#import "AppDelegate.h"
#import <UserNotifications/UserNotifications.h>
#import "JPUSHService.h"
@interface AppDelegate (JPush) <JPUSHRegisterDelegate>
-(void)registerForIos10RemoteNotification;
@end
//
// AppDelegate+JPush.h
// delegateExtention
//
// Created by 张庆贺 on 15/8/3.
// Copyright (c) 2015年 JPush. All rights reserved.
//
#import "AppDelegate.h"
#import <UserNotifications/UserNotifications.h>
#import "JPUSHService.h"
@interface AppDelegate (JPush) <JPUSHRegisterDelegate>
-(void)registerForRemoteNotification;
-(void)startJPushSDK;
@end

View File

@@ -11,19 +11,16 @@
#import <objc/runtime.h>
#import <AdSupport/AdSupport.h>
#import <UserNotifications/UserNotifications.h>
#import "JPushDefine.h"
@implementation AppDelegate (JPush)
+(void)load{
Method origin;
Method swizzle;
origin=class_getInstanceMethod([self class],@selector(init));
swizzle=class_getInstanceMethod([self class], @selector(init_plus));
method_exchangeImplementations(origin, swizzle);
Method origin1;
Method swizzle1;
origin1 = class_getInstanceMethod([self class],@selector(init));
swizzle1 = class_getInstanceMethod([self class], @selector(init_plus));
method_exchangeImplementations(origin1, swizzle1);
}
-(instancetype)init_plus{
@@ -31,10 +28,81 @@
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{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jpushSDKDidLoginNotification) name:kJPFNetworkDidLoginNotification object:nil];
if (notification) {
[self registerForIos10RemoteNotification];
[JPushPlugin setLaunchOptions:notification.userInfo];
if (notification.userInfo) {
if ([notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(fireOpenNotification:)
userInfo:[notification.userInfo
valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey] repeats:YES];
}
if ([notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]) {
UILocalNotification *localNotification = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
NSDictionary* localNotificationEvent = @{@"content":localNotification.alertBody,
@"badge": @(localNotification.applicationIconBadgeNumber),
@"extras":localNotification.userInfo,
};
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(fireOpenNotification:) userInfo:localNotificationEvent repeats:YES];
}
}
[JPUSHService setDebugMode];
NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"];
NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
NSNumber *delay = [plistData valueForKey:JPushConfig_Delay];
_launchOptions = notification.userInfo;
if (![delay boolValue]) {
[self startJPushSDK];
}
}
}
-(void)startJPushSDK{
[self registerForRemoteNotification];
[JPushPlugin setupJPushSDK:_launchOptions];
}
- (void)jpushSDKDidLoginNotification {
NSDictionary *event = @{@"registrationId": JPUSHService.registrationID};
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_receiveRegistrationId jsString:[event toJsonString]];
}
-(void)registerForRemoteNotification{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
#endif
}else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
//categories
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
} else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){
//categories nil
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
}
}
@@ -44,17 +112,50 @@
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
[JPUSHService handleRemoteNotification:userInfo];
[[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveNotification object:userInfo];
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
[JPUSHService handleRemoteNotification:userInfo];
[[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveNotification object:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
NSString *eventName;
switch ([UIApplication sharedApplication].applicationState) {
case UIApplicationStateInactive:
eventName = JPushDocumentEvent_OpenNotification;
break;
case UIApplicationStateActive:
eventName = JPushDocumentEvent_ReceiveNotification;
break;
case UIApplicationStateBackground:
eventName = JPushDocumentEvent_BackgroundNotification;
break;
default:
break;
}
[JPushPlugin fireDocumentEvent:eventName jsString:[userInfo toJsonString]];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(30 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
completionHandler(UIBackgroundFetchResultNewData);
});
}
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo];
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:response.notification.request.content.userInfo];
@try {
[userInfo setValue:[response valueForKey:@"userText"] forKey:@"userText"];
} @catch (NSException *exception) { }
[userInfo setValue:response.actionIdentifier forKey:@"actionIdentifier"];
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo toJsonString]];
completionHandler();
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
[JPUSHService showLocalNotificationAtFront:notification identifierKey:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:JPushDocumentEvent_ReceiveLocalNotification object:notification.userInfo];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
@@ -66,33 +167,4 @@
// [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo];
[userInfo setValue:kJPushPluginiOS10ForegroundReceiveNotification forKey:@"JPushNotificationType"];
[[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginiOS10ForegroundReceiveNotification object:userInfo];
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:response.notification.request.content.userInfo];
[userInfo setValue:kJPushPluginiOS10ClickNotification forKey:@"JPushNotificationType"];
[[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginiOS10ClickNotification object:userInfo];
completionHandler();
}
-(void)registerForIos10RemoteNotification{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
#endif
}
}
@end

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_FileName = @"JPushConfig";
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_Delay = @"Delay";
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_ReceiveLocalNotification = @"receiveLocalNotification";
static NSString *const JPushDocumentEvent_receiveRegistrationId = @"receiveRegistrationId";

View File

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

View File

@@ -1,446 +1,523 @@
//
// PushTalkPlugin.m
// PushTalk
//
// Created by zhangqinghe on 13-12-13.
//
//
#import "JPushPlugin.h"
#import "JPUSHService.h"
#import <UIKit/UIKit.h>
#import <AdSupport/AdSupport.h>
#import <UserNotifications/UserNotifications.h>
#import "AppDelegate+JPush.h"
static NSString *const JP_APP_KEY = @"APP_KEY";
static NSString *const JP_APP_CHANNEL = @"CHANNEL";
static NSString *const JP_APP_ISPRODUCTION = @"IsProduction";
static NSString *const JP_APP_ISIDFA = @"IsIDFA";
static NSString *const JPushConfigFileName = @"PushConfig";
static NSDictionary *_launchOptions = nil;
#define WEAK_SELF(weakSelf) __weak __typeof(&*self)weakSelf = self;
@implementation NSDictionary (JPush)
-(NSString*)toJsonString{
NSError *error;
NSData *data = [NSJSONSerialization dataWithJSONObject:self options:0 error:&error];
NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
return jsonString;
}
@end
@implementation NSString (JPush)
-(NSDictionary*)toDictionary{
NSError *error;
NSData *jsonData = [self dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
return dict;
}
@end
@interface JPushPlugin()
@end
@implementation JPushPlugin
#pragma mark-
-(void)stopPush:(CDVInvokedUrlCommand*)command{
[[UIApplication sharedApplication]unregisterForRemoteNotifications];
}
-(void)resumePush:(CDVInvokedUrlCommand*)command{
[JPushPlugin registerForRemoteNotification];
}
-(void)isPushStopped:(CDVInvokedUrlCommand*)command{
NSNumber *result;
if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) {
result = @(0);
}else{
result = @(1);
}
[self handleResultWithValue:result command:command];
}
-(void)initial:(CDVInvokedUrlCommand*)command{
//do nithng,because Cordova plugin use lazy load mode.
}
#ifdef __CORDOVA_4_0_0
- (void)pluginInitialize {
NSLog(@"### pluginInitialize ");
[self initNotifications];
}
#else
- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{
NSLog(@"### initWithWebView ");
if (self=[super initWithWebView:theWebView]) {
[self initNotifications];
}
return self;
}
#endif
-(void)initNotifications {
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self
selector:@selector(networkDidReceiveMessage:)
name:kJPFNetworkDidReceiveMessageNotification
object:nil];
[defaultCenter addObserver:self
selector:@selector(networkDidReceiveNotification:)
name:kJPushPluginReceiveNotification
object:nil];
[defaultCenter addObserver:self
selector:@selector(networkDidReceiveNotification:)
name:kJPushPluginiOS10ForegroundReceiveNotification
object:nil];
[defaultCenter addObserver:self
selector:@selector(networkDidReceiveNotification:)
name:kJPushPluginiOS10ClickNotification
object:nil];
if (_launchOptions) {
NSDictionary *userInfo = [_launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if ([userInfo count] >0) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.openNotification',%@)",[userInfo toJsonString]]];
});
}
}
}
-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{
NSArray *arguments = command.arguments;
NSString *alias;
NSArray *tags;
if (!arguments || [arguments count] < 2) {
NSLog(@"#### setTagsWithAlias param is less");
return ;
}else{
alias = arguments[0];
tags = arguments[1];
}
NSLog(@"#### setTagsWithAlias alias is %@, tags is %@",alias,tags);
[JPUSHService setTags:[NSSet setWithArray:tags]
alias:alias
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:)
object:self];
}
-(void)setTags:(CDVInvokedUrlCommand *)command{
NSArray *tags = command.arguments;
NSLog(@"#### setTags %@",tags);
[JPUSHService setTags:[NSSet setWithArray:tags]
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:)
object:self];
}
-(void)setAlias:(CDVInvokedUrlCommand *)command{
NSLog(@"#### setAlias %@",command.arguments);
[JPUSHService setAlias:command.arguments[0]
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:)
object:self];
}
-(void)getRegistrationID:(CDVInvokedUrlCommand*)command{
NSString* registrationID = [JPUSHService registrationID];
NSLog(@"### getRegistrationID %@",registrationID);
[self handleResultWithValue:registrationID command:command];
}
-(void)startLogPageView:(CDVInvokedUrlCommand*)command{
NSArray *arguments = command.arguments;
if (!arguments || [arguments count] < 1) {
NSLog(@"startLogPageView argument error");
return ;
}
NSString * pageName = arguments[0];
if (pageName) {
[JPUSHService startLogPageView:pageName];
}
}
-(void)stopLogPageView:(CDVInvokedUrlCommand*)command{
NSArray *arguments = command.arguments;
if (!arguments || [arguments count] < 1) {
NSLog(@"stopLogPageView argument error");
return ;
}
NSString * pageName = arguments[0];
if (pageName) {
[JPUSHService stopLogPageView:pageName];
}
}
-(void)beginLogPageView:(CDVInvokedUrlCommand*)command{
NSArray *arguments = command.arguments;
if (!arguments || [arguments count] < 2) {
NSLog(@"beginLogPageView argument error");
return ;
}
NSString * pageName = arguments[0];
int duration = [arguments[0] intValue];
if (pageName) {
[JPUSHService beginLogPageView:pageName duration:duration];
}
}
-(void)setBadge:(CDVInvokedUrlCommand*)command{
NSArray *argument = command.arguments;
if ([argument count] < 1) {
NSLog(@"setBadge argument error!");
return;
}
NSNumber *badge = argument[0];
[JPUSHService setBadge:[badge intValue]];
}
-(void)resetBadge:(CDVInvokedUrlCommand*)command{
[JPUSHService resetBadge];
}
-(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command{
//
NSArray *argument = command.arguments;
if ([argument count] < 1) {
NSLog(@"setBadge argument error!");
return;
}
NSNumber *badge = [argument objectAtIndex:0];
[UIApplication sharedApplication].applicationIconBadgeNumber = [badge intValue];
}
-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command {
NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber;
NSNumber *number = [NSNumber numberWithInteger:num];
[self handleResultWithValue:number command:command];
}
-(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{
[JPUSHService setDebugMode];
}
-(void)setLogOFF:(CDVInvokedUrlCommand*)command{
[JPUSHService setLogOFF];
}
-(void)crashLogON:(CDVInvokedUrlCommand*)command{
[JPUSHService crashLogON];
}
-(void)setLocalNotification:(CDVInvokedUrlCommand*)command{
NSArray *arguments = command.arguments;
NSDate *date = arguments[0] == [NSNull null] ? nil : [NSDate dateWithTimeIntervalSinceNow:[((NSString*)arguments[0]) intValue]];
NSString *alertBody = arguments[1] == [NSNull null] ? nil : (NSString*)arguments[1];
int badge = arguments[2] == [NSNull null] ? 0 : [(NSString*)arguments[2] intValue];
NSString *idKey = arguments[3] == [NSNull null] ? nil : (NSString*)arguments[3];
NSDictionary *dict = arguments[4] == [NSNull null] ? nil : (NSDictionary*)arguments[4];
[JPUSHService setLocalNotification:date alertBody:alertBody badge:badge alertAction:nil identifierKey:idKey userInfo:dict soundName:nil];
}
-(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{
NSString *identifier = [command argumentAtIndex:0];
if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0) {
JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new];
jpid.identifiers = @[identifier];
[JPUSHService removeNotification:jpid];
}else{
[JPUSHService deleteLocalNotificationWithIdentifierKey:identifier];
}
}
-(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{
[JPUSHService clearAllLocalNotifications];
}
-(void)setLocation:(CDVInvokedUrlCommand*)command{
[JPUSHService setLatitude:[((NSString*)command.arguments[0]) doubleValue] longitude:[((NSString*)command.arguments[1]) doubleValue]];
}
-(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
WEAK_SELF(weakSelf);
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[@"authorizationStatus"] = @(settings.authorizationStatus);
dict[@"soundSetting"] = @(settings.soundSetting);
dict[@"badgeSetting"] = @(settings.badgeSetting);
dict[@"alertSetting"] = @(settings.alertSetting);
dict[@"notificationCenterSetting"] = @(settings.notificationCenterSetting);
dict[@"lockScreenSetting"] = @(settings.lockScreenSetting);
dict[@"carPlaySetting"] = @(settings.carPlaySetting);
dict[@"alertStyle"] = @(settings.alertStyle);
[weakSelf handleResultWithValue:dict command:command];
}];
}else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
UIUserNotificationType type = settings.types;
NSNumber *number = [NSNumber numberWithInteger:type];
[self handleResultWithValue:number command:command];
}else{
UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
NSNumber *number = [NSNumber numberWithInteger:type];
[self handleResultWithValue:number command:command];
}
}
#pragma mark -
+(void)setLaunchOptions:(NSDictionary *)theLaunchOptions{
_launchOptions = theLaunchOptions;
[JPUSHService setDebugMode];
[JPushPlugin registerForRemoteNotification];
//read appkey and channel from PushConfig.plist
NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfigFileName ofType:@"plist"];
if (plistPath == nil) {
NSLog(@"error: PushConfig.plist not found");
assert(0);
}
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
#import "JPushPlugin.h"
#import "JPUSHService.h"
#import <UIKit/UIKit.h>
#import <AdSupport/AdSupport.h>
#import <UserNotifications/UserNotifications.h>
#import "AppDelegate+JPush.h"
#import "JPushDefine.h"
@implementation NSDictionary (JPush)
-(NSString*)toJsonString{
NSError *error;
NSData *data = [NSJSONSerialization dataWithJSONObject:self options:0 error:&error];
NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
return jsonString;
}
@end
@implementation NSString (JPush)
-(NSDictionary*)toDictionary{
NSError *error;
NSData *jsonData = [self dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
return dict;
}
@end
@interface JPushPlugin()
@end
@implementation JPushPlugin
-(void)startJPushSDK:(CDVInvokedUrlCommand*)command{
[(AppDelegate*)[UIApplication sharedApplication].delegate startJPushSDK];
}
#pragma mark-
-(void)stopPush:(CDVInvokedUrlCommand*)command{
[[UIApplication sharedApplication]unregisterForRemoteNotifications];
}
-(void)resumePush:(CDVInvokedUrlCommand*)command{
[(AppDelegate*)[UIApplication sharedApplication].delegate registerForRemoteNotification];
}
-(void)isPushStopped:(CDVInvokedUrlCommand*)command{
NSNumber *result = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications] ? @(0) : @(1);
[self handleResultWithValue:result command:command];
}
-(void)initial:(CDVInvokedUrlCommand*)command{
//do nithng,because Cordova plugin use lazy load mode.
}
#ifdef __CORDOVA_4_0_0
- (void)pluginInitialize {
NSLog(@"### pluginInitialize ");
[self initPlugin];
}
#else
- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{
NSLog(@"### initWithWebView ");
if (self=[super initWithWebView:theWebView]) {
}
[self initPlugin];
return self;
}
#endif
-(void)initPlugin{
if (!SharedJPushPlugin) {
SharedJPushPlugin = self;
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(networkDidReceiveMessage:)
name:kJPFNetworkDidReceiveMessageNotification
object:nil];
}
+(void)fireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString{
dispatch_async(dispatch_get_main_queue(), ^{
[SharedJPushPlugin.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.%@',%@)", eventName, jsString]];
});
}
-(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{
NSString *alias = [command argumentAtIndex:0];
NSArray *tags = [command argumentAtIndex:1];
[JPUSHService setTags:[NSSet setWithArray:tags]
alias:alias
fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) {
CDVPluginResult *result;
if (iResCode == 0) {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:nil];
} else {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:nil];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}];
}
-(void)setTags:(CDVInvokedUrlCommand*)command {
NSDictionary* params = [command.arguments objectAtIndex:0];
NSNumber* sequence = params[@"sequence"];
NSArray* tags = params[@"tags"];
[JPUSHService setTags:[NSSet setWithArray:tags]
completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) {
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:sequence forKey:@"sequence"];
CDVPluginResult* result;
if (iResCode == 0) {
[dic setObject:[iTags allObjects] forKey:@"tags"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
} else {
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
} seq:[sequence integerValue]];
}
-(void)addTags:(CDVInvokedUrlCommand *)command {
NSDictionary* params = [command.arguments objectAtIndex:0];
NSNumber* sequence = params[@"sequence"];
NSArray* tags = params[@"tags"];
[JPUSHService addTags:[NSSet setWithArray:tags]
completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) {
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:sequence forKey:@"sequence"];
CDVPluginResult* result;
if (iResCode == 0) {
[dic setObject:[iTags allObjects] forKey:@"tags"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
} else {
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
} seq:[sequence integerValue]];
}
-(void)deleteTags:(CDVInvokedUrlCommand *)command {
NSDictionary* params = [command.arguments objectAtIndex:0];
NSNumber* sequence = params[@"sequence"];
NSArray* tags = params[@"tags"];
[JPUSHService deleteTags:[NSSet setWithArray:tags]
completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) {
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:sequence forKey:@"sequence"];
CDVPluginResult* result;
if (iResCode == 0) {
[dic setObject:[iTags allObjects] forKey:@"tags"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
} else {
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
} seq:[sequence integerValue]];
}
-(void)cleanTags:(CDVInvokedUrlCommand *)command {
NSDictionary* params = [command.arguments objectAtIndex:0];
NSNumber* sequence = params[@"sequence"];
[JPUSHService cleanTags:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) {
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:sequence forKey:@"sequence"];
CDVPluginResult* result;
if (iResCode == 0) {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
} else {
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
} seq:[sequence integerValue]];
}
-(void)getAllTags:(CDVInvokedUrlCommand *)command {
NSDictionary* params = [command.arguments objectAtIndex:0];
NSNumber* sequence = params[@"sequence"];
[JPUSHService getAllTags:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) {
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:sequence forKey:@"sequence"];
CDVPluginResult* result;
if (iResCode == 0) {
[dic setObject:[iTags allObjects] forKey:@"tags"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
} else {
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
} seq:[sequence integerValue]];
}
-(void)checkTagBindState:(CDVInvokedUrlCommand *)command {
NSDictionary* params = [command.arguments objectAtIndex:0];
NSNumber* sequence = params[@"sequence"];
NSString* tag = params[@"tag"];
[JPUSHService validTag:tag completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq, BOOL isBind) {
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:sequence forKey:@"sequence"];
CDVPluginResult* result;
if (iResCode == 0) {
[dic setObject:[iTags allObjects] forKey:@"tags"];
[dic setObject:[NSNumber numberWithBool:isBind] forKey:@"isBind"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
} else {
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
} seq:[sequence integerValue]];
}
-(void)setAlias:(CDVInvokedUrlCommand*)command {
NSDictionary* params = [command.arguments objectAtIndex:0];
NSNumber* sequence = params[@"sequence"];
NSString* alias = params[@"alias"];
[JPUSHService setAlias:alias completion:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) {
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:sequence forKey:@"sequence"];
CDVPluginResult* result;
if (iResCode == 0) {
[dic setObject:iAlias forKey:@"alias"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
} else {
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
} seq:[sequence integerValue]];
}
-(void)deleteAlias:(CDVInvokedUrlCommand*)command {
NSDictionary* params = [command.arguments objectAtIndex:0];
NSNumber* sequence = params[@"sequence"];
[JPUSHService deleteAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) {
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:sequence forKey:@"sequence"];
CDVPluginResult* result;
if (iResCode == 0) {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
} else {
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
} seq:[sequence integerValue]];
}
-(void)getAlias:(CDVInvokedUrlCommand*)command {
NSDictionary* params = [command.arguments objectAtIndex:0];
NSNumber* sequence = params[@"sequence"];
[JPUSHService getAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) {
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
[dic setObject:sequence forKey:@"sequence"];
CDVPluginResult* result;
if (iResCode == 0) {
[dic setObject:iAlias forKey:@"alias"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
} else {
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
} seq:[sequence integerValue]];
}
-(void)getRegistrationID:(CDVInvokedUrlCommand*)command{
NSString* registrationID = [JPUSHService registrationID];
[self handleResultWithValue:registrationID command:command];
}
-(void)startLogPageView:(CDVInvokedUrlCommand*)command{
NSString * pageName = [command argumentAtIndex:0];
[JPUSHService startLogPageView:pageName];
}
-(void)stopLogPageView:(CDVInvokedUrlCommand*)command{
NSString * pageName = [command argumentAtIndex:0];
[JPUSHService stopLogPageView:pageName];
}
-(void)beginLogPageView:(CDVInvokedUrlCommand*)command{
NSString *pageName = [command argumentAtIndex:0];
NSNumber *duration = [command argumentAtIndex:1];
[JPUSHService beginLogPageView:pageName duration:duration.intValue];
}
-(void)setBadge:(CDVInvokedUrlCommand*)command{
NSNumber *badge = [command argumentAtIndex:0];
[JPUSHService setBadge:badge.intValue];
}
-(void)resetBadge:(CDVInvokedUrlCommand*)command{
[JPUSHService resetBadge];
}
-(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command{
NSNumber *badge = [command argumentAtIndex:0];
[UIApplication sharedApplication].applicationIconBadgeNumber = badge.intValue;
}
-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command {
NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber;
NSNumber *number = [NSNumber numberWithInteger:num];
[self handleResultWithValue:number command:command];
}
-(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{
[JPUSHService setDebugMode];
}
-(void)setLogOFF:(CDVInvokedUrlCommand*)command{
[JPUSHService setLogOFF];
}
-(void)crashLogON:(CDVInvokedUrlCommand*)command{
[JPUSHService crashLogON];
}
-(void)setLocalNotification:(CDVInvokedUrlCommand*)command{
NSLog(@"ios 10 after please use UNNotificationRequest to set local notification, see apple doc to learn more");
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:[[command argumentAtIndex:0] intValue]];
NSString *alert = [command argumentAtIndex:1];
NSNumber *badge = [command argumentAtIndex:2];
NSString *idKey = [command argumentAtIndex:3];
NSDictionary *dict = [command argumentAtIndex:4];
[JPUSHService setLocalNotification:date alertBody:alert badge:badge.intValue alertAction:nil identifierKey:idKey userInfo:dict soundName:nil];
}
-(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{
NSString *identifier = [command argumentAtIndex:0];
JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new];
jpid.identifiers = @[identifier];
[JPUSHService removeNotification:jpid];
}
-(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{
[JPUSHService removeNotification:nil];
}
-(void)setLocation:(CDVInvokedUrlCommand*)command{
NSNumber *latitude = [command argumentAtIndex:0];
NSNumber *longitude = [command argumentAtIndex:1];
[JPUSHService setLatitude:latitude.doubleValue longitude:longitude.doubleValue];
}
-(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
WEAK_SELF(weakSelf);
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[@"authorizationStatus"] = @(settings.authorizationStatus);
dict[@"soundSetting"] = @(settings.soundSetting);
dict[@"badgeSetting"] = @(settings.badgeSetting);
dict[@"alertSetting"] = @(settings.alertSetting);
dict[@"notificationCenterSetting"] = @(settings.notificationCenterSetting);
dict[@"lockScreenSetting"] = @(settings.lockScreenSetting);
dict[@"carPlaySetting"] = @(settings.carPlaySetting);
dict[@"alertStyle"] = @(settings.alertStyle);
[weakSelf handleResultWithValue:dict command:command];
}];
}else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
UIUserNotificationType type = settings.types;
NSNumber *number = [NSNumber numberWithInteger:type];
[self handleResultWithValue:number command:command];
}else{
UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
NSNumber *number = [NSNumber numberWithInteger:type];
[self handleResultWithValue:number command:command];
}
}
#pragma mark - ios 10 APIs
-(void)addDismissActions:(CDVInvokedUrlCommand*)command{
[self addActions:command dismiss:YES];
}
-(void)addNotificationActions:(CDVInvokedUrlCommand*)command{
[self addActions:command dismiss:NO];
}
-(void)addActions:(CDVInvokedUrlCommand*)command dismiss:(BOOL)dimiss{
NSArray *actionsData = [command argumentAtIndex:0];
NSString *categoryId = [command argumentAtIndex:1];
NSMutableArray *actions = [NSMutableArray array];
for (NSDictionary *dict in actionsData) {
NSString *title = dict[@"title"];
NSString *identifier = dict[@"identifier"];
NSString *option = dict[@"option"];
NSString *type = dict[@"type"];
if ([type isEqualToString:@"textInput"]) {
NSString *textInputButtonTitle = dict[@"textInputButtonTitle"];
NSString *textInputPlaceholder = dict[@"textInputPlaceholder"];
UNTextInputNotificationAction *inputAction = [UNTextInputNotificationAction actionWithIdentifier:identifier title:title options:option.integerValue textInputButtonTitle:textInputButtonTitle textInputPlaceholder:textInputPlaceholder];
[actions addObject:inputAction];
} else {
UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:title title:title options:option.integerValue];
[actions addObject:action];
}
}
UNNotificationCategory *category;
if (dimiss) {
category = [UNNotificationCategory categoryWithIdentifier:categoryId
actions:actions
intentIdentifiers:@[]
options:UNNotificationCategoryOptionCustomDismissAction];
} else {
category = [UNNotificationCategory categoryWithIdentifier:categoryId
actions:actions
intentIdentifiers:@[]
options:UNNotificationCategoryOptionNone];
}
[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:category]];
}
#pragma mark -
+(void)setupJPushSDK:(NSDictionary*)userInfo{
NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"];
if (plistPath == nil) {
NSLog(@"error: PushConfig.plist not found");
assert(0);
}
NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
NSString *appkey = [plistData valueForKey:JPushConfig_Appkey];
NSString *channel = [plistData valueForKey:JPushConfig_Channel];
NSNumber *isProduction = [plistData valueForKey:JPushConfig_IsProduction];
NSNumber *isIDFA = [plistData valueForKey:JPushConfig_IsIDFA];
NSString *advertisingId = nil;
if(isIDFA.boolValue) {
advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}
[JPUSHService setupWithOption:userInfo
appKey:appkey
channel:channel
apsForProduction:[isProduction boolValue]
advertisingIdentifier:advertisingId];
}
#pragma mark js
-(void)handleResultWithValue:(id)value command:(CDVInvokedUrlCommand*)command {
CDVPluginResult *result = nil;
CDVCommandStatus status = CDVCommandStatus_OK;
if ([value isKindOfClass:[NSString class]]) {
value = [value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
} else if ([value isKindOfClass:[NSNull class]]) {
value = nil;
}
if ([value isKindOfClass:[NSObject class]]) {
result = [CDVPluginResult resultWithStatus:status messageAsString:value];//NSObject
} else {
NSLog(@"Cordova callback block returned unrecognized type: %@", NSStringFromClass([value class]));
result = nil;
}
if (!result) {
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
}
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
}
-(void)networkDidReceiveMessage:(NSNotification *)notification {
if (notification && notification.userInfo) {
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveMessage
jsString:[notification.userInfo toJsonString]];
}
}
@end

171
src/ios/lib/JPUSHService.h Normal file → Executable file
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 2.1.9
#define JPUSH_VERSION_NUMBER 3.0.6
#import <Foundation/Foundation.h>
@@ -22,6 +22,10 @@
@class UNNotification;
@protocol JPUSHRegisterDelegate;
typedef void (^JPUSHTagsOperationCompletion)(NSInteger iResCode, NSSet *iTags, NSInteger seq);
typedef void (^JPUSHTagValidOperationCompletion)(NSInteger iResCode, NSSet *iTags, NSInteger seq, BOOL isBind);
typedef void (^JPUSHAliasOperationCompletion)(NSInteger iResCode, NSString *iAlias, NSInteger seq);
extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中
extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接
extern NSString *const kJPFNetworkDidCloseNotification; // 关闭连接
@@ -31,6 +35,13 @@ extern NSString *const kJPFNetworkDidLoginNotification; // 登录成功
extern NSString *const kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS)
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
};
/*!
* 通知注册实体类
*/
@@ -130,6 +141,7 @@ extern NSString *const kJPFServiceErrorNotification; // 错误提示
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
* @param channel 发布渠道. 可选.
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
* App 证书环境取决于profile provision的配置此处建议与证书环境保持一致.
* @param advertisingIdentifier 广告标识符IDFA 如果不需要使用IDFA传nil.
*
* @discussion 提供SDK启动必须的参数, 来启动 SDK.
@@ -179,41 +191,102 @@ extern NSString *const kJPFServiceErrorNotification; // 错误提示
*/
+ (void)handleRemoteNotification:(NSDictionary *)remoteInfo;
///----------------------------------------------------
/// @name Tag alias setting 设置别名与标签
///----------------------------------------------------
/*!
* 下面的接口是可选的
* 设置标签和(或)别名若参数为nil则忽略若是空对象则清空详情请参考文档http://docs.jiguang.cn/client/ios_api/#api-ios
* setTags:alias:fetchCompletionHandle:是新的设置标签别名的方法不再需要显示声明回调函数只需要在block里面处理设置结果即可.
* WARN: 使用block时需要注意循环引用问题
* Tags操作接口
* 支持增加/覆盖/删除/清空/查询操作
* 详情请参考文档https://docs.jiguang.cn/jpush/client/iOS/ios_api/
*/
+ (void) setTags:(NSSet *)tags
alias:(NSString *)alias
callbackSelector:(SEL)cbSelector
target:(id)theTarget __attribute__((deprecated("JPush 2.1.1 版本已过期")));
+ (void) setTags:(NSSet *)tags
alias:(NSString *)alias
callbackSelector:(SEL)cbSelector
object:(id)theTarget;
/**
增加tags
+ (void) setTags:(NSSet *)tags
callbackSelector:(SEL)cbSelector
object:(id)theTarget;
@param tags 需要增加的tags集合
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)addTags:(NSSet<NSString *> *)tags
completion:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
+ (void)setTags:(NSSet *)tags
alias:(NSString *)alias
fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler;
/**
覆盖tags
调用该接口会覆盖用户所有的tags
+ (void) setTags:(NSSet *)tags
aliasInbackground:(NSString *)alias;
@param tags 需要设置的tags集合
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)setTags:(NSSet<NSString *> *)tags
completion:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
/**
删除指定tags
@param tags 需要删除的tags集合
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)deleteTags:(NSSet<NSString *> *)tags
completion:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
/**
清空所有tags
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)cleanTags:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
/**
查询全部tags
@param completion 响应回调,请在回调中获取查询结果
@param seq 请求序列号
*/
+ (void)getAllTags:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
/**
验证tag是否绑定
@param completion 响应回调,回调中查看是否绑定
@param seq 请求序列号
*/
+ (void)validTag:(NSString *)tag
completion:(JPUSHTagValidOperationCompletion)completion
seq:(NSInteger)seq;
/**
设置Alias
@param alias 需要设置的alias
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)setAlias:(NSString *)alias
callbackSelector:(SEL)cbSelector
object:(id)theTarget;
completion:(JPUSHAliasOperationCompletion)completion
seq:(NSInteger)seq;
/**
删除alias
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)deleteAlias:(JPUSHAliasOperationCompletion)completion
seq:(NSInteger)seq;
/**
查询当前alias
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)getAlias:(JPUSHAliasOperationCompletion)completion
seq:(NSInteger)seq;
/*!
* @abstract 过滤掉无效的 tags
@@ -223,7 +296,6 @@ callbackSelector:(SEL)cbSelector
*/
+ (NSSet *)filterValidTags:(NSSet *)tags;
///----------------------------------------------------
/// @name Stats 统计功能
///----------------------------------------------------
@@ -243,7 +315,7 @@ callbackSelector:(SEL)cbSelector
+ (void)stopLogPageView:(NSString *)pageName;
/*!
* @abstract 直接上报在页面的停留时
* @abstract 直接上报在页面的停留时
*
* @param pageName 页面
* @param seconds 停留的秒数
@@ -364,7 +436,6 @@ callbackSelector:(SEL)cbSelector
* @abstract 删除本地推送定义
*
* @param notificationKey 本地推送标示符
* @param myUILocalNotification 本地推送对象
* @discussion 此方法被[removeNotification:]方法取代
*/
+ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
@@ -450,7 +521,7 @@ callbackSelector:(SEL)cbSelector
*
* SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志.
*
* 调用本接口可打开日志级别为: Debug, 打印调试日志.
* 请在SDK启动后调用本接口调用本接口可打开日志级别为: Debug, 打印调试日志.
*/
+ (void)setDebugMode;
@@ -465,6 +536,40 @@ callbackSelector:(SEL)cbSelector
*/
+ (void)setLogOFF;
///----------------------------------------------------
///********************下列方法已过期********************
///**************请使用新版tag/alias操作接口**************
///----------------------------------------------------
/// @name Tag alias setting 设置别名与标签
///----------------------------------------------------
/*!
* 下面的接口是可选的
* 设置标签和(或)别名若参数为nil则忽略若是空对象则清空详情请参考文档https://docs.jiguang.cn/jpush/client/iOS/ios_api/
* setTags:alias:fetchCompletionHandle:是新的设置标签别名的方法不再需要显示声明回调函数只需要在block里面处理设置结果即可.
* WARN: 使用block时需要注意循环引用问题
*/
+ (void) setTags:(NSSet *)tags
alias:(NSString *)alias
callbackSelector:(SEL)cbSelector
target:(id)theTarget __attribute__((deprecated("JPush 2.1.1 版本已过期")));
+ (void) setTags:(NSSet *)tags
alias:(NSString *)alias
callbackSelector:(SEL)cbSelector
object:(id)theTarget __attribute__((deprecated("JPush 3.0.6 版本已过期")));
+ (void) setTags:(NSSet *)tags
callbackSelector:(SEL)cbSelector
object:(id)theTarget __attribute__((deprecated("JPush 3.0.6 版本已过期")));
+ (void)setTags:(NSSet *)tags
alias:(NSString *)alias
fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler __attribute__((deprecated("JPush 3.0.6 版本已过期")));
+ (void) setTags:(NSSet *)tags
aliasInbackground:(NSString *)alias __attribute__((deprecated("JPush 3.0.6 版本已过期")));
+ (void)setAlias:(NSString *)alias
callbackSelector:(SEL)cbSelector
object:(id)theTarget __attribute__((deprecated("JPush 3.0.6 版本已过期")));
@end
@class UNUserNotificationCenter;

Binary file not shown.

BIN
src/ios/lib/jpush-ios-3.0.6.a Executable file

Binary file not shown.

View File

@@ -0,0 +1,13 @@
//
// NotificationService.h
// jpushNotificationService
//
// Created by wuxingchen on 16/10/10.
//
//
#import <UserNotifications/UserNotifications.h>
@interface NotificationService : UNNotificationServiceExtension
@end

View File

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

View File

@@ -7,357 +7,383 @@ JPushPlugin.prototype.openNotification = {}
JPushPlugin.prototype.receiveNotification = {}
JPushPlugin.prototype.isPlatformIOS = function () {
var isPlatformIOS = device.platform == 'iPhone'
|| device.platform == 'iPad'
|| device.platform == 'iPod touch'
|| device.platform == 'iOS'
return isPlatformIOS
return (device.platform === 'iPhone' ||
device.platform === 'iPad' ||
device.platform === 'iPod touch' ||
device.platform === 'iOS')
}
JPushPlugin.prototype.error_callback = function (msg) {
console.log('Javascript Callback Error: ' + msg)
JPushPlugin.prototype.errorCallback = function (msg) {
console.log('JPush Callback Error: ' + msg)
}
JPushPlugin.prototype.call_native = function (name, args, callback) {
ret = cordova.exec(callback, this.error_callback, 'JPushPlugin', name, args)
return ret
JPushPlugin.prototype.callNative = function (name, args, successCallback, errorCallback) {
if (errorCallback) {
cordova.exec(successCallback, errorCallback, 'JPushPlugin', name, args)
} else {
cordova.exec(successCallback, this.errorCallback, 'JPushPlugin', name, args)
}
}
// public methods
// Common methods
JPushPlugin.prototype.init = function () {
if (this.isPlatformIOS()) {
var data = []
this.call_native('initial', data, null)
this.callNative('initial', [], null)
} else {
data = []
this.call_native('init', data, null)
this.callNative('init', [], null)
}
}
JPushPlugin.prototype.getRegistrationID = function (callback) {
try {
var data = []
this.call_native('getRegistrationID', [data], callback)
} catch(exception) {
console.log(exception)
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 () {
data = []
this.call_native('stopPush', data, null)
this.callNative('stopPush', [], null)
}
JPushPlugin.prototype.resumePush = function () {
data = []
this.call_native('resumePush', data, null)
this.callNative('resumePush', [], null)
}
JPushPlugin.prototype.isPushStopped = function (callback) {
data = []
this.call_native('isPushStopped', data, callback)
JPushPlugin.prototype.isPushStopped = function (successCallback) {
this.callNative('isPushStopped', [], successCallback)
}
JPushPlugin.prototype.clearLocalNotifications = function () {
if (device.platform === 'Android') {
this.callNative('clearLocalNotifications', [], null)
} else {
this.clearAllLocalNotifications()
}
}
JPushPlugin.prototype.setTagsWithAlias = function (tags, alias, successCallback, errorCallback) {
if (tags == null) {
this.setAlias(alias)
return
}
if (alias == null) {
this.setTags(tags)
return
}
var arrayTagWithAlias = [tags]
arrayTagWithAlias.unshift(alias)
this.callNative('setTagsWithAlias', arrayTagWithAlias, successCallback, errorCallback)
}
/**
* 设置标签。
* 注意:该接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
*
* @param params = { 'sequence': number, 'tags': ['tag1', 'tag2'] }
*/
JPushPlugin.prototype.setTags = function (params, successCallback, errorCallback) {
this.callNative('setTags', [params], successCallback, errorCallback)
}
/**
* 新增标签。
*
* @param params = { 'sequence': number, 'tags': ['tag1', 'tag2'] }
*/
JPushPlugin.prototype.addTags = function (params, successCallback, errorCallback) {
this.callNative('addTags', [params], successCallback, errorCallback)
}
/**
* 删除指定标签。
*
* @param params = { 'sequence': number, 'tags': ['tag1', 'tag2'] }
*/
JPushPlugin.prototype.deleteTags = function (params, successCallback, errorCallback) {
this.callNative('deleteTags', [params], successCallback, errorCallback)
}
/**
* 清除所有标签。
*
* @param params = { 'sequence': number }
*/
JPushPlugin.prototype.cleanTags = function (params, successCallback, errorCallback) {
this.callNative('cleanTags', [params], successCallback, errorCallback)
}
/**
* 查询所有标签。
*
* @param params = { 'sequence': number }
*/
JPushPlugin.prototype.getAllTags = function (params, successCallback, errorCallback) {
this.callNative('getAllTags', [params], successCallback, errorCallback)
}
/**
* 查询指定标签与当前用户的绑定状态。
*
* @param params = { 'sequence': number, 'tag': string }
*/
JPushPlugin.prototype.checkTagBindState = function (params, successCallback, errorCallback) {
this.callNative('checkTagBindState', [params], successCallback, errorCallback)
}
/**
* 设置别名。
* 注意:该接口是覆盖逻辑,而不是增量逻辑。即新的调用会覆盖之前的设置。
*
* @param params = { 'sequence': number, 'alias': string }
*/
JPushPlugin.prototype.setAlias = function (params, successCallback, errorCallback) {
this.callNative('setAlias', [params], successCallback, errorCallback)
}
/**
* 删除别名。
*
* @param params = { 'sequence': number }
*/
JPushPlugin.prototype.deleteAlias = function (params, successCallback, errorCallback) {
this.callNative('deleteAlias', [params], successCallback, errorCallback)
}
/**
* 查询当前绑定的别名。
*
* @param params = { 'sequence': number }
*/
JPushPlugin.prototype.getAlias = function (params, successCallback, errorCallback) {
this.callNative('getAlias', [params], successCallback, errorCallback)
}
// 判断系统设置中是否对本应用启用通知。
// 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.setTagsWithAlias = function (tags, alias) {
try {
if (tags == null) {
this.setAlias(alias)
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)
}
}
JPushPlugin.prototype.setTags = function (tags) {
try {
this.call_native('setTags', tags, null)
} catch(exception) {
console.log(exception)
}
}
JPushPlugin.prototype.setAlias = function (alias) {
try {
this.call_native('setAlias', [alias], null)
} catch(exception) {
console.log(exception)
}
JPushPlugin.prototype.startJPushSDK = function () {
this.callNative('startJPushSDK', [], null)
}
JPushPlugin.prototype.setBadge = function (value) {
if (this.isPlatformIOS()) {
try {
this.call_native('setBadge', [value], null)
} catch(exception) {
console.log(exception)
}
this.callNative('setBadge', [value], null)
}
}
JPushPlugin.prototype.resetBadge = function () {
if (this.isPlatformIOS()) {
try {
var data = []
this.call_native('resetBadge', [data], null)
} catch(exception) {
console.log(exception)
}
this.callNative('resetBadge', [], null)
}
}
JPushPlugin.prototype.setDebugModeFromIos = function () {
if (this.isPlatformIOS()) {
var data = []
this.call_native('setDebugModeFromIos', [data], null)
this.callNative('setDebugModeFromIos', [], null)
}
}
JPushPlugin.prototype.setLogOFF = function () {
if (this.isPlatformIOS()) {
var data = []
this.call_native('setLogOFF', [data], null)
this.callNative('setLogOFF', [], null)
}
}
JPushPlugin.prototype.setCrashLogON = function () {
if (this.isPlatformIOS()) {
var data = []
this.call_native('crashLogON', [data], null)
this.callNative('crashLogON', [], null)
}
}
JPushPlugin.prototype.addLocalNotificationForIOS = function (delayTime, content,
badge, notificationID, extras) {
if (this.isPlatformIOS()) {
var data = [delayTime, content, badge, notificationID, extras]
this.call_native('setLocalNotification', data, null)
this.callNative('setLocalNotification', [delayTime, content, badge, notificationID, extras], null)
}
}
JPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS = function (
identifierKey) {
JPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS = function (identifierKey) {
if (this.isPlatformIOS()) {
var data = [identifierKey]
this.call_native('deleteLocalNotificationWithIdentifierKey', data, null)
this.callNative('deleteLocalNotificationWithIdentifierKey', [identifierKey], null)
}
}
JPushPlugin.prototype.clearAllLocalNotifications = function () {
if (this.isPlatformIOS()) {
var data = []
this.call_native('clearAllLocalNotifications', data, null)
this.callNative('clearAllLocalNotifications', [], null)
}
}
JPushPlugin.prototype.setLocation = function (latitude, longitude) {
if (this.isPlatformIOS()) {
var data = [latitude, longitude]
this.call_native('setLocation', data, null)
}
}
JPushPlugin.prototype.receiveMessageIniOSCallback = function (data) {
try {
console.log('JPushPlugin:receiveMessageIniOSCallback--data:' + data)
var bToObj = JSON.parse(data)
var content = bToObj.content
console.log(content)
} catch(exception) {
console.log('JPushPlugin:receiveMessageIniOSCallback' + exception)
this.callNative('setLocation', [latitude, longitude], null)
}
}
JPushPlugin.prototype.startLogPageView = function (pageName) {
if (this.isPlatformIOS()) {
this.call_native('startLogPageView', [pageName], null)
this.callNative('startLogPageView', [pageName], null)
}
}
JPushPlugin.prototype.stopLogPageView = function (pageName) {
if (this.isPlatformIOS()) {
this.call_native('stopLogPageView', [pageName], null)
this.callNative('stopLogPageView', [pageName], null)
}
}
JPushPlugin.prototype.beginLogPageView = function (pageName, duration) {
if (this.isPlatformIOS()) {
this.call_native('beginLogPageView', [pageName, duration], null)
this.callNative('beginLogPageView', [pageName, duration], null)
}
}
JPushPlugin.prototype.setApplicationIconBadgeNumber = function (badge) {
if (this.isPlatformIOS()) {
this.call_native('setApplicationIconBadgeNumber', [badge], null)
this.callNative('setApplicationIconBadgeNumber', [badge], null)
}
}
JPushPlugin.prototype.getApplicationIconBadgeNumber = function (callback) {
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) {
this.callNative('addDismissActions', [actions, categoryId])
}
JPushPlugin.prototype.addNotificationActions = function (actions, categoryId) {
this.callNative('addNotificationActions', [actions, categoryId])
}
// Android methods
JPushPlugin.prototype.setDebugMode = function (mode) {
if (device.platform == 'Android') {
this.call_native('setDebugMode', [mode], null)
JPushPlugin.prototype.getConnectionState = function (successCallback) {
if (device.platform === 'Android') {
this.callNative('getConnectionState', [], successCallback)
}
}
JPushPlugin.prototype.setBasicPushNotificationBuilder = function () {
if (device.platform == 'Android') {
data = []
this.call_native('setBasicPushNotificationBuilder', data, null)
if (device.platform === 'Android') {
this.callNative('setBasicPushNotificationBuilder', [], null)
}
}
JPushPlugin.prototype.setCustomPushNotificationBuilder = function () {
if (device.platform == 'Android') {
data = []
this.call_native('setCustomPushNotificationBuilder', data, null)
if (device.platform === 'Android') {
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)
}
}
JPushPlugin.prototype.receiveMessageInAndroidCallback = function (data) {
try {
data = JSON.stringify(data)
console.log('JPushPlugin:receiveMessageInAndroidCallback: ' + data)
this.receiveMessage = JSON.parse(data)
cordova.fireDocumentEvent('jpush.receiveMessage', this.receiveMessage)
} catch(exception) {
console.log('JPushPlugin:pushCallback ' + exception)
}
data = JSON.stringify(data)
this.receiveMessage = JSON.parse(data)
cordova.fireDocumentEvent('jpush.receiveMessage', this.receiveMessage)
}
JPushPlugin.prototype.openNotificationInAndroidCallback = function (data) {
try {
data = JSON.stringify(data)
console.log('JPushPlugin:openNotificationInAndroidCallback: ' + data)
this.openNotification = JSON.parse(data)
cordova.fireDocumentEvent('jpush.openNotification', this.openNotification)
} catch(exception) {
console.log(exception)
}
data = JSON.stringify(data)
this.openNotification = JSON.parse(data)
cordova.fireDocumentEvent('jpush.openNotification', this.openNotification)
}
JPushPlugin.prototype.receiveNotificationInAndroidCallback = function (data) {
try {
data = JSON.stringify(data)
console.log('JPushPlugin:receiveNotificationInAndroidCallback: ' + data)
this.receiveNotification = JSON.parse(data)
cordova.fireDocumentEvent('jpush.receiveNotification', this.receiveNotification)
} catch(exception) {
console.log(exception)
}
data = JSON.stringify(data)
this.receiveNotification = JSON.parse(data)
cordova.fireDocumentEvent('jpush.receiveNotification', this.receiveNotification)
}
JPushPlugin.prototype.clearAllNotification = function () {
if (device.platform == 'Android') {
data = []
this.call_native('clearAllNotification', data, null)
if (device.platform === 'Android') {
this.callNative('clearAllNotification', [], null)
}
}
JPushPlugin.prototype.clearNotificationById = function (notificationId) {
if (device.platform == 'Android') {
data = []
this.call_native('clearNotificationById', [notificationId], null)
JPushPlugin.prototype.clearNotificationById = function (id) {
if (device.platform === 'Android') {
this.callNative('clearNotificationById', [id], null)
}
}
JPushPlugin.prototype.setLatestNotificationNum = function (num) {
if (device.platform == 'Android') {
this.call_native('setLatestNotificationNum', [num], null)
}
}
JPushPlugin.prototype.setDebugMode = function (mode) {
if (device.platform == 'Android') {
this.call_native('setDebugMode', [mode], null)
if (device.platform === 'Android') {
this.callNative('setLatestNotificationNum', [num], null)
}
}
JPushPlugin.prototype.addLocalNotification = function (builderId, content, title,
notificationID, broadcastTime, extras) {
if (device.platform == 'Android') {
data = [builderId, content, title, notificationID, broadcastTime, extras]
this.call_native('addLocalNotification', data, null)
if (device.platform === 'Android') {
this.callNative('addLocalNotification',
[builderId, content, title, notificationID, broadcastTime, extras], null)
}
}
JPushPlugin.prototype.removeLocalNotification = function (notificationID) {
if (device.platform == 'Android') {
this.call_native('removeLocalNotification', [notificationID], null)
}
}
JPushPlugin.prototype.clearLocalNotifications = function () {
if (device.platform == 'Android') {
data = []
this.call_native('clearLocalNotifications', data, null)
if (device.platform === 'Android') {
this.callNative('removeLocalNotification', [notificationID], null)
}
}
JPushPlugin.prototype.reportNotificationOpened = function (msgID) {
if (device.platform == 'Android') {
this.call_native('reportNotificationOpened', [msgID], null)
if (device.platform === 'Android') {
this.callNative('reportNotificationOpened', [msgID], null)
}
}
/**
*是否开启统计分析功能,用于“用户使用时长”,“活跃用户”,“用户打开次数”的统计,并上报到服务器上,
*在 Portal 上展示给开发者。
* 用于在 Android 6.0 及以上系统,申请一些权限
* 具体可看http://docs.jpush.io/client/android_api/#android-60
*/
JPushPlugin.prototype.setStatisticsOpen = function (mode) {
if (device.platform == 'Android') {
this.call_native('setStatisticsOpen', [mode], null)
}
}
/**
* 用于在 Android 6.0 及以上系统,申请一些权限
* 具体可看http://docs.jpush.io/client/android_api/#android-60
*/
JPushPlugin.prototype.requestPermission = function () {
if (device.platform == 'Android') {
this.call_native('requestPermission', [], null)
if (device.platform === 'Android') {
this.callNative('requestPermission', [], null)
}
}
JPushPlugin.prototype.setSilenceTime = function (startHour, startMinute, endHour, endMinute) {
if (device.platform == 'Android') {
this.call_native('setSilenceTime', [startHour, startMinute, endHour, endMinute], null)
if (device.platform === 'Android') {
this.callNative('setSilenceTime', [startHour, startMinute, endHour, endMinute], null)
}
}
JPushPlugin.prototype.setPushTime = function (weekdays, startHour, endHour) {
if (device.platform == 'Android') {
this.call_native('setPushTime', [weekdays, startHour, endHour], null)
if (device.platform === 'Android') {
this.callNative('setPushTime', [weekdays, startHour, endHour], null)
}
}