Compare commits
410 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f140784c9c | ||
![]() |
0d64cb853b | ||
![]() |
13c59302f4 | ||
![]() |
aae5380195 | ||
![]() |
679f68c7fd | ||
![]() |
71b4bbe93f | ||
![]() |
ea985d4d5f | ||
![]() |
9f0deb0285 | ||
![]() |
7fafe5aea3 | ||
![]() |
c4ec7f3c2a | ||
![]() |
49d40c12b4 | ||
![]() |
87808d953a | ||
![]() |
768d54f2e4 | ||
![]() |
001ce88d2a | ||
![]() |
3523dfaa83 | ||
![]() |
c242aa4318 | ||
![]() |
f0b00a2d53 | ||
![]() |
0a53660cd9 | ||
![]() |
b5b35428e9 | ||
![]() |
10c2287c5a | ||
![]() |
9aa897a173 | ||
![]() |
abb4b6432b | ||
![]() |
00599ca0bc | ||
![]() |
3faac1945c | ||
![]() |
145b75d90a | ||
![]() |
56d9417dbc | ||
![]() |
6932b84f4e | ||
![]() |
048c12d8dd | ||
![]() |
04891c4fa1 | ||
![]() |
6876a58138 | ||
![]() |
86dcd351cd | ||
![]() |
88fe3a4a24 | ||
![]() |
b3faac2a77 | ||
![]() |
4a711b3a93 | ||
![]() |
fa116c665b | ||
![]() |
4300730073 | ||
![]() |
76d6c5ddb1 | ||
![]() |
521422cac0 | ||
![]() |
c629dcc033 | ||
![]() |
aeee619eab | ||
![]() |
bc9e441fe2 | ||
![]() |
fad4745e01 | ||
![]() |
10b29611c5 | ||
![]() |
03429474c0 | ||
![]() |
e56a05c64b | ||
![]() |
a50bafcf3e | ||
![]() |
60176c1ea6 | ||
![]() |
c929496721 | ||
![]() |
bdd9a8beea | ||
![]() |
511eee622f | ||
![]() |
2f4669471f | ||
![]() |
85e3a23f88 | ||
![]() |
206f2ac89e | ||
![]() |
57b9364279 | ||
![]() |
e0db803818 | ||
![]() |
e140dc3b77 | ||
![]() |
a26822b894 | ||
![]() |
7dd7a4a86c | ||
![]() |
b7a2a74d88 | ||
![]() |
2f8234c29f | ||
![]() |
a9b5af06a5 | ||
![]() |
ddfb952bcf | ||
![]() |
74fea46b1c | ||
![]() |
b2f79c6234 | ||
![]() |
9e23995555 | ||
![]() |
a7455240a1 | ||
![]() |
07466a8718 | ||
![]() |
2b5d59e32e | ||
![]() |
e4b70a561a | ||
![]() |
da8c6c29e9 | ||
![]() |
2ebacad254 | ||
![]() |
9751b15bf0 | ||
![]() |
b5fd5aa51a | ||
![]() |
ee3e6b9e75 | ||
![]() |
72407b0b9c | ||
![]() |
2a427c70f9 | ||
![]() |
bc12d3c606 | ||
![]() |
9b1bff2ce1 | ||
![]() |
3b5fc629dd | ||
![]() |
fa4f3ac0d7 | ||
![]() |
3ad9a415e9 | ||
![]() |
d76d01c856 | ||
![]() |
b7d4ba5111 | ||
![]() |
7c326599aa | ||
![]() |
2adbba2943 | ||
![]() |
5b22d798cb | ||
![]() |
eb624a7bb2 | ||
![]() |
e29f00f77f | ||
![]() |
1ecb2b273a | ||
![]() |
6767af7488 | ||
![]() |
03eab0c59e | ||
![]() |
23ae6ad342 | ||
![]() |
ccfffc9a69 | ||
![]() |
16c3c96844 | ||
![]() |
b2e818e88d | ||
![]() |
5a8a926c50 | ||
![]() |
0903b58270 | ||
![]() |
f0dc403ca8 | ||
![]() |
5c53749171 | ||
![]() |
68bb0ebfdf | ||
![]() |
30fc85fc8d | ||
![]() |
fa0ca5f335 | ||
![]() |
8de93a3a07 | ||
![]() |
a4c17d3882 | ||
![]() |
1d420b5bb6 | ||
![]() |
d69f50915c | ||
![]() |
e26d8448a0 | ||
![]() |
387eaa1aff | ||
![]() |
45785a569c | ||
![]() |
0c8a6d25a6 | ||
![]() |
529f08df88 | ||
![]() |
e60d7c2b8c | ||
![]() |
265d88e766 | ||
![]() |
894c7d7ac1 | ||
![]() |
aabc1453b8 | ||
![]() |
6f78522cca | ||
![]() |
ff735854ec | ||
![]() |
e63f9d1774 | ||
![]() |
f9a5cef603 | ||
![]() |
ef8b1a7b4c | ||
![]() |
82d68c3562 | ||
![]() |
bdaeb5dbec | ||
![]() |
0677094086 | ||
![]() |
1d0d972737 | ||
![]() |
3186de6111 | ||
![]() |
9cb75a85db | ||
![]() |
c022a06461 | ||
![]() |
cc7328ad77 | ||
![]() |
b5d3661240 | ||
![]() |
1ae98e13e6 | ||
![]() |
27cdf61ff3 | ||
![]() |
1fb87d8fba | ||
![]() |
a0e408f05f | ||
![]() |
2d71db888f | ||
![]() |
1bfd8a2836 | ||
![]() |
6c80b47bad | ||
![]() |
179220874e | ||
![]() |
5e85c6b5b0 | ||
![]() |
c526a26231 | ||
![]() |
0380fbdc60 | ||
![]() |
9c888aa964 | ||
![]() |
14f03abce6 | ||
![]() |
4b554fa2ca | ||
![]() |
4085787f95 | ||
![]() |
1eaf73a8d3 | ||
![]() |
6c2bc206e3 | ||
![]() |
10b457d489 | ||
![]() |
5b0613628b | ||
![]() |
6f77da5f41 | ||
![]() |
24328f2ac9 | ||
![]() |
8ccdbd525b | ||
![]() |
67421b5091 | ||
![]() |
83b7ca162a | ||
![]() |
7f2179fe32 | ||
![]() |
54b653e442 | ||
![]() |
4f0c186bc3 | ||
![]() |
1954d6b55b | ||
![]() |
8487d9c823 | ||
![]() |
261eb44473 | ||
![]() |
7549e347b7 | ||
![]() |
504fbb0789 | ||
![]() |
a6fc0bc7a1 | ||
![]() |
cbacc7cb83 | ||
![]() |
7a4943e820 | ||
![]() |
579e2b6de3 | ||
![]() |
05b3fb1b82 | ||
![]() |
5301a2c5ea | ||
![]() |
d628cc168b | ||
![]() |
cce897daa0 | ||
![]() |
0449935bcb | ||
![]() |
b730924d74 | ||
![]() |
4780eafb72 | ||
![]() |
53e3588937 | ||
![]() |
4585a13d7b | ||
![]() |
f50a8ea5c7 | ||
![]() |
9ea65add1f | ||
![]() |
9c103753e6 | ||
![]() |
3f1fa1e7ba | ||
![]() |
c0c7d904e3 | ||
![]() |
509184328d | ||
![]() |
a0c828a296 | ||
![]() |
2d81c7800b | ||
![]() |
4cfca93789 | ||
![]() |
c254794ace | ||
![]() |
6d013438cd | ||
![]() |
29970cd306 | ||
![]() |
4f4a7e44f8 | ||
![]() |
a891578f74 | ||
![]() |
07c9722551 | ||
![]() |
f6ece7dd1e | ||
![]() |
0b4f328e19 | ||
![]() |
bb7b810215 | ||
![]() |
5bea9b0bac | ||
![]() |
7470258950 | ||
![]() |
46f5f41f8e | ||
![]() |
a33cc11090 | ||
![]() |
c4e2deec06 | ||
![]() |
b282d70b2f | ||
![]() |
a0752562b5 | ||
![]() |
82c6532d12 | ||
![]() |
4b929a8e2e | ||
![]() |
d3e2e1a5d7 | ||
![]() |
b8f79dd130 | ||
![]() |
001ab96283 | ||
![]() |
1e2a4ce0e4 | ||
![]() |
1314d33c62 | ||
![]() |
22b6d9a006 | ||
![]() |
c708f396bd | ||
![]() |
0cbedb412c | ||
![]() |
8b2a0daecc | ||
![]() |
fbd9d63590 | ||
![]() |
184ee01d1d | ||
![]() |
14a40c6572 | ||
![]() |
469af4fcd3 | ||
![]() |
fefaaea14f | ||
![]() |
d2f9959ae1 | ||
![]() |
3129165d3f | ||
![]() |
494df2e527 | ||
![]() |
66932a8bc8 | ||
![]() |
07c9b2b945 | ||
![]() |
8811dfc002 | ||
![]() |
031acb9631 | ||
![]() |
0ee5f8b1a0 | ||
![]() |
259ec0a03a | ||
![]() |
6283cb26f6 | ||
![]() |
8d098d29b1 | ||
![]() |
1c3228848b | ||
![]() |
a9343ac776 | ||
![]() |
585e2a5084 | ||
![]() |
de58071773 | ||
![]() |
c726477cfb | ||
![]() |
13341fd68a | ||
![]() |
3f00143a5a | ||
![]() |
f5ea2b5b10 | ||
![]() |
edf29bbc8d | ||
![]() |
266d0cb28f | ||
![]() |
ae54960da4 | ||
![]() |
9f156727e7 | ||
![]() |
155f1e2f6c | ||
![]() |
9680e685e3 | ||
![]() |
ea6011635f | ||
![]() |
2eefd1c247 | ||
![]() |
0829104534 | ||
![]() |
fa256bfb46 | ||
![]() |
592d5a5fb9 | ||
![]() |
83293656da | ||
![]() |
4753174bda | ||
![]() |
8a55aaa429 | ||
![]() |
b5f32e5107 | ||
![]() |
7afb705555 | ||
![]() |
e71c6f3505 | ||
![]() |
ff65c09d4e | ||
![]() |
8398bb56f1 | ||
![]() |
291aa7b8bf | ||
![]() |
5c00243986 | ||
![]() |
3ce2babd9b | ||
![]() |
a27cc445ee | ||
![]() |
3f077e32fd | ||
![]() |
e9ddd798ad | ||
![]() |
5c569d00da | ||
![]() |
5fca83c8b7 | ||
![]() |
d50b74cfab | ||
![]() |
c7bc0ea4c2 | ||
![]() |
c5f7963425 | ||
![]() |
021725e054 | ||
![]() |
a4eaf51455 | ||
![]() |
5d27dca472 | ||
![]() |
09f98f7c38 | ||
![]() |
7b1a77aecb | ||
![]() |
04fae7d538 | ||
![]() |
0436cfcf3e | ||
![]() |
3c70127405 | ||
![]() |
8e087e102a | ||
![]() |
9f5fccefec | ||
![]() |
be07c7383b | ||
![]() |
2df6ea47a8 | ||
![]() |
35c09c0c92 | ||
![]() |
c72cde6632 | ||
![]() |
f0a87962e7 | ||
![]() |
f31881d88a | ||
![]() |
31eef706e4 | ||
![]() |
2cf2bcf970 | ||
![]() |
5d42764438 | ||
![]() |
a5a03a3214 | ||
![]() |
7b70564f82 | ||
![]() |
6059f546f6 | ||
![]() |
d855a07271 | ||
![]() |
c1e70448b1 | ||
![]() |
a9f6adb7af | ||
![]() |
847d94c080 | ||
![]() |
c959fdddeb | ||
![]() |
4285170332 | ||
![]() |
86f07c9729 | ||
![]() |
e3d8d69147 | ||
![]() |
8970e44dc1 | ||
![]() |
7f3682e2a8 | ||
![]() |
dd716aaca7 | ||
![]() |
f5394d6d01 | ||
![]() |
2fc0bc9213 | ||
![]() |
4bc2fe3dc1 | ||
![]() |
3bf9dae294 | ||
![]() |
ca88f5878a | ||
![]() |
8d9a7fa8b0 | ||
![]() |
dead85a931 | ||
![]() |
95330b11ed | ||
![]() |
cba5ffbabb | ||
![]() |
d524d8db00 | ||
![]() |
e20a10588f | ||
![]() |
eefc2e13cb | ||
![]() |
e8417df550 | ||
![]() |
89293001e8 | ||
![]() |
78222b7123 | ||
![]() |
1fb48e886f | ||
![]() |
28a9c298c8 | ||
![]() |
c65c5a4057 | ||
![]() |
6a47116b82 | ||
![]() |
68b217d8a8 | ||
![]() |
13b36b746c | ||
![]() |
b234861e44 | ||
![]() |
2287ef10dd | ||
![]() |
2a05ea1784 | ||
![]() |
9d3d32d725 | ||
![]() |
3c88e87b17 | ||
![]() |
b3b2af1520 | ||
![]() |
6e8b5931fb | ||
![]() |
23ed4817a4 | ||
![]() |
9a1da318cc | ||
![]() |
2fab3a9e60 | ||
![]() |
a032906b1f | ||
![]() |
d362ee788b | ||
![]() |
50588d593c | ||
![]() |
ea06f04415 | ||
![]() |
e4d8752065 | ||
![]() |
9765352969 | ||
![]() |
0589ac82ea | ||
![]() |
ff1fa91d67 | ||
![]() |
14f91aacf8 | ||
![]() |
15c403a471 | ||
![]() |
8b0b8cc26f | ||
![]() |
78e2e9736e | ||
![]() |
a8daded81b | ||
![]() |
18f69303ce | ||
![]() |
390fbb9fda | ||
![]() |
3a4ceb32ce | ||
![]() |
20ab9319bc | ||
![]() |
ef33ad5a85 | ||
![]() |
c355cd2b9f | ||
![]() |
2463368cc1 | ||
![]() |
7279fdd0ce | ||
![]() |
75cb7dfe97 | ||
![]() |
3b25b73adf | ||
![]() |
2b2189f6cb | ||
![]() |
a48915f115 | ||
![]() |
1fe6d0da8c | ||
![]() |
42790c71f3 | ||
![]() |
7d868be664 | ||
![]() |
7b65a1f469 | ||
![]() |
20d93c0047 | ||
![]() |
b1a77669a2 | ||
![]() |
1cf537dacb | ||
![]() |
575fe40faf | ||
![]() |
6734bf9160 | ||
![]() |
fbfe621aa3 | ||
![]() |
df6adddc75 | ||
![]() |
974838d5de | ||
![]() |
727af516e8 | ||
![]() |
423304c5dc | ||
![]() |
5d7181a659 | ||
![]() |
eb0595e5c0 | ||
![]() |
c2f1bc86bf | ||
![]() |
30fbc6094f | ||
![]() |
d39dea2441 | ||
![]() |
abfcd3c93a | ||
![]() |
399d159757 | ||
![]() |
b96e36d6aa | ||
![]() |
78310e5c69 | ||
![]() |
fbad235605 | ||
![]() |
fa8700f05d | ||
![]() |
cf7a481921 | ||
![]() |
7f0eb6166d | ||
![]() |
dfaf84b695 | ||
![]() |
b67b022db3 | ||
![]() |
309131e944 | ||
![]() |
e153e6685c | ||
![]() |
7ca29c3397 | ||
![]() |
1339c0dde4 | ||
![]() |
637624edab | ||
![]() |
3adbc003b0 | ||
![]() |
a88765e3ec | ||
![]() |
27b9ded064 | ||
![]() |
6d0dce371e | ||
![]() |
67e899fa72 | ||
![]() |
1cbd1b6e9d | ||
![]() |
62dca46c8e | ||
![]() |
7ce63d7cb9 | ||
![]() |
54743f8bf5 | ||
![]() |
27c5d80655 | ||
![]() |
fe63a9f47f | ||
![]() |
86fa5f3c23 | ||
![]() |
1afa09cf25 | ||
![]() |
4e579e6947 | ||
![]() |
ff8032e88c | ||
![]() |
9df019fb98 | ||
![]() |
29cbfc5448 | ||
![]() |
9b38c7744c | ||
![]() |
cffcbc1a08 | ||
![]() |
ca72e500d1 | ||
![]() |
1a8cba8e75 | ||
![]() |
9887672545 | ||
![]() |
c627166521 |
70
.gitignore
vendored
@ -1 +1,69 @@
|
||||
.DS_Store
|
||||
# Created by https://www.gitignore.io/api/macos,apachecordova
|
||||
.idea
|
||||
### 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
|
||||
|
||||
# Ionic example
|
||||
ionic/example/.sourcemaps/*
|
||||
ionic/example/node_modules/*
|
||||
ionic/example/plugins/*
|
||||
ionic/example/config.xml
|
||||
ionic/example/ionic.config.json
|
||||
ionic/example/package-lock.json
|
||||
ionic/example/package.json
|
||||
ionic/example/tsconfig.json
|
||||
ionic/example/tslint.json
|
||||
ionic/example/resources/README\.md
|
||||
ionic/example/www/*
|
||||
ionic/example/src/assets/*
|
||||
ionic/example/src/theme
|
||||
ionic/example/platforms
|
||||
|
||||
ionic/example/src/manifest\.json
|
||||
|
||||
ionic/example/resources/android/splash/
|
||||
|
||||
ionic/example/resources/
|
||||
|
||||
ionic/example/src/service-worker\.js
|
||||
|
||||
ionic/example/src/index\.html
|
||||
|
||||
ionic/example/src/app/app\.scss
|
||||
|
||||
ionic/example/src/app/main\.ts
|
||||
|
||||
# End of https://www.gitignore.io/api/macos,apachecordova
|
||||
|
167
README.md
@ -1,74 +1,193 @@
|
||||
# JPush PhoneGap / Cordova Plugin
|
||||
|
||||
[](https://travis-ci.org/jpush/jpush-phonegap-plugin)
|
||||
[]()
|
||||
[](https://github.com/jpush/jpush-phonegap-plugin/releases)
|
||||
[](https://github.com/jpush/jpush-phonegap-plugin/releases)
|
||||
[](https://github.com/jpush/jpush-phonegap-plugin)
|
||||
[](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)
|
||||
|
||||
>注意:插件从 v3.4.0 开始支持 cordova-android 7.0.0,因 cordova-android 7.0.0 修改了 Android 项目结构,因此不兼容之前的版本,升级前请务必注意。
|
||||
>
|
||||
>如果需要在cordova-android 7.0.0之前版本集成最新插件,参照[这篇文章](https://www.jianshu.com/p/23b117ca27a6)
|
||||
>
|
||||
>如果需要安装之前版本的插件,请先安装 v1.2.0 以下版本(建议安装 v1.1.12)的 [cordova-plugin-jcore](https://github.com/jpush/cordova-plugin-jcore),再安装旧版本插件(比如 v3.3.2),否则运行会报错。
|
||||
>
|
||||
>[Cordova Android版本与原生版本对应表](http://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html#requirements-and-support)
|
||||
## Install
|
||||
|
||||
> 注意:
|
||||
> - 应用的包名一定要和 APP_KEY 对应应用的包名一致,否则极光推送服务无法注册成功。
|
||||
> - 在使用 8 或以上版本的 Xcode 调试 iOS 项目时,需要先在项目配置界面的 Capabilities 中打开 Push Notifications 开关。
|
||||
|
||||
- 通过 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
|
||||
```
|
||||
|
||||
|
||||
### 参数
|
||||
|
||||
- APP_KEY: 必须设置,JPush 上注册的包名对应的 Appkey
|
||||
|
||||
```shell
|
||||
--variable APP_KEY=your_jpush_appkey
|
||||
```
|
||||
|
||||
- CHANNEL: 可以不设置,v3.6.0+ 版本开始支持(Android Only),方便开发者统计 APK 分发渠道,默认为 developer-default.
|
||||
|
||||
```shell
|
||||
--variable CHANNEL=your_channel
|
||||
```
|
||||
|
||||
- 同时动态配置 APP_KEY 和 CHANNEL 示例
|
||||
|
||||
```shell
|
||||
cordova plugin add jpush-phonegap-plugin --variable APP_KEY=your_jpush_appkey --variable CHANNEL=your_channel
|
||||
```
|
||||
|
||||
### Ionic
|
||||
|
||||
如果使用了 Ionic,可以再安装 @jiguang-ionic/jpush 包,适配 ionic-native:
|
||||
|
||||
```shell
|
||||
npm install --save @jiguang-ionic/jpush@1.0.2
|
||||
|
||||
# npm install --save @jiguang-ionic/jpush@2.0.0 for ionic4+
|
||||
```
|
||||
|
||||
然后在 *app.module.ts* 中增加:
|
||||
|
||||
```js
|
||||
// @jiguang-ionic/jpush@1.0.0+
|
||||
import { JPush } from '@jiguang-ionic/jpush';
|
||||
|
||||
// @jiguang-ionic/jpush@2.0.0+
|
||||
import { JPush } from '@jiguang-ionic/jpush/ngx';
|
||||
...
|
||||
providers: [
|
||||
...
|
||||
JPush,
|
||||
...
|
||||
]
|
||||
```
|
||||
|
||||
具体可参考 ./ionic/example 中的文件。
|
||||
|
||||
|
||||
## 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
|
||||
|
||||
#### XCode 10 收不到推送怎么办?
|
||||
|
||||
打开 xcode -> file -> WorkSpace Settings… -> Build System 改成 Legacy Build System 然后卸载 App 重新运行。
|
||||
|
||||
#### 打包时遇到 i386 打包失败怎么办?
|
||||
|
||||
```shell
|
||||
cordova platform update ios
|
||||
```
|
||||
|
||||
#### 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)
|
||||
|
@ -1,45 +1,15 @@
|
||||
# Android API简介
|
||||
# Android API 简介
|
||||
|
||||
- [接收通知时获得通知的内容](#接收通知时获得通知的内容)
|
||||
- [打开通知时获得通知的内容](#打开通知时获得通知的内容)
|
||||
- [收到自定义消息时获取消息的内容](#收到自定义消息时获取消息的内容)
|
||||
- [获取集成日志](#获取集成日志)
|
||||
- [接收消息和点击通知事件](#接收消息和点击通知事件)
|
||||
- [统计分析](#统计分析)
|
||||
- [清除通知](#清除通知)
|
||||
- [设置允许推送时间](#设置允许推送时间)
|
||||
- [设置通知静默时间](#设置通知静默时间)
|
||||
- [通知栏样式定制](#通知栏样式定制)
|
||||
- [设置保留最近通知条数](#设置保留最近通知条数)
|
||||
- [本地通知](#本地通知)
|
||||
- [富媒体页面 JavaScript 回调 API](#富媒体页面-javascript-回调-api)
|
||||
- [获取推送连接状态](#获取推送连接状态)
|
||||
- [地理围栏](#地理围栏)
|
||||
|
||||
## 接收通知时获得通知的内容
|
||||
|
||||
- 内容:
|
||||
window.plugins.jPushPlugin.receiveNotification.alert
|
||||
- 标题:
|
||||
window.plugins.jPushPlugin.receiveNotification.title
|
||||
- 附加字段:
|
||||
window.plugins.jPushPlugin.receiveNotification.extras.yourKey
|
||||
|
||||
## 打开通知时获得通知的内容
|
||||
|
||||
- 内容:
|
||||
window.plugins.jPushPlugin.openNotification.alert
|
||||
- 标题:
|
||||
window.plugins.jPushPlugin.openNotification.title
|
||||
- 附加字段
|
||||
window.plugins.jPushPlugin.openNotification.extras.yourKey
|
||||
|
||||
## 收到自定义消息时获取消息的内容
|
||||
|
||||
- 内容:
|
||||
window.plugins.jPushPlugin.receiveMessage.message
|
||||
- 附加字段:
|
||||
window.plugins.jPushPlugin.receiveMessage.extras.yourKey
|
||||
|
||||
## 获取集成日志
|
||||
## 获取集成日志(同时适用于 iOS)
|
||||
|
||||
### API - setDebugMode
|
||||
|
||||
@ -47,90 +17,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 +33,14 @@
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.reportNotificationOpened(msgID)
|
||||
```js
|
||||
window.JPush.reportNotificationOpened(msgID)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- msgID: 收到的通知或者自定义消息的 id。
|
||||
|
||||
|
||||
## 清除通知
|
||||
|
||||
### API - clearAllNotification
|
||||
@ -155,23 +51,46 @@
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.clearAllNotification()
|
||||
```js
|
||||
window.JPush.clearAllNotification()
|
||||
```
|
||||
|
||||
### API - clearNotificationById
|
||||
根据通知 Id 清除通知(包括本地通知)。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
```js
|
||||
window.JPush.clearNotificationById(notificationId)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
- notificationId:int,通知的 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,则表示任何时间都收不到消息和通知。
|
||||
数组的值为 null, 表示任何时间都可以收到消息和通知,数组的 size 为 0,则表示任何时间都收不到消息和通知。
|
||||
- startHour: 整形,允许推送的开始时间 (24 小时制:startHour 的范围为 0 到 23)。
|
||||
- endHour: 整形,允许推送的结束时间 (24 小时制:endHour 的范围为 0 到 23)。
|
||||
|
||||
@ -184,7 +103,9 @@
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.setSilenceTime(startHour, startMinute, endHour, endMinute)
|
||||
```js
|
||||
window.JPush.setSilenceTime(startHour, startMinute, endHour, endMinute)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
@ -193,15 +114,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 +139,10 @@ JPush SDK 提供了 2 个用于定制通知栏样式的构建类:
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.setBasicPushNotificationBuilder()
|
||||
window.plugins.jPushPlugin.setCustomPushNotificationBuilder()
|
||||
|
||||
```js
|
||||
window.JPush.setBasicPushNotificationBuilder()
|
||||
window.JPush.setCustomPushNotificationBuilder()
|
||||
```
|
||||
|
||||
## 设置保留最近通知条数
|
||||
|
||||
@ -228,97 +154,143 @@ 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 - getConnectionState
|
||||
|
||||
此 API 提供的回调函数包括:关闭当前页面、打开应用的主 Activity、根据 Activity 名字打开对应的 Activity、以广播的形式传递页面参数到应用程序等功能。
|
||||
开发者可以使用此功能获取当前 Push 服务的连接状态
|
||||
|
||||
### API - 关闭当前页面
|
||||
#### 接口定义
|
||||
|
||||
JPushWeb.close(); // 在富文本 HTML 页面中调用后会关闭当前页面。
|
||||
```js
|
||||
window.JPush.getConnectionState(callback)
|
||||
```
|
||||
|
||||
### 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 、打开一个网页等。
|
||||
}
|
||||
- callback: 回调函数,用来通知 JPush 的推送服务是否开启。
|
||||
|
||||
#### 代码示例
|
||||
|
||||
<!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();
|
||||
}
|
||||
```js
|
||||
window.JPush.getConnectionState(function (result) {
|
||||
if (result == 0) {
|
||||
// 链接状态
|
||||
} else {
|
||||
// 断开状态
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
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>
|
||||
## 地理围栏
|
||||
|
||||
### API - setGeofenceInterval
|
||||
|
||||
设置地理围栏监控周期,最小3分钟,最大1天。默认为15分钟,当距离地理围栏边界小于1000米周期自动调整为3分钟。设置成功后一直使用设置周期,不会进行调整。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
```js
|
||||
window.JPush.setGeofenceInterval(interval)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- interval: 监控周期,单位是毫秒。
|
||||
|
||||
### API - setMaxGeofenceNumber
|
||||
|
||||
设置最多允许保存的地理围栏数量,超过最大限制后,如果继续创建先删除最早创建的地理围栏。默认数量为10个,允许设置最小1个,最大100个。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
```js
|
||||
window.JPush.setMaxGeofenceNumber(maxNumber)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- maxNumber: 最多允许保存的地理围栏个数
|
||||
|
||||
|
||||
### API - setBadgeNumber
|
||||
|
||||
设置App角标,目前仅华为系手机支持。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
```js
|
||||
window.JPush.setBadgeNumber(badgeNumb)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- badgeNumb: 角标显示数字,小于或等0,角标显示数字清楚
|
||||
|
||||
### API - setAuth
|
||||
|
||||
设置用户是否同意隐私协议
|
||||
|
||||
#### 接口定义
|
||||
|
||||
```js
|
||||
window.JPush.setAuth(isAuth)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- isAuth: 是否同意隐私协议,true 已同意;false未同意
|
||||
|
||||
#### 调用逻辑
|
||||
|
||||
- 宿主 APP 在首次安装,冷启动
|
||||
- 用户隐私协议告知
|
||||
- 用户确认授权
|
||||
- 告知极光授权结果
|
||||
|
||||
同意隐私协议:
|
||||
|
||||
```js
|
||||
window.JPush.setAuth(true)
|
||||
```
|
||||
|
||||
不同意隐私协议:
|
||||
|
||||
```js
|
||||
window.JPush.setAuth(false)
|
||||
```
|
@ -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"/>
|
@ -1,15 +1,54 @@
|
||||
# 通用 API 说明
|
||||
# 通用 API 说明(同时适用于 Android 和 iOS 系统)
|
||||
|
||||
- [停止与恢复推送服务](#停止与恢复推送服务)
|
||||
- [注册成功事件](#注册成功事件)
|
||||
- [jpush.receiveRegistrationId](#jpushreceiveregistrationid)
|
||||
- [初始化、停止与恢复推送服务](#初始化停止与恢复推送服务)
|
||||
- [init](#init)
|
||||
- [stopPush](#stoppush)
|
||||
- [resumePush](#resumepush)
|
||||
- [isPushStopped](#ispushstopped)
|
||||
- [开启 Debug 模式](#开启-debug-模式)
|
||||
- [setDebugMode](#setdebugmode)
|
||||
- [获取 RegistrationID](#获取-registrationid)
|
||||
- [getRegistrationID](#getregistrationid)
|
||||
- [设置别名与标签](#设置别名与标签)
|
||||
- [setAlias](#setalias)
|
||||
- [deleteAlias](#deletealias)
|
||||
- [getAlias](#getalias)
|
||||
- [setTags](#settags)
|
||||
- [addTags](#addtags)
|
||||
- [deleteTags](#deletetags)
|
||||
- [cleanTags](#cleantags)
|
||||
- [getAllTags](#getalltags)
|
||||
- [checkTagBindState](#checktagbindstate)
|
||||
- [设置手机号](#设置手机号)
|
||||
- [setMobileNumber](#setMobileNumber)
|
||||
- [获取点击通知内容](#获取点击通知内容)
|
||||
- [event - jpush.openNotification](#event---jpushopennotification)
|
||||
- [获取通知内容](#获取通知内容)
|
||||
- [event - jpush.receiveNotification](#event---jpushreceivenotification)
|
||||
- [获取自定义消息推送内容](#获取自定义消息推送内容)
|
||||
- [event - jpush.receiveMessage](#event---jpushreceivemessage)
|
||||
- [判断系统设置中是否允许当前应用推送](#判断系统设置中是否允许当前应用推送)
|
||||
|
||||
## 停止与恢复推送服务
|
||||
### API - init
|
||||
## 注册成功事件
|
||||
|
||||
### jpush.receiveRegistrationId
|
||||
|
||||
集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时,JPush 服务器会给客户端返回一个唯一的该设备的标识 - Registration ID。
|
||||
此时就会触发这个事件(注意只有第一次会触发该事件,之后如果想要取到 Registration Id,可以直接调用 `getRegistrationID` 方法)。
|
||||
|
||||
#### 代码示例
|
||||
|
||||
```js
|
||||
document.addEventListener('jpush.receiveRegistrationId', function (event) {
|
||||
console.log(event.registrationId)
|
||||
}, false)
|
||||
```
|
||||
|
||||
## 初始化、停止与恢复推送服务
|
||||
|
||||
### init
|
||||
|
||||
调用此 API,用来开启 JPush SDK 提供的推送服务。
|
||||
|
||||
@ -17,87 +56,99 @@
|
||||
|
||||
本功能是一个完全本地的状态操作,也就是说:停止推送服务的状态不会保存到服务器上。
|
||||
|
||||
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
|
||||
JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
|
||||
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,JPush SDK 会恢复正常的默认行为(因为保存在本地的状态数据被清除掉了)。
|
||||
|
||||
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
|
||||
恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
|
||||
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.init()
|
||||
```js
|
||||
window.JPush.init()
|
||||
```
|
||||
|
||||
### API - stopPush
|
||||
+ Android 平台:
|
||||
### stopPush
|
||||
|
||||
+ 开发者 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
|
||||
### resumePush
|
||||
|
||||
恢复推送服务。调用了此 API 后:
|
||||
|
||||
+ Android 平台:
|
||||
- Android 平台:
|
||||
- 极光推送完全恢复正常工作。
|
||||
|
||||
+ 极光推送完全恢复正常工作。
|
||||
|
||||
+ iOS 平台:
|
||||
|
||||
+ 重新去APNS注册。
|
||||
- iOS 平台:
|
||||
- 重新去 APNS 注册。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.resumePush()
|
||||
```js
|
||||
window.JPush.resumePush()
|
||||
```
|
||||
|
||||
### API - isPushStopped
|
||||
### 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 模式
|
||||
### setDebugMode
|
||||
用于开启 Debug 模式,显示更多的日志信息。
|
||||
|
||||
#### 代码示例
|
||||
|
||||
```js
|
||||
window.JPush.setDebugMode(true)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- true: 开启 Debug 模式;
|
||||
- false: 关闭 Debug 模式,不显示错误信息之外的日志信息。
|
||||
|
||||
## 获取 RegistrationID
|
||||
|
||||
### API - getRegistrationID
|
||||
### getRegistrationID
|
||||
|
||||
RegistrationID 定义:
|
||||
|
||||
@ -108,7 +159,9 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
JPushPlugin.prototype.getRegistrationID(callback)
|
||||
```js
|
||||
window.JPush.getRegistrationID(callback)
|
||||
```
|
||||
|
||||
#### 返回值
|
||||
|
||||
@ -116,19 +169,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 +191,7 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
|
||||
|
||||
系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端 API 会同时给这多个用户发送消息。
|
||||
|
||||
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时,发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端 API 发通知到客户端提醒用户。
|
||||
举例:在一个用户要登录的游戏中,可能设置别名为 userId。游戏运营时,发现该用户 3 天没有玩游戏了,则根据 userId 调用服务器端 API 发通知到客户端提醒用户。
|
||||
|
||||
**标签 Tag**:
|
||||
|
||||
@ -155,221 +203,388 @@ 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 个 tag,App 全局 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。
|
||||
|
||||
## 设置手机号
|
||||
|
||||
提供设置手机号码的接口,用于短信补充功能。
|
||||
|
||||
注:短信补充仅支持国内业务,号码格式为 11 位数字,有无 +86 前缀皆可。
|
||||
|
||||
### setMobileNumber
|
||||
|
||||
调用此 API 设置手机号码。该接口会控制调用频率,频率为 10s 之内最多 3 次。
|
||||
|
||||
#### 代码示例
|
||||
|
||||
```js
|
||||
window.JPush.setMobileNumber({ sequence: 5, mobileNumber: '111111' },
|
||||
(result) => {
|
||||
var sequence = result.sequence
|
||||
var number = result.mobileNumber
|
||||
}, (error) => {
|
||||
var sequence = error.sequence
|
||||
var errorCode = error.code
|
||||
})
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- sequence: number。用户自定义的操作序列号, 同操作结果一起返回,用来标识一次操作的唯一性。
|
||||
- mobileNumber: string
|
||||
- 手机号码。如果传空串则为解除号码绑定操作。
|
||||
- 限制:只能以 “+” 或者 数字开头;后面的内容只能包含 “-” 和数字。
|
||||
|
||||
|
||||
## 获取点击通知内容
|
||||
|
||||
### event - jpush.openNotification
|
||||
|
||||
点击通知进入应用程序时会出发改事件。
|
||||
点击通知进入应用程序时触发。
|
||||
|
||||
#### 代码示例
|
||||
|
||||
- 在你需要接收通知的的 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 需要这样写:
|
||||
- Android:
|
||||
|
||||
var alertContent;
|
||||
if(device.platform == "Android") {
|
||||
alertContent = event.alert;
|
||||
} else {
|
||||
alertContent = event.aps.alert;
|
||||
}
|
||||
alert("open Notificaiton:" + alertContent);
|
||||
```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"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.openNotification,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
|
||||
- iOS:
|
||||
|
||||
+ 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
|
||||
}
|
||||
```json
|
||||
{
|
||||
"aps": {
|
||||
"badge": 1,
|
||||
"sound": "default",
|
||||
"alert": "今天去哪儿"
|
||||
},
|
||||
"key1": "value1",
|
||||
"key2": "value2",
|
||||
"_j_msgid": 154604475
|
||||
}
|
||||
```
|
||||
|
||||
## 获取通知内容
|
||||
|
||||
### event - jpush.receiveNotification
|
||||
|
||||
收到通知时会触发该事件。
|
||||
收到通知时触发。
|
||||
|
||||
#### 代码示例
|
||||
|
||||
- 在你需要接收通知的的 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 需要这样写:
|
||||
- Android:
|
||||
|
||||
var alertContent;
|
||||
if(device.platform == "Android") {
|
||||
alertContent = event.alert;
|
||||
} else {
|
||||
alertContent = event.aps.alert;
|
||||
}
|
||||
alert("open Notificaiton:" + alertContent);
|
||||
```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"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveNotification,直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
|
||||
|
||||
+ Android:
|
||||
|
||||
{
|
||||
"title": "title",
|
||||
"alert":"ding",
|
||||
"extras":{
|
||||
"yourKey": "yourValue",
|
||||
"cn.jpush.android.MSG_ID":"1691785879",
|
||||
"app":"com.thi.pushtest",
|
||||
"cn.jpush.android.ALERT":"ding",
|
||||
"cn.jpush.android.EXTRA":{},
|
||||
"cn.jpush.android.PUSH_ID":"1691785879",
|
||||
"cn.jpush.android.NOTIFICATION_ID":1691785879,
|
||||
"cn.jpush.android.NOTIFICATION_TYPE":"0"
|
||||
}
|
||||
}
|
||||
|
||||
+ iOS:
|
||||
|
||||
{
|
||||
"aps":{
|
||||
"badge":1,
|
||||
"sound":"default",
|
||||
"alert":"今天去哪儿"
|
||||
},
|
||||
"key1":"value1",
|
||||
"key2":"value2",
|
||||
"_j_msgid":154604475
|
||||
}
|
||||
- iOS:
|
||||
|
||||
```json
|
||||
{
|
||||
"aps":{
|
||||
"badge":1,
|
||||
"sound":"default",
|
||||
"alert":"今天去哪儿"
|
||||
},
|
||||
"key1":"value1",
|
||||
"key2":"value2",
|
||||
"_j_msgid":154604475
|
||||
}
|
||||
```
|
||||
|
||||
## 获取自定义消息推送内容
|
||||
|
||||
### event - jpush.receiveMessage
|
||||
|
||||
收到自定义消息时触发这个事件,推荐使用事件的方式传递。
|
||||
收到自定义消息时触发,推荐使用事件的方式传递。
|
||||
|
||||
但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
|
||||
但同时保留了 `receiveMessageIniOSCallback` 的回调函数,兼容以前的代码。
|
||||
|
||||
#### 代码示例
|
||||
|
||||
- 在你需要接收通知的的 js 文件中加入:
|
||||
|
||||
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
|
||||
```js
|
||||
document.addEventListener("jpush.receiveMessage", function (event) {
|
||||
var message
|
||||
if(device.platform == "Android") {
|
||||
message = event.message;
|
||||
} else {
|
||||
message = event.content;
|
||||
}
|
||||
}, false)
|
||||
```
|
||||
|
||||
- onReceiveMessage 需要这样写:
|
||||
- Android:
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
```json
|
||||
{
|
||||
"message":"今天去哪儿",
|
||||
"extras"{
|
||||
"yourKey": "yourValue",
|
||||
"cn.jpush.android.MSG_ID":"154378013",
|
||||
"cn.jpush.android.CONTENT_TYPE":"",
|
||||
"cn.jpush.android.EXTRA":{ "key":"不添加没有" }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
ps:点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveMessage,
|
||||
直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
|
||||
|
||||
+ 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 +594,22 @@ 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) {
|
||||
// 系统设置中打开了应用推送。
|
||||
}
|
||||
})
|
||||
```
|
||||
|
724
doc/iOS_API.md
@ -1,50 +1,76 @@
|
||||
# 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 提供的推送服务。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
```js
|
||||
window.JPush.init()
|
||||
```
|
||||
|
||||
### API - stopPush
|
||||
|
||||
开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
|
||||
|
||||
```
|
||||
本功能是一个完全本地的状态操作。也就是说:停止推送服务的状态不会保存到服务器上。
|
||||
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
|
||||
JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
|
||||
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
|
||||
恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
|
||||
```
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.init()
|
||||
|
||||
|
||||
### API - stopPush
|
||||
|
||||
- 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。
|
||||
- 推荐:设置一个 UI 界面,提醒用户在 设置-通知 中关闭推送服务。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
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 个 tag,App 全局 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 推送内容
|
||||
|
||||
@ -199,34 +143,39 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
|
||||
|
||||
#### event - jpush.openNotification
|
||||
|
||||
点击通知启动或唤醒应用程序时会出发该事件
|
||||
点击通知(包括 localNotification 和 remoteNotification)启动或唤醒应用程序时会触发该事件
|
||||
|
||||
#### 代码示例
|
||||
|
||||
- 在你需要接收通知的的 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: 整形,例如 0,1,2(当 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,11 +373,13 @@ value 取值范围:[0,99999]。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
|
||||
```js
|
||||
window.JPush.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- delayTime: 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可。
|
||||
- delayTime: 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可,单位为秒。
|
||||
- content: 本地推送需要显示的内容。
|
||||
- badge: 角标的数字。如果不需要改变角标传-1。数值类型或纯数字的字符型均可。
|
||||
- notificationID: 本地推送标识符,字符串。
|
||||
@ -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,54 @@ 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 在前台时收到」均会触发该事件。
|
||||
|
||||
#### 代码示例
|
||||
|
||||
- 在你需要接收通知的的 js 文件中加入:
|
||||
|
||||
```js
|
||||
document.addEventListener("jpush.receiveLocalNotification", onLocalNotification, false)
|
||||
```
|
||||
|
||||
- onLocalNotification 需要这样写:
|
||||
|
||||
```js
|
||||
var onLocalNotification = function(event) {
|
||||
alert("receive Local Notification:" + JSON.stringify(event))
|
||||
}
|
||||
```
|
||||
|
||||
- event 举例
|
||||
|
||||
```json
|
||||
{
|
||||
badge = 1;
|
||||
content = "Hello JPush";
|
||||
extras = {
|
||||
"__JPUSHNotificationKey" = notificationIdentify_1;
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### iOS 10 收到本地通知
|
||||
|
||||
监听 [jpush.receiveNotification](#前台收到推送)、[jpush.openNotification](点击推送通知),获取推送内容后,通过获取到的 `__JPUSHNotificationKey` 字段([本地通知](#本地通知) 设置的 `notificationID`)来判断是本地通知,并处理。
|
||||
|
||||
|
||||
|
||||
## 页面的统计
|
||||
@ -468,26 +476,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 +507,13 @@ value 取值范围:[0,99999]。
|
||||
|
||||
用于开启 Debug 模式,显示更多的日志信息。
|
||||
|
||||
建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 setLogOFF 是相反的一对。
|
||||
建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 `setLogOFF` 是相反的一对。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.prototype.setDebugModeFromIos()
|
||||
|
||||
#### 代码示例
|
||||
|
||||
window.plugins.jPushPlugin.setDebugModeFromIos();
|
||||
```js
|
||||
window.JPush.setDebugModeFromIos();
|
||||
```
|
||||
|
||||
### API - setLogOFF
|
||||
|
||||
@ -513,11 +523,9 @@ value 取值范围:[0,99999]。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.prototype.setLogOFF()
|
||||
|
||||
#### 代码示例
|
||||
|
||||
window.plugins.jPushPlugin.setLogOFF();
|
||||
```js
|
||||
window.JPush.setLogOFF();
|
||||
```
|
||||
|
||||
### API - setCrashLogON
|
||||
|
||||
@ -527,11 +535,9 @@ value 取值范围:[0,99999]。
|
||||
|
||||
#### 接口定义
|
||||
|
||||
window.plugins.jPushPlugin.prototype.setCrashLogON()
|
||||
|
||||
#### 代码示例
|
||||
|
||||
window.plugins.jPushPlugin.setCrashLogON();
|
||||
```js
|
||||
window.JPush.setCrashLogON();
|
||||
```
|
||||
|
||||
## 地理位置上报
|
||||
|
||||
@ -541,17 +547,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 +564,190 @@ 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。
|
||||
|
||||
效果如下图所示:
|
||||
|
||||

|
||||
|
||||
#### 接口定义
|
||||
|
||||
```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:可选,快捷回复输入框占位符。
|
||||
- categoryId:category 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。
|
||||
|
||||
效果如下图所示:
|
||||
|
||||

|
||||
|
||||
#### 接口定义
|
||||
|
||||
```js
|
||||
window.JPush.addNotificationActions(actions, categoryId)
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
参数同 API - addDismissActions
|
||||
|
||||
#### 代码示例
|
||||
|
||||
代码示例同 API - addDismissActions
|
||||
|
||||
### Media Attachments
|
||||
|
||||
(iOS 10)在手机锁屏界面和通知中心界面的推送条目、应用菜单界面的推送横幅上,展示图片、gif、audio、video 等富媒体。效果如下图所示:
|
||||
|
||||

|
||||
|
||||
#### 配置方法
|
||||
|
||||
1.首先配置好 iOS 项目的证书。如下图所示没有任何异常警告:
|
||||
|
||||

|
||||
|
||||
2.打开 iOS Xcode Project - File - New - Target - iOS - Notification Service Extension - Next - Product Name 填写 `jpushNotificationService` - Finish,如下图所示: 
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
3.在 Xcode 工程目录左侧系统自动创建了 jpushNotificationService 文件夹及三个文件,下载本插件目录 `jpush-phonegap-plugin/src/ios/notificationService/` 下的 `NotificationService.h`、`NotificationService.m` 文件,全部复制替换对应文件内代码。
|
||||
|
||||
4.在 Xcode 中拖拽图片、gif、audio、video 等资源文件至 `jpushNotificationService` 文件夹目录下,弹出菜单选择如下: 
|
||||
|
||||
5.在极光控制台 - 发送通知 - 可选设置 - mutable-content 打勾。
|
||||
|
||||
6.添加附加字段, key 为 `JPushPluginAttachment` ,value 为资源名称如 `aPic.png`,该资源必须在第 4 步中已经添加至工程,且文件名和拓展名完全对应。5、6 如下图所示:
|
||||
|
||||

|
||||
|
||||
另,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.receiveMessage
|
||||
|
||||
[获取自定义消息内容](#获取自定义消息内容)
|
||||
|
||||
### jpush.receiveLocalNotification
|
||||
|
||||
[iOS 10 before 收到本地通知](#ios-10-before-收到本地通知)
|
@ -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>
|
BIN
doc/res/DismissActions_00.PNG
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
doc/res/MediaAttachments_00.gif
Normal file
After Width: | Height: | Size: 1.7 MiB |
BIN
doc/res/MediaAttachments_01.png
Normal file
After Width: | Height: | Size: 237 KiB |
BIN
doc/res/MediaAttachments_02.png
Normal file
After Width: | Height: | Size: 204 KiB |
BIN
doc/res/MediaAttachments_03.png
Normal file
After Width: | Height: | Size: 213 KiB |
BIN
doc/res/MediaAttachments_04.png
Normal file
After Width: | Height: | Size: 140 KiB |
BIN
doc/res/MediaAttachments_05.png
Normal file
After Width: | Height: | Size: 143 KiB |
BIN
doc/res/MediaAttachments_06.png
Normal file
After Width: | Height: | Size: 93 KiB |
BIN
doc/res/NotificationActions_00.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
example/css/.DS_Store
vendored
@ -1,198 +1,315 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>JPush Phonegap Simple Demo</title>
|
||||
<link href="css/jquery.mobile-1.1.1.css" rel="stylesheet" type="text/css" />
|
||||
<script type="text/javascript" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" src="js/jquery.mobile-1.1.1.js"></script>
|
||||
<script type="text/javascript" src="cordova.js"></script>
|
||||
<script type="text/javascript">
|
||||
<title>JPush Phonegap Simple Demo</title>
|
||||
<link href="css/jquery.mobile-1.1.1.css" rel="stylesheet" type="text/css" />
|
||||
<script type="text/javascript" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" src="js/jquery.mobile-1.1.1.js"></script>
|
||||
<script type="text/javascript" src="cordova.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
var onDeviceReady = function() {
|
||||
console.log("JPushPlugin:Device ready!");
|
||||
initiateUI();
|
||||
document.addEventListener("jpush.receiveRegistrationId", function (event) {
|
||||
alert("receiveRegistrationId" + JSON.stringify(event));
|
||||
$("#registrationId").html(event.registrationId);
|
||||
}, false)
|
||||
|
||||
initiateUI();
|
||||
};
|
||||
|
||||
var getRegistrationID = function() {
|
||||
window.plugins.jPushPlugin.getRegistrationID(onGetRegistrationID);
|
||||
window.JPush.getRegistrationID(onGetRegistrationID);
|
||||
};
|
||||
|
||||
var onGetRegistrationID = function(data) {
|
||||
try {
|
||||
console.log("JPushPlugin:registrationID is " + data);
|
||||
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);
|
||||
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 badgeNumb = 0;
|
||||
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;
|
||||
}
|
||||
|
||||
badgeNumb = badgeNumb - 1;
|
||||
badgeNumb = badgeNumb<=0 ? 0 : badgeNumb;
|
||||
window.JPush.setBadgeNumber(badgeNumb);
|
||||
|
||||
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);
|
||||
|
||||
badgeNumb = badgeNumb + 1;
|
||||
window.JPush.setBadgeNumber(badgeNumb);
|
||||
} 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);
|
||||
|
||||
badgeNumb = badgeNumb + 1;
|
||||
window.JPush.setBadgeNumber(badgeNumb);
|
||||
} catch (exception) {
|
||||
console.log("JPushPlugin:onReceiveMessage-->" + exception);
|
||||
}
|
||||
};
|
||||
|
||||
var onResume = function(event){
|
||||
try {
|
||||
badgeNumb = 0
|
||||
window.JPush.setBadgeNumber(0);
|
||||
|
||||
} catch (exception) {
|
||||
console.log("onResume-->" + 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);
|
||||
}
|
||||
$("#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 = [];
|
||||
try {
|
||||
window.JPush.init();
|
||||
window.JPush.setDebugMode(true);
|
||||
window.setTimeout(getRegistrationID, 1000);
|
||||
|
||||
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);
|
||||
}
|
||||
})
|
||||
if (device.platform != "Android") {
|
||||
window.JPush.setApplicationIconBadgeNumber(0);
|
||||
}
|
||||
} 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 },
|
||||
function (result) {
|
||||
$("#tagsResult").html(JSON.stringify(result.tags))
|
||||
}, function (error) {
|
||||
alert(error.code)
|
||||
})
|
||||
} catch (exception) {
|
||||
console.log(exception)
|
||||
}
|
||||
})
|
||||
|
||||
$("#getAllTags").click(function (event) {
|
||||
window.JPush.getAllTags({ sequence: 2 },
|
||||
function (result) {
|
||||
$("#tagsResult").html(JSON.stringify(result.tags))
|
||||
}, function (error) {
|
||||
alert(error.code)
|
||||
})
|
||||
})
|
||||
|
||||
$("#cleanTags").click(function (event) {
|
||||
window.JPush.cleanTags({ sequence: 2 },
|
||||
function (result) {
|
||||
alert(result.sequence)
|
||||
$("#tagsResult").html("")
|
||||
}, function (error) {
|
||||
alert(error.code)
|
||||
})
|
||||
})
|
||||
|
||||
$("#setAlias").click(function (event) {
|
||||
var alias = $("#aliasText").val()
|
||||
window.JPush.setAlias({ sequence: 1, alias: alias },
|
||||
function (result) {
|
||||
$("#aliasResult").html(result.alias)
|
||||
}, function (error){
|
||||
alert(error.code)
|
||||
})
|
||||
})
|
||||
|
||||
$("#getAlias").click(function (event) {
|
||||
window.JPush.getAlias({ sequence: 2 },
|
||||
function (result) {
|
||||
alert(JSON.stringify(result));
|
||||
}, function (error) {
|
||||
alert(error.code)
|
||||
})
|
||||
});
|
||||
|
||||
$("#deleteAlias").click(function (event) {
|
||||
window.JPush.deleteAlias({ sequence: 3 },
|
||||
function (result) {
|
||||
alert(JSON.stringify(result));
|
||||
}, function (error) {
|
||||
alert(error.code)
|
||||
})
|
||||
});
|
||||
|
||||
$("#setMobileNumber").click(function (event) {
|
||||
var number = $("#mobileNumberText").val()
|
||||
window.JPush.setMobileNumber({ sequence: 5, mobileNumber: number },
|
||||
function (result) {
|
||||
$("#mobileNumberResult").html(result.mobileNumber)
|
||||
}, function (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>
|
||||
document.addEventListener("resume", onResume, false);
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<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>
|
||||
<label>MobileNumber: </label>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="number" id="mobileNumberText" />
|
||||
</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">
|
||||
<input type="button" id="setMobileNumber" value="Set mobileNumber" />
|
||||
</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="mobileNumberPrompt">设置手机号的结果:</label>
|
||||
<label id="mobileNumberResult">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>
|
BIN
example/js/.DS_Store
vendored
8
hooks/apns.entitlements
Normal 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
@ -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
@ -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
@ -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);
|
||||
}
|
||||
}
|
25
ionic/example/src/app/app.component.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { Platform } from 'ionic-angular';
|
||||
import { StatusBar } from '@ionic-native/status-bar';
|
||||
import { SplashScreen } from '@ionic-native/splash-screen';
|
||||
import { JPush } from '@jiguang-ionic/jpush';
|
||||
|
||||
import { HomePage } from '../pages/home/home';
|
||||
@Component({
|
||||
templateUrl: 'app.html'
|
||||
})
|
||||
export class MyApp {
|
||||
rootPage:any = HomePage;
|
||||
|
||||
constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen, jpush: JPush) {
|
||||
platform.ready().then(() => {
|
||||
// Okay, so the platform is ready and our plugins are available.
|
||||
// Here you can do any higher level native things you might need.
|
||||
statusBar.styleDefault();
|
||||
splashScreen.hide();
|
||||
|
||||
jpush.init();
|
||||
jpush.setDebugMode(true);
|
||||
});
|
||||
}
|
||||
}
|
1
ionic/example/src/app/app.html
Normal file
@ -0,0 +1 @@
|
||||
<ion-nav [root]="rootPage"></ion-nav>
|
34
ionic/example/src/app/app.module.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import { BrowserModule } from '@angular/platform-browser';
|
||||
import { ErrorHandler, NgModule } from '@angular/core';
|
||||
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
|
||||
import { SplashScreen } from '@ionic-native/splash-screen';
|
||||
import { StatusBar } from '@ionic-native/status-bar';
|
||||
import { Device } from '@ionic-native/device';
|
||||
import { JPush } from '@jiguang-ionic/jpush';
|
||||
|
||||
import { MyApp } from './app.component';
|
||||
import { HomePage } from '../pages/home/home';
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
MyApp,
|
||||
HomePage
|
||||
],
|
||||
imports: [
|
||||
BrowserModule,
|
||||
IonicModule.forRoot(MyApp)
|
||||
],
|
||||
bootstrap: [IonicApp],
|
||||
entryComponents: [
|
||||
MyApp,
|
||||
HomePage
|
||||
],
|
||||
providers: [
|
||||
StatusBar,
|
||||
SplashScreen,
|
||||
Device,
|
||||
JPush,
|
||||
{provide: ErrorHandler, useClass: IonicErrorHandler}
|
||||
]
|
||||
})
|
||||
export class AppModule {}
|
36
ionic/example/src/pages/home/home.html
Normal file
@ -0,0 +1,36 @@
|
||||
<ion-header>
|
||||
<ion-navbar>
|
||||
<ion-title>
|
||||
JPush Ionic Example
|
||||
</ion-title>
|
||||
</ion-navbar>
|
||||
</ion-header>
|
||||
|
||||
<ion-content padding>
|
||||
|
||||
<ion-list>
|
||||
<ion-item>
|
||||
<div>Registration Id: {{registrationId}}</div>
|
||||
<button ion-button full (click)="getRegistrationID()">Get Registration Id</button>
|
||||
</ion-item>
|
||||
|
||||
<ion-item>
|
||||
<button ion-button full (click)="setTags()">Set tags - Tag1, Tag2</button>
|
||||
<button ion-button full (click)="addTags()">Add tags - Tag3, Tag4</button>
|
||||
<button ion-button full (click)="checkTagBindState()">Check tag bind state - Tag1</button>
|
||||
<button ion-button full (click)="deleteTags()">Delete tags - Tag4</button>
|
||||
<button ion-button full (click)="getAllTags()">Get all tags</button>
|
||||
<button ion-button full (click)="cleanTags()">Clean tags</button>
|
||||
</ion-item>
|
||||
|
||||
<ion-item>
|
||||
<button ion-button full (click)="setAlias()">Set Alias - TestAlias</button>
|
||||
<button ion-button full (click)="getAlias()">Get Alias</button>
|
||||
<button ion-button full (click)="deleteAlias()">Delete Alias</button>
|
||||
</ion-item>
|
||||
|
||||
<ion-item>
|
||||
<button ion-button full (click)="addLocalNotification()">Trigger local notification after 5 seconds</button>
|
||||
</ion-item>
|
||||
</ion-list>
|
||||
</ion-content>
|
3
ionic/example/src/pages/home/home.scss
Normal file
@ -0,0 +1,3 @@
|
||||
page-home {
|
||||
|
||||
}
|
176
ionic/example/src/pages/home/home.ts
Normal file
@ -0,0 +1,176 @@
|
||||
import { Component } from "@angular/core";
|
||||
import { NavController } from "ionic-angular";
|
||||
import { JPush } from "@jiguang-ionic/jpush";
|
||||
import { Device } from "@ionic-native/device";
|
||||
|
||||
@Component({
|
||||
selector: "page-home",
|
||||
templateUrl: "home.html"
|
||||
})
|
||||
export class HomePage {
|
||||
public registrationId: string;
|
||||
|
||||
devicePlatform: string;
|
||||
sequence: number = 0;
|
||||
|
||||
tagResultHandler = function(result) {
|
||||
var sequence: number = result.sequence;
|
||||
var tags: Array<string> = result.tags == null ? [] : result.tags;
|
||||
alert(
|
||||
"Success!" + "\nSequence: " + sequence + "\nTags: " + tags.toString()
|
||||
);
|
||||
};
|
||||
|
||||
aliasResultHandler = function(result) {
|
||||
var sequence: number = result.sequence;
|
||||
var alias: string = result.alias;
|
||||
alert("Success!" + "\nSequence: " + sequence + "\nAlias: " + alias);
|
||||
};
|
||||
|
||||
errorHandler = function(err) {
|
||||
var sequence: number = err.sequence;
|
||||
var code = err.code;
|
||||
alert("Error!" + "\nSequence: " + sequence + "\nCode: " + code);
|
||||
};
|
||||
|
||||
constructor(
|
||||
public navCtrl: NavController,
|
||||
public jpush: JPush,
|
||||
device: Device
|
||||
) {
|
||||
this.devicePlatform = device.platform;
|
||||
|
||||
document.addEventListener(
|
||||
"jpush.receiveNotification",
|
||||
(event: any) => {
|
||||
var content;
|
||||
if (this.devicePlatform == "Android") {
|
||||
content = event.alert;
|
||||
} else {
|
||||
content = event.aps.alert;
|
||||
}
|
||||
alert("Receive notification: " + JSON.stringify(event));
|
||||
},
|
||||
false
|
||||
);
|
||||
|
||||
document.addEventListener(
|
||||
"jpush.openNotification",
|
||||
(event: any) => {
|
||||
var content;
|
||||
if (this.devicePlatform == "Android") {
|
||||
content = event.alert;
|
||||
} else {
|
||||
// iOS
|
||||
if (event.aps == undefined) {
|
||||
// 本地通知
|
||||
content = event.content;
|
||||
} else {
|
||||
// APNS
|
||||
content = event.aps.alert;
|
||||
}
|
||||
}
|
||||
alert("open notification: " + JSON.stringify(event));
|
||||
},
|
||||
false
|
||||
);
|
||||
|
||||
document.addEventListener(
|
||||
"jpush.receiveLocalNotification",
|
||||
(event: any) => {
|
||||
// iOS(*,9) Only , iOS(10,*) 将在 jpush.openNotification 和 jpush.receiveNotification 中触发。
|
||||
var content;
|
||||
if (this.devicePlatform == "Android") {
|
||||
} else {
|
||||
content = event.content;
|
||||
}
|
||||
alert("receive local notification: " + JSON.stringify(event));
|
||||
},
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
getRegistrationID() {
|
||||
this.jpush.getRegistrationID().then(rId => {
|
||||
this.registrationId = rId;
|
||||
});
|
||||
}
|
||||
|
||||
setTags() {
|
||||
this.jpush
|
||||
.setTags({ sequence: this.sequence++, tags: ["Tag1", "Tag2"] })
|
||||
.then(this.tagResultHandler)
|
||||
.catch(this.errorHandler);
|
||||
}
|
||||
|
||||
addTags() {
|
||||
this.jpush
|
||||
.addTags({ sequence: this.sequence++, tags: ["Tag3", "Tag4"] })
|
||||
.then(this.tagResultHandler)
|
||||
.catch(this.errorHandler);
|
||||
}
|
||||
|
||||
checkTagBindState() {
|
||||
this.jpush
|
||||
.checkTagBindState({ sequence: this.sequence++, tag: "Tag1" })
|
||||
.then(result => {
|
||||
var sequence = result.sequence;
|
||||
var tag = result.tag;
|
||||
var isBind = result.isBind;
|
||||
alert(
|
||||
"Sequence: " + sequence + "\nTag: " + tag + "\nIsBind: " + isBind
|
||||
);
|
||||
})
|
||||
.catch(this.errorHandler);
|
||||
}
|
||||
|
||||
deleteTags() {
|
||||
this.jpush
|
||||
.deleteTags({ sequence: this.sequence++, tags: ["Tag4"] })
|
||||
.then(this.tagResultHandler)
|
||||
.catch(this.errorHandler);
|
||||
}
|
||||
|
||||
getAllTags() {
|
||||
this.jpush
|
||||
.getAllTags({ sequence: this.sequence++ })
|
||||
.then(this.tagResultHandler)
|
||||
.catch(this.errorHandler);
|
||||
}
|
||||
|
||||
cleanTags() {
|
||||
this.jpush
|
||||
.cleanTags({ sequence: this.sequence++ })
|
||||
.then(this.tagResultHandler)
|
||||
.catch(this.errorHandler);
|
||||
}
|
||||
|
||||
setAlias() {
|
||||
this.jpush
|
||||
.setAlias({ sequence: this.sequence++, alias: "TestAlias" })
|
||||
.then(this.aliasResultHandler)
|
||||
.catch(this.errorHandler);
|
||||
}
|
||||
|
||||
getAlias() {
|
||||
this.jpush
|
||||
.getAlias({ sequence: this.sequence++ })
|
||||
.then(this.aliasResultHandler)
|
||||
.catch(this.errorHandler);
|
||||
}
|
||||
|
||||
deleteAlias() {
|
||||
this.jpush
|
||||
.deleteAlias({ sequence: this.sequence++ })
|
||||
.then(this.aliasResultHandler)
|
||||
.catch(this.errorHandler);
|
||||
}
|
||||
|
||||
addLocalNotification() {
|
||||
if (this.devicePlatform == "Android") {
|
||||
this.jpush.addLocalNotification(0, "Hello JPush", "JPush", 1, 5000);
|
||||
} else {
|
||||
this.jpush.addLocalNotificationForIOS(5, "Hello JPush", 1, "localNoti1");
|
||||
}
|
||||
}
|
||||
}
|
210
ionic/index.ts
Normal file
@ -0,0 +1,210 @@
|
||||
import { Plugin, Cordova, IonicNativePlugin } from '@ionic-native/core';
|
||||
import { Injectable } from '@angular/core';
|
||||
|
||||
export interface TagOptions {
|
||||
sequence: number;
|
||||
tags?: Array<string>;
|
||||
}
|
||||
|
||||
export interface AliasOptions {
|
||||
sequence: number;
|
||||
alias?: string;
|
||||
}
|
||||
|
||||
@Plugin({
|
||||
pluginName: 'JPush',
|
||||
plugin: 'jpush-phonegap-plugin',
|
||||
pluginRef: 'plugins.jPushPlugin',
|
||||
repo: 'https://github.com/jpush/jpush-phonegap-plugin',
|
||||
install: 'ionic cordova plugin add jpush-phonegap-plugin --variable APP_KEY=your_app_key',
|
||||
installVariables: ['APP_KEY'],
|
||||
platforms: ['Android', 'iOS']
|
||||
})
|
||||
@Injectable()
|
||||
export class JPush extends IonicNativePlugin {
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS', 'Android']
|
||||
})
|
||||
init(): void { }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS', 'Android']
|
||||
})
|
||||
setDebugMode(enable: boolean): void { }
|
||||
|
||||
@Cordova()
|
||||
getRegistrationID(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
stopPush(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
resumePush(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
isPushStopped(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
setTags(params: TagOptions): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
addTags(params: TagOptions): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
deleteTags(params: TagOptions): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
cleanTags(params: TagOptions): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
getAllTags(params: TagOptions): Promise<any> { return; }
|
||||
|
||||
/**
|
||||
* @param params { sequence: number, tag: string }
|
||||
*/
|
||||
@Cordova()
|
||||
checkTagBindState(params: object): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
setAlias(params: AliasOptions): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
deleteAlias(params: AliasOptions): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
getAlias(params: AliasOptions): Promise<any> { return; }
|
||||
|
||||
/**
|
||||
* Determinate whether the application notification has been opened.
|
||||
*
|
||||
* iOS: 0: closed; >1: opened.
|
||||
* UIRemoteNotificationTypeNone = 0,
|
||||
* UIRemoteNotificationTypeBadge = 1 << 0,
|
||||
* UIRemoteNotificationTypeSound = 1 << 1,
|
||||
* UIRemoteNotificationTypeAlert = 1 << 2,
|
||||
* UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3
|
||||
*
|
||||
* Android: 0: closed; 1: opened.
|
||||
*/
|
||||
@Cordova()
|
||||
getUserNotificationSettings(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
clearLocalNotifications(): Promise<any> { return; }
|
||||
|
||||
// iOS API - start
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
setBadge(badge: number): void { }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
resetBadge(): void { }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
setApplicationIconBadgeNumber(badge: number): void { }
|
||||
|
||||
@Cordova()
|
||||
getApplicationIconBadgeNumber(): Promise<any> { return; }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
addLocalNotificationForIOS(delayTime: number, content: string, badge: number, identifierKey: string, extras?: object): void { }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey: string): void { }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
addDismissActions(actions: Array<object>, categoryId: string): void { }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
addNotificationActions(actions: Array<object>, categoryId: string): void { }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
setLocation(latitude: number, longitude: number): void { }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
startLogPageView(pageName: string): void { return; }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
stopLogPageView(pageName: string): void { return; }
|
||||
|
||||
@Cordova({
|
||||
sync: true,
|
||||
platforms: ['iOS']
|
||||
})
|
||||
beginLogPageView(pageName: string, duration: number): void { return; }
|
||||
|
||||
// iOS API - end
|
||||
|
||||
// Android API - start
|
||||
|
||||
@Cordova()
|
||||
getConnectionState(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
setBasicPushNotificationBuilder(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
setCustomPushNotificationBuilder(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
clearAllNotification(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
clearNotificationById(id: number): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
setLatestNotificationNum(num: number): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
addLocalNotification(builderId: number, content: string, title: string, notificationId: number, broadcastTime: number, extras?: string): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
removeLocalNotification(notificationId: number): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
reportNotificationOpened(msgId: number): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
requestPermission(): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
setSilenceTime(startHour: number, startMinute: number, endHour: number, endMinute: number): Promise<any> { return; }
|
||||
|
||||
@Cordova()
|
||||
setPushTime(weekdays: Array<string>, startHour: number, endHour: number): Promise<any> { return; }
|
||||
|
||||
// Android API - end
|
||||
}
|
97
ionic/jpush/index.d.ts
vendored
Normal file
@ -0,0 +1,97 @@
|
||||
import { IonicNativePlugin } from '@ionic-native/core';
|
||||
export interface TagOptions {
|
||||
sequence: number;
|
||||
tags?: Array<string>;
|
||||
}
|
||||
export interface AliasOptions {
|
||||
sequence: number;
|
||||
alias?: string;
|
||||
}
|
||||
/**
|
||||
* @name jpush
|
||||
* @description
|
||||
* This plugin does something
|
||||
*
|
||||
* @usage
|
||||
* ```typescript
|
||||
* import { jpush } from '@ionic-native/jpush';
|
||||
*
|
||||
*
|
||||
* constructor(private jpush: jpush) { }
|
||||
*
|
||||
* ...
|
||||
*
|
||||
*
|
||||
* this.jpush.functionName('Hello', 123)
|
||||
* .then((res: any) => console.log(res))
|
||||
* .catch((error: any) => console.error(error));
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export declare class JPushOriginal extends IonicNativePlugin {
|
||||
/**
|
||||
* This function does something
|
||||
* @param arg1 {string} Some param to configure something
|
||||
* @param arg2 {number} Another param to configure something
|
||||
* @return {Promise<any>} Returns a promise that resolves when something happens
|
||||
*/
|
||||
functionName(arg1: string, arg2: number): Promise<any>;
|
||||
init(): void;
|
||||
setDebugMode(enable: boolean): void;
|
||||
getRegistrationID(): Promise<any>;
|
||||
stopPush(): Promise<any>;
|
||||
resumePush(): Promise<any>;
|
||||
isPushStopped(): Promise<any>;
|
||||
setTags(params: TagOptions): Promise<any>;
|
||||
addTags(params: TagOptions): Promise<any>;
|
||||
deleteTags(params: TagOptions): Promise<any>;
|
||||
cleanTags(params: TagOptions): Promise<any>;
|
||||
getAllTags(params: TagOptions): Promise<any>;
|
||||
/**
|
||||
* @param params { sequence: number, tag: string }
|
||||
*/
|
||||
checkTagBindState(params: object): Promise<any>;
|
||||
setAlias(params: AliasOptions): Promise<any>;
|
||||
deleteAlias(params: AliasOptions): Promise<any>;
|
||||
getAlias(params: AliasOptions): Promise<any>;
|
||||
/**
|
||||
* Determinate whether the application notification has been opened.
|
||||
*
|
||||
* iOS: 0: closed; >1: opened.
|
||||
* UIRemoteNotificationTypeNone = 0,
|
||||
* UIRemoteNotificationTypeBadge = 1 << 0,
|
||||
* UIRemoteNotificationTypeSound = 1 << 1,
|
||||
* UIRemoteNotificationTypeAlert = 1 << 2,
|
||||
* UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3
|
||||
*
|
||||
* Android: 0: closed; 1: opened.
|
||||
*/
|
||||
getUserNotificationSettings(): Promise<any>;
|
||||
clearLocalNotifications(): Promise<any>;
|
||||
setBadge(badge: number): void;
|
||||
resetBadge(): void;
|
||||
setApplicationIconBadgeNumber(badge: number): void;
|
||||
getApplicationIconBadgeNumber(): Promise<any>;
|
||||
addLocalNotificationForIOS(delayTime: number, content: string, badge: number, identifierKey: string, extras?: object): void;
|
||||
deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey: string): void;
|
||||
addDismissActions(actions: Array<object>, categoryId: string): void;
|
||||
addNotificationActions(actions: Array<object>, categoryId: string): void;
|
||||
setLocation(latitude: number, longitude: number): void;
|
||||
startLogPageView(pageName: string): void;
|
||||
stopLogPageView(pageName: string): void;
|
||||
beginLogPageView(pageName: string, duration: number): void;
|
||||
getConnectionState(): Promise<any>;
|
||||
setBasicPushNotificationBuilder(): Promise<any>;
|
||||
setCustomPushNotificationBuilder(): Promise<any>;
|
||||
clearAllNotification(): Promise<any>;
|
||||
clearNotificationById(id: number): Promise<any>;
|
||||
setLatestNotificationNum(num: number): Promise<any>;
|
||||
addLocalNotification(builderId: number, content: string, title: string, notificationId: number, broadcastTime: number, extras?: string): Promise<any>;
|
||||
removeLocalNotification(notificationId: number): Promise<any>;
|
||||
reportNotificationOpened(msgId: number): Promise<any>;
|
||||
requestPermission(): Promise<any>;
|
||||
setSilenceTime(startHour: number, startMinute: number, endHour: number, endMinute: number): Promise<any>;
|
||||
setPushTime(weekdays: Array<string>, startHour: number, endHour: number): Promise<any>;
|
||||
}
|
||||
|
||||
export declare const JPush: JPushOriginal;
|
73
ionic/jpush/index.js
Normal file
95
ionic/jpush/ngx/index.d.ts
vendored
Normal file
@ -0,0 +1,95 @@
|
||||
import { IonicNativePlugin } from '@ionic-native/core';
|
||||
export interface TagOptions {
|
||||
sequence: number;
|
||||
tags?: Array<string>;
|
||||
}
|
||||
export interface AliasOptions {
|
||||
sequence: number;
|
||||
alias?: string;
|
||||
}
|
||||
/**
|
||||
* @name jpush
|
||||
* @description
|
||||
* This plugin does something
|
||||
*
|
||||
* @usage
|
||||
* ```typescript
|
||||
* import { jpush } from '@ionic-native/jpush';
|
||||
*
|
||||
*
|
||||
* constructor(private jpush: jpush) { }
|
||||
*
|
||||
* ...
|
||||
*
|
||||
*
|
||||
* this.jpush.functionName('Hello', 123)
|
||||
* .then((res: any) => console.log(res))
|
||||
* .catch((error: any) => console.error(error));
|
||||
*
|
||||
* ```
|
||||
*/
|
||||
export declare class JPush extends IonicNativePlugin {
|
||||
/**
|
||||
* This function does something
|
||||
* @param arg1 {string} Some param to configure something
|
||||
* @param arg2 {number} Another param to configure something
|
||||
* @return {Promise<any>} Returns a promise that resolves when something happens
|
||||
*/
|
||||
functionName(arg1: string, arg2: number): Promise<any>;
|
||||
init(): void;
|
||||
setDebugMode(enable: boolean): void;
|
||||
getRegistrationID(): Promise<any>;
|
||||
stopPush(): Promise<any>;
|
||||
resumePush(): Promise<any>;
|
||||
isPushStopped(): Promise<any>;
|
||||
setTags(params: TagOptions): Promise<any>;
|
||||
addTags(params: TagOptions): Promise<any>;
|
||||
deleteTags(params: TagOptions): Promise<any>;
|
||||
cleanTags(params: TagOptions): Promise<any>;
|
||||
getAllTags(params: TagOptions): Promise<any>;
|
||||
/**
|
||||
* @param params { sequence: number, tag: string }
|
||||
*/
|
||||
checkTagBindState(params: object): Promise<any>;
|
||||
setAlias(params: AliasOptions): Promise<any>;
|
||||
deleteAlias(params: AliasOptions): Promise<any>;
|
||||
getAlias(params: AliasOptions): Promise<any>;
|
||||
/**
|
||||
* Determinate whether the application notification has been opened.
|
||||
*
|
||||
* iOS: 0: closed; >1: opened.
|
||||
* UIRemoteNotificationTypeNone = 0,
|
||||
* UIRemoteNotificationTypeBadge = 1 << 0,
|
||||
* UIRemoteNotificationTypeSound = 1 << 1,
|
||||
* UIRemoteNotificationTypeAlert = 1 << 2,
|
||||
* UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3
|
||||
*
|
||||
* Android: 0: closed; 1: opened.
|
||||
*/
|
||||
getUserNotificationSettings(): Promise<any>;
|
||||
clearLocalNotifications(): Promise<any>;
|
||||
setBadge(badge: number): void;
|
||||
resetBadge(): void;
|
||||
setApplicationIconBadgeNumber(badge: number): void;
|
||||
getApplicationIconBadgeNumber(): Promise<any>;
|
||||
addLocalNotificationForIOS(delayTime: number, content: string, badge: number, identifierKey: string, extras?: object): void;
|
||||
deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey: string): void;
|
||||
addDismissActions(actions: Array<object>, categoryId: string): void;
|
||||
addNotificationActions(actions: Array<object>, categoryId: string): void;
|
||||
setLocation(latitude: number, longitude: number): void;
|
||||
startLogPageView(pageName: string): void;
|
||||
stopLogPageView(pageName: string): void;
|
||||
beginLogPageView(pageName: string, duration: number): void;
|
||||
getConnectionState(): Promise<any>;
|
||||
setBasicPushNotificationBuilder(): Promise<any>;
|
||||
setCustomPushNotificationBuilder(): Promise<any>;
|
||||
clearAllNotification(): Promise<any>;
|
||||
clearNotificationById(id: number): Promise<any>;
|
||||
setLatestNotificationNum(num: number): Promise<any>;
|
||||
addLocalNotification(builderId: number, content: string, title: string, notificationId: number, broadcastTime: number, extras?: string): Promise<any>;
|
||||
removeLocalNotification(notificationId: number): Promise<any>;
|
||||
reportNotificationOpened(msgId: number): Promise<any>;
|
||||
requestPermission(): Promise<any>;
|
||||
setSilenceTime(startHour: number, startMinute: number, endHour: number, endMinute: number): Promise<any>;
|
||||
setPushTime(weekdays: Array<string>, startHour: number, endHour: number): Promise<any>;
|
||||
}
|
95
ionic/jpush/ngx/index.js
Normal file
1
ionic/jpush/ngx/index.metadata.json
Normal file
@ -0,0 +1 @@
|
||||
[{"__symbolic":"module","version":4,"metadata":{"TagOptions":{"__symbolic":"interface"},"AliasOptions":{"__symbolic":"interface"},"JPush":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@ionic-native/core","name":"IonicNativePlugin","line":67,"character":27},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":64,"character":1},"arguments":[{"providedIn":"root"}]}],"members":{"functionName":[{"__symbolic":"method"}],"init":[{"__symbolic":"method"}],"setDebugMode":[{"__symbolic":"method"}],"getRegistrationID":[{"__symbolic":"method"}],"stopPush":[{"__symbolic":"method"}],"resumePush":[{"__symbolic":"method"}],"isPushStopped":[{"__symbolic":"method"}],"setTags":[{"__symbolic":"method"}],"addTags":[{"__symbolic":"method"}],"deleteTags":[{"__symbolic":"method"}],"cleanTags":[{"__symbolic":"method"}],"getAllTags":[{"__symbolic":"method"}],"checkTagBindState":[{"__symbolic":"method"}],"setAlias":[{"__symbolic":"method"}],"deleteAlias":[{"__symbolic":"method"}],"getAlias":[{"__symbolic":"method"}],"getUserNotificationSettings":[{"__symbolic":"method"}],"clearLocalNotifications":[{"__symbolic":"method"}],"setBadge":[{"__symbolic":"method"}],"resetBadge":[{"__symbolic":"method"}],"setApplicationIconBadgeNumber":[{"__symbolic":"method"}],"getApplicationIconBadgeNumber":[{"__symbolic":"method"}],"addLocalNotificationForIOS":[{"__symbolic":"method"}],"deleteLocalNotificationWithIdentifierKeyInIOS":[{"__symbolic":"method"}],"addDismissActions":[{"__symbolic":"method"}],"addNotificationActions":[{"__symbolic":"method"}],"setLocation":[{"__symbolic":"method"}],"startLogPageView":[{"__symbolic":"method"}],"stopLogPageView":[{"__symbolic":"method"}],"beginLogPageView":[{"__symbolic":"method"}],"getConnectionState":[{"__symbolic":"method"}],"setBasicPushNotificationBuilder":[{"__symbolic":"method"}],"setCustomPushNotificationBuilder":[{"__symbolic":"method"}],"clearAllNotification":[{"__symbolic":"method"}],"clearNotificationById":[{"__symbolic":"method"}],"setLatestNotificationNum":[{"__symbolic":"method"}],"addLocalNotification":[{"__symbolic":"method"}],"removeLocalNotification":[{"__symbolic":"method"}],"reportNotificationOpened":[{"__symbolic":"method"}],"requestPermission":[{"__symbolic":"method"}],"setSilenceTime":[{"__symbolic":"method"}],"setPushTime":[{"__symbolic":"method"}]}}}}]
|
18
ionic/jpush/package.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "@jiguang-ionic/jpush",
|
||||
"version": "2.0.0",
|
||||
"description": "JPush support for ionic-native",
|
||||
"module": "index.js",
|
||||
"typings": "index.d.ts",
|
||||
"author": "hevin",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@ionic-native/core": "^5.1.0",
|
||||
"@angular/core": "*",
|
||||
"rxjs": "^6.3.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/jpush/jpush-phonegap-plugin"
|
||||
}
|
||||
}
|
35
issue_template.md
Normal file
@ -0,0 +1,35 @@
|
||||
**WARNING: 如果不按照这个表格,我们将无法帮助你,并将忽略你的问题。**
|
||||
|
||||
## 你的运行环境
|
||||
|
||||
* 插件版本:
|
||||
* 平台(Android / iOS):
|
||||
* Cordova version (```cordova -v```):
|
||||
* Cordova platform version (```cordova platform ls```):
|
||||
* Ionic Version (if using Ionic)
|
||||
|
||||
## 期望效果
|
||||
|
||||
告诉我们你希望达到什么效果。
|
||||
|
||||
## 实际效果
|
||||
|
||||
告诉我们实际是什么效果。
|
||||
|
||||
## 重现步骤
|
||||
|
||||
1. ...
|
||||
2. ...
|
||||
3. ...
|
||||
4. ...
|
||||
|
||||
## 背景
|
||||
|
||||
你尝试做过些什么?
|
||||
|
||||
## Debug logs
|
||||
|
||||
包括 Android 或 iOS 的日志:
|
||||
|
||||
* iOS: XCode logs
|
||||
* Android: $ adb logcat / Android Studio logcat
|
69
package.json
@ -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": "5.6.0",
|
||||
"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": ">=4.2.2"
|
||||
},
|
||||
"author": "JiGuang",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jpush/jpush-phonegap-plugin/issues"
|
||||
},
|
||||
"homepage": "https://github.com/jpush/jpush-phonegap-plugin#readme"
|
||||
}
|
||||
|
347
plugin.xml
@ -2,15 +2,16 @@
|
||||
<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="5.6.0">
|
||||
|
||||
<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" />
|
||||
<preference name="CHANNEL" default="developer-default" />
|
||||
|
||||
<engines>
|
||||
<engine name="cordova" version=">=3.0" />
|
||||
@ -18,6 +19,7 @@
|
||||
|
||||
<!-- dependencies -->
|
||||
<dependency id="cordova-plugin-device" />
|
||||
<dependency id="cordova-plugin-jcore" />
|
||||
|
||||
<js-module src="www/JPushPlugin.js" name="JPushPlugin">
|
||||
<clobbers target="JPush" />
|
||||
@ -29,15 +31,26 @@
|
||||
<param name="ios-package" value="JPushPlugin" />
|
||||
</feature>
|
||||
</config-file>
|
||||
|
||||
<config-file target="*-Info.plist" parent="UIBackgroundModes">
|
||||
<array>
|
||||
<string>remote-notification</string>
|
||||
</array>
|
||||
</config-file>
|
||||
<config-file target="*-Debug.plist" parent="aps-environment">
|
||||
<string>development</string>
|
||||
</config-file>
|
||||
<config-file target="*-Release.plist" parent="aps-environment">
|
||||
<string>production</string>
|
||||
</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" />
|
||||
|
||||
<source-file src="src/ios/lib/jpush-ios-5.6.0.xcframework" 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 +62,78 @@
|
||||
<framework src="libz.tbd" weak="true" />
|
||||
<framework src="AdSupport.framework" weak="true" />
|
||||
<framework src="UserNotifications.framework" weak="true" />
|
||||
<framework src="libresolv.tbd" weak="true" />
|
||||
<framework src="StoreKit.framework" weak="true" />
|
||||
<framework src="Network.framework" 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>
|
||||
</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" />
|
||||
|
||||
<!-- 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" />
|
||||
<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" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||
|
||||
|
||||
<!-- Optional for location -->
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /><!-- Android Q后台定位权限-->
|
||||
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.GET_TASKS" />
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
|
||||
<!--华为角标-->
|
||||
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
|
||||
<!-- vivo 角标 -->
|
||||
<uses-permission android:name="com.vivo.notification.permission.BADGE_ICON" />
|
||||
<!--honor 角标-->
|
||||
<uses-permission android:name="com.hihonor.android.launcher.permission.CHANGE_BADGE" />
|
||||
</config-file>
|
||||
|
||||
<config-file target="AndroidManifest.xml" parent="/manifest/application">
|
||||
|
||||
|
||||
<!-- Rich push 核心功能 since 2.0.6-->
|
||||
<activity
|
||||
android:name="cn.jpush.android.ui.PopWinActivity"
|
||||
android:exported="true"
|
||||
android:theme="@style/JPushDialogStyle" >
|
||||
<intent-filter>
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
|
||||
<action android:name="cn.jpush.android.ui.PopWinActivity" />
|
||||
|
||||
<category android:name="$PACKAGE_NAME" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<!-- 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:configChanges="orientation|keyboardHidden"
|
||||
android:theme="@android:style/Theme.NoTitleBar"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="cn.jpush.android.ui.PushActivity" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
@ -89,104 +141,187 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<!-- Rich push 核心功能 since 2.0.6-->
|
||||
<activity android:name="cn.jpush.android.ui.PopWinActivity" android:theme="@style/MyDialogStyle" android:exported="false">
|
||||
|
||||
|
||||
<!-- since 3.0.9 Required SDK 核心功能-->
|
||||
<provider
|
||||
android:authorities="$PACKAGE_NAME.DataProvider"
|
||||
android:name="cn.jpush.android.service.DataProvider"
|
||||
android:process=":pushcore"
|
||||
android:exported="false"
|
||||
/>
|
||||
|
||||
|
||||
|
||||
<!-- Required SDK核心功能-->
|
||||
<receiver
|
||||
android:name="cn.jpush.android.service.PushReceiver"
|
||||
android:enabled="true"
|
||||
android:exported="false">
|
||||
<intent-filter android:priority="1000">
|
||||
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <!--Required 显示通知栏 -->
|
||||
<category android:name="$PACKAGE_NAME" />
|
||||
</intent-filter>
|
||||
|
||||
</receiver>
|
||||
|
||||
|
||||
<!-- 3.5.0新增,用于定时展示功能 -->
|
||||
<receiver android:name="cn.jpush.android.service.SchedulerReceiver" android:exported="false"/>
|
||||
|
||||
<!--since 3.3.0 接收JPush相关事件-->
|
||||
<receiver android:name="cn.jiguang.cordova.push.JPushEventReceiver"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="cn.jpush.android.intent.RECEIVER_MESSAGE" />
|
||||
<category android:name="$PACKAGE_NAME"></category>
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<!--since 3.3.0 Required SDK核心功能-->
|
||||
|
||||
<!-- since 3.3.0 Required SDK核心功能 -->
|
||||
<activity
|
||||
android:name="cn.jpush.android.service.JNotifyActivity"
|
||||
android:exported="true"
|
||||
android:taskAffinity=""
|
||||
android:theme="@style/JPushTheme" >
|
||||
<intent-filter>
|
||||
<action android:name="cn.jpush.android.intent.JNotifyActivity" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="$PACKAGE_NAME" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<!-- since 4.6.0 Required SDK核心功能 -->
|
||||
<activity
|
||||
android:name="cn.android.service.JTransitActivity"
|
||||
android:exported="true"
|
||||
android:taskAffinity=""
|
||||
android:theme="@style/JPushTheme" >
|
||||
<intent-filter>
|
||||
<action android:name="cn.android.service.JTransitActivity" />
|
||||
|
||||
<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">
|
||||
<!-- since 3.3.0 Required SDK 核心功能-->
|
||||
<!-- 可配置android:process参数将PushService放在其他进程中 -->
|
||||
<!--User defined. For test only 继承自cn.jpush.android.service.JCommonService-->
|
||||
<service android:name="cn.jiguang.cordova.push.PushService"
|
||||
android:process=":pushcore"
|
||||
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" />
|
||||
<action android:name="cn.jiguang.user.service.action" />
|
||||
</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" />
|
||||
</intent-filter>
|
||||
<receiver
|
||||
android:name="cn.jiguang.cordova.push.JPushReceiver"
|
||||
android:enabled="true"
|
||||
android:exported="false">
|
||||
<!-- <intent-filter>-->
|
||||
<!-- <action android:name="cn.jpush.android.intent.REGISTRATION" />-->
|
||||
<!-- <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />-->
|
||||
<!-- <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />-->
|
||||
<!-- <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />-->
|
||||
<!-- <action android:name="cn.jpush.android.intent.CONNECTION" />-->
|
||||
|
||||
<!-- <category android:name="$PACKAGE_NAME" />-->
|
||||
<!-- </intent-filter>-->
|
||||
</receiver>
|
||||
|
||||
<!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
|
||||
<!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
|
||||
<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" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<!-- 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="$API_KEY" />
|
||||
<!-- Required . Enable it you can get statistics data with channel -->
|
||||
<meta-data android:name="JPUSH_CHANNEL" android:value="$CHANNEL"/>
|
||||
<meta-data android:name="JPUSH_APPKEY" android:value="$APP_KEY" /> <!-- </>值来自开发者平台取得的AppKey-->
|
||||
<provider
|
||||
android:name="cn.jpush.android.service.InitProvider"
|
||||
android:authorities="${applicationId}.jiguang.InitProvider"
|
||||
android:exported="false"
|
||||
android:readPermission="${applicationId}.permission.JPUSH_MESSAGE"
|
||||
android:writePermission="${applicationId}.permission.JPUSH_MESSAGE" />
|
||||
</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" />
|
||||
<lib-file src="src/android/libs/jpush-android-5.6.0.jar" />
|
||||
|
||||
<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/PushService.java" target-dir="src/cn/jiguang/cordova/push" />
|
||||
<source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jiguang/cordova/push" />
|
||||
<source-file src="src/android/JPushReceiver.java" target-dir="src/cn/jiguang/cordova/push" />
|
||||
<source-file src="src/android/JPushEventReceiver.java" target-dir="src/cn/jiguang/cordova/push" />
|
||||
<source-file src="src/android/JLogger.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" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_btn_blue_bg.xml"
|
||||
target="res/drawable/jpush_btn_blue_bg.xml" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_btn_grey_bg.xml"
|
||||
target="res/drawable/jpush_btn_grey_bg.xml" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_cancel_btn_bg.xml"
|
||||
target="res/drawable/jpush_cancel_btn_bg.xml" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_close.xml"
|
||||
target="res/drawable/jpush_close.xml" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_contain_bg.xml"
|
||||
target="res/drawable/jpush_contain_bg.xml" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_interstitial_bg.xml"
|
||||
target="res/drawable/jpush_interstitial_bg.xml" />
|
||||
|
||||
|
||||
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_richpush_btn_selector.xml"
|
||||
target="res/drawable/jpush_richpush_btn_selector.xml" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_richpush_progressbar.xml"
|
||||
target="res/drawable/jpush_richpush_progressbar.xml" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_back.png"
|
||||
target="res/drawable-hdpi/jpush_ic_richpush_actionbar_back.png" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png"
|
||||
target="res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_ic_action_cancle.png"
|
||||
target="res/drawable-hdpi/jpush_ic_action_cancle.png" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_ic_action_close.png"
|
||||
target="res/drawable-hdpi/jpush_ic_action_close.png" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_ic_action_close2.png"
|
||||
target="res/drawable-hdpi/jpush_ic_action_close2.png" />
|
||||
<resource-file src="src/android/res/drawable-hdpi/jpush_btn_bg_green_playable.xml"
|
||||
target="res/drawable-hdpi/jpush_btn_bg_green_playable.xml" />
|
||||
|
||||
<resource-file src="src/android/res/layout/jpush_popwin_layout.xml"
|
||||
target="res/layout/jpush_popwin_layout.xml" />
|
||||
<resource-file src="src/android/res/layout/jpush_webview_layout.xml"
|
||||
target="res/layout/jpush_webview_layout.xml" />
|
||||
<resource-file src="src/android/res/layout/push_notification.xml"
|
||||
target="res/layout/push_notification.xml" />
|
||||
<resource-file src="src/android/res/layout/push_notification_large.xml"
|
||||
target="res/layout/push_notification_large.xml" />
|
||||
<resource-file src="src/android/res/layout/push_notification_middle.xml"
|
||||
target="res/layout/push_notification_middle.xml" />
|
||||
<resource-file src="src/android/res/layout/jpush_inapp_banner.xml"
|
||||
target="res/layout/jpush_inapp_banner.xml" />
|
||||
<resource-file src="src/android/res/layout/push_download_notification_layout.xml"
|
||||
target="res/layout/push_download_notification_layout.xml" />
|
||||
|
||||
<resource-file src="src/android/res/layout/jpush_interstitial.xml"
|
||||
target="res/layout/jpush_interstitial.xml" />
|
||||
<resource-file src="src/android/res/layout/jpush_full.xml"
|
||||
target="res/layout/jpush_full.xml" />
|
||||
<resource-file src="src/android/res/layout/jpush_banner.xml"
|
||||
target="res/layout/jpush_banner.xml" />
|
||||
|
||||
|
||||
<resource-file src="src/android/res/layout-v21/push_notification.xml"
|
||||
target="res/layout-v21/push_notification.xml" />
|
||||
<resource-file src="src/android/res/layout-v21/push_notification_middle.xml"
|
||||
target="res/layout-v21/push_notification_middle.xml" />
|
||||
<resource-file src="src/android/res/layout-v21/push_notification_large.xml"
|
||||
target="res/layout-v21/push_notification_large.xml" />
|
||||
|
||||
<resource-file src="src/android/res/values/jpush_style.xml"
|
||||
target="res/values/jpush_style.xml" />
|
||||
<resource-file src="src/android/res/values/jpush_string.xml"
|
||||
target="res/values/jpush_string.xml" />
|
||||
|
||||
<resource-file src="src/android/res/values-zh/jpush_string.xml"
|
||||
target="res/values-zh/jpush_string.xml" />
|
||||
<resource-file src="src/android/res/xml/jpush_file_paths.xml"
|
||||
target="res/xml/jpush_file_paths.xml" />
|
||||
</platform>
|
||||
</plugin>
|
||||
|
46
src/android/JLogger.java
Normal file
@ -0,0 +1,46 @@
|
||||
package cn.jiguang.cordova.push;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
public class JLogger {
|
||||
|
||||
public static final String TAG = "[Cordova-JPush]";
|
||||
|
||||
private static boolean isLoggerEnable = false;
|
||||
|
||||
public static void setLoggerEnable(boolean loggerEnable) {
|
||||
Log.d(TAG, "setLoggerEnable:" + loggerEnable);
|
||||
isLoggerEnable = loggerEnable;
|
||||
}
|
||||
|
||||
public static void i(String tag,String msg) {
|
||||
if (isLoggerEnable) {
|
||||
Log.i(TAG+tag, msg);
|
||||
}
|
||||
}
|
||||
|
||||
public static void d(String tag,String msg) {
|
||||
if (isLoggerEnable) {
|
||||
Log.d(TAG+tag, msg);
|
||||
}
|
||||
}
|
||||
|
||||
public static void v(String tag,String msg) {
|
||||
if (isLoggerEnable) {
|
||||
Log.v(TAG+tag, msg);
|
||||
}
|
||||
}
|
||||
|
||||
public static void w(String tag,String msg) {
|
||||
if (isLoggerEnable) {
|
||||
Log.w(TAG+tag, msg);
|
||||
}
|
||||
}
|
||||
|
||||
public static void e(String tag,String error) {
|
||||
if (isLoggerEnable) {
|
||||
Log.e(TAG+tag, error);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
302
src/android/JPushEventReceiver.java
Normal file
@ -0,0 +1,302 @@
|
||||
package cn.jiguang.cordova.push;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
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.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import cn.jpush.android.api.CustomMessage;
|
||||
import cn.jpush.android.api.JPushInterface;
|
||||
import cn.jpush.android.api.JPushMessage;
|
||||
import cn.jpush.android.api.NotificationMessage;
|
||||
import cn.jpush.android.helper.Logger;
|
||||
import cn.jpush.android.local.JPushConstants;
|
||||
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);
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onTagOperatorResult:"+jPushMessage);
|
||||
|
||||
tryCallback(jPushMessage, new SuccessCallback() {
|
||||
@Override
|
||||
public void onSuccessCallback(JSONObject resultJson) throws JSONException {
|
||||
Set<String> tags = jPushMessage.getTags();
|
||||
JSONArray tagsJsonArr = new JSONArray();
|
||||
for (String tag : tags) {
|
||||
tagsJsonArr.put(tag);
|
||||
}
|
||||
if (tagsJsonArr.length() != 0) {
|
||||
resultJson.put("tags", tagsJsonArr);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
|
||||
super.onCheckTagOperatorResult(context, jPushMessage);
|
||||
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onCheckTagOperatorResult:"+jPushMessage);
|
||||
|
||||
tryCallback(jPushMessage, new SuccessCallback() {
|
||||
@Override
|
||||
public void onSuccessCallback(JSONObject resultJson) throws JSONException {
|
||||
resultJson.put("tag", jPushMessage.getCheckTag());
|
||||
resultJson.put("isBind", jPushMessage.getTagCheckStateResult());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
|
||||
super.onAliasOperatorResult(context, jPushMessage);
|
||||
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onAliasOperatorResult:"+jPushMessage);
|
||||
|
||||
tryCallback(jPushMessage, new SuccessCallback() {
|
||||
@Override
|
||||
public void onSuccessCallback(JSONObject resultJson) throws JSONException {
|
||||
if (!TextUtils.isEmpty(jPushMessage.getAlias())) {
|
||||
resultJson.put("alias", jPushMessage.getAlias());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRegister(Context context, String regId) {
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onRegister:"+regId);
|
||||
cn.jiguang.cordova.push.JPushPlugin.transmitReceiveRegistrationId(regId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(Context context, CustomMessage customMessage) {
|
||||
// super.onMessage(context,customMessage);
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onMessage:"+customMessage);
|
||||
try {
|
||||
JSONObject jsonObject=new JSONObject();
|
||||
jsonObject.put("message", customMessage.message);
|
||||
jsonObject.put("alert", customMessage.title);
|
||||
jsonObject.put(JPushInterface.EXTRA_EXTRA, stringToMap(customMessage.extra));
|
||||
jsonObject.put(JPushInterface.EXTRA_MSG_ID, customMessage.messageId);
|
||||
jsonObject.put(JPushInterface.EXTRA_CONTENT_TYPE, customMessage.contentType);
|
||||
if (JPushConstants.SDK_VERSION_CODE >= 387) {
|
||||
jsonObject.put(JPushInterface.EXTRA_TYPE_PLATFORM, customMessage.platform);
|
||||
}
|
||||
cn.jiguang.cordova.push.JPushPlugin.transmitNotificationReceive(jsonObject);
|
||||
}catch (Throwable throwable){
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onMessage throwable:"+throwable);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNotifyMessageArrived(Context context, NotificationMessage notificationMessage) {
|
||||
// super.onNotifyMessageArrived(context, notificationMessage);
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onNotifyMessageArrived:"+notificationMessage);
|
||||
try {
|
||||
JSONObject jsonObject=new JSONObject();
|
||||
jsonObject.put("title", notificationMessage.notificationTitle);
|
||||
jsonObject.put("alert", notificationMessage.notificationContent);
|
||||
getExtras(jsonObject,notificationMessage);
|
||||
JPushPlugin.notificationJson = jsonObject;
|
||||
cn.jiguang.cordova.push.JPushPlugin.transmitNotificationReceive(jsonObject);
|
||||
}catch (Throwable throwable){
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onNotifyMessageArrived throwable:"+throwable);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) {
|
||||
// super.onNotifyMessageOpened(context, notificationMessage);
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onNotifyMessageOpened:"+notificationMessage);
|
||||
|
||||
try {
|
||||
JSONObject jsonObject=new JSONObject();
|
||||
jsonObject.put("title", notificationMessage.notificationTitle);
|
||||
jsonObject.put("alert", notificationMessage.notificationContent);
|
||||
getExtras(jsonObject,notificationMessage);
|
||||
JPushPlugin.openNotificationJson = jsonObject;
|
||||
cn.jiguang.cordova.push.JPushPlugin.transmitNotificationOpen(jsonObject);
|
||||
}catch (Throwable throwable){
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onNotifyMessageOpened throwable:"+throwable);
|
||||
|
||||
}
|
||||
Intent launch = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
|
||||
if (launch != null) {
|
||||
launch.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||
launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
context.startActivity(launch);
|
||||
}
|
||||
}
|
||||
private void getExtras(JSONObject extras,NotificationMessage notificationMessage) {
|
||||
try {
|
||||
extras.put(JPushInterface.EXTRA_MSG_ID, notificationMessage.msgId);
|
||||
extras.put(JPushInterface.EXTRA_NOTIFICATION_ID, notificationMessage.notificationId);
|
||||
extras.put(JPushInterface.EXTRA_ALERT_TYPE, notificationMessage.notificationAlertType + "");
|
||||
extras.put(JPushInterface.EXTRA_EXTRA, stringToMap(notificationMessage.notificationExtras));
|
||||
if (notificationMessage.notificationStyle == 1 && !TextUtils.isEmpty(notificationMessage.notificationBigText)) {
|
||||
extras.put(JPushInterface.EXTRA_BIG_TEXT, notificationMessage.notificationBigText);
|
||||
} else if (notificationMessage.notificationStyle == 2 && !TextUtils.isEmpty(notificationMessage.notificationInbox)) {
|
||||
extras.put(JPushInterface.EXTRA_INBOX, notificationMessage.notificationInbox);
|
||||
} else if ((notificationMessage.notificationStyle == 3) && !TextUtils.isEmpty(notificationMessage.notificationBigPicPath)) {
|
||||
extras.put(JPushInterface.EXTRA_BIG_PIC_PATH, notificationMessage.notificationBigPicPath);
|
||||
}
|
||||
if (!(notificationMessage.notificationPriority == 0)) {
|
||||
extras.put(JPushInterface.EXTRA_NOTI_PRIORITY, notificationMessage.notificationPriority + "");
|
||||
}
|
||||
if (!TextUtils.isEmpty(notificationMessage.notificationCategory)) {
|
||||
extras.put(JPushInterface.EXTRA_NOTI_CATEGORY, notificationMessage.notificationCategory);
|
||||
}
|
||||
if (!TextUtils.isEmpty(notificationMessage.notificationSmallIcon)) {
|
||||
extras.put(JPushInterface.EXTRA_NOTIFICATION_SMALL_ICON, notificationMessage.notificationSmallIcon);
|
||||
}
|
||||
if (!TextUtils.isEmpty(notificationMessage.notificationLargeIcon)) {
|
||||
extras.put(JPushInterface.EXTRA_NOTIFICATION_LARGET_ICON, notificationMessage.notificationLargeIcon);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
Log.e(TAG, "[onNotifyMessageUnShow] e:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) {
|
||||
super.onMobileNumberOperatorResult(context, jPushMessage);
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onMobileNumberOperatorResult:"+jPushMessage);
|
||||
|
||||
tryCallback(jPushMessage, new SuccessCallback() {
|
||||
@Override
|
||||
public void onSuccessCallback(JSONObject resultJson) throws JSONException {
|
||||
if (!TextUtils.isEmpty(jPushMessage.getMobileNumber())) {
|
||||
resultJson.put("mobileNumber", jPushMessage.getMobileNumber());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMultiActionClicked(Context context, Intent intent) {
|
||||
super.onMultiActionClicked(context, intent);
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG,"onMultiActionClicked:"+intent);
|
||||
}
|
||||
@Override
|
||||
public void onInAppMessageShow(Context context,final NotificationMessage message) {
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG, "[onInAppMessageShow], " + message.toString());
|
||||
try {
|
||||
JSONObject jsonObject=new JSONObject();
|
||||
jsonObject.put("title", message.inAppMsgTitle);
|
||||
jsonObject.put("alert", message.inAppMsgContentBody);
|
||||
jsonObject.put("messageId", message.msgId);
|
||||
jsonObject.put("inAppShowTarget", message.inAppExtras);
|
||||
jsonObject.put("inAppClickAction", message.inAppClickAction);
|
||||
jsonObject.put("inAppExtras", message.inAppExtras);
|
||||
cn.jiguang.cordova.push.JPushPlugin.transmitInAppMessageShow(jsonObject);
|
||||
|
||||
}catch (Throwable throwable){
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInAppMessageClick(Context context,final NotificationMessage message) {
|
||||
cn.jiguang.cordova.push.JLogger.d(TAG, "[onInAppMessageClick], " + message.toString());
|
||||
try {
|
||||
JSONObject jsonObject=new JSONObject();
|
||||
jsonObject.put("title", message.inAppMsgTitle);
|
||||
jsonObject.put("alert", message.inAppMsgContentBody);
|
||||
jsonObject.put("messageId", message.msgId);
|
||||
jsonObject.put("inAppShowTarget", message.inAppExtras);
|
||||
jsonObject.put("inAppClickAction", message.inAppClickAction);
|
||||
jsonObject.put("inAppExtras", message.inAppExtras);
|
||||
cn.jiguang.cordova.push.JPushPlugin.transmitInAppMessageClick(jsonObject);
|
||||
|
||||
}catch (Throwable throwable){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
interface SuccessCallback{
|
||||
void onSuccessCallback(JSONObject resultJson) throws JSONException;
|
||||
}
|
||||
public void tryCallback(JPushMessage jPushMessage,SuccessCallback successCallback){
|
||||
JSONObject resultJson = new JSONObject();
|
||||
|
||||
int sequence = jPushMessage.getSequence();
|
||||
try {
|
||||
resultJson.put("sequence", sequence);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
CallbackContext callback = cn.jiguang.cordova.push.JPushPlugin.eventCallbackMap.get(sequence);
|
||||
|
||||
if (callback == null) {
|
||||
Logger.i(TAG, "Unexpected error, callback is null!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (jPushMessage.getErrorCode() == 0) {
|
||||
try {
|
||||
successCallback.onSuccessCallback(resultJson);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
callback.success(resultJson);
|
||||
|
||||
} else {
|
||||
try {
|
||||
resultJson.put("code", jPushMessage.getErrorCode());
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
callback.error(resultJson);
|
||||
}
|
||||
|
||||
cn.jiguang.cordova.push.JPushPlugin.eventCallbackMap.remove(sequence);
|
||||
|
||||
}
|
||||
public Map<String, Object> stringToMap(String extra) {
|
||||
Map<String, Object> useExtra = new HashMap<String, Object>();
|
||||
try {
|
||||
if (TextUtils.isEmpty(extra)) {
|
||||
return useExtra;
|
||||
}
|
||||
JSONObject object = new JSONObject(extra);
|
||||
Iterator<String> keys = object.keys();
|
||||
while (keys.hasNext()) {
|
||||
try {
|
||||
String key = keys.next();
|
||||
Object value = object.get(key);
|
||||
if (value instanceof Integer
|
||||
|| value instanceof Long
|
||||
|| value instanceof Boolean
|
||||
|| value instanceof String) {
|
||||
useExtra.put(key, value);
|
||||
} else {
|
||||
useExtra.put(key, String.valueOf(value));
|
||||
}
|
||||
} catch (Throwable throwable) {
|
||||
|
||||
}
|
||||
}
|
||||
} catch (Throwable throwable) {
|
||||
}
|
||||
return useExtra;
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
package cn.jpush.phonegap;
|
||||
package cn.jiguang.cordova.push;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.Activity;
|
||||
import android.app.AppOpsManager;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.os.Build;
|
||||
@ -20,68 +20,35 @@ import org.json.JSONObject;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
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.jiguang.api.utils.JCollectionAuth;
|
||||
|
||||
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 JSONObject notificationJson;
|
||||
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 JSONObject openNotificationJson;
|
||||
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,49 +56,30 @@ 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();
|
||||
Log.d(TAG,"initialize plugin");
|
||||
|
||||
// JPushInterface.init(mContext);
|
||||
|
||||
cordovaActivity = cordova.getActivity();
|
||||
|
||||
//如果同时缓存了打开事件 openNotificationAlert 和 消息事件 notificationAlert,只向 UI 发打开事件。
|
||||
//这样做是为了和 iOS 统一。
|
||||
if (openNotificationAlert != null) {
|
||||
notificationAlert = null;
|
||||
transmitNotificationOpen(openNotificationTitle, openNotificationAlert,
|
||||
openNotificationExtras);
|
||||
// 如果同时缓存了打开事件 openNotificationAlert 和 消息事件 notificationAlert,只向 UI 发打开事件。
|
||||
// 这样做是为了和 iOS 统一。
|
||||
if (openNotificationJson != null) {
|
||||
transmitNotificationOpen(openNotificationJson);
|
||||
}
|
||||
if (notificationAlert != null) {
|
||||
transmitNotificationReceive(notificationTitle, notificationAlert,
|
||||
notificationExtras);
|
||||
}
|
||||
}
|
||||
|
||||
public void onPause(boolean multitasking) {
|
||||
Log.i(TAG, "---------------- onPause");
|
||||
shouldCacheMsg = true;
|
||||
if (isStatisticsOpened && multitasking) {
|
||||
JPushInterface.onPause(this.cordova.getActivity());
|
||||
if (notificationJson != null) {
|
||||
transmitNotificationReceive(notificationJson);
|
||||
}
|
||||
}
|
||||
|
||||
public void onResume(boolean multitasking) {
|
||||
shouldCacheMsg = false;
|
||||
Log.i(TAG, "---------------- onResume" + "-" + openNotificationAlert
|
||||
+ "-" + notificationAlert);
|
||||
if (isStatisticsOpened && multitasking) {
|
||||
JPushInterface.onResume(this.cordova.getActivity());
|
||||
if (openNotificationJson != null) {
|
||||
transmitNotificationOpen(openNotificationJson);
|
||||
}
|
||||
if (openNotificationAlert != null) {
|
||||
notificationAlert = null;
|
||||
transmitNotificationOpen(openNotificationTitle, openNotificationAlert,
|
||||
openNotificationExtras);
|
||||
}
|
||||
if (notificationAlert != null) {
|
||||
transmitNotificationReceive(notificationTitle, notificationAlert,
|
||||
notificationExtras);
|
||||
if (notificationJson != null) {
|
||||
transmitNotificationReceive(notificationJson);
|
||||
}
|
||||
}
|
||||
|
||||
@ -142,15 +90,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 +123,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);
|
||||
@ -211,11 +157,11 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
return data;
|
||||
}
|
||||
|
||||
static void transmitMessageReceive(String message, Map<String, Object> extras) {
|
||||
static void transmitMessageReceive(JSONObject data) {
|
||||
if (instance == null) {
|
||||
return;
|
||||
}
|
||||
JSONObject data = getMessageObject(message, extras);
|
||||
// JSONObject data = getMessageObject(message, extras);
|
||||
String format = "window.plugins.jPushPlugin.receiveMessageInAndroidCallback(%s);";
|
||||
final String js = String.format(format, data.toString());
|
||||
cordovaActivity.runOnUiThread(new Runnable() {
|
||||
@ -225,13 +171,39 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static void transmitNotificationOpen(String title, String alert,
|
||||
Map<String, Object> extras) {
|
||||
static void transmitInAppMessageClick( JSONObject data) {
|
||||
if (instance == null) {
|
||||
return;
|
||||
}
|
||||
JSONObject data = getNotificationObject(title, alert, extras);
|
||||
String format = "window.plugins.jPushPlugin.receiveInAppMessageClickCallback(%s);";
|
||||
final String js = String.format(format, data.toString());
|
||||
cordovaActivity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
instance.webView.loadUrl("javascript:" + js);
|
||||
}
|
||||
});
|
||||
}
|
||||
static void transmitInAppMessageShow( JSONObject data) {
|
||||
if (instance == null) {
|
||||
return;
|
||||
}
|
||||
String format = "window.plugins.jPushPlugin.receiveInAppMessageShowCallback(%s);";
|
||||
final String js = String.format(format, data.toString());
|
||||
cordovaActivity.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
instance.webView.loadUrl("javascript:" + js);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
static void transmitNotificationOpen(JSONObject data) {
|
||||
if (instance == null) {
|
||||
return;
|
||||
}
|
||||
// JSONObject data = getNotificationObject(title, alert, extras);
|
||||
String format = "window.plugins.jPushPlugin.openNotificationInAndroidCallback(%s);";
|
||||
final String js = String.format(format, data.toString());
|
||||
cordovaActivity.runOnUiThread(new Runnable() {
|
||||
@ -240,16 +212,14 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
instance.webView.loadUrl("javascript:" + js);
|
||||
}
|
||||
});
|
||||
JPushPlugin.openNotificationTitle = null;
|
||||
JPushPlugin.openNotificationAlert = null;
|
||||
JPushPlugin.openNotificationJson = null;
|
||||
}
|
||||
|
||||
static void transmitNotificationReceive(String title, String alert,
|
||||
Map<String, Object> extras) {
|
||||
static void transmitNotificationReceive(JSONObject data) {
|
||||
if (instance == null) {
|
||||
return;
|
||||
}
|
||||
JSONObject data = getNotificationObject(title, alert, extras);
|
||||
// JSONObject data = getNotificationObject(title, alert, extras);
|
||||
String format = "window.plugins.jPushPlugin.receiveNotificationInAndroidCallback(%s);";
|
||||
final String js = String.format(format, data.toString());
|
||||
cordovaActivity.runOnUiThread(new Runnable() {
|
||||
@ -258,22 +228,37 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
instance.webView.loadUrl("javascript:" + js);
|
||||
}
|
||||
});
|
||||
JPushPlugin.notificationTitle = null;
|
||||
JPushPlugin.notificationAlert = null;
|
||||
JPushPlugin.notificationJson = 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() {
|
||||
public boolean execute(final String action, final JSONArray data, final CallbackContext callbackContext)
|
||||
throws JSONException {
|
||||
cordova.getThreadPool().execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Method method = JPushPlugin.class.getDeclaredMethod(action,
|
||||
JSONArray.class, CallbackContext.class);
|
||||
Method method = JPushPlugin.class.getDeclaredMethod(action, JSONArray.class, CallbackContext.class);
|
||||
method.invoke(JPushPlugin.this, data, callbackContext);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, e.toString());
|
||||
@ -284,7 +269,8 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
}
|
||||
|
||||
void init(JSONArray data, CallbackContext callbackContext) {
|
||||
JPushInterface.init(this.cordova.getActivity().getApplicationContext());
|
||||
JPushInterface.setNotificationCallBackEnable(mContext, true);
|
||||
JPushInterface.init(mContext);
|
||||
}
|
||||
|
||||
void setDebugMode(JSONArray data, CallbackContext callbackContext) {
|
||||
@ -292,6 +278,7 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
try {
|
||||
mode = data.getBoolean(0);
|
||||
JPushInterface.setDebugMode(mode);
|
||||
JLogger.setLoggerEnable(mode);
|
||||
callbackContext.success();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
@ -299,18 +286,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 {
|
||||
@ -335,10 +321,10 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
callbackContext.error("error reading num json");
|
||||
return;
|
||||
}
|
||||
if (num != -1) {
|
||||
JPushInterface.setLatestNotificationNumber(
|
||||
this.cordova.getActivity().getApplicationContext(), num);
|
||||
JPushInterface.setLatestNotificationNumber(mContext, num);
|
||||
} else {
|
||||
callbackContext.error("error num");
|
||||
}
|
||||
@ -364,13 +350,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,55 +379,192 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
void setTags(JSONArray data, CallbackContext callbackContext) {
|
||||
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();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
callbackContext.error("Error reading tags JSON");
|
||||
}
|
||||
}
|
||||
|
||||
void setAlias(JSONArray data, CallbackContext callbackContext) {
|
||||
int sequence = -1;
|
||||
String alias = null;
|
||||
|
||||
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");
|
||||
alias = params.getString("alias");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
callbackContext.error("Error reading alias JSON");
|
||||
callbackContext.error("Parameters error.");
|
||||
return;
|
||||
}
|
||||
|
||||
JPushInterface.setAlias(mContext, sequence, alias);
|
||||
eventCallbackMap.put(sequence, callbackContext);
|
||||
}
|
||||
|
||||
void setTagsWithAlias(JSONArray data, CallbackContext callbackContext) {
|
||||
HashSet<String> tags = new HashSet<String>();
|
||||
String alias;
|
||||
void deleteAlias(JSONArray data, CallbackContext callbackContext) {
|
||||
int sequence = -1;
|
||||
|
||||
try {
|
||||
alias = data.getString(0);
|
||||
JSONArray tagsArray = data.getJSONArray(1);
|
||||
for (int i = 0; i < tagsArray.length(); i++) {
|
||||
tags.add(tagsArray.getString(i));
|
||||
JSONObject params = data.getJSONObject(0);
|
||||
sequence = params.getInt("sequence");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
callbackContext.error("Parameters error.");
|
||||
return;
|
||||
}
|
||||
|
||||
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.");
|
||||
return;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
JPushInterface.setAliasAndTags(this.cordova.getActivity().getApplicationContext(),
|
||||
alias, tags, mTagWithAliasCallback);
|
||||
callbackContext.success();
|
||||
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
callbackContext.error("Error reading tagAlias JSON");
|
||||
callbackContext.error("Parameters error.");
|
||||
return;
|
||||
}
|
||||
|
||||
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.");
|
||||
return;
|
||||
}
|
||||
|
||||
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.");
|
||||
return;
|
||||
}
|
||||
|
||||
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.");
|
||||
return;
|
||||
}
|
||||
|
||||
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.");
|
||||
return;
|
||||
}
|
||||
|
||||
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.");
|
||||
return;
|
||||
}
|
||||
|
||||
JPushInterface.checkTagBindState(mContext, sequence, tag);
|
||||
eventCallbackMap.put(sequence, callbackContext);
|
||||
}
|
||||
|
||||
void getConnectionState(JSONArray data, CallbackContext callback) {
|
||||
boolean isConnected = JPushInterface.getConnectionState(cordovaActivity.getApplicationContext());
|
||||
if (isConnected) {
|
||||
callback.success(1);
|
||||
} else {
|
||||
callback.success(0);
|
||||
}
|
||||
}
|
||||
|
||||
void setBasicPushNotificationBuilder(JSONArray data,
|
||||
CallbackContext callbackContext) {
|
||||
BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(
|
||||
this.cordova.getActivity());
|
||||
/**
|
||||
* 自定义通知行为,声音、震动、呼吸灯等。
|
||||
*/
|
||||
void setBasicPushNotificationBuilder(JSONArray data, CallbackContext callbackContext) {
|
||||
BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(this.cordova.getActivity());
|
||||
builder.developerArg0 = "Basic builder 1";
|
||||
JPushInterface.setPushNotificationBuilder(1, builder);
|
||||
JSONObject obj = new JSONObject();
|
||||
@ -453,14 +576,12 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
}
|
||||
|
||||
/**
|
||||
* 自定义推送通知栏样式,需要自己实现具体代码。
|
||||
* http://docs.jiguang.cn/client/android_tutorials/#_11
|
||||
* 自定义推送通知栏样式,需要自己实现具体代码。 http://docs.jiguang.cn/client/android_tutorials/#_11
|
||||
*/
|
||||
void setCustomPushNotificationBuilder(JSONArray data,
|
||||
CallbackContext callbackContext) {
|
||||
void setCustomPushNotificationBuilder(JSONArray data, CallbackContext callbackContext) {
|
||||
// CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
|
||||
// this.cordova.getActivity(), R.layout.test_notification_layout,
|
||||
// R.id.icon, R.id.title, R.id.text);
|
||||
// this.cordova.getActivity(), R.layout.test_notification_layout,
|
||||
// R.id.icon, R.id.title, R.id.text);
|
||||
// JPushInterface.setPushNotificationBuilder(2, builder);
|
||||
// JPushInterface.setDefaultPushNotificationBuilder(builder);
|
||||
}
|
||||
@ -476,6 +597,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 +606,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 +629,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);
|
||||
}
|
||||
@ -519,19 +639,7 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
}
|
||||
|
||||
/**
|
||||
* 决定是否启用统计分析功能。
|
||||
*/
|
||||
void setStatisticsOpen(JSONArray data, CallbackContext callbackContext) {
|
||||
try {
|
||||
isStatisticsOpened = data.getBoolean(0);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置通知静默时间
|
||||
* http://docs.jpush.io/client/android_api/#api_5
|
||||
* 设置通知静默时间 http://docs.jpush.io/client/android_api/#api_5
|
||||
*/
|
||||
void setSilenceTime(JSONArray data, CallbackContext callbackContext) {
|
||||
try {
|
||||
@ -547,14 +655,58 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
callbackContext.error("结束时间数值错误");
|
||||
return;
|
||||
}
|
||||
JPushInterface.setSilenceTime(this.cordova.getActivity(), startHour, startMinute,
|
||||
endHour, endMinute);
|
||||
JPushInterface.setSilenceTime(this.cordova.getActivity(), startHour, startMinute, endHour, endMinute);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
callbackContext.error("error: reading json data.");
|
||||
}
|
||||
}
|
||||
|
||||
void setGeofenceInterval(JSONArray data, CallbackContext callbackContext) throws JSONException {
|
||||
long interval = data.getLong(0);
|
||||
JPushInterface.setGeofenceInterval(this.cordova.getActivity(), interval);
|
||||
}
|
||||
|
||||
void setMaxGeofenceNumber(JSONArray data, CallbackContext callbackContext) throws JSONException {
|
||||
int maxNumber = data.getInt(0);
|
||||
JPushInterface.setMaxGeofenceNumber(mContext, maxNumber);
|
||||
}
|
||||
|
||||
void setBadgeNumber(JSONArray data, CallbackContext callbackContext) throws JSONException {
|
||||
int badgeNumb = data.getInt(0);
|
||||
JPushInterface.setBadgeNumber(mContext, badgeNumb);
|
||||
}
|
||||
|
||||
void setMobileNumber(JSONArray data, CallbackContext callbackContext) throws JSONException {
|
||||
int sequence = -1;
|
||||
String number = null;
|
||||
|
||||
try {
|
||||
JSONObject params = data.getJSONObject(0);
|
||||
sequence = params.getInt("sequence");
|
||||
number = params.getString("mobileNumber");
|
||||
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
callbackContext.error("Parameters error.");
|
||||
return;
|
||||
}
|
||||
|
||||
eventCallbackMap.put(sequence, callbackContext);
|
||||
JPushInterface.setMobileNumber(mContext,sequence, number);
|
||||
}
|
||||
|
||||
void setAuth(JSONArray data, CallbackContext callbackContext) {
|
||||
boolean isAuth = false;
|
||||
try {
|
||||
isAuth = data.getBoolean(0);
|
||||
JCollectionAuth.setAuth(mContext, isAuth);
|
||||
callbackContext.success();
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isValidHour(int hour) {
|
||||
return !(hour < 0 || hour > 23);
|
||||
}
|
||||
@ -582,8 +734,7 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
data.put("resultCode", code);
|
||||
data.put("tags", tags);
|
||||
data.put("alias", alias);
|
||||
final String jsEvent = String.format(
|
||||
"cordova.fireDocumentEvent('jpush.setTagsWithAlias',%s)",
|
||||
final String jsEvent = String.format("cordova.fireDocumentEvent('jpush.setTagsWithAlias',%s)",
|
||||
data.toString());
|
||||
cordova.getActivity().runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
@ -597,37 +748,43 @@ public class JPushPlugin extends CordovaPlugin {
|
||||
}
|
||||
};
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.KITKAT)
|
||||
private boolean hasPermission(String appOpsServiceId) {
|
||||
|
||||
Context context = cordova.getActivity().getApplicationContext();
|
||||
AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
|
||||
ApplicationInfo appInfo = context.getApplicationInfo();
|
||||
if (Build.VERSION.SDK_INT >= 24) {
|
||||
NotificationManager mNotificationManager = (NotificationManager) context
|
||||
.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
return mNotificationManager.areNotificationsEnabled();
|
||||
} else {
|
||||
AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
|
||||
ApplicationInfo appInfo = context.getApplicationInfo();
|
||||
|
||||
String pkg = context.getPackageName();
|
||||
int uid = appInfo.uid;
|
||||
Class appOpsClazz = null;
|
||||
String pkg = context.getPackageName();
|
||||
int uid = appInfo.uid;
|
||||
Class appOpsClazz;
|
||||
|
||||
try {
|
||||
appOpsClazz = Class.forName(AppOpsManager.class.getName());
|
||||
Method checkOpNoThrowMethod = appOpsClazz.getMethod("checkOpNoThrow",
|
||||
Integer.TYPE, Integer.TYPE, String.class);
|
||||
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();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
try {
|
||||
appOpsClazz = Class.forName(AppOpsManager.class.getName());
|
||||
Method checkOpNoThrowMethod = appOpsClazz.getMethod("checkOpNoThrow", Integer.TYPE, Integer.TYPE,
|
||||
String.class);
|
||||
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();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
86
src/android/JPushReceiver.java
Normal file
@ -0,0 +1,86 @@
|
||||
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;
|
||||
|
||||
public class JPushReceiver extends BroadcastReceiver {
|
||||
|
||||
private static final List<String> IGNORED_EXTRAS_KEYS = Arrays.asList("cn.jpush.android.TITLE",
|
||||
"cn.jpush.android.MESSAGE", "cn.jpush.android.APPKEY", "cn.jpush.android.NOTIFICATION_CONTENT_TITLE","key_show_entity","platform");
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
// String action = intent.getAction();
|
||||
// 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 (action.equals(JPushInterface.ACTION_NOTIFICATION_RECEIVED)) {
|
||||
// handlingNotificationReceive(context, intent);
|
||||
// } else if (action.equals(JPushInterface.ACTION_NOTIFICATION_OPENED)) {
|
||||
// handlingNotificationOpen(context, intent);
|
||||
// }
|
||||
}
|
||||
|
||||
// private void handlingMessageReceive(Intent intent) {
|
||||
// String msg = intent.getStringExtra(JPushInterface.EXTRA_MESSAGE);
|
||||
// Map<String, Object> extras = getNotificationExtras(intent);
|
||||
// JPushPlugin.transmitMessageReceive(msg, extras);
|
||||
// }
|
||||
//
|
||||
// private void handlingNotificationOpen(Context context, Intent intent) {
|
||||
// String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
|
||||
// JPushPlugin.openNotificationJson = title;
|
||||
//
|
||||
// String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT);
|
||||
// JPushPlugin.openNotificationAlert = alert;
|
||||
//
|
||||
// Map<String, Object> extras = getNotificationExtras(intent);
|
||||
// JPushPlugin.openNotificationExtras = extras;
|
||||
//
|
||||
// JPushPlugin.transmitNotificationOpen(title, alert, extras);
|
||||
//
|
||||
// Intent launch = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
|
||||
// if (launch != null) {
|
||||
// launch.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||
// launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
// context.startActivity(launch);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// private void handlingNotificationReceive(Context context, Intent intent) {
|
||||
// String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
|
||||
// JPushPlugin.notificationTitle = title;
|
||||
//
|
||||
// String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT);
|
||||
// JPushPlugin.notificationAlert = alert;
|
||||
//
|
||||
// Map<String, Object> extras = getNotificationExtras(intent);
|
||||
// JPushPlugin.notificationExtras = extras;
|
||||
//
|
||||
// JPushPlugin.transmitNotificationReceive(title, alert, extras);
|
||||
// }
|
||||
//
|
||||
// private Map<String, Object> getNotificationExtras(Intent intent) {
|
||||
// Map<String, Object> extrasMap = new HashMap<String, Object>();
|
||||
// for (String key : intent.getExtras().keySet()) {
|
||||
// if (!IGNORED_EXTRAS_KEYS.contains(key)) {
|
||||
// if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
|
||||
// extrasMap.put(key, intent.getIntExtra(key, 0));
|
||||
// } else {
|
||||
// extrasMap.put(key, intent.getStringExtra(key));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return extrasMap;
|
||||
// }
|
||||
}
|
@ -1,103 +0,0 @@
|
||||
package cn.jpush.phonegap;
|
||||
|
||||
|
||||
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",
|
||||
"cn.jpush.android.MESSAGE",
|
||||
"cn.jpush.android.APPKEY",
|
||||
"cn.jpush.android.NOTIFICATION_CONTENT_TITLE"
|
||||
);
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
String action = intent.getAction();
|
||||
if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(action)) {
|
||||
handlingMessageReceive(intent);
|
||||
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(action)) {
|
||||
handlingNotificationReceive(context, intent);
|
||||
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(action)) {
|
||||
handlingNotificationOpen(context, intent);
|
||||
} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(action)) {
|
||||
// 当在 HTML 页面中调用 JPushWeb.triggerNativeAction(String params) 方法时触发此方法,
|
||||
// 再进行相关的操作。
|
||||
|
||||
} else {
|
||||
Log.d(TAG, "Unhandled intent - " + action);
|
||||
}
|
||||
}
|
||||
|
||||
private void handlingMessageReceive(Intent intent) {
|
||||
String msg = intent.getStringExtra(JPushInterface.EXTRA_MESSAGE);
|
||||
Map<String, Object> extras = getNotificationExtras(intent);
|
||||
JPushPlugin.transmitMessageReceive(msg, extras);
|
||||
}
|
||||
|
||||
private void handlingNotificationOpen(Context context, Intent intent) {
|
||||
Log.i(TAG, "---------------- handlingNotificationOpen");
|
||||
|
||||
String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
|
||||
JPushPlugin.openNotificationTitle = title;
|
||||
|
||||
String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT);
|
||||
JPushPlugin.openNotificationAlert = alert;
|
||||
|
||||
Map<String, Object> extras = getNotificationExtras(intent);
|
||||
JPushPlugin.openNotificationExtras = extras;
|
||||
|
||||
JPushPlugin.transmitNotificationOpen(title, alert, extras);
|
||||
|
||||
Intent launch = context.getPackageManager().getLaunchIntentForPackage(
|
||||
context.getPackageName());
|
||||
launch.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||
launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
context.startActivity(launch);
|
||||
}
|
||||
|
||||
private void handlingNotificationReceive(Context context, Intent intent) {
|
||||
Log.i(TAG, "---------------- handlingNotificationReceive");
|
||||
|
||||
Intent launch = context.getPackageManager().getLaunchIntentForPackage(
|
||||
context.getPackageName());
|
||||
launch.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||
launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
|
||||
String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
|
||||
JPushPlugin.notificationTitle = title;
|
||||
|
||||
String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT);
|
||||
JPushPlugin.notificationAlert = alert;
|
||||
|
||||
Map<String, Object> extras = getNotificationExtras(intent);
|
||||
JPushPlugin.notificationExtras = extras;
|
||||
|
||||
JPushPlugin.transmitNotificationReceive(title, alert, extras);
|
||||
}
|
||||
|
||||
private Map<String, Object> getNotificationExtras(Intent intent) {
|
||||
Map<String, Object> extrasMap = new HashMap<String, Object>();
|
||||
for (String key : intent.getExtras().keySet()) {
|
||||
if (!IGNORED_EXTRAS_KEYS.contains(key)) {
|
||||
if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
|
||||
extrasMap.put(key, intent.getIntExtra(key, 0));
|
||||
} else {
|
||||
extrasMap.put(key, intent.getStringExtra(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
return extrasMap;
|
||||
}
|
||||
|
||||
}
|
6
src/android/PushService.java
Normal file
@ -0,0 +1,6 @@
|
||||
package cn.jiguang.cordova.push;
|
||||
|
||||
import cn.jpush.android.service.JCommonService;
|
||||
|
||||
public class PushService extends JCommonService {
|
||||
}
|
Before Width: | Height: | Size: 3.3 KiB |
BIN
src/android/libs/jpush-android-5.6.0.jar
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle"
|
||||
>
|
||||
<corners android:radius="6dp" />
|
||||
<solid android:color="#0A9789" />
|
||||
<stroke android:color="#0A9789" android:width="1dp"/>
|
||||
</shape>
|
5
src/android/res/drawable-hdpi/jpush_btn_blue_bg.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="#ff2c6bff" />
|
||||
<corners android:radius="25dp" />
|
||||
</shape>
|
6
src/android/res/drawable-hdpi/jpush_btn_grey_bg.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="#ffffffff" />
|
||||
<stroke android:width="0.1dp"/>
|
||||
<corners android:radius="20dp" />
|
||||
</shape>
|
8
src/android/res/drawable-hdpi/jpush_cancel_btn_bg.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="#FFFFFF" />
|
||||
<stroke android:width="1dp"
|
||||
android:color="#E2E3E5"
|
||||
/>
|
||||
<corners android:radius="25dp" />
|
||||
</shape>
|
19
src/android/res/drawable-hdpi/jpush_close.xml
Normal file
@ -0,0 +1,19 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="30dp"
|
||||
android:height="30dp"
|
||||
android:viewportWidth="30"
|
||||
android:viewportHeight="30">
|
||||
<path
|
||||
android:pathData="M15,15m-15,0a15,15 0,1 1,30 0a15,15 0,1 1,-30 0"
|
||||
android:strokeWidth="1"
|
||||
android:fillColor="#253044"
|
||||
android:fillAlpha="0.68"
|
||||
android:fillType="evenOdd"
|
||||
android:strokeColor="#00000000"/>
|
||||
<path
|
||||
android:pathData="M19.7356,10.2465C20.0722,10.5832 20.0722,11.129 19.7356,11.4656L16.21,14.99L19.7328,18.5129C20.0696,18.8498 20.0696,19.3959 19.7328,19.7328C19.3959,20.0696 18.8498,20.0696 18.5129,19.7328L14.99,16.21L11.4656,19.7356C11.129,20.0722 10.5832,20.0722 10.2465,19.7356C9.9099,19.3989 9.9099,18.8531 10.2465,18.5165L13.771,14.991L10.2493,11.4692C9.9125,11.1323 9.9125,10.5862 10.2493,10.2493C10.5862,9.9125 11.1323,9.9125 11.4692,10.2493L14.991,13.771L18.5165,10.2465C18.8531,9.9099 19.3989,9.9099 19.7356,10.2465Z"
|
||||
android:strokeWidth="1"
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="evenOdd"
|
||||
android:strokeColor="#00000000"/>
|
||||
</vector>
|
5
src/android/res/drawable-hdpi/jpush_contain_bg.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="#ffffffff" />
|
||||
<corners android:radius="15dp" />
|
||||
</shape>
|
BIN
src/android/res/drawable-hdpi/jpush_ic_action_cancle.png
Executable file
After Width: | Height: | Size: 551 B |
BIN
src/android/res/drawable-hdpi/jpush_ic_action_close.png
Executable file
After Width: | Height: | Size: 591 B |
BIN
src/android/res/drawable-hdpi/jpush_ic_action_close2.png
Executable file
After Width: | Height: | Size: 759 B |
0
src/android/ic_richpush_actionbar_back.png → src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_back.png
Normal file → Executable file
Before Width: | Height: | Size: 695 B After Width: | Height: | Size: 695 B |
0
src/android/ic_richpush_actionbar_divider.png → src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png
Normal file → Executable file
Before Width: | Height: | Size: 181 B After Width: | Height: | Size: 181 B |
5
src/android/res/drawable-hdpi/jpush_interstitial_bg.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="#ffffffff" />
|
||||
<corners android:topLeftRadius="0dp" android:topRightRadius="0dp" android:bottomLeftRadius="15dp" android:bottomRightRadius="15dp" />
|
||||
</shape>
|
4
src/android/richpush_btn_selector.xml → src/android/res/drawable-hdpi/jpush_richpush_btn_selector.xml
Normal file → Executable 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>
|
20
src/android/res/drawable-hdpi/jpush_richpush_progressbar.xml
Executable 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>
|
296
src/android/res/layout-v21/push_notification.xml
Executable file
@ -0,0 +1,296 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_root_view"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/v21"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<FrameLayout
|
||||
android:id="@+id/layout_version_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp" />
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_default"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone">
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_layout_lefttop"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_small_icon"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:scaleType="centerInside" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:maxLines="1"
|
||||
android:maxWidth="200dp"
|
||||
android:maxLength="24"
|
||||
android:textSize="12sp" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_dot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:textStyle="bold"
|
||||
android:text="·"
|
||||
android:textSize="16sp" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Time"
|
||||
android:maxLines="1"
|
||||
android:id="@+id/push_notification_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp" />
|
||||
</LinearLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_height="0dp"/>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="96dp"
|
||||
android:layout_above="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:visibility="gone"
|
||||
android:scaleType="centerCrop" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_main_layout"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_above="@+id/push_notification_banner_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:layout_below="@id/push_notification_layout_lefttop">
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_sub_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:textSize="13sp"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="2"
|
||||
android:textSize="13sp" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content_one_line"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:textSize="13sp"
|
||||
android:maxLines="1"
|
||||
android:visibility="gone" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_big_icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignTop="@+id/push_notification_main_layout"
|
||||
android:layout_alignBottom="@+id/push_notification_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:visibility="gone">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:scaleType="centerInside" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_style_1_main_layout"
|
||||
android:layout_toRightOf="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:orientation="vertical">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/push_notification_layout_time"
|
||||
android:gravity="center_vertical"
|
||||
android:weightSum="1"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_style_1_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="1"
|
||||
android:layout_marginRight="8dp"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Time"
|
||||
android:id="@+id/push_notification_style_1_date"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:gravity="right"
|
||||
android:textSize="12sp" />
|
||||
<TextView android:id="@+id/push_notification_null"
|
||||
android:layout_width="24dp"
|
||||
android:visibility="gone"
|
||||
android:layout_height="20dp"/>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_style_1_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:textSize="13sp" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="96dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:visibility="gone"
|
||||
android:layout_below="@id/push_notification_style_1_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_banner_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_img"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="centerCrop"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_header_neg_fb"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:visibility="gone">
|
||||
<ImageView android:id="@+id/push_notification_header_expand"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_width="14dp"
|
||||
android:layout_height="14dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:scaleType="centerInside"
|
||||
android:background="#08000000"
|
||||
android:src="@drawable/jpush_ic_action_close"
|
||||
android:visibility="visible"/>
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_fb_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:layout_below="@id/push_notification_header_expand"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="invisible"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="不感兴趣"/>
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="重复收到"/>
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容低质"/>
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like4"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容不宜"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
298
src/android/res/layout-v21/push_notification_large.xml
Executable file
@ -0,0 +1,298 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_root_view"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="256dp">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/v21"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<FrameLayout
|
||||
android:id="@+id/layout_version_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp" />
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_default"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone">
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_layout_lefttop"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_small_icon"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:scaleType="centerInside" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:maxLines="1"
|
||||
android:maxWidth="200dp"
|
||||
android:maxLength="24"
|
||||
android:textSize="12sp" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_dot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:textStyle="bold"
|
||||
android:text="·"
|
||||
android:textSize="16sp" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Time"
|
||||
android:maxLines="1"
|
||||
android:id="@+id/push_notification_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp" />
|
||||
</LinearLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_height="0dp"/>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="150dp"
|
||||
android:layout_above="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:visibility="visible"
|
||||
android:scaleType="centerCrop" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_main_layout"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_above="@+id/push_notification_banner_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:layout_below="@id/push_notification_layout_lefttop">
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_sub_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:textSize="13sp"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="2"
|
||||
android:textSize="13sp" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content_one_line"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:textSize="13sp"
|
||||
android:maxLines="1"
|
||||
android:visibility="gone" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_big_icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignTop="@+id/push_notification_main_layout"
|
||||
android:layout_alignBottom="@+id/push_notification_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:visibility="gone">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:scaleType="centerInside" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_style_1_main_layout"
|
||||
android:layout_toRightOf="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:orientation="vertical">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/push_notification_layout_time"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_style_1_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="1"
|
||||
android:layout_marginRight="8dp"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Time"
|
||||
android:id="@+id/push_notification_style_1_date"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginRight="4dp"
|
||||
android:gravity="right"
|
||||
android:textSize="12sp" />
|
||||
<TextView android:id="@+id/push_notification_null"
|
||||
android:layout_width="24dp"
|
||||
android:visibility="gone"
|
||||
android:layout_height="20dp"/>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_style_1_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="4dp"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:textSize="13sp" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="150dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:visibility="gone"
|
||||
android:layout_below="@id/push_notification_style_1_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_banner_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_img"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="centerCrop"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_header_neg_fb"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:visibility="gone">
|
||||
<ImageView android:id="@+id/push_notification_header_expand"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_width="14dp"
|
||||
android:layout_height="14dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:scaleType="centerInside"
|
||||
android:background="#08000000"
|
||||
android:src="@drawable/jpush_ic_action_close"
|
||||
android:visibility="visible"/>
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_fb_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:layout_below="@id/push_notification_header_expand"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="invisible"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="不感兴趣"/>
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="重复收到"/>
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容低质"/>
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like4"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容不宜"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
298
src/android/res/layout-v21/push_notification_middle.xml
Executable file
@ -0,0 +1,298 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_root_view"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="202dp">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/v21"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<FrameLayout
|
||||
android:id="@+id/layout_version_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp" />
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_default"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone">
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_layout_lefttop"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_small_icon"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:scaleType="centerInside" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:maxLines="1"
|
||||
android:maxWidth="200dp"
|
||||
android:maxLength="24"
|
||||
android:textSize="12sp" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_dot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:textStyle="bold"
|
||||
android:text="·"
|
||||
android:textSize="16sp" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Time"
|
||||
android:maxLines="1"
|
||||
android:id="@+id/push_notification_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp" />
|
||||
</LinearLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_height="0dp"/>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="96dp"
|
||||
android:layout_above="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:visibility="visible"
|
||||
android:scaleType="centerCrop" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_main_layout"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_above="@+id/push_notification_banner_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:layout_below="@id/push_notification_layout_lefttop">
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_sub_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:textSize="13sp"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="2"
|
||||
android:textSize="13sp" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content_one_line"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:textSize="13sp"
|
||||
android:maxLines="1"
|
||||
android:visibility="gone" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_big_icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignTop="@+id/push_notification_main_layout"
|
||||
android:layout_alignBottom="@+id/push_notification_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:visibility="gone">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:scaleType="centerInside" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_style_1_main_layout"
|
||||
android:layout_toRightOf="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:orientation="vertical">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/push_notification_layout_time"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_style_1_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="1"
|
||||
android:layout_marginRight="8dp"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Time"
|
||||
android:id="@+id/push_notification_style_1_date"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginRight="4dp"
|
||||
android:gravity="right"
|
||||
android:textSize="12sp" />
|
||||
<TextView android:id="@+id/push_notification_null"
|
||||
android:layout_width="24dp"
|
||||
android:visibility="gone"
|
||||
android:layout_height="20dp"/>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_style_1_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="4dp"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:textSize="13sp" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="96dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:visibility="gone"
|
||||
android:layout_below="@id/push_notification_style_1_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_banner_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_img"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="centerCrop"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_header_neg_fb"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:visibility="gone">
|
||||
<ImageView android:id="@+id/push_notification_header_expand"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_width="14dp"
|
||||
android:layout_height="14dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:scaleType="centerInside"
|
||||
android:background="#08000000"
|
||||
android:src="@drawable/jpush_ic_action_close"
|
||||
android:visibility="visible"/>
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_fb_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:layout_below="@id/push_notification_header_expand"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="invisible"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="不感兴趣"/>
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="重复收到"/>
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容低质"/>
|
||||
<TextView
|
||||
style="@android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_fb_content_no_like4"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容不宜"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
66
src/android/res/layout/jpush_banner.xml
Normal file
@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@android:color/transparent">
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/banner"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
>
|
||||
|
||||
<cn.jpush.android.ui.ShadowViewCard
|
||||
android:id="@+id/bg_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
>
|
||||
<RelativeLayout
|
||||
android:id="@+id/banner_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<cn.jpush.android.ui.RoundedImageView
|
||||
android:id="@+id/image_small"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_width="35dp"
|
||||
android:layout_height="35dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:scaleType="fitXY"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toRightOf="@+id/image_small"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:textColor="#ff253044"
|
||||
android:textSize="20sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/text_title"
|
||||
android:layout_toRightOf="@+id/image_small"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="2"
|
||||
|
||||
android:textColor="#85253044"
|
||||
android:textSize="18sp" />
|
||||
</RelativeLayout>
|
||||
|
||||
</cn.jpush.android.ui.ShadowViewCard>
|
||||
|
||||
|
||||
<cn.jpush.android.ui.RoundedImageView
|
||||
android:id="@+id/image_only"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="fitXY"
|
||||
android:visibility="gone" />
|
||||
</RelativeLayout>
|
||||
</FrameLayout>
|
46
src/android/res/layout/jpush_full.xml
Normal file
@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="fitXY"
|
||||
/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/countdown_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="right"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginRight="16dp">
|
||||
|
||||
<TextView
|
||||
android:layout_gravity="right"
|
||||
android:id="@+id/btn_countdown"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/jpush_btn_grey_bg"
|
||||
android:paddingLeft="12dp"
|
||||
android:paddingTop="5dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:paddingRight="12dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:text=""
|
||||
android:textColor="#ff2c6bff"
|
||||
android:textSize="20sp" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/image_close"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/jpush_close" />
|
||||
</FrameLayout>
|
||||
|
||||
|
||||
</FrameLayout>
|
85
src/android/res/layout/jpush_inapp_banner.xml
Executable file
@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/banner_root"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:weightSum="1.0">
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/banner_content_root"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1.0"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:gravity="center"
|
||||
android:padding="15dp"
|
||||
android:orientation="vertical"
|
||||
android:visibility="visible">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/banner_image_only"
|
||||
android:adjustViewBounds="true"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
android:scaleType="fitXY"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/banner_image"
|
||||
android:adjustViewBounds="true"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="64dp"
|
||||
android:layout_centerVertical="true"
|
||||
android:padding="5dp"
|
||||
android:layout_marginLeft="3dp"
|
||||
android:visibility="visible" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/banner_text_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="74dp"
|
||||
android:layout_toRightOf="@id/banner_image"
|
||||
android:layout_marginLeft="3dp"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="vertical"
|
||||
android:layout_centerInParent="true">
|
||||
<TextView
|
||||
android:id="@+id/banner_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toRightOf="@+id/banner_image"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:layout_marginRight="4dp"
|
||||
android:text=""
|
||||
android:textSize="14sp"
|
||||
android:visibility="visible" />
|
||||
<TextView
|
||||
android:id="@+id/banner_body"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/banner_title"
|
||||
android:layout_toRightOf="@+id/banner_image"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:layout_marginRight="4dp"
|
||||
android:text=""
|
||||
android:textSize="14sp" />
|
||||
</LinearLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</FrameLayout>
|
148
src/android/res/layout/jpush_interstitial.xml
Normal file
@ -0,0 +1,148 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#66000000"
|
||||
android:orientation="vertical">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/frame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerInParent="true"
|
||||
android:layout_marginLeft="20dp"
|
||||
android:layout_marginRight="20dp">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/content_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<cn.jpush.android.ui.RoundedImageView
|
||||
android:id="@+id/image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="140dp"
|
||||
android:scaleType="fitXY"
|
||||
android:visibility="gone" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/bg_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/jpush_interstitial_bg"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/margeview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="20dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:gravity="center"
|
||||
android:text=""
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:textColor="#ff253044"
|
||||
android:textSize="22sp" />
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:maxHeight="130dp"
|
||||
android:scrollbars="vertical"
|
||||
android:text=""
|
||||
android:textColor="#ad253044"
|
||||
android:textSize="18sp"
|
||||
|
||||
/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/btn_parent_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/btn_one"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/jpush_cancel_btn_bg"
|
||||
android:gravity="center"
|
||||
android:paddingTop="10dp"
|
||||
android:paddingBottom="10dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:textColor="#d6253044"
|
||||
android:textSize="20sp" />
|
||||
|
||||
|
||||
|
||||
<TextView
|
||||
android:ellipsize="end"
|
||||
android:maxLines="1"
|
||||
android:id="@+id/btn_two"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:background="@drawable/jpush_btn_blue_bg"
|
||||
android:gravity="center"
|
||||
android:paddingTop="9dp"
|
||||
android:paddingBottom="9dp"
|
||||
android:textColor="#ffffffff"
|
||||
android:textSize="20sp" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<cn.jpush.android.ui.RoundedImageView
|
||||
android:id="@+id/image_only"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleType="fitXY"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/img_top_close"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_above="@+id/frame"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:src="@drawable/jpush_close"
|
||||
android:visibility="gone"
|
||||
|
||||
/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/img_bottom_close"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/frame"
|
||||
android:layout_centerInParent="true"
|
||||
android:layout_marginTop="16dp"
|
||||
android:src="@drawable/jpush_close"
|
||||
android:visibility="gone" />
|
||||
</RelativeLayout>
|
4
src/android/jpush_popwin_layout.xml → src/android/res/layout/jpush_popwin_layout.xml
Normal file → Executable file
@ -2,10 +2,10 @@
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/popLayoutId"
|
||||
style="@style/MyDialogStyle"
|
||||
style="@style/JPushDialogStyle"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="280dp"
|
||||
android:layout_height="250dp" >
|
||||
android:layout_height="380dp" >
|
||||
|
||||
<WebView
|
||||
android:layout_width="match_parent"
|
22
src/android/jpush_webview_layout.xml → src/android/res/layout/jpush_webview_layout.xml
Normal file → Executable file
@ -13,12 +13,14 @@
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/imgRichpushBtnBack"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="25dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginLeft="9dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:background="@drawable/richpush_btn_selector" />
|
||||
android:layout_marginRight="9dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:background="@drawable/jpush_richpush_btn_selector" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/imgView"
|
||||
@ -27,7 +29,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 +37,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginLeft="7dp"
|
||||
android:layout_marginRight="48dp"
|
||||
android:layout_toRightOf="@id/imgView"
|
||||
android:clickable="false"
|
||||
android:text=" "
|
||||
@ -42,10 +45,17 @@
|
||||
android:textColor="#ffffff" />
|
||||
</RelativeLayout>
|
||||
|
||||
<WebView
|
||||
<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"
|
||||
android:id="@+id/fullWebView"
|
||||
android:background="#000000" />
|
||||
android:background="#000000" />-->
|
||||
|
||||
</cn.jpush.android.ui.FullScreenView>
|
107
src/android/res/layout/push_download_notification_layout.xml
Normal file
@ -0,0 +1,107 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/jad_root_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="64dp"
|
||||
android:orientation="horizontal"
|
||||
android:padding="10dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/jad_icon"
|
||||
android:layout_width="44dp"
|
||||
android:layout_height="44dp"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginRight="18dp"
|
||||
android:layout_marginEnd="18dp"
|
||||
android:background="#0A9789"
|
||||
android:duplicateParentState="false"
|
||||
android:scaleType="center" />
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/jad_desc"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textColor="#000000"
|
||||
android:textSize="14sp"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/jad_download_success"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/jad_desc"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone">
|
||||
<TextView
|
||||
android:id="@+id/download_success_size"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:ellipsize="end"
|
||||
android:gravity="start|center"
|
||||
android:singleLine="true"
|
||||
android:textColor="#000000"
|
||||
android:textSize="12sp"/>
|
||||
<TextView
|
||||
android:id="@+id/jad_download_success_status"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:gravity="start|center"
|
||||
android:singleLine="true"
|
||||
android:textColor="#000000"
|
||||
android:textSize="11sp"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/jad_download_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/jad_desc"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="visible">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/jad_download_size"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="3"
|
||||
android:ellipsize="end"
|
||||
android:gravity="start|center"
|
||||
android:maxLines="1"
|
||||
android:textColor="#000000"
|
||||
android:textSize="11sp"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/jad_download_status"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="2"
|
||||
android:ellipsize="end"
|
||||
android:gravity="end|center"
|
||||
android:singleLine="true"
|
||||
android:textColor="#000000"
|
||||
android:textSize="11sp"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/jad_action"
|
||||
android:layout_width="55dp"
|
||||
android:layout_height="30dp"
|
||||
android:layout_gravity="end|center"
|
||||
android:layout_marginLeft="18dp"
|
||||
android:layout_marginStart="18dp"
|
||||
android:layout_weight="0"
|
||||
android:gravity="center"
|
||||
android:background="@drawable/jpush_btn_bg_green_playable"
|
||||
android:textColor="#FFFFFF"
|
||||
android:textSize="12sp"/>
|
||||
</LinearLayout>
|
297
src/android/res/layout/push_notification.xml
Executable file
@ -0,0 +1,297 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_root_view"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/v"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<FrameLayout
|
||||
android:id="@+id/layout_version_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp" />
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_default"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone">
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_layout_lefttop"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_small_icon"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:scaleType="centerInside" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:maxLines="1"
|
||||
android:maxWidth="200dp"
|
||||
android:maxLength="24"
|
||||
android:textSize="12sp" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_dot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:textStyle="bold"
|
||||
android:text="·"
|
||||
android:textSize="16sp" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Time"
|
||||
android:maxLines="1"
|
||||
android:id="@+id/push_notification_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp" />
|
||||
</LinearLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_height="0dp"/>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="96dp"
|
||||
android:layout_above="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:visibility="gone"
|
||||
android:scaleType="centerCrop" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_main_layout"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_above="@+id/push_notification_banner_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:layout_below="@id/push_notification_layout_lefttop">
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_sub_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:textSize="13sp"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="2"
|
||||
android:textSize="13sp" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content_one_line"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:textSize="13sp"
|
||||
android:maxLines="1"
|
||||
android:visibility="gone" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_big_icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignTop="@+id/push_notification_main_layout"
|
||||
android:layout_alignBottom="@+id/push_notification_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:visibility="gone">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:scaleType="centerInside" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_style_1_main_layout"
|
||||
android:layout_toRightOf="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:orientation="vertical">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/push_notification_layout_time"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_style_1_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="1"
|
||||
android:layout_marginRight="8dp"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Time"
|
||||
android:id="@+id/push_notification_style_1_date"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginRight="4dp"
|
||||
android:gravity="right"
|
||||
android:textSize="12sp" />
|
||||
<TextView android:id="@+id/push_notification_null"
|
||||
android:layout_width="24dp"
|
||||
android:visibility="gone"
|
||||
android:layout_height="20dp"/>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_style_1_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="4dp"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:textSize="13sp" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="96dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:visibility="gone"
|
||||
android:layout_below="@id/push_notification_style_1_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_banner_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_img"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="centerCrop"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_header_neg_fb"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:visibility="gone">
|
||||
<ImageView android:id="@+id/push_notification_header_expand"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_width="14dp"
|
||||
android:layout_height="14dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:scaleType="centerInside"
|
||||
android:background="#08000000"
|
||||
android:src="@drawable/jpush_ic_action_close"
|
||||
android:visibility="visible"/>
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_fb_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:layout_below="@id/push_notification_header_expand"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="不感兴趣"/>
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="重复收到"/>
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容低质"/>
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like4"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容不宜"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
297
src/android/res/layout/push_notification_large.xml
Executable file
@ -0,0 +1,297 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_root_view"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="256dp">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/v"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<FrameLayout
|
||||
android:id="@+id/layout_version_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp" />
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_default"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone">
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_layout_lefttop"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_small_icon"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:scaleType="centerInside" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:maxLines="1"
|
||||
android:maxWidth="200dp"
|
||||
android:maxLength="24"
|
||||
android:textSize="12sp" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_dot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:textStyle="bold"
|
||||
android:text="·"
|
||||
android:textSize="16sp" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Time"
|
||||
android:maxLines="1"
|
||||
android:id="@+id/push_notification_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp" />
|
||||
</LinearLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_height="0dp"/>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="150dp"
|
||||
android:layout_above="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:visibility="gone"
|
||||
android:scaleType="centerCrop" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_main_layout"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_above="@+id/push_notification_banner_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:layout_below="@id/push_notification_layout_lefttop">
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_sub_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:textSize="13sp"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="2"
|
||||
android:textSize="13sp" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content_one_line"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:textSize="13sp"
|
||||
android:maxLines="1"
|
||||
android:visibility="gone" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_big_icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignTop="@+id/push_notification_main_layout"
|
||||
android:layout_alignBottom="@+id/push_notification_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:visibility="gone">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:scaleType="centerInside" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_style_1_main_layout"
|
||||
android:layout_toRightOf="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:orientation="vertical">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/push_notification_layout_time"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_style_1_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="1"
|
||||
android:layout_marginRight="8dp"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Time"
|
||||
android:id="@+id/push_notification_style_1_date"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginRight="4dp"
|
||||
android:gravity="right"
|
||||
android:textSize="12sp" />
|
||||
<TextView android:id="@+id/push_notification_null"
|
||||
android:layout_width="24dp"
|
||||
android:visibility="gone"
|
||||
android:layout_height="20dp"/>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_style_1_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="4dp"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:textSize="13sp" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="150dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:visibility="gone"
|
||||
android:layout_below="@id/push_notification_style_1_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_banner_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_img"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="centerCrop"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_header_neg_fb"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:visibility="gone">
|
||||
<ImageView android:id="@+id/push_notification_header_expand"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_width="14dp"
|
||||
android:layout_height="14dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:scaleType="centerInside"
|
||||
android:background="#08000000"
|
||||
android:src="@drawable/jpush_ic_action_close"
|
||||
android:visibility="visible"/>
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_fb_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:layout_below="@id/push_notification_header_expand"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="不感兴趣"/>
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="重复收到"/>
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容低质"/>
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like4"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容不宜"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
297
src/android/res/layout/push_notification_middle.xml
Executable file
@ -0,0 +1,297 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_root_view"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="202dp">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/v"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<FrameLayout
|
||||
android:id="@+id/layout_version_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp" />
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_default"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone">
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_layout_lefttop"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_small_icon"
|
||||
android:layout_width="18dp"
|
||||
android:layout_height="18dp"
|
||||
android:scaleType="centerInside" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:maxLines="1"
|
||||
android:maxWidth="200dp"
|
||||
android:maxLength="24"
|
||||
android:textSize="12sp" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_dot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:textStyle="bold"
|
||||
android:text="·"
|
||||
android:textSize="16sp" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Time"
|
||||
android:maxLines="1"
|
||||
android:id="@+id/push_notification_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp" />
|
||||
</LinearLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_height="0dp"/>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="96dp"
|
||||
android:layout_above="@+id/push_notification_for_bottom_margin"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:visibility="gone"
|
||||
android:scaleType="centerCrop" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_main_layout"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_above="@+id/push_notification_banner_icon"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_marginBottom="5dp"
|
||||
android:layout_toLeftOf="@+id/push_notification_big_icon"
|
||||
android:layout_below="@id/push_notification_layout_lefttop">
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_sub_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:textSize="13sp"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="2"
|
||||
android:textSize="13sp" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_content_one_line"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:textSize="13sp"
|
||||
android:maxLines="1"
|
||||
android:visibility="gone" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_big_icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignTop="@+id/push_notification_main_layout"
|
||||
android:layout_alignBottom="@+id/push_notification_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_style_1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:visibility="gone">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:scaleType="centerInside" />
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_style_1_main_layout"
|
||||
android:layout_toRightOf="@+id/push_notification_style_1_big_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:orientation="vertical">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/push_notification_layout_time"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Title"
|
||||
android:id="@+id/push_notification_style_1_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="1"
|
||||
android:layout_marginRight="8dp"
|
||||
android:textSize="12sp"
|
||||
android:textStyle="bold" />
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Time"
|
||||
android:id="@+id/push_notification_style_1_date"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginRight="4dp"
|
||||
android:gravity="right"
|
||||
android:textSize="12sp" />
|
||||
<TextView android:id="@+id/push_notification_null"
|
||||
android:layout_width="24dp"
|
||||
android:visibility="gone"
|
||||
android:layout_height="20dp"/>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
style="@*android:style/TextAppearance.Material.Notification.Info"
|
||||
android:id="@+id/push_notification_style_1_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="4dp"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginTop="1dp"
|
||||
android:maxLines="1"
|
||||
android:textSize="13sp" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_style_1_banner_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="96dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:visibility="gone"
|
||||
android:layout_below="@id/push_notification_style_1_main_layout"
|
||||
android:scaleType="centerInside" />
|
||||
</RelativeLayout>
|
||||
<FrameLayout
|
||||
android:id="@+id/push_notification_banner_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<ImageView
|
||||
android:id="@+id/push_notification_banner_img"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scaleType="centerCrop"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/push_notification_header_neg_fb"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:visibility="gone">
|
||||
<ImageView android:id="@+id/push_notification_header_expand"
|
||||
android:layout_marginRight="2dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_width="14dp"
|
||||
android:layout_height="14dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:scaleType="centerInside"
|
||||
android:background="#08000000"
|
||||
android:src="@drawable/jpush_ic_action_close"
|
||||
android:visibility="visible"/>
|
||||
<LinearLayout
|
||||
android:id="@+id/push_notification_fb_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:layout_below="@id/push_notification_header_expand"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="不感兴趣"/>
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="重复收到"/>
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容低质"/>
|
||||
<TextView
|
||||
android:id="@+id/push_notification_fb_content_no_like4"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#88000000"
|
||||
android:background="#0f000000"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingRight="6dp"
|
||||
android:textSize="14sp"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:layout_margin="5dp"
|
||||
android:text="内容不宜"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
7
src/android/res/values-zh/jpush_string.xml
Executable file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="jg_channel_name_p_min">不重要</string>
|
||||
<string name="jg_channel_name_p_low">不重要</string>
|
||||
<string name="jg_channel_name_p_default">普通</string>
|
||||
<string name="jg_channel_name_p_high">重要</string>
|
||||
</resources>
|
8
src/android/res/values/jpush_string.xml
Executable file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="jg_channel_name_p_min">LOW</string>
|
||||
<string name="jg_channel_name_p_low">LOW</string>
|
||||
<string name="jg_channel_name_p_default">NORMAL</string>
|
||||
<string name="jg_channel_name_p_high">HIGH</string>
|
||||
|
||||
</resources>
|
11
src/android/jpush_style.xml → src/android/res/values/jpush_style.xml
Normal file → Executable file
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<style name="MyDialogStyle">
|
||||
<style name="JPushDialogStyle">
|
||||
<item name="android:windowBackground">@android:color/transparent</item>
|
||||
<item name="android:windowFrame">@null</item>
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
@ -10,4 +10,13 @@
|
||||
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
|
||||
<item name="android:backgroundDimEnabled">true</item>
|
||||
</style>
|
||||
<style name="JPushTheme">
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
<item name="android:windowActionBar">false</item>
|
||||
<item name="android:windowFullscreen">true</item>
|
||||
<item name="android:windowContentOverlay">@null</item>
|
||||
<item name="android:textAllCaps">false</item>
|
||||
<item name="android:windowIsTranslucent">true</item>
|
||||
<item name="android:windowBackground">@android:color/transparent</item>
|
||||
</style>
|
||||
</resources>
|
10
src/android/res/xml/jpush_file_paths.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<paths>
|
||||
<root-path name="jad_root_path" path="."/>
|
||||
<external-path name="jad_external_path" path="JAdDownload" />
|
||||
<external-files-path name="jad_external_files_path" path="JAdDownload" />
|
||||
<files-path name="jad_files_path" path="JAdDownload" />
|
||||
<cache-path name="jad_cache_path" path="JAdDownload" />
|
||||
</paths>
|
||||
</resources>
|
@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal" >
|
||||
<ImageView android:id="@+id/icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
<LinearLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
<TextView android:id="@+id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
<TextView android:id="@+id/text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
@ -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>
|
@ -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
|
||||
|
@ -11,19 +11,37 @@
|
||||
#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);
|
||||
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
Class class = [self class];
|
||||
|
||||
SEL originalSelector = @selector(init);
|
||||
SEL swizzledSelector = @selector(init_plus);
|
||||
|
||||
Method origin = class_getInstanceMethod(class, originalSelector);
|
||||
Method swizzle = class_getInstanceMethod(class, swizzledSelector);
|
||||
|
||||
BOOL didAddMethod =
|
||||
class_addMethod(class,
|
||||
originalSelector,
|
||||
method_getImplementation(swizzle),
|
||||
method_getTypeEncoding(swizzle));
|
||||
|
||||
if (didAddMethod) {
|
||||
class_replaceMethod(class,
|
||||
swizzledSelector,
|
||||
method_getImplementation(origin),
|
||||
method_getTypeEncoding(origin));
|
||||
} else {
|
||||
method_exchangeImplementations(origin, swizzle);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
-(instancetype)init_plus{
|
||||
@ -31,10 +49,98 @@
|
||||
return [self init_plus];
|
||||
}
|
||||
|
||||
NSDictionary *_launchOptions;
|
||||
-(void)applicationDidLaunch:(NSNotification *)notification{
|
||||
if (notification) {
|
||||
[self registerForIos10RemoteNotification];
|
||||
[JPushPlugin setLaunchOptions:notification.userInfo];
|
||||
|
||||
if (!_jpushEventCache) {
|
||||
_jpushEventCache = @{}.mutableCopy;
|
||||
}
|
||||
|
||||
[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
|
||||
NSDictionary *event = @{@"registrationId": registrationID?:@""};
|
||||
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_receiveRegistrationId jsString:[event toJsonString]];
|
||||
}];
|
||||
|
||||
if (notification != nil &&
|
||||
[[UIDevice currentDevice].systemVersion floatValue] < 10.0) {// iOS 10 以后通过 openNotification 这个回调触发事件。
|
||||
if (notification.userInfo) {
|
||||
|
||||
if ([notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
|
||||
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification
|
||||
jsString:[[self jpushFormatAPNSDic: notification.userInfo[UIApplicationLaunchOptionsRemoteNotificationKey]] toJsonString]];
|
||||
}
|
||||
|
||||
if ([notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]) {
|
||||
UILocalNotification *localNotification = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
|
||||
NSMutableDictionary *localNotificationEvent = @{}.mutableCopy;
|
||||
localNotificationEvent[@"content"] = localNotification.alertBody;
|
||||
localNotificationEvent[@"badge"] = @(localNotification.applicationIconBadgeNumber);
|
||||
localNotificationEvent[@"extras"] = localNotification.userInfo;
|
||||
|
||||
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[localNotificationEvent toJsonString]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[JPUSHService setDebugMode];
|
||||
|
||||
NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"];
|
||||
NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
|
||||
NSNumber *delay = [plistData valueForKey:JPushConfig_Delay];
|
||||
|
||||
_launchOptions = notification.userInfo;
|
||||
|
||||
if (![delay boolValue]) {
|
||||
[self startJPushSDK];
|
||||
}
|
||||
}
|
||||
|
||||
-(void)startJPushSDK{
|
||||
[self registerForRemoteNotification];
|
||||
[JPushPlugin setupJPushSDK:_launchOptions];
|
||||
}
|
||||
|
||||
- (void)jpushSDKDidLoginNotification {
|
||||
NSDictionary *event = @{@"registrationId": JPUSHService.registrationID};
|
||||
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_receiveRegistrationId jsString:[event toJsonString]];
|
||||
}
|
||||
|
||||
- (NSMutableDictionary *)jpushFormatAPNSDic:(NSDictionary *)dic {
|
||||
NSMutableDictionary *extras = @{}.mutableCopy;
|
||||
for (NSString *key in dic) {
|
||||
if([key isEqualToString:@"_j_business"] ||
|
||||
[key isEqualToString:@"_j_msgid"] ||
|
||||
[key isEqualToString:@"_j_uid"] ||
|
||||
[key isEqualToString:@"actionIdentifier"] ||
|
||||
[key isEqualToString:@"aps"]) {
|
||||
continue;
|
||||
}
|
||||
extras[key] = dic[key];
|
||||
}
|
||||
NSMutableDictionary *formatDic = dic.mutableCopy;
|
||||
formatDic[@"extras"] = extras;
|
||||
return formatDic;
|
||||
}
|
||||
|
||||
-(void)registerForRemoteNotification{
|
||||
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
|
||||
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
|
||||
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
|
||||
entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
|
||||
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
|
||||
#endif
|
||||
}else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
|
||||
//可以添加自定义categories
|
||||
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
|
||||
UIUserNotificationTypeSound |
|
||||
UIUserNotificationTypeAlert)
|
||||
categories:nil];
|
||||
} else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){
|
||||
//categories 必须为nil
|
||||
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
|
||||
UIRemoteNotificationTypeSound |
|
||||
UIRemoteNotificationTypeAlert)
|
||||
categories:nil];
|
||||
}
|
||||
}
|
||||
|
||||
@ -44,17 +150,76 @@
|
||||
|
||||
-(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 UIApplicationStateBackground:
|
||||
eventName = JPushDocumentEvent_BackgroundNotification;
|
||||
break;
|
||||
default:
|
||||
eventName = JPushDocumentEvent_ReceiveNotification;
|
||||
break;
|
||||
}
|
||||
|
||||
[JPushPlugin fireDocumentEvent:eventName jsString:[[self jpushFormatAPNSDic:userInfo] toJsonString]];
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(30 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
completionHandler(UIBackgroundFetchResultNewData);
|
||||
});
|
||||
}
|
||||
|
||||
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{
|
||||
NSMutableDictionary *userInfo = @{}.mutableCopy;
|
||||
|
||||
if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
|
||||
userInfo = [self jpushFormatAPNSDic:notification.request.content.userInfo];
|
||||
} else {
|
||||
UNNotificationContent *content = notification.request.content;
|
||||
userInfo[@"content"] = content.body;
|
||||
userInfo[@"badge"] = content.badge;
|
||||
userInfo[@"extras"] = content.userInfo;
|
||||
userInfo[@"identifier"] = notification.request.identifier;
|
||||
}
|
||||
|
||||
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
|
||||
|
||||
if ([userInfo[@"aps"][@"content-available"] isEqualToNumber:@(1)]) {// content-available 当用户开启后台推送是,防止触发两次事件
|
||||
return;
|
||||
}
|
||||
|
||||
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
|
||||
|
||||
}
|
||||
|
||||
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
|
||||
UNNotification *notification = response.notification;
|
||||
NSMutableDictionary *userInfo = @{}.mutableCopy;
|
||||
|
||||
if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
|
||||
userInfo = [self jpushFormatAPNSDic:notification.request.content.userInfo];
|
||||
} else {
|
||||
UNNotificationContent *content = notification.request.content;
|
||||
userInfo[@"content"] = content.body;
|
||||
userInfo[@"badge"] = content.badge;
|
||||
userInfo[@"extras"] = content.userInfo;
|
||||
userInfo[@"identifier"] = notification.request.identifier;
|
||||
}
|
||||
|
||||
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo toJsonString]];
|
||||
completionHandler();
|
||||
}
|
||||
|
||||
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
|
||||
[JPUSHService showLocalNotificationAtFront:notification identifierKey:nil];
|
||||
NSMutableDictionary *localNotificationEvent = @{}.mutableCopy;
|
||||
localNotificationEvent[@"content"] = notification.alertBody;
|
||||
localNotificationEvent[@"badge"] = @(notification.applicationIconBadgeNumber);
|
||||
localNotificationEvent[@"extras"] = notification.userInfo;
|
||||
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:JPushDocumentEvent_ReceiveLocalNotification object:localNotificationEvent];
|
||||
}
|
||||
|
||||
- (void)applicationWillEnterForeground:(UIApplication *)application {
|
||||
@ -66,33 +231,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
|
||||
|
32
src/ios/Plugins/JPushDefine.h
Normal 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";
|
@ -8,22 +8,27 @@
|
||||
|
||||
#import <Cordova/CDV.h>
|
||||
|
||||
#define kJPushPluginReceiveNotification @"JPushPluginReceiveNofication"
|
||||
#define kJPushPluginiOS10ForegroundReceiveNotification @"kJPushPluginiOS10ForegroundReceiveNotification"
|
||||
#define kJPushPluginiOS10ClickNotification @"kJPushPluginiOS10ClickNotification"
|
||||
|
||||
static NSMutableDictionary *_jpushEventCache;
|
||||
|
||||
@interface JPushPlugin : CDVPlugin{
|
||||
|
||||
}
|
||||
|
||||
+(void)setLaunchOptions:(NSDictionary *)theLaunchOptions;
|
||||
//注册通知服务并启动 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;
|
||||
@ -64,13 +69,37 @@
|
||||
//检查用户的推送设置情况
|
||||
-(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command;
|
||||
|
||||
//ios 10 APIs
|
||||
-(void)addDismissActions:(CDVInvokedUrlCommand*)command;
|
||||
-(void)addNotificationActions:(CDVInvokedUrlCommand*)command;
|
||||
|
||||
// 设置手机号
|
||||
-(void)setMobileNumber:(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
|
||||
|
||||
static JPushPlugin *SharedJPushPlugin;
|
||||
|
||||
@interface NSDictionary (JPush)
|
||||
-(NSString*)toJsonString;
|
||||
@end
|
||||
|
||||
@interface NSString (JPush)
|
||||
-(NSDictionary*)toDictionary;
|
||||
@end
|
||||
|
||||
|
||||
|
@ -1,26 +1,10 @@
|
||||
//
|
||||
// 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;
|
||||
#import "JPushDefine.h"
|
||||
|
||||
@implementation NSDictionary (JPush)
|
||||
-(NSString*)toJsonString{
|
||||
@ -46,22 +30,21 @@ static NSDictionary *_launchOptions = nil;
|
||||
|
||||
@implementation JPushPlugin
|
||||
|
||||
-(void)startJPushSDK:(CDVInvokedUrlCommand*)command{
|
||||
[(AppDelegate*)[UIApplication sharedApplication].delegate startJPushSDK];
|
||||
}
|
||||
|
||||
#pragma mark- 外部接口
|
||||
-(void)stopPush:(CDVInvokedUrlCommand*)command{
|
||||
[[UIApplication sharedApplication]unregisterForRemoteNotifications];
|
||||
}
|
||||
|
||||
-(void)resumePush:(CDVInvokedUrlCommand*)command{
|
||||
[JPushPlugin registerForRemoteNotification];
|
||||
[(AppDelegate*)[UIApplication sharedApplication].delegate registerForRemoteNotification];
|
||||
}
|
||||
|
||||
-(void)isPushStopped:(CDVInvokedUrlCommand*)command{
|
||||
NSNumber *result;
|
||||
if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) {
|
||||
result = @(0);
|
||||
}else{
|
||||
result = @(1);
|
||||
}
|
||||
NSNumber *result = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications] ? @(0) : @(1);
|
||||
[self handleResultWithValue:result command:command];
|
||||
}
|
||||
|
||||
@ -69,171 +52,310 @@ static NSDictionary *_launchOptions = nil;
|
||||
//do nithng,because Cordova plugin use lazy load mode.
|
||||
}
|
||||
|
||||
|
||||
#ifdef __CORDOVA_4_0_0
|
||||
|
||||
- (void)pluginInitialize {
|
||||
NSLog(@"### pluginInitialize ");
|
||||
[self initNotifications];
|
||||
[self initPlugin];
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{
|
||||
- (CDVPlugin*)initWithWebView:(WKWebView*)theWebView{
|
||||
NSLog(@"### initWithWebView ");
|
||||
if (self=[super initWithWebView:theWebView]) {
|
||||
[self initNotifications];
|
||||
}
|
||||
[self initPlugin];
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
-(void)initNotifications {
|
||||
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
|
||||
[defaultCenter addObserver:self
|
||||
selector:@selector(networkDidReceiveMessage:)
|
||||
name:kJPFNetworkDidReceiveMessageNotification
|
||||
object:nil];
|
||||
-(void)initPlugin{
|
||||
if (!SharedJPushPlugin) {
|
||||
SharedJPushPlugin = self;
|
||||
}
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(networkDidReceiveMessage:)
|
||||
name:kJPFNetworkDidReceiveMessageNotification
|
||||
object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(receiveLocalNotification:)
|
||||
name:JPushDocumentEvent_ReceiveLocalNotification
|
||||
object:nil];
|
||||
[self dispatchJPushCacheEvent];
|
||||
}
|
||||
|
||||
[defaultCenter addObserver:self
|
||||
selector:@selector(networkDidReceiveNotification:)
|
||||
name:kJPushPluginReceiveNotification
|
||||
object:nil];
|
||||
- (void)dispatchJPushCacheEvent {
|
||||
for (NSString* key in _jpushEventCache) {
|
||||
NSArray *evenList = _jpushEventCache[key];
|
||||
for (NSString *event in evenList) {
|
||||
[JPushPlugin fireDocumentEvent:key jsString:event];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[defaultCenter addObserver:self
|
||||
selector:@selector(networkDidReceiveNotification:)
|
||||
name:kJPushPluginiOS10ForegroundReceiveNotification
|
||||
object:nil];
|
||||
+(void)fireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString{
|
||||
if (SharedJPushPlugin) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[SharedJPushPlugin.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.%@',%@)", eventName, jsString]];
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_jpushEventCache) {
|
||||
_jpushEventCache = @{}.mutableCopy;
|
||||
}
|
||||
|
||||
if (!_jpushEventCache[eventName]) {
|
||||
_jpushEventCache[eventName] = @[].mutableCopy;
|
||||
}
|
||||
|
||||
[_jpushEventCache[eventName] addObject: jsString];
|
||||
}
|
||||
|
||||
[defaultCenter addObserver:self
|
||||
selector:@selector(networkDidReceiveNotification:)
|
||||
name:kJPushPluginiOS10ClickNotification
|
||||
object:nil];
|
||||
-(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]];
|
||||
}
|
||||
|
||||
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)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)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)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)setTags:(CDVInvokedUrlCommand *)command{
|
||||
|
||||
NSArray *tags = command.arguments;
|
||||
|
||||
NSLog(@"#### setTags %@",tags);
|
||||
|
||||
[JPUSHService setTags:[NSSet setWithArray:tags]
|
||||
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:)
|
||||
object:self];
|
||||
|
||||
-(void)checkTagBindState:(CDVInvokedUrlCommand *)command {
|
||||
NSDictionary* params = [command.arguments objectAtIndex:0];
|
||||
NSNumber* sequence = params[@"sequence"];
|
||||
NSString* tag = params[@"tag"];
|
||||
|
||||
[JPUSHService validTag:tag completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq, BOOL isBind) {
|
||||
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
|
||||
[dic setObject:sequence forKey:@"sequence"];
|
||||
|
||||
CDVPluginResult* result;
|
||||
|
||||
if (iResCode == 0) {
|
||||
dic[@"tag"] = tag;
|
||||
[dic setObject:[NSNumber numberWithBool:isBind] forKey:@"isBind"];
|
||||
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
|
||||
} else {
|
||||
[dic setValue:[NSNumber numberWithUnsignedInteger:iResCode] forKey:@"code"];
|
||||
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
|
||||
}
|
||||
|
||||
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
|
||||
} seq:[sequence integerValue]];
|
||||
}
|
||||
|
||||
-(void)setAlias:(CDVInvokedUrlCommand *)command{
|
||||
-(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]];
|
||||
}
|
||||
|
||||
NSLog(@"#### setAlias %@",command.arguments);
|
||||
[JPUSHService setAlias:command.arguments[0]
|
||||
callbackSelector:@selector(tagsWithAliasCallback:tags:alias:)
|
||||
object:self];
|
||||
-(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];
|
||||
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];
|
||||
}
|
||||
NSString * pageName = [command argumentAtIndex:0];
|
||||
[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];
|
||||
}
|
||||
|
||||
NSString * pageName = [command argumentAtIndex:0];
|
||||
[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];
|
||||
}
|
||||
NSString *pageName = [command argumentAtIndex:0];
|
||||
NSNumber *duration = [command argumentAtIndex:1];
|
||||
[JPUSHService beginLogPageView:pageName duration:duration.intValue];
|
||||
}
|
||||
|
||||
-(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]];
|
||||
NSNumber *badge = [command argumentAtIndex: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)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command{
|
||||
NSNumber *badge = [command argumentAtIndex:0];
|
||||
[UIApplication sharedApplication].applicationIconBadgeNumber = badge.intValue;
|
||||
}
|
||||
|
||||
-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand *)command {
|
||||
-(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command {
|
||||
NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber;
|
||||
NSNumber *number = [NSNumber numberWithInteger:num];
|
||||
[self handleResultWithValue:number command:command];
|
||||
@ -252,32 +374,68 @@ static NSDictionary *_launchOptions = nil;
|
||||
}
|
||||
|
||||
-(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];
|
||||
NSNumber *delay = [command argumentAtIndex:0];
|
||||
NSString *alert = [command argumentAtIndex:1];
|
||||
NSNumber *badge = [command argumentAtIndex:2];
|
||||
NSString *idKey = [command argumentAtIndex:3];
|
||||
NSDictionary *userInfo = [command argumentAtIndex:4];
|
||||
|
||||
JPushNotificationContent *content = [[JPushNotificationContent alloc] init];
|
||||
|
||||
if (alert) {
|
||||
content.body = alert;
|
||||
}
|
||||
|
||||
if (badge) {
|
||||
content.badge = badge;
|
||||
}
|
||||
|
||||
if (userInfo) {
|
||||
content.userInfo = userInfo;
|
||||
}
|
||||
|
||||
JPushNotificationTrigger *trigger = [[JPushNotificationTrigger alloc] init];
|
||||
// 由于 不支持 0 作为传入参数,在传入参数基础上添加一个极小的时间于 android 端保持一致。
|
||||
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {
|
||||
if (delay) {
|
||||
trigger.timeInterval = [delay doubleValue] + 0.000001;
|
||||
}
|
||||
} else {
|
||||
if (delay) {
|
||||
trigger.fireDate = [NSDate dateWithTimeIntervalSinceNow:[[command argumentAtIndex:0] doubleValue] + 0.001];
|
||||
}
|
||||
}
|
||||
|
||||
JPushNotificationRequest *request = [[JPushNotificationRequest alloc] init];
|
||||
request.content = content;
|
||||
request.trigger = trigger;
|
||||
|
||||
if (idKey) {
|
||||
request.requestIdentifier = idKey;
|
||||
}
|
||||
|
||||
request.completionHandler = ^(id result) {
|
||||
NSLog(@"result");
|
||||
};
|
||||
|
||||
[JPUSHService addNotification:request];
|
||||
}
|
||||
|
||||
-(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{
|
||||
NSString *identifier = [command argumentAtIndex:0];
|
||||
if ([UIDevice currentDevice].systemVersion.floatValue >= 10.0) {
|
||||
JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new];
|
||||
jpid.identifiers = @[identifier];
|
||||
[JPUSHService removeNotification:jpid];
|
||||
}else{
|
||||
[JPUSHService deleteLocalNotificationWithIdentifierKey:identifier];
|
||||
}
|
||||
JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new];
|
||||
jpid.identifiers = @[identifier];
|
||||
[JPUSHService removeNotification:jpid];
|
||||
}
|
||||
|
||||
-(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{
|
||||
[JPUSHService clearAllLocalNotifications];
|
||||
[JPUSHService removeNotification:nil];
|
||||
}
|
||||
|
||||
-(void)setLocation:(CDVInvokedUrlCommand*)command{
|
||||
[JPUSHService setLatitude:[((NSString*)command.arguments[0]) doubleValue] longitude:[((NSString*)command.arguments[1]) doubleValue]];
|
||||
NSNumber *latitude = [command argumentAtIndex:0];
|
||||
NSNumber *longitude = [command argumentAtIndex:1];
|
||||
[JPUSHService setLatitude:latitude.doubleValue longitude:longitude.doubleValue];
|
||||
}
|
||||
|
||||
-(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command{
|
||||
@ -308,59 +466,101 @@ static NSDictionary *_launchOptions = nil;
|
||||
}
|
||||
}
|
||||
|
||||
#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)setMobileNumber:(CDVInvokedUrlCommand *)command {
|
||||
NSDictionary* params = [command.arguments objectAtIndex:0];
|
||||
NSNumber* sequence = params[@"sequence"];
|
||||
NSString* number = params[@"mobileNumber"];
|
||||
[JPUSHService setMobileNumber:number completion:^(NSError *error) {
|
||||
NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];
|
||||
[dic setObject:sequence forKey:@"sequence"];
|
||||
CDVPluginResult* result;
|
||||
if (error) {
|
||||
[dic setValue:[NSNumber numberWithUnsignedInteger:error.code] forKey:@"code"];
|
||||
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dic];
|
||||
}
|
||||
else {
|
||||
// success
|
||||
[dic setObject:number forKey:@"mobileNumber"];
|
||||
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dic];
|
||||
}
|
||||
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
|
||||
}];
|
||||
|
||||
}
|
||||
|
||||
#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"];
|
||||
+(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: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 *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){
|
||||
if(isIDFA.boolValue) {
|
||||
advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
|
||||
}
|
||||
[JPUSHService setupWithOption:_launchOptions
|
||||
[JPUSHService setupWithOption:userInfo
|
||||
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{
|
||||
-(void)handleResultWithValue:(id)value command:(CDVInvokedUrlCommand*)command {
|
||||
CDVPluginResult *result = nil;
|
||||
CDVCommandStatus status = CDVCommandStatus_OK;
|
||||
|
||||
@ -383,64 +583,17 @@ static NSDictionary *_launchOptions = nil;
|
||||
[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)networkDidReceiveMessage:(NSNotification *)notification {
|
||||
if (notification && notification.userInfo) {
|
||||
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveMessage
|
||||
jsString:[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;
|
||||
}
|
||||
|
||||
-(void)receiveLocalNotification:(NSNotification *)notification {
|
||||
if (notification && notification.object) {
|
||||
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveLocalNotification
|
||||
jsString:[notification.object toJsonString]];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -1,490 +0,0 @@
|
||||
/*
|
||||
* | | | | \ \ / / | | | | / _______|
|
||||
* | |____| | \ \/ / | |____| | / /
|
||||
* | |____| | \ / | |____| | | | _____
|
||||
* | | | | / \ | | | | | | |____ |
|
||||
* | | | | / /\ \ | | | | \ \______| |
|
||||
* | | | | /_/ \_\ | | | | \_________|
|
||||
*
|
||||
* Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved.
|
||||
*/
|
||||
|
||||
#define JPUSH_VERSION_NUMBER 2.1.9
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class CLRegion;
|
||||
@class UILocalNotification;
|
||||
@class CLLocation;
|
||||
@class UNNotificationCategory;
|
||||
@class UNNotificationSettings;
|
||||
@class UNNotificationRequest;
|
||||
@class UNNotification;
|
||||
@protocol JPUSHRegisterDelegate;
|
||||
|
||||
extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中
|
||||
extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接
|
||||
extern NSString *const kJPFNetworkDidCloseNotification; // 关闭连接
|
||||
extern NSString *const kJPFNetworkDidRegisterNotification; // 注册成功
|
||||
extern NSString *const kJPFNetworkFailedRegisterNotification; //注册失败
|
||||
extern NSString *const kJPFNetworkDidLoginNotification; // 登录成功
|
||||
extern NSString *const kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS)
|
||||
extern NSString *const kJPFServiceErrorNotification; // 错误提示
|
||||
|
||||
/*!
|
||||
* 通知注册实体类
|
||||
*/
|
||||
@interface JPUSHRegisterEntity : NSObject
|
||||
|
||||
/*!
|
||||
* 支持的类型
|
||||
* badge,sound,alert
|
||||
*/
|
||||
@property (nonatomic, assign) NSInteger types;
|
||||
/*!
|
||||
* 注入的类别
|
||||
* iOS10 UNNotificationCategory
|
||||
* iOS8-iOS9 UIUserNotificationCategory
|
||||
*/
|
||||
@property (nonatomic, strong) NSSet *categories;
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 进行删除、查找推送实体类
|
||||
*/
|
||||
@interface JPushNotificationIdentifier : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, copy) NSArray<NSString *> *identifiers; // 推送的标识数组
|
||||
@property (nonatomic, copy) UILocalNotification *notificationObj NS_DEPRECATED_IOS(4_0, 10_0); // iOS10以下可以传UILocalNotification对象数据,iOS10以上无效
|
||||
@property (nonatomic, assign) BOOL delivered NS_AVAILABLE_IOS(10_0); // 在通知中心显示的或待推送的标志,默认为NO,YES表示在通知中心显示的,NO表示待推送的
|
||||
@property (nonatomic, copy) void (^findCompletionHandler)(NSArray *results); // 用于查询回调,调用[findNotification:]方法前必须设置,results为返回相应对象数组,iOS10以下返回UILocalNotification对象数组;iOS10以上根据delivered传入值返回UNNotification或UNNotificationRequest对象数组(delivered传入YES,则返回UNNotification对象数组,否则返回UNNotificationRequest对象数组)
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 推送内容实体类
|
||||
*/
|
||||
@interface JPushNotificationContent : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, copy) NSString *title; // 推送标题
|
||||
@property (nonatomic, copy) NSString *subtitle; // 推送副标题
|
||||
@property (nonatomic, copy) NSString *body; // 推送内容
|
||||
@property (nonatomic, copy) NSNumber *badge; // 角标的数字。如果不需要改变角标传@(-1)
|
||||
@property (nonatomic, copy) NSString *action NS_DEPRECATED_IOS(8_0, 10_0); // 弹框的按钮显示的内容(IOS 8默认为"打开", 其他默认为"启动",iOS10以上无效)
|
||||
@property (nonatomic, copy) NSString *categoryIdentifier; // 行为分类标识
|
||||
@property (nonatomic, copy) NSDictionary *userInfo; // 本地推送时可以设置userInfo来增加附加信息,远程推送时设置的payload推送内容作为此userInfo
|
||||
@property (nonatomic, copy) NSString *sound; // 声音名称,不设置则为默认声音
|
||||
@property (nonatomic, copy) NSArray *attachments NS_AVAILABLE_IOS(10_0); // 附件,iOS10以上有效,需要传入UNNotificationAttachment对象数组类型
|
||||
@property (nonatomic, copy) NSString *threadIdentifier NS_AVAILABLE_IOS(10_0); // 线程或与推送请求相关对话的标识,iOS10以上有效,可用来对推送进行分组
|
||||
@property (nonatomic, copy) NSString *launchImageName NS_AVAILABLE_IOS(10_0); // 启动图片名,iOS10以上有效,从推送启动时将会用到
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 推送触发方式实体类
|
||||
* 注:dateComponents、timeInterval、region在iOS10以上可选择其中一个参数传入有效值,如果同时传入值会根据优先级I、II、III使其中一种触发方式生效,fireDate为iOS10以下根据时间触发时须传入的参数
|
||||
*/
|
||||
@interface JPushNotificationTrigger : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, assign) BOOL repeat; // 设置是否重复,默认为NO
|
||||
@property (nonatomic, copy) NSDate *fireDate NS_DEPRECATED_IOS(2_0, 10_0); // 用来设置触发推送的时间,iOS10以上无效
|
||||
@property (nonatomic, copy) CLRegion *region NS_AVAILABLE_IOS(8_0); // 用来设置触发推送的位置,iOS8以上有效,iOS10以上优先级为I,应用需要有允许使用定位的授权
|
||||
@property (nonatomic, copy) NSDateComponents *dateComponents NS_AVAILABLE_IOS(10_0); // 用来设置触发推送的日期时间,iOS10以上有效,优先级为II
|
||||
@property (nonatomic, assign) NSTimeInterval timeInterval NS_AVAILABLE_IOS(10_0); // 用来设置触发推送的时间,iOS10以上有效,优先级为III
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 注册或更新推送实体类
|
||||
*/
|
||||
@interface JPushNotificationRequest : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, copy) NSString *requestIdentifier; // 推送请求标识
|
||||
@property (nonatomic, copy) JPushNotificationContent *content; // 设置推送的具体内容
|
||||
@property (nonatomic, copy) JPushNotificationTrigger *trigger; // 设置推送的触发方式
|
||||
@property (nonatomic, copy) void (^completionHandler)(id result); // 注册或更新推送成功回调,iOS10以上成功则result为UNNotificationRequest对象,失败则result为nil;iOS10以下成功result为UILocalNotification对象,失败则result为nil
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* JPush 核心头文件
|
||||
*/
|
||||
@interface JPUSHService : NSObject
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Setup 启动相关
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 启动SDK
|
||||
*
|
||||
* @discussion 这是旧版本的启动方法, 依赖于 PushConfig.plist 文件. 建议不要使用, 已经过期.
|
||||
*/
|
||||
+ (void)setupWithOption:(NSDictionary *)launchingOption __attribute__((deprecated("JPush 2.1.0 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 启动SDK
|
||||
*
|
||||
* @param launchingOption 启动参数.
|
||||
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
|
||||
* @param channel 发布渠道. 可选.
|
||||
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
|
||||
* @param advertisingIdentifier 广告标识符(IDFA) 如果不需要使用IDFA,传nil.
|
||||
*
|
||||
* @discussion 提供SDK启动必须的参数, 来启动 SDK.
|
||||
* 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作.
|
||||
*/
|
||||
+ (void)setupWithOption:(NSDictionary *)launchingOption
|
||||
appKey:(NSString *)appKey
|
||||
channel:(NSString *)channel
|
||||
apsForProduction:(BOOL)isProduction;
|
||||
|
||||
|
||||
+ (void)setupWithOption:(NSDictionary *)launchingOption
|
||||
appKey:(NSString *)appKey
|
||||
channel:(NSString *)channel
|
||||
apsForProduction:(BOOL)isProduction
|
||||
advertisingIdentifier:(NSString *)advertisingId;
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name APNs about 通知相关
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 注册要处理的远程通知类型
|
||||
*
|
||||
* @param types 通知类型
|
||||
* @param categories 类别组
|
||||
*
|
||||
*/
|
||||
+ (void)registerForRemoteNotificationTypes:(NSUInteger)types
|
||||
categories:(NSSet *)categories;
|
||||
/*!
|
||||
* @abstract 新版本的注册方法(兼容iOS10)
|
||||
*
|
||||
* @param config 注册通知配置
|
||||
* @param delegate 代理
|
||||
*
|
||||
*/
|
||||
+ (void)registerForRemoteNotificationConfig:(JPUSHRegisterEntity *)config delegate:(id<JPUSHRegisterDelegate>)delegate;
|
||||
|
||||
|
||||
+ (void)registerDeviceToken:(NSData *)deviceToken;
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 处理收到的 APNs 消息
|
||||
*/
|
||||
+ (void)handleRemoteNotification:(NSDictionary *)remoteInfo;
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Tag alias setting 设置别名与标签
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* 下面的接口是可选的
|
||||
* 设置标签和(或)别名(若参数为nil,则忽略;若是空对象,则清空;详情请参考文档:http://docs.jiguang.cn/client/ios_api/#api-ios)
|
||||
* 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;
|
||||
|
||||
+ (void) setTags:(NSSet *)tags
|
||||
callbackSelector:(SEL)cbSelector
|
||||
object:(id)theTarget;
|
||||
|
||||
+ (void)setTags:(NSSet *)tags
|
||||
alias:(NSString *)alias
|
||||
fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler;
|
||||
|
||||
+ (void) setTags:(NSSet *)tags
|
||||
aliasInbackground:(NSString *)alias;
|
||||
|
||||
+ (void)setAlias:(NSString *)alias
|
||||
callbackSelector:(SEL)cbSelector
|
||||
object:(id)theTarget;
|
||||
|
||||
/*!
|
||||
* @abstract 过滤掉无效的 tags
|
||||
*
|
||||
* @discussion 如果 tags 数量超过限制数量, 则返回靠前的有效的 tags.
|
||||
* 建议设置 tags 前用此接口校验. SDK 内部也会基于此接口来做过滤.
|
||||
*/
|
||||
+ (NSSet *)filterValidTags:(NSSet *)tags;
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Stats 统计功能
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 开始记录页面停留
|
||||
*
|
||||
* @param pageName 页面名称
|
||||
*/
|
||||
+ (void)startLogPageView:(NSString *)pageName;
|
||||
|
||||
/*!
|
||||
* @abstract 停止记录页面停留
|
||||
*
|
||||
* @param pageName 页面
|
||||
*/
|
||||
+ (void)stopLogPageView:(NSString *)pageName;
|
||||
|
||||
/*!
|
||||
* @abstract 直接上报在页面的停留时工
|
||||
*
|
||||
* @param pageName 页面
|
||||
* @param seconds 停留的秒数
|
||||
*/
|
||||
+ (void)beginLogPageView:(NSString *)pageName duration:(int)seconds;
|
||||
|
||||
/*!
|
||||
* @abstract 开启Crash日志收集
|
||||
*
|
||||
* @discussion 默认是关闭状态.
|
||||
*/
|
||||
+ (void)crashLogON;
|
||||
|
||||
/*!
|
||||
* @abstract 地理位置上报
|
||||
*
|
||||
* @param latitude 纬度.
|
||||
* @param longitude 经度.
|
||||
*
|
||||
*/
|
||||
+ (void)setLatitude:(double)latitude longitude:(double)longitude;
|
||||
|
||||
/*!
|
||||
* @abstract 地理位置上报
|
||||
*
|
||||
* @param location 直接传递 CLLocation * 型的地理信息
|
||||
*
|
||||
* @discussion 需要链接 CoreLocation.framework 并且 #import <CoreLocation/CoreLocation.h>
|
||||
*/
|
||||
+ (void)setLocation:(CLLocation *)location;
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Local Notification 本地通知
|
||||
///----------------------------------------------------
|
||||
/*!
|
||||
* @abstract 注册或更新推送 (支持iOS10,并兼容iOS10以下版本)
|
||||
*
|
||||
* JPush 2.1.9新接口
|
||||
* @param request JPushNotificationRequest类型,设置推送的属性,设置已有推送的request.requestIdentifier即更新已有的推送,否则为注册新推送,更新推送仅仅在iOS10以上有效,结果通过request.completionHandler返回
|
||||
* @discussion 旧的注册本地推送接口被废弃,使用此接口可以替换
|
||||
*
|
||||
*/
|
||||
+ (void)addNotification:(JPushNotificationRequest *)request;
|
||||
|
||||
/*!
|
||||
* @abstract 移除推送 (支持iOS10,并兼容iOS10以下版本)
|
||||
*
|
||||
* JPush 2.1.9新接口
|
||||
* @param identifier JPushNotificationIdentifier类型,iOS10以上identifier设置为nil,则移除所有在通知中心显示推送和待推送请求,也可以通过设置identifier.delivered和identifier.identifiers来移除相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则移除相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier设置为nil,则移除所有推送,identifier.delivered属性无效,另外可以通过identifier.notificationObj传入特定推送对象来移除此推送。
|
||||
* @discussion 旧的所有删除推送接口被废弃,使用此接口可以替换
|
||||
*
|
||||
*/
|
||||
+ (void)removeNotification:(JPushNotificationIdentifier *)identifier;
|
||||
|
||||
/*!
|
||||
* @abstract 查找推送 (支持iOS10,并兼容iOS10以下版本)
|
||||
*
|
||||
* JPush 2.1.9新接口
|
||||
* @param identifier JPushNotificationIdentifier类型,iOS10以上可以通过设置identifier.delivered和identifier.identifiers来查找相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则返回相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier.delivered属性无效,identifier.identifiers如果设置nil或空数组则返回所有推送。须要设置identifier.findCompletionHandler回调才能得到查找结果,通过(NSArray *results)返回相应对象数组。
|
||||
* @discussion 旧的查找推送接口被废弃,使用此接口可以替换
|
||||
*
|
||||
*/
|
||||
+ (void)findNotification:(JPushNotificationIdentifier *)identifier;
|
||||
|
||||
/*!
|
||||
* @abstract 本地推送,最多支持64个
|
||||
*
|
||||
* @param fireDate 本地推送触发的时间
|
||||
* @param alertBody 本地推送需要显示的内容
|
||||
* @param badge 角标的数字。如果不需要改变角标传-1
|
||||
* @param alertAction 弹框的按钮显示的内容(IOS 8默认为"打开", 其他默认为"启动")
|
||||
* @param notificationKey 本地推送标示符
|
||||
* @param userInfo 自定义参数,可以用来标识推送和增加附加信息
|
||||
* @param soundName 自定义通知声音,设置为nil为默认声音
|
||||
*
|
||||
* @discussion 最多支持 64 个定义,此方法被[addNotification:]方法取代
|
||||
*/
|
||||
+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate
|
||||
alertBody:(NSString *)alertBody
|
||||
badge:(int)badge
|
||||
alertAction:(NSString *)alertAction
|
||||
identifierKey:(NSString *)notificationKey
|
||||
userInfo:(NSDictionary *)userInfo
|
||||
soundName:(NSString *)soundName __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 本地推送 (支持 iOS8 新参数)
|
||||
*
|
||||
* IOS8新参数
|
||||
* @param region 自定义参数
|
||||
* @param regionTriggersOnce 自定义参数
|
||||
* @param category 自定义参数
|
||||
* @discussion 此方法被[addNotification:]方法取代
|
||||
*/
|
||||
+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate
|
||||
alertBody:(NSString *)alertBody
|
||||
badge:(int)badge
|
||||
alertAction:(NSString *)alertAction
|
||||
identifierKey:(NSString *)notificationKey
|
||||
userInfo:(NSDictionary *)userInfo
|
||||
soundName:(NSString *)soundName
|
||||
region:(CLRegion *)region
|
||||
regionTriggersOnce:(BOOL)regionTriggersOnce
|
||||
category:(NSString *)category NS_AVAILABLE_IOS(8_0) __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 前台展示本地推送
|
||||
*
|
||||
* @param notification 本地推送对象
|
||||
* @param notificationKey 需要前台显示的本地推送通知的标示符
|
||||
*
|
||||
* @discussion 默认App在前台运行时不会进行弹窗,在程序接收通知调用此接口可实现指定的推送弹窗。--iOS10以下还可继续使用,iOS10以上在[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:]方法中调用completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);即可
|
||||
*/
|
||||
+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification
|
||||
identifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
/*!
|
||||
* @abstract 删除本地推送定义
|
||||
*
|
||||
* @param notificationKey 本地推送标示符
|
||||
* @param myUILocalNotification 本地推送对象
|
||||
* @discussion 此方法被[removeNotification:]方法取代
|
||||
*/
|
||||
+ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 删除本地推送定义
|
||||
* @discussion 此方法被[removeNotification:]方法取代
|
||||
*/
|
||||
+ (void)deleteLocalNotification:(UILocalNotification *)localNotification __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 获取指定通知
|
||||
*
|
||||
* @param notificationKey 本地推送标示符
|
||||
* @return 本地推送对象数组, [array count]为0时表示没找到
|
||||
* @discussion 此方法被[findNotification:]方法取代
|
||||
*/
|
||||
+ (NSArray *)findLocalNotificationWithIdentifier:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 清除所有本地推送对象
|
||||
* @discussion 此方法被[removeNotification:]方法取代
|
||||
*/
|
||||
+ (void)clearAllLocalNotifications __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Server badge 服务器端 badge 功能
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 设置角标(到服务器)
|
||||
*
|
||||
* @param value 新的值. 会覆盖服务器上保存的值(这个用户)
|
||||
*
|
||||
* @discussion 本接口不会改变应用本地的角标值.
|
||||
* 本地仍须调用 UIApplication:setApplicationIconBadgeNumber 函数来设置脚标.
|
||||
*
|
||||
* 本接口用于配合 JPush 提供的服务器端角标功能.
|
||||
* 该功能解决的问题是, 服务器端推送 APNs 时, 并不知道客户端原来已经存在的角标是多少, 指定一个固定的数字不太合理.
|
||||
*
|
||||
* JPush 服务器端脚标功能提供:
|
||||
*
|
||||
* - 通过本 API 把当前客户端(当前这个用户的) 的实际 badge 设置到服务器端保存起来;
|
||||
* - 调用服务器端 API 发 APNs 时(通常这个调用是批量针对大量用户),
|
||||
* 使用 "+1" 的语义, 来表达需要基于目标用户实际的 badge 值(保存的) +1 来下发通知时带上新的 badge 值;
|
||||
*/
|
||||
+ (BOOL)setBadge:(NSInteger)value;
|
||||
|
||||
/*!
|
||||
* @abstract 重置脚标(为0)
|
||||
*
|
||||
* @discussion 相当于 [setBadge:0] 的效果.
|
||||
* 参考 [JPUSHService setBadge:] 说明来理解其作用.
|
||||
*/
|
||||
+ (void)resetBadge;
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Logs and others 日志与其他
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract JPush标识此设备的 registrationID
|
||||
*
|
||||
* @discussion SDK注册成功后, 调用此接口获取到 registrationID 才能够获取到.
|
||||
*
|
||||
* JPush 支持根据 registrationID 来进行推送.
|
||||
* 如果你需要此功能, 应该通过此接口获取到 registrationID 后, 上报到你自己的服务器端, 并保存下来.
|
||||
* registrationIDCompletionHandler:是新增的获取registrationID的方法,需要在block中获取registrationID,resCode为返回码,模拟器调用此接口resCode返回1011,registrationID返回nil.
|
||||
* 更多的理解请参考 JPush 的文档网站.
|
||||
*/
|
||||
+ (NSString *)registrationID;
|
||||
|
||||
+ (void)registrationIDCompletionHandler:(void(^)(int resCode,NSString *registrationID))completionHandler;
|
||||
|
||||
/*!
|
||||
* @abstract 打开日志级别到 Debug
|
||||
*
|
||||
* @discussion JMessage iOS 的日志系统参考 Android 设计了级别.
|
||||
* 从低到高是: Verbose, Debug, Info, Warning, Error.
|
||||
* 对日志级别的进一步理解, 请参考 Android 相关的说明.
|
||||
*
|
||||
* SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志.
|
||||
*
|
||||
* 调用本接口可打开日志级别为: Debug, 打印调试日志.
|
||||
*/
|
||||
+ (void)setDebugMode;
|
||||
|
||||
/*!
|
||||
* @abstract 关闭日志
|
||||
*
|
||||
* @discussion 关于日志级别的说明, 参考 [JPUSHService setDebugMode]
|
||||
*
|
||||
* 虽说是关闭日志, 但还是会打印 Warning, Error 日志. 这二种日志级别, 在程序运行正常时, 不应有打印输出.
|
||||
*
|
||||
* 建议在发布的版本里, 调用此接口, 关闭掉日志打印.
|
||||
*/
|
||||
+ (void)setLogOFF;
|
||||
|
||||
@end
|
||||
|
||||
@class UNUserNotificationCenter;
|
||||
@class UNNotificationResponse;
|
||||
|
||||
@protocol JPUSHRegisterDelegate <NSObject>
|
||||
|
||||
/*
|
||||
* @brief handle UserNotifications.framework [willPresentNotification:withCompletionHandler:]
|
||||
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心
|
||||
* @param notification 前台得到的的通知对象
|
||||
* @param completionHandler 该callback中的options 请使用UNNotificationPresentationOptions
|
||||
*/
|
||||
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger options))completionHandler;
|
||||
/*
|
||||
* @brief handle UserNotifications.framework [didReceiveNotificationResponse:withCompletionHandler:]
|
||||
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心
|
||||
* @param response 通知响应对象
|
||||
* @param completionHandler
|
||||
*/
|
||||
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler;
|
||||
|
||||
@end
|
44
src/ios/lib/jpush-ios-5.6.0.xcframework/Info.plist
Normal file
@ -0,0 +1,44 @@
|
||||
<?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>AvailableLibraries</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>HeadersPath</key>
|
||||
<string>Headers</string>
|
||||
<key>LibraryIdentifier</key>
|
||||
<string>ios-arm64_x86_64-simulator</string>
|
||||
<key>LibraryPath</key>
|
||||
<string>libJPush.a</string>
|
||||
<key>SupportedArchitectures</key>
|
||||
<array>
|
||||
<string>arm64</string>
|
||||
<string>x86_64</string>
|
||||
</array>
|
||||
<key>SupportedPlatform</key>
|
||||
<string>ios</string>
|
||||
<key>SupportedPlatformVariant</key>
|
||||
<string>simulator</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>HeadersPath</key>
|
||||
<string>Headers</string>
|
||||
<key>LibraryIdentifier</key>
|
||||
<string>ios-arm64</string>
|
||||
<key>LibraryPath</key>
|
||||
<string>libJPush.a</string>
|
||||
<key>SupportedArchitectures</key>
|
||||
<array>
|
||||
<string>arm64</string>
|
||||
</array>
|
||||
<key>SupportedPlatform</key>
|
||||
<string>ios</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XFWK</string>
|
||||
<key>XCFrameworkFormatVersion</key>
|
||||
<string>1.0</string>
|
||||
</dict>
|
||||
</plist>
|
@ -0,0 +1,982 @@
|
||||
/*
|
||||
* | | | | \ \ / / | | | | / _______|
|
||||
* | |____| | \ \/ / | |____| | / /
|
||||
* | |____| | \ / | |____| | | | _____
|
||||
* | | | | / \ | | | | | | |____ |
|
||||
* | | | | / /\ \ | | | | \ \______| |
|
||||
* | | | | /_/ \_\ | | | | \_________|
|
||||
*
|
||||
* Copyright (c) 2011 ~ 2017 Shenzhen HXHG. All rights reserved.
|
||||
*/
|
||||
|
||||
#define JPUSH_VERSION_NUMBER 5.6.0
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class CLRegion;
|
||||
@class UILocalNotification;
|
||||
@class CLLocation;
|
||||
@class UNNotificationCategory;
|
||||
@class UNNotificationSettings;
|
||||
@class UNNotificationRequest;
|
||||
@class UNNotification;
|
||||
@class UIView;
|
||||
@protocol JPUSHRegisterDelegate;
|
||||
@protocol JPUSHGeofenceDelegate;
|
||||
@protocol JPUSHNotiInMessageDelegate;
|
||||
@protocol JPUSHInAppMessageDelegate;
|
||||
|
||||
typedef void (^JPUSHTagsOperationCompletion)(NSInteger iResCode, NSSet *_Nullable iTags, NSInteger seq);
|
||||
typedef void (^JPUSHTagValidOperationCompletion)(NSInteger iResCode, NSSet *_Nullable iTags, NSInteger seq, BOOL isBind);
|
||||
typedef void (^JPUSHAliasOperationCompletion)(NSInteger iResCode, NSString *_Nullable iAlias, NSInteger seq);
|
||||
typedef void (^JPUSHPropertiesOperationCompletion)(NSInteger iResCode, NSDictionary *_Nullable properties, NSInteger seq);
|
||||
typedef void (^JPUSHLiveActivityTokenCompletion)(NSInteger iResCode, NSString *_Nullable iLiveActivityId, NSData * _Nullable pushToken, NSInteger seq);
|
||||
|
||||
extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中
|
||||
extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接
|
||||
extern NSString *const kJPFNetworkDidCloseNotification; // 关闭连接
|
||||
extern NSString *const kJPFNetworkDidRegisterNotification; // 注册成功
|
||||
extern NSString *const kJPFNetworkFailedRegisterNotification; //注册失败
|
||||
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
|
||||
JPAuthorizationOptionCarPlay = (1 << 3), // The ability to display notifications in a CarPlay environment.
|
||||
JPAuthorizationOptionCriticalAlert NS_AVAILABLE_IOS(12.0) = (1 << 4) , //The ability to play sounds for critical alerts.
|
||||
JPAuthorizationOptionProvidesAppNotificationSettings NS_AVAILABLE_IOS(12.0) = (1 << 5) , //An option indicating the system should display a button for in-app notification settings.
|
||||
JPAuthorizationOptionProvisional NS_AVAILABLE_IOS(12.0) = (1 << 6) , //The ability to post noninterrupting notifications provisionally to the Notification Center.
|
||||
JPAuthorizationOptionAnnouncement NS_AVAILABLE_IOS(13.0) = (1 << 7) , //The ability for Siri to automatically read out messages over AirPods.
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSUInteger, JPAuthorizationStatus) {
|
||||
JPAuthorizationNotDetermined = 0, // The user has not yet made a choice regarding whether the application may post user notifications.
|
||||
JPAuthorizationStatusDenied, // The application is not authorized to post user notifications.
|
||||
JPAuthorizationStatusAuthorized, // The application is authorized to post user notifications.
|
||||
JPAuthorizationStatusProvisional NS_AVAILABLE_IOS(12.0), // The application is authorized to post non-interruptive user notifications.
|
||||
};
|
||||
|
||||
/*!
|
||||
* 通知注册实体类
|
||||
*/
|
||||
@interface JPUSHRegisterEntity : NSObject
|
||||
|
||||
/*!
|
||||
* 支持的类型
|
||||
* badge,sound,alert
|
||||
*/
|
||||
@property (nonatomic, assign) NSInteger types;
|
||||
/*!
|
||||
* 注入的类别
|
||||
* iOS10 UNNotificationCategory
|
||||
* iOS8-iOS9 UIUserNotificationCategory
|
||||
*/
|
||||
@property (nonatomic, strong, nullable) NSSet *categories;
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 进行删除、查找推送实体类
|
||||
*/
|
||||
@interface JPushNotificationIdentifier : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, copy, nullable) NSArray<NSString *> * identifiers; // 推送的标识数组
|
||||
@property (nonatomic, copy, nullable) UILocalNotification * notificationObj NS_DEPRECATED_IOS(4_0, 10_0); // iOS10以下可以传UILocalNotification对象数据,iOS10以上无效
|
||||
@property (nonatomic, assign) BOOL delivered NS_AVAILABLE_IOS(10_0); // 在通知中心显示的或待推送的标志,默认为NO,YES表示在通知中心显示的,NO表示待推送的
|
||||
@property (nonatomic, copy, nullable) void (^findCompletionHandler)(NSArray * _Nullable results); // 用于查询回调,调用[findNotification:]方法前必须设置,results为返回相应对象数组,iOS10以下返回UILocalNotification对象数组;iOS10以上根据delivered传入值返回UNNotification或UNNotificationRequest对象数组(delivered传入YES,则返回UNNotification对象数组,否则返回UNNotificationRequest对象数组)
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 推送通知声音实体类
|
||||
* iOS10以上有效
|
||||
*/
|
||||
@interface JPushNotificationSound : NSObject <NSCopying, NSCoding>
|
||||
@property (nonatomic, copy, nullable) NSString *soundName; //普通通知铃声
|
||||
@property (nonatomic, copy, nullable) NSString *criticalSoundName NS_AVAILABLE_IOS(12.0); //警告通知铃声
|
||||
@property (nonatomic, assign) float criticalSoundVolume NS_AVAILABLE_IOS(12.0); //警告通知铃声音量,有效值在0~1之间,默认为1
|
||||
@end
|
||||
|
||||
|
||||
/*!
|
||||
* 推送内容实体类
|
||||
*/
|
||||
@interface JPushNotificationContent : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, copy) NSString *title; // 推送标题
|
||||
@property (nonatomic, copy) NSString *subtitle; // 推送副标题
|
||||
@property (nonatomic, copy) NSString *body; // 推送内容
|
||||
@property (nonatomic, copy, nullable) NSNumber *badge; // 角标的数字。如果不需要改变角标传@(-1)
|
||||
@property (nonatomic, copy) NSString *action NS_DEPRECATED_IOS(8_0, 10_0); // 弹框的按钮显示的内容(IOS 8默认为"打开", 其他默认为"启动",iOS10以上无效)
|
||||
@property (nonatomic, copy) NSString *categoryIdentifier; // 行为分类标识
|
||||
@property (nonatomic, copy) NSDictionary *userInfo; // 本地推送时可以设置userInfo来增加附加信息,远程推送时设置的payload推送内容作为此userInfo
|
||||
@property (nonatomic, copy, nullable) NSString *sound; // 声音名称,不设置则为默认声音
|
||||
@property (nonatomic, copy, nullable) JPushNotificationSound *soundSetting NS_AVAILABLE_IOS(10.0); //推送声音实体
|
||||
@property (nonatomic, copy) NSArray *attachments NS_AVAILABLE_IOS(10_0); // 附件,iOS10以上有效,需要传入UNNotificationAttachment对象数组类型
|
||||
@property (nonatomic, copy) NSString *threadIdentifier NS_AVAILABLE_IOS(10_0); // 线程或与推送请求相关对话的标识,iOS10以上有效,可用来对推送进行分组
|
||||
@property (nonatomic, copy) NSString *launchImageName NS_AVAILABLE_IOS(10_0); // 启动图片名,iOS10以上有效,从推送启动时将会用到
|
||||
@property (nonatomic, copy) NSString *summaryArgument NS_AVAILABLE_IOS(12.0); //插入到通知摘要中的部分参数。iOS12以上有效。
|
||||
@property (nonatomic, assign) NSUInteger summaryArgumentCount NS_AVAILABLE_IOS(12.0); //插入到通知摘要中的项目数。iOS12以上有效。
|
||||
@property (nonatomic, copy, nullable) NSString *targetContentIdentifier NS_AVAILABLE_IOS(13.0); // An identifier for the content of the notification used by the system to customize the scene to be activated when tapping on a notification.
|
||||
//iOS15以上的新增属性 interruptionLevel为枚举UNNotificationInterruptionLevel
|
||||
// The interruption level determines the degree of interruption associated with the notification
|
||||
@property (nonatomic, assign) NSUInteger interruptionLevel NS_AVAILABLE_IOS(15.0);
|
||||
// Relevance score determines the sorting for the notification across app notifications. The expected range is between 0.0f and 1.0f.
|
||||
@property (nonatomic, assign) double relevanceScore NS_AVAILABLE_IOS(15.0);
|
||||
// iOS16以上的新增属性
|
||||
@property (nonatomic, copy, nullable) NSString * filterCriteria NS_AVAILABLE_IOS(16.0); // default nil
|
||||
|
||||
@end
|
||||
|
||||
|
||||
/*!
|
||||
* 推送触发方式实体类
|
||||
* 注:dateComponents、timeInterval、region在iOS10以上可选择其中一个参数传入有效值,如果同时传入值会根据优先级I、II、III使其中一种触发方式生效,fireDate为iOS10以下根据时间触发时须传入的参数
|
||||
*/
|
||||
@interface JPushNotificationTrigger : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, assign) BOOL repeat; // 设置是否重复,默认为NO
|
||||
@property (nonatomic, copy) NSDate *fireDate NS_DEPRECATED_IOS(2_0, 10_0); // 用来设置触发推送的时间,iOS10以上无效
|
||||
@property (nonatomic, copy) CLRegion *region NS_AVAILABLE_IOS(8_0); // 用来设置触发推送的位置,iOS8以上有效,iOS10以上优先级为I,应用需要有允许使用定位的授权
|
||||
@property (nonatomic, copy) NSDateComponents *dateComponents NS_AVAILABLE_IOS(10_0); // 用来设置触发推送的日期时间,iOS10以上有效,优先级为II
|
||||
@property (nonatomic, assign) NSTimeInterval timeInterval NS_AVAILABLE_IOS(10_0); // 用来设置触发推送的时间,iOS10以上有效,优先级为III
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 注册或更新推送实体类
|
||||
*/
|
||||
@interface JPushNotificationRequest : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, copy) NSString *requestIdentifier; // 推送请求标识
|
||||
@property (nonatomic, copy) JPushNotificationContent *content; // 设置推送的具体内容
|
||||
@property (nonatomic, copy) JPushNotificationTrigger *trigger; // 设置推送的触发方式
|
||||
@property (nonatomic, copy, nullable) void (^completionHandler)(id result); // 注册或更新推送成功回调,iOS10以上成功则result为UNNotificationRequest对象,失败则result为nil;iOS10以下成功result为UILocalNotification对象,失败则result为nil
|
||||
|
||||
@end
|
||||
|
||||
|
||||
/*!
|
||||
* 应用内消息内容实体
|
||||
*/
|
||||
@interface JPushInAppMessage : NSObject
|
||||
|
||||
@property (nonatomic, copy) NSString *mesageId; // 消息id
|
||||
@property (nonatomic, copy) NSString *title; // 标题
|
||||
@property (nonatomic, copy) NSString *content; // 内容
|
||||
@property (nonatomic, strong) NSArray *target; // 目标页面
|
||||
@property (nonatomic, copy) NSString *clickAction; // 跳转地址
|
||||
@property (nonatomic, strong) NSDictionary *extras; // 附加字段
|
||||
|
||||
@end
|
||||
|
||||
@interface JPushCollectControl : NSObject
|
||||
|
||||
/* ssid SSID信息。设置为NO,不采集SSID信息。默认为YES。 */
|
||||
@property (nonatomic, assign) BOOL ssid;
|
||||
/* bssid BSSID信息。设置为NO,不采集BSSID信息。默认为YES。 */
|
||||
@property (nonatomic, assign) BOOL bssid;
|
||||
/* cell 基站信息。设置为NO,不采集基站信息。默认为YES。*/
|
||||
@property (nonatomic, assign) BOOL cell;
|
||||
/* gps 经纬度信息。设置为NO,不采集经纬度信息。默认为YES。 */
|
||||
@property (nonatomic, assign) BOOL gps;
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* JPush 核心头文件
|
||||
*/
|
||||
@interface JPUSHService : NSObject
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Setup 启动相关
|
||||
///----------------------------------------------------
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 启动SDK
|
||||
*
|
||||
* @param launchingOption 启动参数.
|
||||
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
|
||||
* @param channel 发布渠道. 可选.
|
||||
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
|
||||
* App 证书环境取决于profile provision的配置,此处建议与证书环境保持一致.
|
||||
*
|
||||
* @discussion 提供SDK启动必须的参数, 来启动 SDK.
|
||||
* 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作.
|
||||
*/
|
||||
+ (void)setupWithOption:(nullable NSDictionary *)launchingOption
|
||||
appKey:(NSString *)appKey
|
||||
channel:(nullable NSString *)channel
|
||||
apsForProduction:(BOOL)isProduction;
|
||||
|
||||
/*!
|
||||
* @abstract 启动SDK
|
||||
*
|
||||
* @param launchingOption 启动参数.
|
||||
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
|
||||
* @param channel 发布渠道. 可选.
|
||||
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
|
||||
* App 证书环境取决于profile provision的配置,此处建议与证书环境保持一致.
|
||||
* @param advertisingId 广告标识符(IDFA) 如果不需要使用IDFA,传nil.
|
||||
*
|
||||
* @discussion 提供SDK启动必须的参数, 来启动 SDK.
|
||||
* 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作.
|
||||
*/
|
||||
+ (void)setupWithOption:(nullable NSDictionary *)launchingOption
|
||||
appKey:(NSString *)appKey
|
||||
channel:(nullable NSString *)channel
|
||||
apsForProduction:(BOOL)isProduction
|
||||
advertisingIdentifier:(nullable NSString *)advertisingId;
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name APNs about 通知相关
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 注册要处理的远程通知类型
|
||||
*
|
||||
* @param types 通知类型
|
||||
* @param categories 类别组
|
||||
*
|
||||
*/
|
||||
+ (void)registerForRemoteNotificationTypes:(NSUInteger)types
|
||||
categories:(nullable NSSet *)categories;
|
||||
/*!
|
||||
* @abstract 新版本的注册方法(兼容iOS10)
|
||||
*
|
||||
* @param config 注册通知配置
|
||||
* @param delegate 代理
|
||||
*
|
||||
*/
|
||||
+ (void)registerForRemoteNotificationConfig:(JPUSHRegisterEntity *)config delegate:(nullable id<JPUSHRegisterDelegate>)delegate;
|
||||
|
||||
|
||||
+ (void)registerDeviceToken:(NSData *)deviceToken;
|
||||
|
||||
/*!
|
||||
* @abstract 上报liveactivity的启动token
|
||||
*
|
||||
* @param activityAttributes 某liveActivity定义的属性类型
|
||||
* @param pushToStartToken 对应该liveactivity的pushToStartToken,如有更新,请及时调用该方法更新pushToStartToken
|
||||
* @param completion 响应回调
|
||||
* @param seq 请求序列号
|
||||
*/
|
||||
+ (void)registerLiveActivity:(NSString *)activityAttributes
|
||||
pushToStartToken:(nullable NSData *)pushToStartToken
|
||||
completion:(nullable JPUSHLiveActivityTokenCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/*!
|
||||
* @abstract 注册liveActivity并上报其pushToken
|
||||
* 在pushToken有变化的时候同步调用该接口。
|
||||
* 在liveActivity结束的时候,请同步调用该接口,pushToken传nil
|
||||
*
|
||||
* @param liveActivityId 标识某一个liveActivity
|
||||
* @param pushToken 对应该liveActivity的pushToken,如有更新,请及时调用该方法更新pushToken
|
||||
* @param completion 响应回调
|
||||
* @param seq 请求序列号
|
||||
*/
|
||||
+ (void)registerLiveActivity:(NSString *)liveActivityId
|
||||
pushToken:(nullable NSData *)pushToken
|
||||
completion:(nullable JPUSHLiveActivityTokenCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/*!
|
||||
* @abstract 处理收到的 APNs 消息
|
||||
*/
|
||||
+ (void)handleRemoteNotification:(NSDictionary *)remoteInfo;
|
||||
|
||||
/*!
|
||||
* @abstract 向极光服务器提交Token
|
||||
*
|
||||
* @param voipToken 推送使用的Voip Token
|
||||
*/
|
||||
+ (void)registerVoipToken:(NSData *)voipToken;
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 处理收到的 Voip 消息
|
||||
*
|
||||
* @param remoteInfo 下发的 Voip 内容
|
||||
*/
|
||||
+ (void)handleVoipNotification:(NSDictionary *)remoteInfo;
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 检测通知授权状态
|
||||
* @param completion 授权结果通过status值返回,详见JPAuthorizationStatus
|
||||
*/
|
||||
+ (void)requestNotificationAuthorization:(nullable void (^)(JPAuthorizationStatus status))completion;
|
||||
|
||||
/*!
|
||||
* @abstract 跳转至系统设置页面,iOS8及以上有效
|
||||
*/
|
||||
+ (void)openSettingsForNotification:(nullable void (^)(BOOL success))completionHandler NS_AVAILABLE_IOS(8_0);
|
||||
|
||||
/*!
|
||||
* Tags操作接口
|
||||
* 支持增加/覆盖/删除/清空/查询操作
|
||||
* 详情请参考文档:https://docs.jiguang.cn/jpush/client/iOS/ios_api/)
|
||||
*/
|
||||
|
||||
/**
|
||||
增加tags
|
||||
|
||||
@param tags 需要增加的tags集合
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)addTags:(NSSet<NSString *> *)tags
|
||||
completion:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
覆盖tags
|
||||
调用该接口会覆盖用户所有的tags
|
||||
|
||||
@param tags 需要设置的tags集合
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)setTags:(NSSet<NSString *> *)tags
|
||||
completion:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
删除指定tags
|
||||
|
||||
@param tags 需要删除的tags集合
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)deleteTags:(NSSet<NSString *> *)tags
|
||||
completion:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
清空所有tags
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)cleanTags:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
查询全部tags
|
||||
|
||||
@param completion 响应回调,请在回调中获取查询结果
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)getAllTags:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
验证tag是否绑定
|
||||
|
||||
@param completion 响应回调,回调中查看是否绑定
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)validTag:(NSString *)tag
|
||||
completion:(nullable JPUSHTagValidOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
设置Alias
|
||||
|
||||
@param alias 需要设置的alias
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)setAlias:(NSString *)alias
|
||||
completion:(nullable JPUSHAliasOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
删除alias
|
||||
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)deleteAlias:(nullable JPUSHAliasOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
查询当前alias
|
||||
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)getAlias:(nullable JPUSHAliasOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 过滤掉无效的 tags
|
||||
*
|
||||
* @discussion 如果 tags 数量超过限制数量, 则返回靠前的有效的 tags.
|
||||
* 建议设置 tags 前用此接口校验. SDK 内部也会基于此接口来做过滤.
|
||||
*/
|
||||
+ (NSSet *)filterValidTags:(NSSet *)tags;
|
||||
|
||||
|
||||
/*!
|
||||
* Property操作接口
|
||||
* 支持增加/删除/清空操作
|
||||
* 详情请参考文档:https://docs.jiguang.cn/jpush/client/iOS/ios_api/)
|
||||
*/
|
||||
|
||||
/**
|
||||
新增/更新用户属性
|
||||
|
||||
如果某个用户属性之前已经存在了,则会更新;不存在,则会新增
|
||||
|
||||
@param properties 需要新增或者更新的的用户属性内容,类型为NSDictionary;
|
||||
Key 为用户属性名称,类型必须是 NSString 类型;Value为用户属性值,只支持 NSString、NSNumber、NSDate类型,如果属性为BOOL类型,传值时请转成NSNumber类型
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)setProperties:(NSDictionary *)properties
|
||||
completion:(nullable JPUSHPropertiesOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
|
||||
/**
|
||||
删除指定属性
|
||||
|
||||
@param keys 需要删除的属性名称集合
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)deleteProperties:(NSSet<NSString *> *)keys
|
||||
completion:(nullable JPUSHPropertiesOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
|
||||
/**
|
||||
清空所有属性
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)cleanProperties:(nullable JPUSHPropertiesOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
|
||||
/*!
|
||||
* 应用内消息接口
|
||||
* 使用应用内消息需要配置以下两个接口。请在进入页面和离开页面的时候相应地配置。以下两个接口请配套调用。
|
||||
*/
|
||||
|
||||
/**
|
||||
进入页面
|
||||
|
||||
请与 + (void)pageLeave:(NSString *)pageName; 方法配套使用
|
||||
|
||||
@param pageName 页面名
|
||||
@discussion 使用应用内消息功能,需要配置pageEnterTo:和pageLeave:函数。
|
||||
*/
|
||||
+ (void)pageEnterTo:(NSString *)pageName;
|
||||
|
||||
|
||||
/**
|
||||
离开页面
|
||||
|
||||
请与 + (void)pageEnterTo:(NSString *)pageName;方法配套使用
|
||||
|
||||
@param pageName 页面名
|
||||
@discussion 使用应用内消息功能,需要配置pageEnterTo:和pageLeave:函数。
|
||||
*/
|
||||
+ (void)pageLeave:(NSString *)pageName;
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 设置应用内消息的代理
|
||||
*
|
||||
* @discussion 遵守JPUSHInAppMessageDelegate的代理对象
|
||||
*
|
||||
*/
|
||||
+ (void)setInAppMessageDelegate:(id<JPUSHInAppMessageDelegate>)inAppMessageDelegate;
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Stats 统计功能
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 开始记录页面停留
|
||||
*
|
||||
* @param pageName 页面名称
|
||||
* @discussion JCore 1.1.8 版本后,如需统计页面流,请使用 JAnalytics
|
||||
*/
|
||||
+ (void)startLogPageView:(NSString *)pageName __attribute__((deprecated("JCore 1.1.8 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 停止记录页面停留
|
||||
*
|
||||
* @param pageName 页面
|
||||
* @discussion JCore 1.1.8 版本后,如需统计页面流,请使用 JAnalytics
|
||||
*/
|
||||
+ (void)stopLogPageView:(NSString *)pageName __attribute__((deprecated("JCore 1.1.8 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 直接上报在页面的停留时间
|
||||
*
|
||||
* @param pageName 页面
|
||||
* @param seconds 停留的秒数
|
||||
* @discussion JCore 1.1.8 版本后,如需统计页面流,请使用 JAnalytics
|
||||
*/
|
||||
+ (void)beginLogPageView:(NSString *)pageName duration:(int)seconds __attribute__((deprecated("JCore 1.1.8 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 开启Crash日志收集
|
||||
*
|
||||
* @discussion 默认是关闭状态.
|
||||
*/
|
||||
+ (void)crashLogON;
|
||||
|
||||
/*!
|
||||
* @abstract 地理位置上报
|
||||
*
|
||||
* @param latitude 纬度.
|
||||
* @param longitude 经度.
|
||||
*
|
||||
*/
|
||||
+ (void)setLatitude:(double)latitude longitude:(double)longitude;
|
||||
|
||||
/*!
|
||||
* @abstract 地理位置上报
|
||||
*
|
||||
* @param location 直接传递 CLLocation * 型的地理信息
|
||||
*
|
||||
* @discussion 需要链接 CoreLocation.framework 并且 #import <CoreLocation/CoreLocation.h>
|
||||
*/
|
||||
+ (void)setLocation:(CLLocation *)location;
|
||||
|
||||
/**
|
||||
设置地理围栏的最大个数
|
||||
默认值为 10 ,iOS系统默认地理围栏最大个数为20
|
||||
@param count 个数 count
|
||||
*/
|
||||
+ (void)setGeofeneceMaxCount:(NSInteger)count;
|
||||
|
||||
/**
|
||||
设置地理围栏'圈内'类型的检测周期
|
||||
默认15分钟检测一次
|
||||
*/
|
||||
+ (void)setGeofenecePeriodForInside:(NSInteger)seconds;
|
||||
|
||||
/**
|
||||
注册地理围栏的代理
|
||||
|
||||
@param delegate 代理
|
||||
@param launchOptions app启动完成是收到的字段参数
|
||||
*/
|
||||
+ (void)registerLbsGeofenceDelegate:(id<JPUSHGeofenceDelegate>)delegate withLaunchOptions:(nullable NSDictionary *)launchOptions;
|
||||
|
||||
/**
|
||||
删除地理围栏
|
||||
|
||||
@param geofenceId 地理围栏id
|
||||
*/
|
||||
+ (void)removeGeofenceWithIdentifier:(NSString *)geofenceId;
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Local Notification 本地通知
|
||||
///----------------------------------------------------
|
||||
/*!
|
||||
* @abstract 注册或更新推送 (支持iOS10,并兼容iOS10以下版本)
|
||||
*
|
||||
* JPush 2.1.9新接口
|
||||
* @param request JPushNotificationRequest类型,设置推送的属性,设置已有推送的request.requestIdentifier即更新已有的推送,否则为注册新推送,更新推送仅仅在iOS10以上有效,结果通过request.completionHandler返回
|
||||
* @discussion 旧的注册本地推送接口被废弃,使用此接口可以替换
|
||||
*
|
||||
*/
|
||||
+ (void)addNotification:(JPushNotificationRequest *)request;
|
||||
|
||||
/*!
|
||||
* @abstract 移除推送 (支持iOS10,并兼容iOS10以下版本)
|
||||
*
|
||||
* JPush 2.1.9新接口
|
||||
* @param identifier JPushNotificationIdentifier类型,iOS10以上identifier设置为nil,则移除所有在通知中心显示推送和待推送请求,也可以通过设置identifier.delivered和identifier.identifiers来移除相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则移除相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier设置为nil,则移除所有推送,identifier.delivered属性无效,另外可以通过identifier.notificationObj传入特定推送对象来移除此推送。
|
||||
* @discussion 旧的所有删除推送接口被废弃,使用此接口可以替换
|
||||
*
|
||||
*/
|
||||
+ (void)removeNotification:(nullable JPushNotificationIdentifier *)identifier;
|
||||
|
||||
/*!
|
||||
* @abstract 查找推送 (支持iOS10,并兼容iOS10以下版本)
|
||||
*
|
||||
* JPush 2.1.9新接口
|
||||
* @param identifier JPushNotificationIdentifier类型,iOS10以上可以通过设置identifier.delivered和identifier.identifiers来查找相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则返回相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier.delivered属性无效,identifier.identifiers如果设置nil或空数组则返回所有未触发的推送。须要设置identifier.findCompletionHandler回调才能得到查找结果,通过(NSArray *results)返回相应对象数组。
|
||||
* @discussion 旧的查找推送接口被废弃,使用此接口可以替换
|
||||
*
|
||||
*/
|
||||
+ (void)findNotification:(JPushNotificationIdentifier *)identifier;
|
||||
|
||||
/*!
|
||||
* @abstract 本地推送,最多支持64个
|
||||
*
|
||||
* @param fireDate 本地推送触发的时间
|
||||
* @param alertBody 本地推送需要显示的内容
|
||||
* @param badge 角标的数字。如果不需要改变角标传-1
|
||||
* @param alertAction 弹框的按钮显示的内容(IOS 8默认为"打开", 其他默认为"启动")
|
||||
* @param notificationKey 本地推送标示符
|
||||
* @param userInfo 自定义参数,可以用来标识推送和增加附加信息
|
||||
* @param soundName 自定义通知声音,设置为nil为默认声音
|
||||
*
|
||||
* @discussion 最多支持 64 个定义,此方法被[addNotification:]方法取代
|
||||
*/
|
||||
+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate
|
||||
alertBody:(NSString *)alertBody
|
||||
badge:(int)badge
|
||||
alertAction:(NSString *)alertAction
|
||||
identifierKey:(NSString *)notificationKey
|
||||
userInfo:(NSDictionary *)userInfo
|
||||
soundName:(NSString *)soundName __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 本地推送 (支持 iOS8 新参数)
|
||||
*
|
||||
* IOS8新参数
|
||||
* @param region 自定义参数
|
||||
* @param regionTriggersOnce 自定义参数
|
||||
* @param category 自定义参数
|
||||
* @discussion 此方法被[addNotification:]方法取代
|
||||
*/
|
||||
+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate
|
||||
alertBody:(NSString *)alertBody
|
||||
badge:(int)badge
|
||||
alertAction:(NSString *)alertAction
|
||||
identifierKey:(NSString *)notificationKey
|
||||
userInfo:(NSDictionary *)userInfo
|
||||
soundName:(NSString *)soundName
|
||||
region:(CLRegion *)region
|
||||
regionTriggersOnce:(BOOL)regionTriggersOnce
|
||||
category:(NSString *)category NS_AVAILABLE_IOS(8_0) __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 前台展示本地推送
|
||||
*
|
||||
* @param notification 本地推送对象
|
||||
* @param notificationKey 需要前台显示的本地推送通知的标示符
|
||||
*
|
||||
* @discussion 默认App在前台运行时不会进行弹窗,在程序接收通知调用此接口可实现指定的推送弹窗。--iOS10以下还可继续使用,iOS10以上在[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:]方法中调用completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);即可
|
||||
*/
|
||||
+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification
|
||||
identifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
/*!
|
||||
* @abstract 删除本地推送定义
|
||||
*
|
||||
* @param notificationKey 本地推送标示符
|
||||
* @discussion 此方法被[removeNotification:]方法取代
|
||||
*/
|
||||
+ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 删除本地推送定义
|
||||
* @discussion 此方法被[removeNotification:]方法取代
|
||||
*/
|
||||
+ (void)deleteLocalNotification:(UILocalNotification *)localNotification __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 获取指定通知
|
||||
*
|
||||
* @param notificationKey 本地推送标示符
|
||||
* @return 本地推送对象数组, [array count]为0时表示没找到
|
||||
* @discussion 此方法被[findNotification:]方法取代
|
||||
*/
|
||||
+ (NSArray *)findLocalNotificationWithIdentifier:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 清除所有本地推送对象
|
||||
* @discussion 此方法被[removeNotification:]方法取代
|
||||
*/
|
||||
+ (void)clearAllLocalNotifications __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Server badge 服务器端 badge 功能
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 设置角标(到服务器)
|
||||
*
|
||||
* @param value 新的值. 会覆盖服务器上保存的值(这个用户)
|
||||
*
|
||||
* @discussion 本接口不会改变应用本地的角标值.
|
||||
* 本地仍须调用 UIApplication:setApplicationIconBadgeNumber 函数来设置脚标.
|
||||
*
|
||||
* 本接口用于配合 JPush 提供的服务器端角标功能.
|
||||
* 该功能解决的问题是, 服务器端推送 APNs 时, 并不知道客户端原来已经存在的角标是多少, 指定一个固定的数字不太合理.
|
||||
*
|
||||
* JPush 服务器端脚标功能提供:
|
||||
*
|
||||
* - 通过本 API 把当前客户端(当前这个用户的) 的实际 badge 设置到服务器端保存起来;
|
||||
* - 调用服务器端 API 发 APNs 时(通常这个调用是批量针对大量用户),
|
||||
* 使用 "+1" 的语义, 来表达需要基于目标用户实际的 badge 值(保存的) +1 来下发通知时带上新的 badge 值;
|
||||
*/
|
||||
+ (BOOL)setBadge:(NSInteger)value;
|
||||
|
||||
/*!
|
||||
* @abstract 重置脚标(为0)
|
||||
*
|
||||
* @discussion 相当于 [setBadge:0] 的效果.
|
||||
* 参考 [JPUSHService setBadge:] 说明来理解其作用.
|
||||
*/
|
||||
+ (void)resetBadge;
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Other Feature 其他功能
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 设置手机号码(到服务器)
|
||||
*
|
||||
* @param mobileNumber 手机号码. 会与用户信息一一对应。可为空,为空则清除号码
|
||||
* @param completion 响应回调。成功则error为空,失败则error带有错误码及错误信息
|
||||
*
|
||||
* @discussion 设置手机号码后,可实现“推送不到短信到”的通知方式,提高推送达到率。结果信息通过completion异步返回,也可将completion设置为nil不处理结果信息。
|
||||
*
|
||||
*/
|
||||
+ (void)setMobileNumber:(NSString *)mobileNumber completion:(nullable void (^)(NSError *error))completion;
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Logs and others 日志与其他
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract JPush标识此设备的 registrationID
|
||||
*
|
||||
* @discussion SDK注册成功后, 调用此接口获取到 registrationID 才能够获取到.
|
||||
*
|
||||
* JPush 支持根据 registrationID 来进行推送.
|
||||
* 如果你需要此功能, 应该通过此接口获取到 registrationID 后, 上报到你自己的服务器端, 并保存下来.
|
||||
* registrationIDCompletionHandler:是新增的获取registrationID的方法,需要在block中获取registrationID,resCode为返回码,模拟器调用此接口resCode返回1011,registrationID返回nil.
|
||||
* 更多的理解请参考 JPush 的文档网站.
|
||||
*/
|
||||
+ (NSString *)registrationID;
|
||||
|
||||
+ (void)registrationIDCompletionHandler:(void(^)(int resCode,NSString * _Nullable registrationID))completionHandler;
|
||||
|
||||
/*!
|
||||
* @abstract 打开日志级别到 Debug
|
||||
*
|
||||
* @discussion JMessage iOS 的日志系统参考 Android 设计了级别.
|
||||
* 从低到高是: Verbose, Debug, Info, Warning, Error.
|
||||
* 对日志级别的进一步理解, 请参考 Android 相关的说明.
|
||||
*
|
||||
* SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志.
|
||||
*
|
||||
* 请在SDK启动后调用本接口,调用本接口可打开日志级别为: Debug, 打印调试日志.
|
||||
*/
|
||||
+ (void)setDebugMode;
|
||||
|
||||
/*!
|
||||
* @abstract 关闭日志
|
||||
*
|
||||
* @discussion 关于日志级别的说明, 参考 [JPUSHService setDebugMode]
|
||||
*
|
||||
* 虽说是关闭日志, 但还是会打印 Warning, Error 日志. 这二种日志级别, 在程序运行正常时, 不应有打印输出.
|
||||
*
|
||||
* 建议在发布的版本里, 调用此接口, 关闭掉日志打印.
|
||||
*/
|
||||
+ (void)setLogOFF;
|
||||
|
||||
/*!
|
||||
数据采集控制
|
||||
|
||||
@param control 数据采集配置。
|
||||
*/
|
||||
+ (void)setCollectControl:(JPushCollectControl *)control;
|
||||
|
||||
/*!
|
||||
* @abstract 设置SDK地理位置权限开关
|
||||
*
|
||||
* @discussion 关闭地理位置之后,SDK地理围栏的相关功能将受到影响,默认是开启。
|
||||
*
|
||||
*/
|
||||
+ (void)setLocationEanable:(BOOL)isEanble;
|
||||
|
||||
/*!
|
||||
* @abstract 设置PUSH开关
|
||||
*
|
||||
* @discussion 关闭PUSH之后,将接收不到极光通知推送、自定义消息推送、liveActivity消息推送,默认是开启。
|
||||
*
|
||||
*/
|
||||
+ (void)setPushEnable:(BOOL)isEnable completion:(nullable void (^)(NSInteger iResCode))completion;
|
||||
|
||||
/*!
|
||||
* @abstract 设置用户分群推送功能开关
|
||||
*
|
||||
* @param isEnable YES:开启,NO:关闭,默认是开启。
|
||||
*
|
||||
*/
|
||||
+ (void)setSmartPushEnable:(BOOL)isEnable;
|
||||
|
||||
/*!
|
||||
* @abstract 设置应用内提醒消息的代理
|
||||
*
|
||||
* @discussion 遵守JPushNotiInMessageDelegate的代理对象
|
||||
*
|
||||
*/
|
||||
+ (void)setNotiInMessageDelegate:(id<JPUSHNotiInMessageDelegate>)notiInMessageDelegate;
|
||||
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
///********************下列方法已过期********************
|
||||
///**************请使用新版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;
|
||||
@class UNNotificationResponse;
|
||||
|
||||
@protocol JPUSHRegisterDelegate <NSObject>
|
||||
|
||||
/*
|
||||
* @brief handle UserNotifications.framework [willPresentNotification:withCompletionHandler:]
|
||||
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心
|
||||
* @param notification 前台得到的的通知对象
|
||||
* @param completionHandler 该callback中的options 请使用UNNotificationPresentationOptions
|
||||
*/
|
||||
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger options))completionHandler;
|
||||
/*
|
||||
* @brief handle UserNotifications.framework [didReceiveNotificationResponse:withCompletionHandler:]
|
||||
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心
|
||||
* @param response 通知响应对象
|
||||
* @param completionHandler
|
||||
*/
|
||||
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler;
|
||||
|
||||
/*
|
||||
* @brief handle UserNotifications.framework [openSettingsForNotification:]
|
||||
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心
|
||||
* @param notification 当前管理的通知对象
|
||||
*/
|
||||
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center openSettingsForNotification:(UNNotification *)notification NS_AVAILABLE_IOS(12.0);
|
||||
|
||||
/**
|
||||
* 监测通知授权状态返回的结果
|
||||
* @param status 授权通知状态,详见JPAuthorizationStatus
|
||||
* @param info 更多信息,预留参数
|
||||
*/
|
||||
- (void)jpushNotificationAuthorization:(JPAuthorizationStatus)status withInfo:(nullable NSDictionary *)info;
|
||||
|
||||
@end
|
||||
|
||||
@protocol JPUSHGeofenceDelegate <NSObject>
|
||||
/**
|
||||
触发地理围栏
|
||||
@param geofence 地理围栏触发时返回的信息
|
||||
@param error 错误信息
|
||||
*/
|
||||
- (void)jpushGeofenceRegion:(nullable NSDictionary *)geofence
|
||||
error:(nullable NSError *)error;
|
||||
|
||||
/**
|
||||
拉取地理围栏列表的回调
|
||||
|
||||
@param geofenceList 地理围栏列表
|
||||
*/
|
||||
- (void)jpushCallbackGeofenceReceived:(nullable NSArray<NSDictionary*> *)geofenceList;
|
||||
|
||||
/**
|
||||
进入地理围栏区域
|
||||
|
||||
@param geofenceId 地理围栏id
|
||||
@param userInfo 地理围栏触发时返回的信息
|
||||
@param error 错误信息
|
||||
*/
|
||||
- (void)jpushGeofenceIdentifer:(NSString *)geofenceId didEnterRegion:(NSDictionary *_Nullable)userInfo error:(NSError *_Nullable)error __attribute__((deprecated("JPush 3.6.0 版本已过期")));
|
||||
|
||||
/**
|
||||
离开地理围栏区域
|
||||
|
||||
@param geofenceId 地理围栏id
|
||||
@param userInfo 地理围栏触发时返回的信息
|
||||
@param error 错误信息
|
||||
*/
|
||||
- (void)jpushGeofenceIdentifer:(NSString *)geofenceId didExitRegion:(NSDictionary *_Nullable)userInfo error:(NSError *_Nullable)error __attribute__((deprecated("JPush 3.6.0 版本已过期")));
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@protocol JPUSHNotiInMessageDelegate <NSObject>
|
||||
|
||||
/**
|
||||
应用内提醒消息展示的回调
|
||||
|
||||
@param content 应用内提醒消息的内容
|
||||
|
||||
*/
|
||||
- (void)jPushNotiInMessageDidShowWithContent:(NSDictionary *)content;
|
||||
|
||||
/**
|
||||
应用内提醒消息点击的回调
|
||||
|
||||
@param content 应用内提醒消息的内容
|
||||
|
||||
*/
|
||||
- (void)jPushNotiInMessageDidClickWithContent:(NSDictionary *)content;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@protocol JPUSHInAppMessageDelegate <NSObject>
|
||||
|
||||
/**
|
||||
应用内消息展示的回调
|
||||
|
||||
@param inAppMessage 应用内消息的内容
|
||||
|
||||
*/
|
||||
- (void)jPushInAppMessageDidShow:(JPushInAppMessage *)inAppMessage;
|
||||
|
||||
/**
|
||||
应用内消息点击的回调
|
||||
|
||||
@param inAppMessage 应用内消息的内容
|
||||
|
||||
*/
|
||||
- (void)jPushInAppMessageDidClick:(JPushInAppMessage *)inAppMessage;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
@ -0,0 +1,23 @@
|
||||
<?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>NSPrivacyTrackingDomains</key>
|
||||
<array/>
|
||||
<key>NSPrivacyCollectedDataTypes</key>
|
||||
<array/>
|
||||
<key>NSPrivacyTracking</key>
|
||||
<false/>
|
||||
<key>NSPrivacyAccessedAPITypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||
<array>
|
||||
<string>CA92.1</string>
|
||||
</array>
|
||||
<key>NSPrivacyAccessedAPIType</key>
|
||||
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
BIN
src/ios/lib/jpush-ios-5.6.0.xcframework/ios-arm64/libJPush.a
Normal file
@ -0,0 +1,982 @@
|
||||
/*
|
||||
* | | | | \ \ / / | | | | / _______|
|
||||
* | |____| | \ \/ / | |____| | / /
|
||||
* | |____| | \ / | |____| | | | _____
|
||||
* | | | | / \ | | | | | | |____ |
|
||||
* | | | | / /\ \ | | | | \ \______| |
|
||||
* | | | | /_/ \_\ | | | | \_________|
|
||||
*
|
||||
* Copyright (c) 2011 ~ 2017 Shenzhen HXHG. All rights reserved.
|
||||
*/
|
||||
|
||||
#define JPUSH_VERSION_NUMBER 5.6.0
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class CLRegion;
|
||||
@class UILocalNotification;
|
||||
@class CLLocation;
|
||||
@class UNNotificationCategory;
|
||||
@class UNNotificationSettings;
|
||||
@class UNNotificationRequest;
|
||||
@class UNNotification;
|
||||
@class UIView;
|
||||
@protocol JPUSHRegisterDelegate;
|
||||
@protocol JPUSHGeofenceDelegate;
|
||||
@protocol JPUSHNotiInMessageDelegate;
|
||||
@protocol JPUSHInAppMessageDelegate;
|
||||
|
||||
typedef void (^JPUSHTagsOperationCompletion)(NSInteger iResCode, NSSet *_Nullable iTags, NSInteger seq);
|
||||
typedef void (^JPUSHTagValidOperationCompletion)(NSInteger iResCode, NSSet *_Nullable iTags, NSInteger seq, BOOL isBind);
|
||||
typedef void (^JPUSHAliasOperationCompletion)(NSInteger iResCode, NSString *_Nullable iAlias, NSInteger seq);
|
||||
typedef void (^JPUSHPropertiesOperationCompletion)(NSInteger iResCode, NSDictionary *_Nullable properties, NSInteger seq);
|
||||
typedef void (^JPUSHLiveActivityTokenCompletion)(NSInteger iResCode, NSString *_Nullable iLiveActivityId, NSData * _Nullable pushToken, NSInteger seq);
|
||||
|
||||
extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中
|
||||
extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接
|
||||
extern NSString *const kJPFNetworkDidCloseNotification; // 关闭连接
|
||||
extern NSString *const kJPFNetworkDidRegisterNotification; // 注册成功
|
||||
extern NSString *const kJPFNetworkFailedRegisterNotification; //注册失败
|
||||
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
|
||||
JPAuthorizationOptionCarPlay = (1 << 3), // The ability to display notifications in a CarPlay environment.
|
||||
JPAuthorizationOptionCriticalAlert NS_AVAILABLE_IOS(12.0) = (1 << 4) , //The ability to play sounds for critical alerts.
|
||||
JPAuthorizationOptionProvidesAppNotificationSettings NS_AVAILABLE_IOS(12.0) = (1 << 5) , //An option indicating the system should display a button for in-app notification settings.
|
||||
JPAuthorizationOptionProvisional NS_AVAILABLE_IOS(12.0) = (1 << 6) , //The ability to post noninterrupting notifications provisionally to the Notification Center.
|
||||
JPAuthorizationOptionAnnouncement NS_AVAILABLE_IOS(13.0) = (1 << 7) , //The ability for Siri to automatically read out messages over AirPods.
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSUInteger, JPAuthorizationStatus) {
|
||||
JPAuthorizationNotDetermined = 0, // The user has not yet made a choice regarding whether the application may post user notifications.
|
||||
JPAuthorizationStatusDenied, // The application is not authorized to post user notifications.
|
||||
JPAuthorizationStatusAuthorized, // The application is authorized to post user notifications.
|
||||
JPAuthorizationStatusProvisional NS_AVAILABLE_IOS(12.0), // The application is authorized to post non-interruptive user notifications.
|
||||
};
|
||||
|
||||
/*!
|
||||
* 通知注册实体类
|
||||
*/
|
||||
@interface JPUSHRegisterEntity : NSObject
|
||||
|
||||
/*!
|
||||
* 支持的类型
|
||||
* badge,sound,alert
|
||||
*/
|
||||
@property (nonatomic, assign) NSInteger types;
|
||||
/*!
|
||||
* 注入的类别
|
||||
* iOS10 UNNotificationCategory
|
||||
* iOS8-iOS9 UIUserNotificationCategory
|
||||
*/
|
||||
@property (nonatomic, strong, nullable) NSSet *categories;
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 进行删除、查找推送实体类
|
||||
*/
|
||||
@interface JPushNotificationIdentifier : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, copy, nullable) NSArray<NSString *> * identifiers; // 推送的标识数组
|
||||
@property (nonatomic, copy, nullable) UILocalNotification * notificationObj NS_DEPRECATED_IOS(4_0, 10_0); // iOS10以下可以传UILocalNotification对象数据,iOS10以上无效
|
||||
@property (nonatomic, assign) BOOL delivered NS_AVAILABLE_IOS(10_0); // 在通知中心显示的或待推送的标志,默认为NO,YES表示在通知中心显示的,NO表示待推送的
|
||||
@property (nonatomic, copy, nullable) void (^findCompletionHandler)(NSArray * _Nullable results); // 用于查询回调,调用[findNotification:]方法前必须设置,results为返回相应对象数组,iOS10以下返回UILocalNotification对象数组;iOS10以上根据delivered传入值返回UNNotification或UNNotificationRequest对象数组(delivered传入YES,则返回UNNotification对象数组,否则返回UNNotificationRequest对象数组)
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 推送通知声音实体类
|
||||
* iOS10以上有效
|
||||
*/
|
||||
@interface JPushNotificationSound : NSObject <NSCopying, NSCoding>
|
||||
@property (nonatomic, copy, nullable) NSString *soundName; //普通通知铃声
|
||||
@property (nonatomic, copy, nullable) NSString *criticalSoundName NS_AVAILABLE_IOS(12.0); //警告通知铃声
|
||||
@property (nonatomic, assign) float criticalSoundVolume NS_AVAILABLE_IOS(12.0); //警告通知铃声音量,有效值在0~1之间,默认为1
|
||||
@end
|
||||
|
||||
|
||||
/*!
|
||||
* 推送内容实体类
|
||||
*/
|
||||
@interface JPushNotificationContent : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, copy) NSString *title; // 推送标题
|
||||
@property (nonatomic, copy) NSString *subtitle; // 推送副标题
|
||||
@property (nonatomic, copy) NSString *body; // 推送内容
|
||||
@property (nonatomic, copy, nullable) NSNumber *badge; // 角标的数字。如果不需要改变角标传@(-1)
|
||||
@property (nonatomic, copy) NSString *action NS_DEPRECATED_IOS(8_0, 10_0); // 弹框的按钮显示的内容(IOS 8默认为"打开", 其他默认为"启动",iOS10以上无效)
|
||||
@property (nonatomic, copy) NSString *categoryIdentifier; // 行为分类标识
|
||||
@property (nonatomic, copy) NSDictionary *userInfo; // 本地推送时可以设置userInfo来增加附加信息,远程推送时设置的payload推送内容作为此userInfo
|
||||
@property (nonatomic, copy, nullable) NSString *sound; // 声音名称,不设置则为默认声音
|
||||
@property (nonatomic, copy, nullable) JPushNotificationSound *soundSetting NS_AVAILABLE_IOS(10.0); //推送声音实体
|
||||
@property (nonatomic, copy) NSArray *attachments NS_AVAILABLE_IOS(10_0); // 附件,iOS10以上有效,需要传入UNNotificationAttachment对象数组类型
|
||||
@property (nonatomic, copy) NSString *threadIdentifier NS_AVAILABLE_IOS(10_0); // 线程或与推送请求相关对话的标识,iOS10以上有效,可用来对推送进行分组
|
||||
@property (nonatomic, copy) NSString *launchImageName NS_AVAILABLE_IOS(10_0); // 启动图片名,iOS10以上有效,从推送启动时将会用到
|
||||
@property (nonatomic, copy) NSString *summaryArgument NS_AVAILABLE_IOS(12.0); //插入到通知摘要中的部分参数。iOS12以上有效。
|
||||
@property (nonatomic, assign) NSUInteger summaryArgumentCount NS_AVAILABLE_IOS(12.0); //插入到通知摘要中的项目数。iOS12以上有效。
|
||||
@property (nonatomic, copy, nullable) NSString *targetContentIdentifier NS_AVAILABLE_IOS(13.0); // An identifier for the content of the notification used by the system to customize the scene to be activated when tapping on a notification.
|
||||
//iOS15以上的新增属性 interruptionLevel为枚举UNNotificationInterruptionLevel
|
||||
// The interruption level determines the degree of interruption associated with the notification
|
||||
@property (nonatomic, assign) NSUInteger interruptionLevel NS_AVAILABLE_IOS(15.0);
|
||||
// Relevance score determines the sorting for the notification across app notifications. The expected range is between 0.0f and 1.0f.
|
||||
@property (nonatomic, assign) double relevanceScore NS_AVAILABLE_IOS(15.0);
|
||||
// iOS16以上的新增属性
|
||||
@property (nonatomic, copy, nullable) NSString * filterCriteria NS_AVAILABLE_IOS(16.0); // default nil
|
||||
|
||||
@end
|
||||
|
||||
|
||||
/*!
|
||||
* 推送触发方式实体类
|
||||
* 注:dateComponents、timeInterval、region在iOS10以上可选择其中一个参数传入有效值,如果同时传入值会根据优先级I、II、III使其中一种触发方式生效,fireDate为iOS10以下根据时间触发时须传入的参数
|
||||
*/
|
||||
@interface JPushNotificationTrigger : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, assign) BOOL repeat; // 设置是否重复,默认为NO
|
||||
@property (nonatomic, copy) NSDate *fireDate NS_DEPRECATED_IOS(2_0, 10_0); // 用来设置触发推送的时间,iOS10以上无效
|
||||
@property (nonatomic, copy) CLRegion *region NS_AVAILABLE_IOS(8_0); // 用来设置触发推送的位置,iOS8以上有效,iOS10以上优先级为I,应用需要有允许使用定位的授权
|
||||
@property (nonatomic, copy) NSDateComponents *dateComponents NS_AVAILABLE_IOS(10_0); // 用来设置触发推送的日期时间,iOS10以上有效,优先级为II
|
||||
@property (nonatomic, assign) NSTimeInterval timeInterval NS_AVAILABLE_IOS(10_0); // 用来设置触发推送的时间,iOS10以上有效,优先级为III
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* 注册或更新推送实体类
|
||||
*/
|
||||
@interface JPushNotificationRequest : NSObject<NSCopying, NSCoding>
|
||||
|
||||
@property (nonatomic, copy) NSString *requestIdentifier; // 推送请求标识
|
||||
@property (nonatomic, copy) JPushNotificationContent *content; // 设置推送的具体内容
|
||||
@property (nonatomic, copy) JPushNotificationTrigger *trigger; // 设置推送的触发方式
|
||||
@property (nonatomic, copy, nullable) void (^completionHandler)(id result); // 注册或更新推送成功回调,iOS10以上成功则result为UNNotificationRequest对象,失败则result为nil;iOS10以下成功result为UILocalNotification对象,失败则result为nil
|
||||
|
||||
@end
|
||||
|
||||
|
||||
/*!
|
||||
* 应用内消息内容实体
|
||||
*/
|
||||
@interface JPushInAppMessage : NSObject
|
||||
|
||||
@property (nonatomic, copy) NSString *mesageId; // 消息id
|
||||
@property (nonatomic, copy) NSString *title; // 标题
|
||||
@property (nonatomic, copy) NSString *content; // 内容
|
||||
@property (nonatomic, strong) NSArray *target; // 目标页面
|
||||
@property (nonatomic, copy) NSString *clickAction; // 跳转地址
|
||||
@property (nonatomic, strong) NSDictionary *extras; // 附加字段
|
||||
|
||||
@end
|
||||
|
||||
@interface JPushCollectControl : NSObject
|
||||
|
||||
/* ssid SSID信息。设置为NO,不采集SSID信息。默认为YES。 */
|
||||
@property (nonatomic, assign) BOOL ssid;
|
||||
/* bssid BSSID信息。设置为NO,不采集BSSID信息。默认为YES。 */
|
||||
@property (nonatomic, assign) BOOL bssid;
|
||||
/* cell 基站信息。设置为NO,不采集基站信息。默认为YES。*/
|
||||
@property (nonatomic, assign) BOOL cell;
|
||||
/* gps 经纬度信息。设置为NO,不采集经纬度信息。默认为YES。 */
|
||||
@property (nonatomic, assign) BOOL gps;
|
||||
|
||||
@end
|
||||
|
||||
/*!
|
||||
* JPush 核心头文件
|
||||
*/
|
||||
@interface JPUSHService : NSObject
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Setup 启动相关
|
||||
///----------------------------------------------------
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 启动SDK
|
||||
*
|
||||
* @param launchingOption 启动参数.
|
||||
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
|
||||
* @param channel 发布渠道. 可选.
|
||||
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
|
||||
* App 证书环境取决于profile provision的配置,此处建议与证书环境保持一致.
|
||||
*
|
||||
* @discussion 提供SDK启动必须的参数, 来启动 SDK.
|
||||
* 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作.
|
||||
*/
|
||||
+ (void)setupWithOption:(nullable NSDictionary *)launchingOption
|
||||
appKey:(NSString *)appKey
|
||||
channel:(nullable NSString *)channel
|
||||
apsForProduction:(BOOL)isProduction;
|
||||
|
||||
/*!
|
||||
* @abstract 启动SDK
|
||||
*
|
||||
* @param launchingOption 启动参数.
|
||||
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
|
||||
* @param channel 发布渠道. 可选.
|
||||
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
|
||||
* App 证书环境取决于profile provision的配置,此处建议与证书环境保持一致.
|
||||
* @param advertisingId 广告标识符(IDFA) 如果不需要使用IDFA,传nil.
|
||||
*
|
||||
* @discussion 提供SDK启动必须的参数, 来启动 SDK.
|
||||
* 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作.
|
||||
*/
|
||||
+ (void)setupWithOption:(nullable NSDictionary *)launchingOption
|
||||
appKey:(NSString *)appKey
|
||||
channel:(nullable NSString *)channel
|
||||
apsForProduction:(BOOL)isProduction
|
||||
advertisingIdentifier:(nullable NSString *)advertisingId;
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name APNs about 通知相关
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 注册要处理的远程通知类型
|
||||
*
|
||||
* @param types 通知类型
|
||||
* @param categories 类别组
|
||||
*
|
||||
*/
|
||||
+ (void)registerForRemoteNotificationTypes:(NSUInteger)types
|
||||
categories:(nullable NSSet *)categories;
|
||||
/*!
|
||||
* @abstract 新版本的注册方法(兼容iOS10)
|
||||
*
|
||||
* @param config 注册通知配置
|
||||
* @param delegate 代理
|
||||
*
|
||||
*/
|
||||
+ (void)registerForRemoteNotificationConfig:(JPUSHRegisterEntity *)config delegate:(nullable id<JPUSHRegisterDelegate>)delegate;
|
||||
|
||||
|
||||
+ (void)registerDeviceToken:(NSData *)deviceToken;
|
||||
|
||||
/*!
|
||||
* @abstract 上报liveactivity的启动token
|
||||
*
|
||||
* @param activityAttributes 某liveActivity定义的属性类型
|
||||
* @param pushToStartToken 对应该liveactivity的pushToStartToken,如有更新,请及时调用该方法更新pushToStartToken
|
||||
* @param completion 响应回调
|
||||
* @param seq 请求序列号
|
||||
*/
|
||||
+ (void)registerLiveActivity:(NSString *)activityAttributes
|
||||
pushToStartToken:(nullable NSData *)pushToStartToken
|
||||
completion:(nullable JPUSHLiveActivityTokenCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/*!
|
||||
* @abstract 注册liveActivity并上报其pushToken
|
||||
* 在pushToken有变化的时候同步调用该接口。
|
||||
* 在liveActivity结束的时候,请同步调用该接口,pushToken传nil
|
||||
*
|
||||
* @param liveActivityId 标识某一个liveActivity
|
||||
* @param pushToken 对应该liveActivity的pushToken,如有更新,请及时调用该方法更新pushToken
|
||||
* @param completion 响应回调
|
||||
* @param seq 请求序列号
|
||||
*/
|
||||
+ (void)registerLiveActivity:(NSString *)liveActivityId
|
||||
pushToken:(nullable NSData *)pushToken
|
||||
completion:(nullable JPUSHLiveActivityTokenCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/*!
|
||||
* @abstract 处理收到的 APNs 消息
|
||||
*/
|
||||
+ (void)handleRemoteNotification:(NSDictionary *)remoteInfo;
|
||||
|
||||
/*!
|
||||
* @abstract 向极光服务器提交Token
|
||||
*
|
||||
* @param voipToken 推送使用的Voip Token
|
||||
*/
|
||||
+ (void)registerVoipToken:(NSData *)voipToken;
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 处理收到的 Voip 消息
|
||||
*
|
||||
* @param remoteInfo 下发的 Voip 内容
|
||||
*/
|
||||
+ (void)handleVoipNotification:(NSDictionary *)remoteInfo;
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 检测通知授权状态
|
||||
* @param completion 授权结果通过status值返回,详见JPAuthorizationStatus
|
||||
*/
|
||||
+ (void)requestNotificationAuthorization:(nullable void (^)(JPAuthorizationStatus status))completion;
|
||||
|
||||
/*!
|
||||
* @abstract 跳转至系统设置页面,iOS8及以上有效
|
||||
*/
|
||||
+ (void)openSettingsForNotification:(nullable void (^)(BOOL success))completionHandler NS_AVAILABLE_IOS(8_0);
|
||||
|
||||
/*!
|
||||
* Tags操作接口
|
||||
* 支持增加/覆盖/删除/清空/查询操作
|
||||
* 详情请参考文档:https://docs.jiguang.cn/jpush/client/iOS/ios_api/)
|
||||
*/
|
||||
|
||||
/**
|
||||
增加tags
|
||||
|
||||
@param tags 需要增加的tags集合
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)addTags:(NSSet<NSString *> *)tags
|
||||
completion:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
覆盖tags
|
||||
调用该接口会覆盖用户所有的tags
|
||||
|
||||
@param tags 需要设置的tags集合
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)setTags:(NSSet<NSString *> *)tags
|
||||
completion:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
删除指定tags
|
||||
|
||||
@param tags 需要删除的tags集合
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)deleteTags:(NSSet<NSString *> *)tags
|
||||
completion:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
清空所有tags
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)cleanTags:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
查询全部tags
|
||||
|
||||
@param completion 响应回调,请在回调中获取查询结果
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)getAllTags:(nullable JPUSHTagsOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
验证tag是否绑定
|
||||
|
||||
@param completion 响应回调,回调中查看是否绑定
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)validTag:(NSString *)tag
|
||||
completion:(nullable JPUSHTagValidOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
设置Alias
|
||||
|
||||
@param alias 需要设置的alias
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)setAlias:(NSString *)alias
|
||||
completion:(nullable JPUSHAliasOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
删除alias
|
||||
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)deleteAlias:(nullable JPUSHAliasOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
/**
|
||||
查询当前alias
|
||||
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)getAlias:(nullable JPUSHAliasOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 过滤掉无效的 tags
|
||||
*
|
||||
* @discussion 如果 tags 数量超过限制数量, 则返回靠前的有效的 tags.
|
||||
* 建议设置 tags 前用此接口校验. SDK 内部也会基于此接口来做过滤.
|
||||
*/
|
||||
+ (NSSet *)filterValidTags:(NSSet *)tags;
|
||||
|
||||
|
||||
/*!
|
||||
* Property操作接口
|
||||
* 支持增加/删除/清空操作
|
||||
* 详情请参考文档:https://docs.jiguang.cn/jpush/client/iOS/ios_api/)
|
||||
*/
|
||||
|
||||
/**
|
||||
新增/更新用户属性
|
||||
|
||||
如果某个用户属性之前已经存在了,则会更新;不存在,则会新增
|
||||
|
||||
@param properties 需要新增或者更新的的用户属性内容,类型为NSDictionary;
|
||||
Key 为用户属性名称,类型必须是 NSString 类型;Value为用户属性值,只支持 NSString、NSNumber、NSDate类型,如果属性为BOOL类型,传值时请转成NSNumber类型
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)setProperties:(NSDictionary *)properties
|
||||
completion:(nullable JPUSHPropertiesOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
|
||||
/**
|
||||
删除指定属性
|
||||
|
||||
@param keys 需要删除的属性名称集合
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)deleteProperties:(NSSet<NSString *> *)keys
|
||||
completion:(nullable JPUSHPropertiesOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
|
||||
/**
|
||||
清空所有属性
|
||||
@param completion 响应回调
|
||||
@param seq 请求序列号
|
||||
*/
|
||||
+ (void)cleanProperties:(nullable JPUSHPropertiesOperationCompletion)completion
|
||||
seq:(NSInteger)seq;
|
||||
|
||||
|
||||
/*!
|
||||
* 应用内消息接口
|
||||
* 使用应用内消息需要配置以下两个接口。请在进入页面和离开页面的时候相应地配置。以下两个接口请配套调用。
|
||||
*/
|
||||
|
||||
/**
|
||||
进入页面
|
||||
|
||||
请与 + (void)pageLeave:(NSString *)pageName; 方法配套使用
|
||||
|
||||
@param pageName 页面名
|
||||
@discussion 使用应用内消息功能,需要配置pageEnterTo:和pageLeave:函数。
|
||||
*/
|
||||
+ (void)pageEnterTo:(NSString *)pageName;
|
||||
|
||||
|
||||
/**
|
||||
离开页面
|
||||
|
||||
请与 + (void)pageEnterTo:(NSString *)pageName;方法配套使用
|
||||
|
||||
@param pageName 页面名
|
||||
@discussion 使用应用内消息功能,需要配置pageEnterTo:和pageLeave:函数。
|
||||
*/
|
||||
+ (void)pageLeave:(NSString *)pageName;
|
||||
|
||||
|
||||
/*!
|
||||
* @abstract 设置应用内消息的代理
|
||||
*
|
||||
* @discussion 遵守JPUSHInAppMessageDelegate的代理对象
|
||||
*
|
||||
*/
|
||||
+ (void)setInAppMessageDelegate:(id<JPUSHInAppMessageDelegate>)inAppMessageDelegate;
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Stats 统计功能
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 开始记录页面停留
|
||||
*
|
||||
* @param pageName 页面名称
|
||||
* @discussion JCore 1.1.8 版本后,如需统计页面流,请使用 JAnalytics
|
||||
*/
|
||||
+ (void)startLogPageView:(NSString *)pageName __attribute__((deprecated("JCore 1.1.8 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 停止记录页面停留
|
||||
*
|
||||
* @param pageName 页面
|
||||
* @discussion JCore 1.1.8 版本后,如需统计页面流,请使用 JAnalytics
|
||||
*/
|
||||
+ (void)stopLogPageView:(NSString *)pageName __attribute__((deprecated("JCore 1.1.8 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 直接上报在页面的停留时间
|
||||
*
|
||||
* @param pageName 页面
|
||||
* @param seconds 停留的秒数
|
||||
* @discussion JCore 1.1.8 版本后,如需统计页面流,请使用 JAnalytics
|
||||
*/
|
||||
+ (void)beginLogPageView:(NSString *)pageName duration:(int)seconds __attribute__((deprecated("JCore 1.1.8 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 开启Crash日志收集
|
||||
*
|
||||
* @discussion 默认是关闭状态.
|
||||
*/
|
||||
+ (void)crashLogON;
|
||||
|
||||
/*!
|
||||
* @abstract 地理位置上报
|
||||
*
|
||||
* @param latitude 纬度.
|
||||
* @param longitude 经度.
|
||||
*
|
||||
*/
|
||||
+ (void)setLatitude:(double)latitude longitude:(double)longitude;
|
||||
|
||||
/*!
|
||||
* @abstract 地理位置上报
|
||||
*
|
||||
* @param location 直接传递 CLLocation * 型的地理信息
|
||||
*
|
||||
* @discussion 需要链接 CoreLocation.framework 并且 #import <CoreLocation/CoreLocation.h>
|
||||
*/
|
||||
+ (void)setLocation:(CLLocation *)location;
|
||||
|
||||
/**
|
||||
设置地理围栏的最大个数
|
||||
默认值为 10 ,iOS系统默认地理围栏最大个数为20
|
||||
@param count 个数 count
|
||||
*/
|
||||
+ (void)setGeofeneceMaxCount:(NSInteger)count;
|
||||
|
||||
/**
|
||||
设置地理围栏'圈内'类型的检测周期
|
||||
默认15分钟检测一次
|
||||
*/
|
||||
+ (void)setGeofenecePeriodForInside:(NSInteger)seconds;
|
||||
|
||||
/**
|
||||
注册地理围栏的代理
|
||||
|
||||
@param delegate 代理
|
||||
@param launchOptions app启动完成是收到的字段参数
|
||||
*/
|
||||
+ (void)registerLbsGeofenceDelegate:(id<JPUSHGeofenceDelegate>)delegate withLaunchOptions:(nullable NSDictionary *)launchOptions;
|
||||
|
||||
/**
|
||||
删除地理围栏
|
||||
|
||||
@param geofenceId 地理围栏id
|
||||
*/
|
||||
+ (void)removeGeofenceWithIdentifier:(NSString *)geofenceId;
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Local Notification 本地通知
|
||||
///----------------------------------------------------
|
||||
/*!
|
||||
* @abstract 注册或更新推送 (支持iOS10,并兼容iOS10以下版本)
|
||||
*
|
||||
* JPush 2.1.9新接口
|
||||
* @param request JPushNotificationRequest类型,设置推送的属性,设置已有推送的request.requestIdentifier即更新已有的推送,否则为注册新推送,更新推送仅仅在iOS10以上有效,结果通过request.completionHandler返回
|
||||
* @discussion 旧的注册本地推送接口被废弃,使用此接口可以替换
|
||||
*
|
||||
*/
|
||||
+ (void)addNotification:(JPushNotificationRequest *)request;
|
||||
|
||||
/*!
|
||||
* @abstract 移除推送 (支持iOS10,并兼容iOS10以下版本)
|
||||
*
|
||||
* JPush 2.1.9新接口
|
||||
* @param identifier JPushNotificationIdentifier类型,iOS10以上identifier设置为nil,则移除所有在通知中心显示推送和待推送请求,也可以通过设置identifier.delivered和identifier.identifiers来移除相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则移除相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier设置为nil,则移除所有推送,identifier.delivered属性无效,另外可以通过identifier.notificationObj传入特定推送对象来移除此推送。
|
||||
* @discussion 旧的所有删除推送接口被废弃,使用此接口可以替换
|
||||
*
|
||||
*/
|
||||
+ (void)removeNotification:(nullable JPushNotificationIdentifier *)identifier;
|
||||
|
||||
/*!
|
||||
* @abstract 查找推送 (支持iOS10,并兼容iOS10以下版本)
|
||||
*
|
||||
* JPush 2.1.9新接口
|
||||
* @param identifier JPushNotificationIdentifier类型,iOS10以上可以通过设置identifier.delivered和identifier.identifiers来查找相应在通知中心显示推送或待推送请求,identifier.identifiers如果设置为nil或空数组则返回相应标志下所有在通知中心显示推送或待推送请求;iOS10以下identifier.delivered属性无效,identifier.identifiers如果设置nil或空数组则返回所有未触发的推送。须要设置identifier.findCompletionHandler回调才能得到查找结果,通过(NSArray *results)返回相应对象数组。
|
||||
* @discussion 旧的查找推送接口被废弃,使用此接口可以替换
|
||||
*
|
||||
*/
|
||||
+ (void)findNotification:(JPushNotificationIdentifier *)identifier;
|
||||
|
||||
/*!
|
||||
* @abstract 本地推送,最多支持64个
|
||||
*
|
||||
* @param fireDate 本地推送触发的时间
|
||||
* @param alertBody 本地推送需要显示的内容
|
||||
* @param badge 角标的数字。如果不需要改变角标传-1
|
||||
* @param alertAction 弹框的按钮显示的内容(IOS 8默认为"打开", 其他默认为"启动")
|
||||
* @param notificationKey 本地推送标示符
|
||||
* @param userInfo 自定义参数,可以用来标识推送和增加附加信息
|
||||
* @param soundName 自定义通知声音,设置为nil为默认声音
|
||||
*
|
||||
* @discussion 最多支持 64 个定义,此方法被[addNotification:]方法取代
|
||||
*/
|
||||
+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate
|
||||
alertBody:(NSString *)alertBody
|
||||
badge:(int)badge
|
||||
alertAction:(NSString *)alertAction
|
||||
identifierKey:(NSString *)notificationKey
|
||||
userInfo:(NSDictionary *)userInfo
|
||||
soundName:(NSString *)soundName __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 本地推送 (支持 iOS8 新参数)
|
||||
*
|
||||
* IOS8新参数
|
||||
* @param region 自定义参数
|
||||
* @param regionTriggersOnce 自定义参数
|
||||
* @param category 自定义参数
|
||||
* @discussion 此方法被[addNotification:]方法取代
|
||||
*/
|
||||
+ (UILocalNotification *)setLocalNotification:(NSDate *)fireDate
|
||||
alertBody:(NSString *)alertBody
|
||||
badge:(int)badge
|
||||
alertAction:(NSString *)alertAction
|
||||
identifierKey:(NSString *)notificationKey
|
||||
userInfo:(NSDictionary *)userInfo
|
||||
soundName:(NSString *)soundName
|
||||
region:(CLRegion *)region
|
||||
regionTriggersOnce:(BOOL)regionTriggersOnce
|
||||
category:(NSString *)category NS_AVAILABLE_IOS(8_0) __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 前台展示本地推送
|
||||
*
|
||||
* @param notification 本地推送对象
|
||||
* @param notificationKey 需要前台显示的本地推送通知的标示符
|
||||
*
|
||||
* @discussion 默认App在前台运行时不会进行弹窗,在程序接收通知调用此接口可实现指定的推送弹窗。--iOS10以下还可继续使用,iOS10以上在[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:]方法中调用completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);即可
|
||||
*/
|
||||
+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification
|
||||
identifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
/*!
|
||||
* @abstract 删除本地推送定义
|
||||
*
|
||||
* @param notificationKey 本地推送标示符
|
||||
* @discussion 此方法被[removeNotification:]方法取代
|
||||
*/
|
||||
+ (void)deleteLocalNotificationWithIdentifierKey:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 删除本地推送定义
|
||||
* @discussion 此方法被[removeNotification:]方法取代
|
||||
*/
|
||||
+ (void)deleteLocalNotification:(UILocalNotification *)localNotification __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 获取指定通知
|
||||
*
|
||||
* @param notificationKey 本地推送标示符
|
||||
* @return 本地推送对象数组, [array count]为0时表示没找到
|
||||
* @discussion 此方法被[findNotification:]方法取代
|
||||
*/
|
||||
+ (NSArray *)findLocalNotificationWithIdentifier:(NSString *)notificationKey __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
/*!
|
||||
* @abstract 清除所有本地推送对象
|
||||
* @discussion 此方法被[removeNotification:]方法取代
|
||||
*/
|
||||
+ (void)clearAllLocalNotifications __attribute__((deprecated("JPush 2.1.9 版本已过期")));
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Server badge 服务器端 badge 功能
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 设置角标(到服务器)
|
||||
*
|
||||
* @param value 新的值. 会覆盖服务器上保存的值(这个用户)
|
||||
*
|
||||
* @discussion 本接口不会改变应用本地的角标值.
|
||||
* 本地仍须调用 UIApplication:setApplicationIconBadgeNumber 函数来设置脚标.
|
||||
*
|
||||
* 本接口用于配合 JPush 提供的服务器端角标功能.
|
||||
* 该功能解决的问题是, 服务器端推送 APNs 时, 并不知道客户端原来已经存在的角标是多少, 指定一个固定的数字不太合理.
|
||||
*
|
||||
* JPush 服务器端脚标功能提供:
|
||||
*
|
||||
* - 通过本 API 把当前客户端(当前这个用户的) 的实际 badge 设置到服务器端保存起来;
|
||||
* - 调用服务器端 API 发 APNs 时(通常这个调用是批量针对大量用户),
|
||||
* 使用 "+1" 的语义, 来表达需要基于目标用户实际的 badge 值(保存的) +1 来下发通知时带上新的 badge 值;
|
||||
*/
|
||||
+ (BOOL)setBadge:(NSInteger)value;
|
||||
|
||||
/*!
|
||||
* @abstract 重置脚标(为0)
|
||||
*
|
||||
* @discussion 相当于 [setBadge:0] 的效果.
|
||||
* 参考 [JPUSHService setBadge:] 说明来理解其作用.
|
||||
*/
|
||||
+ (void)resetBadge;
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Other Feature 其他功能
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract 设置手机号码(到服务器)
|
||||
*
|
||||
* @param mobileNumber 手机号码. 会与用户信息一一对应。可为空,为空则清除号码
|
||||
* @param completion 响应回调。成功则error为空,失败则error带有错误码及错误信息
|
||||
*
|
||||
* @discussion 设置手机号码后,可实现“推送不到短信到”的通知方式,提高推送达到率。结果信息通过completion异步返回,也可将completion设置为nil不处理结果信息。
|
||||
*
|
||||
*/
|
||||
+ (void)setMobileNumber:(NSString *)mobileNumber completion:(nullable void (^)(NSError *error))completion;
|
||||
|
||||
///----------------------------------------------------
|
||||
/// @name Logs and others 日志与其他
|
||||
///----------------------------------------------------
|
||||
|
||||
/*!
|
||||
* @abstract JPush标识此设备的 registrationID
|
||||
*
|
||||
* @discussion SDK注册成功后, 调用此接口获取到 registrationID 才能够获取到.
|
||||
*
|
||||
* JPush 支持根据 registrationID 来进行推送.
|
||||
* 如果你需要此功能, 应该通过此接口获取到 registrationID 后, 上报到你自己的服务器端, 并保存下来.
|
||||
* registrationIDCompletionHandler:是新增的获取registrationID的方法,需要在block中获取registrationID,resCode为返回码,模拟器调用此接口resCode返回1011,registrationID返回nil.
|
||||
* 更多的理解请参考 JPush 的文档网站.
|
||||
*/
|
||||
+ (NSString *)registrationID;
|
||||
|
||||
+ (void)registrationIDCompletionHandler:(void(^)(int resCode,NSString * _Nullable registrationID))completionHandler;
|
||||
|
||||
/*!
|
||||
* @abstract 打开日志级别到 Debug
|
||||
*
|
||||
* @discussion JMessage iOS 的日志系统参考 Android 设计了级别.
|
||||
* 从低到高是: Verbose, Debug, Info, Warning, Error.
|
||||
* 对日志级别的进一步理解, 请参考 Android 相关的说明.
|
||||
*
|
||||
* SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志.
|
||||
*
|
||||
* 请在SDK启动后调用本接口,调用本接口可打开日志级别为: Debug, 打印调试日志.
|
||||
*/
|
||||
+ (void)setDebugMode;
|
||||
|
||||
/*!
|
||||
* @abstract 关闭日志
|
||||
*
|
||||
* @discussion 关于日志级别的说明, 参考 [JPUSHService setDebugMode]
|
||||
*
|
||||
* 虽说是关闭日志, 但还是会打印 Warning, Error 日志. 这二种日志级别, 在程序运行正常时, 不应有打印输出.
|
||||
*
|
||||
* 建议在发布的版本里, 调用此接口, 关闭掉日志打印.
|
||||
*/
|
||||
+ (void)setLogOFF;
|
||||
|
||||
/*!
|
||||
数据采集控制
|
||||
|
||||
@param control 数据采集配置。
|
||||
*/
|
||||
+ (void)setCollectControl:(JPushCollectControl *)control;
|
||||
|
||||
/*!
|
||||
* @abstract 设置SDK地理位置权限开关
|
||||
*
|
||||
* @discussion 关闭地理位置之后,SDK地理围栏的相关功能将受到影响,默认是开启。
|
||||
*
|
||||
*/
|
||||
+ (void)setLocationEanable:(BOOL)isEanble;
|
||||
|
||||
/*!
|
||||
* @abstract 设置PUSH开关
|
||||
*
|
||||
* @discussion 关闭PUSH之后,将接收不到极光通知推送、自定义消息推送、liveActivity消息推送,默认是开启。
|
||||
*
|
||||
*/
|
||||
+ (void)setPushEnable:(BOOL)isEnable completion:(nullable void (^)(NSInteger iResCode))completion;
|
||||
|
||||
/*!
|
||||
* @abstract 设置用户分群推送功能开关
|
||||
*
|
||||
* @param isEnable YES:开启,NO:关闭,默认是开启。
|
||||
*
|
||||
*/
|
||||
+ (void)setSmartPushEnable:(BOOL)isEnable;
|
||||
|
||||
/*!
|
||||
* @abstract 设置应用内提醒消息的代理
|
||||
*
|
||||
* @discussion 遵守JPushNotiInMessageDelegate的代理对象
|
||||
*
|
||||
*/
|
||||
+ (void)setNotiInMessageDelegate:(id<JPUSHNotiInMessageDelegate>)notiInMessageDelegate;
|
||||
|
||||
|
||||
|
||||
///----------------------------------------------------
|
||||
///********************下列方法已过期********************
|
||||
///**************请使用新版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;
|
||||
@class UNNotificationResponse;
|
||||
|
||||
@protocol JPUSHRegisterDelegate <NSObject>
|
||||
|
||||
/*
|
||||
* @brief handle UserNotifications.framework [willPresentNotification:withCompletionHandler:]
|
||||
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心
|
||||
* @param notification 前台得到的的通知对象
|
||||
* @param completionHandler 该callback中的options 请使用UNNotificationPresentationOptions
|
||||
*/
|
||||
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger options))completionHandler;
|
||||
/*
|
||||
* @brief handle UserNotifications.framework [didReceiveNotificationResponse:withCompletionHandler:]
|
||||
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心
|
||||
* @param response 通知响应对象
|
||||
* @param completionHandler
|
||||
*/
|
||||
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler;
|
||||
|
||||
/*
|
||||
* @brief handle UserNotifications.framework [openSettingsForNotification:]
|
||||
* @param center [UNUserNotificationCenter currentNotificationCenter] 新特性用户通知中心
|
||||
* @param notification 当前管理的通知对象
|
||||
*/
|
||||
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center openSettingsForNotification:(UNNotification *)notification NS_AVAILABLE_IOS(12.0);
|
||||
|
||||
/**
|
||||
* 监测通知授权状态返回的结果
|
||||
* @param status 授权通知状态,详见JPAuthorizationStatus
|
||||
* @param info 更多信息,预留参数
|
||||
*/
|
||||
- (void)jpushNotificationAuthorization:(JPAuthorizationStatus)status withInfo:(nullable NSDictionary *)info;
|
||||
|
||||
@end
|
||||
|
||||
@protocol JPUSHGeofenceDelegate <NSObject>
|
||||
/**
|
||||
触发地理围栏
|
||||
@param geofence 地理围栏触发时返回的信息
|
||||
@param error 错误信息
|
||||
*/
|
||||
- (void)jpushGeofenceRegion:(nullable NSDictionary *)geofence
|
||||
error:(nullable NSError *)error;
|
||||
|
||||
/**
|
||||
拉取地理围栏列表的回调
|
||||
|
||||
@param geofenceList 地理围栏列表
|
||||
*/
|
||||
- (void)jpushCallbackGeofenceReceived:(nullable NSArray<NSDictionary*> *)geofenceList;
|
||||
|
||||
/**
|
||||
进入地理围栏区域
|
||||
|
||||
@param geofenceId 地理围栏id
|
||||
@param userInfo 地理围栏触发时返回的信息
|
||||
@param error 错误信息
|
||||
*/
|
||||
- (void)jpushGeofenceIdentifer:(NSString *)geofenceId didEnterRegion:(NSDictionary *_Nullable)userInfo error:(NSError *_Nullable)error __attribute__((deprecated("JPush 3.6.0 版本已过期")));
|
||||
|
||||
/**
|
||||
离开地理围栏区域
|
||||
|
||||
@param geofenceId 地理围栏id
|
||||
@param userInfo 地理围栏触发时返回的信息
|
||||
@param error 错误信息
|
||||
*/
|
||||
- (void)jpushGeofenceIdentifer:(NSString *)geofenceId didExitRegion:(NSDictionary *_Nullable)userInfo error:(NSError *_Nullable)error __attribute__((deprecated("JPush 3.6.0 版本已过期")));
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@protocol JPUSHNotiInMessageDelegate <NSObject>
|
||||
|
||||
/**
|
||||
应用内提醒消息展示的回调
|
||||
|
||||
@param content 应用内提醒消息的内容
|
||||
|
||||
*/
|
||||
- (void)jPushNotiInMessageDidShowWithContent:(NSDictionary *)content;
|
||||
|
||||
/**
|
||||
应用内提醒消息点击的回调
|
||||
|
||||
@param content 应用内提醒消息的内容
|
||||
|
||||
*/
|
||||
- (void)jPushNotiInMessageDidClickWithContent:(NSDictionary *)content;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@protocol JPUSHInAppMessageDelegate <NSObject>
|
||||
|
||||
/**
|
||||
应用内消息展示的回调
|
||||
|
||||
@param inAppMessage 应用内消息的内容
|
||||
|
||||
*/
|
||||
- (void)jPushInAppMessageDidShow:(JPushInAppMessage *)inAppMessage;
|
||||
|
||||
/**
|
||||
应用内消息点击的回调
|
||||
|
||||
@param inAppMessage 应用内消息的内容
|
||||
|
||||
*/
|
||||
- (void)jPushInAppMessageDidClick:(JPushInAppMessage *)inAppMessage;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
@ -0,0 +1,23 @@
|
||||
<?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>NSPrivacyTrackingDomains</key>
|
||||
<array/>
|
||||
<key>NSPrivacyCollectedDataTypes</key>
|
||||
<array/>
|
||||
<key>NSPrivacyTracking</key>
|
||||
<false/>
|
||||
<key>NSPrivacyAccessedAPITypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||
<array>
|
||||
<string>CA92.1</string>
|
||||
</array>
|
||||
<key>NSPrivacyAccessedAPIType</key>
|
||||
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|