Compare commits

..

322 Commits
v3.0.2 ... dev

Author SHA1 Message Date
JoshLi
e56a05c64b Update SDK to Android v3.6.6 iOS v3.3.3 2020-06-10 18:04:30 +08:00
JoshLi
a50bafcf3e Update iOS UIWebView to WKWebView 2020-06-10 18:03:47 +08:00
lilx
60176c1ea6 Merge branch 'dev' 2020-06-03 14:49:59 +08:00
lilx
c929496721 Release v3.7.5 2020-06-03 14:38:40 +08:00
lilx
bdd9a8beea Release v3.7.5 2020-06-03 14:24:58 +08:00
1060420895@qq.com
511eee622f Merge branch 'dev' 2020-04-10 16:42:55 +08:00
1060420895@qq.com
2f4669471f Release v3.7.4 2020-04-10 16:36:49 +08:00
1060420895@qq.com
85e3a23f88 Merge branch 'dev' 2020-04-10 16:09:04 +08:00
1060420895@qq.com
206f2ac89e update doc 2020-04-10 16:05:03 +08:00
1060420895@qq.com
57b9364279 Update android jpush to v3.5.8 2020-04-10 16:01:00 +08:00
1060420895@qq.com
e0db803818 Add API setBadgeNumber for Android 2020-04-10 15:56:06 +08:00
1060420895@qq.com
e140dc3b77 android 更新到 3.7.4 2020-04-10 15:48:26 +08:00
1060420895@qq.com
a26822b894 add API setBadgeNumber for android 2020-04-10 15:41:35 +08:00
1060420895@qq.com
7dd7a4a86c add API setBadgeNumber for Android 2020-04-10 15:34:27 +08:00
1060420895@qq.com
b7a2a74d88 add API setBadgeNumber for Android 2020-04-10 15:30:46 +08:00
1060420895@qq.com
2f8234c29f add API set setBadgeNumber for Android 2020-04-10 15:23:13 +08:00
1060420895@qq.com
a9b5af06a5 add API set setBadgeNumber for Android 2020-04-10 15:19:20 +08:00
1060420895@qq.com
ddfb952bcf Release v3.7.4 2020-04-10 15:15:09 +08:00
JoshLipan
74fea46b1c Merge pull request #418 from jpush/dev
Dev
2019-10-21 15:16:45 +08:00
JoshLi
b2f79c6234 Release v3.7.2 2019-10-21 15:15:29 +08:00
JoshLi
9e23995555 Update iOS jpush to v3.2.6 2019-10-21 15:14:40 +08:00
JoshLi
a7455240a1 Update android jpush to v3.3.8 2019-10-21 15:14:18 +08:00
weiruiyang
07466a8718 Merge pull request #411 from weiruiyang/master
版本更新到 3.7.2
2019-07-29 18:23:51 +08:00
weiry
2b5d59e32e 版本更新到 3.7.2 2019-07-29 18:22:44 +08:00
weiruiyang
e4b70a561a Merge pull request #410 from weiruiyang/master
版本更新到 3.7.1
2019-07-29 14:52:16 +08:00
weiry
da8c6c29e9 版本更新到 3.7.1 2019-07-29 14:50:19 +08:00
weiruiyang
2ebacad254 Merge pull request #409 from weiruiyang/master
更新版本
2019-07-29 14:16:12 +08:00
weiry
9751b15bf0 ios 更新到 3.2.1.a 2019-07-29 13:55:19 +08:00
weiry
b5fd5aa51a android 更新到 3.3.4 2019-07-29 13:52:32 +08:00
JoshLipan
ee3e6b9e75 Update doc 2019-04-09 18:21:14 +08:00
HuminiOS
72407b0b9c Merge pull request #400 from jpush/dev
update readme
2019-03-29 10:23:47 +08:00
huangminlinux
2a427c70f9 update readme 2019-03-29 10:23:18 +08:00
JoshLipan
bc12d3c606 Merge pull request #398 from jpush/dev
Dev
2019-03-22 16:32:04 +08:00
JoshLi
9b1bff2ce1 Release v3.6.4 2019-03-22 16:28:06 +08:00
JoshLi
3b5fc629dd Update Android SDK to v3.2.0 2019-03-22 16:27:31 +08:00
JoshLipan
fa4f3ac0d7 Merge pull request #397 from jpush/dev
Dev
2019-02-28 16:28:58 +08:00
JoshLi
3ad9a415e9 Release v3.6.3 2019-02-28 16:27:47 +08:00
JoshLi
d76d01c856 Set exported false for custom Receiver 2019-02-28 16:27:21 +08:00
HuminiOS
b7d4ba5111 Merge pull request #396 from jpush/dev
update readme
2019-02-25 10:13:55 +08:00
huangminlinux
7c326599aa update readme 2019-02-25 10:09:10 +08:00
HuminiOS
2adbba2943 Merge pull request #395 from jpush/dev
update readme
2019-02-24 22:26:35 +08:00
huangminlinux
5b22d798cb update readme 2019-02-24 22:25:01 +08:00
HuminiOS
eb624a7bb2 Merge pull request #394 from jpush/dev
Dev
2019-02-24 00:03:44 +08:00
huangminlinux
e29f00f77f delete file 2019-02-24 00:00:18 +08:00
huangminlinux
1ecb2b273a the adaption to ionic4 project and udpate ionic plugin to 2.0.0 version 2019-02-23 23:58:23 +08:00
huangminlinux
6767af7488 udpate jpush plugin to 3.6.2 2019-01-11 14:34:09 +08:00
huangminlinux
03eab0c59e update iOS SDK to 3.1.2 2019-01-11 14:31:56 +08:00
JoshLipan
23ae6ad342 Merge pull request #390 from jpush/dev
Dev
2018-12-28 17:32:40 +08:00
JoshLi
ccfffc9a69 Release v3.6.1 2018-12-28 17:28:12 +08:00
JoshLi
16c3c96844 Add API setGeofenceInterval for Android 2018-12-28 17:27:31 +08:00
JoshLipan
b2e818e88d Merge pull request #387 from jpush/dev
Dev
2018-12-20 16:27:34 +08:00
JoshLi
5a8a926c50 Update DOC 2018-12-20 16:24:22 +08:00
JoshLi
0903b58270 Update DOC 2018-12-20 16:17:42 +08:00
JoshLi
f0dc403ca8 Add CHANNEL variable setup 2018-12-18 21:07:18 +08:00
JoshLi
5c53749171 Update Android SDK to v3.1.8 2018-12-18 21:06:29 +08:00
JoshLi
68bb0ebfdf Release v3.5.1 2018-11-16 14:31:47 +08:00
HuminiOS
30fc85fc8d Merge pull request #381 from jpush/dev
update readme add xcode10 fq
2018-11-14 14:35:16 +08:00
huangminlinux
fa0ca5f335 update readme add xcode10 fq 2018-11-14 14:33:13 +08:00
JoshLipan
8de93a3a07 Merge pull request #380 from jpush/dev
Dev
2018-11-13 16:48:32 +08:00
JoshLi
a4c17d3882 Update doc 2018-11-13 16:46:40 +08:00
JoshLi
1d420b5bb6 Release v3.5.0 2018-11-13 16:31:42 +08:00
JoshLi
d69f50915c Release v3.5.0 2018-11-13 16:27:09 +08:00
JoshLi
e26d8448a0 Update Android SDK to v3.1.7 2018-11-13 16:26:38 +08:00
HuminiOS
387eaa1aff Merge pull request #376 from jpush/dev
update to ios sdk to 3.1.1
2018-10-26 10:41:16 +08:00
huangminlinux
45785a569c update to ios sdk to 3.1.1 2018-10-26 10:37:51 +08:00
HuminiOS
0c8a6d25a6 Merge pull request #374 from jpush/dev
Dev
2018-10-23 18:17:22 +08:00
huangminlinux
529f08df88 update to 3.4.6 2018-10-23 18:16:24 +08:00
huangminlinux
e60d7c2b8c ios send local notification can accept 0 as params 2018-10-23 18:15:47 +08:00
huangminlinux
265d88e766 update docs 2018-10-23 18:15:47 +08:00
JoshLipan
894c7d7ac1 Merge pull request #373 from jpush/dev
Dev
2018-10-18 14:33:58 +08:00
JoshLi
aabc1453b8 Release v3.4.5 2018-10-18 14:30:48 +08:00
JoshLi
6f78522cca Update getConnectionState API 2018-10-18 14:26:00 +08:00
JoshLi
ff735854ec Update doc 2018-10-18 14:25:40 +08:00
JoshLi
e63f9d1774 Release v3.4.4 2018-10-18 14:12:52 +08:00
JoshLi
f9a5cef603 Merge branch 'dev' of https://github.com/jpush/jpush-phonegap-plugin into dev 2018-10-18 14:07:25 +08:00
JoshLi
ef8b1a7b4c Update Android SDK to v3.1.6 2018-10-18 13:56:48 +08:00
huangminlinux
82d68c3562 Merge pull request #364 from jpush/dev
Dev
2018-07-31 17:13:54 +08:00
huangminlinux
bdaeb5dbec update ios jpush sdk to 3.1.0 2018-07-31 17:12:05 +08:00
JoshLi
0677094086 Update Android SDK to v3.1.5 2018-07-31 17:08:44 +08:00
JoshLi
1d0d972737 Merge branch 'dev' 2018-07-23 11:21:16 +08:00
JoshLi
3186de6111 Merge branch 'dev' of https://github.com/jpush/jpush-phonegap-plugin into dev 2018-07-23 11:20:36 +08:00
JoshLi
9cb75a85db Update DOC 2018-07-23 11:19:50 +08:00
huangminlinux
c022a06461 add UIBackgroundModes in plugin.xml 2018-06-04 17:02:38 +08:00
huangminlinux
cc7328ad77 add update plugin.xml add aps-environment in entitlement plist 2018-06-04 16:57:42 +08:00
huangminlinux
b5d3661240 Merge pull request #340 from jpush/dev
updage demo
2018-04-19 13:20:16 +08:00
huangminlinux
1ae98e13e6 updage demo 2018-04-19 13:19:38 +08:00
huangminlinux
27cdf61ff3 Merge pull request #336 from jpush/dev
adjust link
2018-04-16 15:34:02 +08:00
huangminlinux
1fb87d8fba adjust link 2018-04-16 15:30:41 +08:00
huangminlinux
a0e408f05f Merge pull request #335 from jpush/dev
Dev
2018-04-16 15:15:14 +08:00
huangminlinux
2d71db888f update js comment link 2018-04-16 15:14:13 +08:00
huangminlinux
1bfd8a2836 appdelegate+jpush.m 2018-04-12 10:26:36 +08:00
Hevin
6c80b47bad Merge branch 'dev' 2018-03-06 13:45:59 +08:00
Hevin
179220874e Update README 2018-03-06 13:45:46 +08:00
Hevin
5e85c6b5b0 Merge branch 'dev' 2018-03-01 17:05:08 +08:00
Hevin
c526a26231 Update comment about cordova android 7.0.0 2018-03-01 17:03:09 +08:00
Hevin
0380fbdc60 Merge branch 'dev' 2018-03-01 16:56:45 +08:00
Hevin
9c888aa964 Update comments about cordova-android 7.0.0 2018-03-01 16:56:33 +08:00
Hevin
14f03abce6 Merge branch 'dev' 2018-03-01 16:54:49 +08:00
Hevin
4b554fa2ca Add comments about cordova-android 7.0.0 2018-03-01 16:54:22 +08:00
Hevin
4085787f95 build: v3.4.1 2018-03-01 14:19:11 +08:00
Hevin
1eaf73a8d3 Merge branch 'dev' 2018-02-26 15:42:43 +08:00
Hevin
6c2bc206e3 Format the style 2018-02-26 15:42:29 +08:00
Hevin
10b457d489 Add comments of cordova-android 7.0.0 2018-02-26 15:29:36 +08:00
Hevin
5b0613628b Merge cordova_android_7.0.0 to dev 2018-02-26 14:59:36 +08:00
Hevin
6f77da5f41 build: v3.4.0
Support cordova-android 7.0.0
2018-02-26 14:50:53 +08:00
huangminlinux
24328f2ac9 update to 3.3.3 2018-02-06 15:38:47 +08:00
huangminlinux
8ccdbd525b fix app not launch open notification will fire twice bug 2018-02-06 14:32:12 +08:00
huangminlinux
67421b5091 fix application in activity notification will not alert in ios10 2018-02-01 10:11:03 +08:00
huangminlinux
83b7ca162a update to 3.3.1 2018-01-31 16:19:17 +08:00
huangminlinux
7f2179fe32 fix backgroup notification event fire twice 2018-01-31 16:12:31 +08:00
Hevin
54b653e442 Merge branch 'dev' 2018-01-27 10:27:49 +08:00
Hevin
4f0c186bc3 build: v3.3.0 2018-01-27 09:54:21 +08:00
Hevin
1954d6b55b Update Android SDK to v3.1.1 & Update MyReceiver to JPushReceiver 2018-01-27 09:41:35 +08:00
Hevin
8487d9c823 Merge branch 'dev' 2018-01-17 15:18:36 +08:00
Hevin
261eb44473 Add comment about cordova-android 7.0.0 2018-01-17 15:18:17 +08:00
huangminlinux
7549e347b7 Merge pull request #309 from jpush/dev
add issue template
2017-12-26 10:37:36 +08:00
huangminlinux
504fbb0789 add issue template 2017-12-26 10:37:09 +08:00
Hevin
a6fc0bc7a1 Merge branch 'dev' 2017-12-20 13:23:13 +08:00
Hevin
cbacc7cb83 Add explain of APP_KEY 2017-12-20 13:22:08 +08:00
Hevin
7a4943e820 Merge branch 'dev' 2017-12-15 16:27:39 +08:00
Hevin
579e2b6de3 Update FAQ 2017-12-15 16:27:14 +08:00
Hevin
05b3fb1b82 Merge branch 'dev' 2017-12-15 16:04:25 +08:00
Hevin
5301a2c5ea Update ionic install script 2017-12-15 15:35:28 +08:00
Hevin
d628cc168b Change the format 2017-12-15 15:01:09 +08:00
Hevin
cce897daa0 Update install step of ionic 2017-12-15 14:50:38 +08:00
Hevin
0449935bcb Update example 2017-12-14 17:16:00 +08:00
Hevin
b730924d74 Fixed extras to object of addLocalNotificationForIOS 2017-12-14 16:47:08 +08:00
huangminlinux
4780eafb72 adjust ios remote notification formate 2017-12-14 15:36:43 +08:00
huangminlinux
53e3588937 fix conflict 2017-12-14 11:03:33 +08:00
huangminlinux
4585a13d7b update localnotification event field 2017-12-13 13:32:34 +08:00
huangminlinux
f50a8ea5c7 fix local notification event in ios 10 2017-12-12 17:00:28 +08:00
huangminlinux
9ea65add1f update demo add receiveLocalNotification Event 2017-12-12 14:26:55 +08:00
huangminlinux
9c103753e6 update iOS docs 2017-12-12 14:20:04 +08:00
Hevin
3f1fa1e7ba Merge branch 'ionic' into dev 2017-12-11 19:06:43 +08:00
Hevin
c0c7d904e3 Complete example 2017-12-11 19:06:04 +08:00
Hevin
509184328d Fix params type error 2017-12-11 18:44:33 +08:00
Hevin
a0c828a296 Update gitignore 2017-12-11 15:22:11 +08:00
Hevin
2d81c7800b Merge branch 'ionic' into dev 2017-12-11 13:21:35 +08:00
Hevin
4cfca93789 Complete ionic example 2017-12-11 13:02:50 +08:00
Hevin
c254794ace create ionic floder 2017-12-11 12:31:54 +08:00
Hevin
6d013438cd Fixed checkTagBindState callback error 2017-12-08 21:38:40 +08:00
Hevin
29970cd306 Fixed params error 2017-12-08 21:35:42 +08:00
Hevin
4f4a7e44f8 build ionic-native/jpush 2017-12-07 21:35:43 +08:00
Hevin
a891578f74 Complete index.ts 2017-12-07 21:32:48 +08:00
Hevin
07c9722551 Merge branch 'dev' into ionic 2017-12-04 13:33:16 +08:00
Hevin
f6ece7dd1e Merge branch 'dev' 2017-12-04 13:32:54 +08:00
Hevin
0b4f328e19 Update FAQ 2017-12-04 13:31:33 +08:00
Hevin
bb7b810215 Add ionic-native 2017-11-27 20:36:41 +08:00
Hevin
5bea9b0bac Merge branch 'dev' into ionic 2017-11-27 15:17:41 +08:00
Hevin
7470258950 Update Android sdk to 3.1.0 2017-11-27 15:17:18 +08:00
Hevin
46f5f41f8e Merge branch 'dev' into ionic 2017-11-27 12:55:01 +08:00
Hevin
a33cc11090 Make jcore version explitily 2017-11-27 12:54:49 +08:00
Hevin
c4e2deec06 Remove unused methods 2017-11-14 10:56:54 +08:00
huangminlinux
b282d70b2f Merge pull request #287 from jpush/dev
change arrow syntax to function
2017-11-08 03:05:43 -06:00
huangminlinux
a0752562b5 fix demo 2017-11-08 17:04:06 +08:00
huangminlinux
82c6532d12 Merge pull request #286 from jpush/dev
update to 3.2.12
2017-11-07 23:58:22 -06:00
huangminlinux
4b929a8e2e update 3.2.12 2017-11-08 13:56:14 +08:00
huangminlinux
d3e2e1a5d7 fix app not launch open notification bug 2017-11-08 13:49:50 +08:00
Hevin
b8f79dd130 Merge branch 'dev' 2017-11-03 17:38:08 +08:00
Hevin
001ab96283 Fix error words 2017-11-03 17:37:48 +08:00
huangminlinux
1e2a4ce0e4 Merge pull request #284 from jpush/dev
update docs
2017-11-03 04:14:25 -05:00
huangminlinux
1314d33c62 udpate docs 2017-11-03 17:13:52 +08:00
huangminlinux
22b6d9a006 adjust glable var to static 2017-11-01 16:29:27 +08:00
Hevin
c708f396bd Merge branch 'dev' 2017-10-27 14:29:56 +08:00
Hevin
0cbedb412c Format api doc 2017-10-27 14:29:43 +08:00
Hevin
8b2a0daecc Merge branch 'dev' 2017-10-25 11:19:39 +08:00
Hevin
fbd9d63590 build: v3.2.11 2017-10-25 11:19:14 +08:00
huangminlinux
184ee01d1d update registrationId evet 2017-10-25 11:09:46 +08:00
huangminlinux
14a40c6572 adjust ios registerNotification event 2017-10-25 10:49:58 +08:00
Hevin
469af4fcd3 Merge branch 'dev' 2017-10-23 17:23:10 +08:00
Hevin
fefaaea14f build: v3.2.10 2017-10-23 17:22:53 +08:00
huangminlinux
d2f9959ae1 open notification event add to jpush event cache 2017-10-23 17:18:49 +08:00
huangminlinux
3129165d3f add jpush event cache 2017-10-23 17:11:35 +08:00
Hevin
494df2e527 Merge branch 'dev' 2017-10-20 13:10:03 +08:00
Hevin
66932a8bc8 build: v3.2.9 2017-10-20 13:09:32 +08:00
huangminlinux
07c9b2b945 fix iOS10 remove local notification fail bug 2017-10-20 11:28:51 +08:00
huangminlinux
8811dfc002 update docs 2017-10-19 13:51:19 +08:00
Hevin
031acb9631 Merge branch 'dev' 2017-10-13 13:11:12 +08:00
Hevin
0ee5f8b1a0 Update iOS SDK to v3.0.7 2017-10-13 13:10:47 +08:00
Hevin
259ec0a03a Update API doc 2017-10-13 13:09:19 +08:00
Hevin
6283cb26f6 Remove deprecated method
setTagsWithAlias
2017-10-13 10:12:16 +08:00
Hevin
8d098d29b1 Merge branch 'dev' 2017-10-11 14:49:23 +08:00
Hevin
1c3228848b build: v3.2.7 2017-10-11 14:49:07 +08:00
huangminlinux
a9343ac776 Merge pull request #278 from jpush/dev
fix open local notification to launch app event bug
2017-10-11 01:43:19 -05:00
huangminlinux
585e2a5084 fix open local notification to launch app event bug 2017-10-11 14:28:56 +08:00
huangminlinux
de58071773 Merge pull request #277 from jpush/dev
remove jpush.startLocalNotification event in iOS docs
2017-10-10 22:30:56 -05:00
huangminlinux
c726477cfb remove jpush.startLocalNotification event in iOS docs 2017-10-11 11:29:40 +08:00
huangminlinux
13341fd68a Merge pull request #276 from jpush/dev
Dev
2017-10-10 22:28:05 -05:00
huangminlinux
3f00143a5a update doc remove startLocalNotification event 2017-10-11 11:26:46 +08:00
huangminlinux
f5ea2b5b10 ios add jpush.receiveRegistrationId event 2017-10-11 11:15:13 +08:00
Hevin
edf29bbc8d Merge branch 'dev' 2017-09-28 10:25:03 +08:00
Hevin
266d0cb28f Add JPushEventReceiver in manifest 2017-09-28 10:22:40 +08:00
Hevin
ae54960da4 Merge branch 'dev' 2017-09-26 18:28:44 +08:00
Hevin
9f156727e7 Remove unused code 2017-09-26 17:51:25 +08:00
Hevin
155f1e2f6c Update Android SDK to v3.0.9 2017-09-26 17:48:18 +08:00
Hevin
9680e685e3 Remove unused console.log 2017-09-25 12:33:08 +08:00
Hevin
ea6011635f Merge branch 'dev' 2017-09-25 12:32:36 +08:00
Hevin
2eefd1c247 Fixed android api doc 2017-09-25 12:32:27 +08:00
Hevin
0829104534 Merge branch 'dev' 2017-09-23 09:11:34 +08:00
Hevin
fa256bfb46 Format api doc 2017-09-23 09:11:21 +08:00
Hevin
592d5a5fb9 Merge branch 'dev' 2017-09-22 21:16:11 +08:00
Hevin
83293656da Optimize api doc 2017-09-22 21:15:37 +08:00
Hevin
4753174bda Merge branch 'dev' 2017-09-22 20:24:21 +08:00
Hevin
8a55aaa429 Update README 2017-09-22 20:13:25 +08:00
Hevin
b5f32e5107 Update example 2017-09-22 20:13:15 +08:00
Hevin
7afb705555 Update tag & alias api 2017-09-22 20:08:37 +08:00
Hevin
e71c6f3505 build: v3.2.4 2017-09-22 16:23:21 +08:00
Hevin
ff65c09d4e Update tag & alias api of iOS 2017-09-22 16:12:23 +08:00
Hevin
8398bb56f1 Improve example 2017-09-22 16:06:44 +08:00
Hevin
291aa7b8bf Update tag & alias methods 2017-09-21 19:20:53 +08:00
Hevin
5c00243986 Update JPUSHService.h to v3.0.6 2017-09-20 19:03:31 +08:00
Hevin
3ce2babd9b Add new tag and alias methods 2017-09-19 17:48:22 +08:00
Hevin
a27cc445ee Update Android sdk to v3.0.8 2017-09-19 17:46:49 +08:00
Hevin
3f077e32fd Merge branch 'dev' 2017-09-19 14:33:24 +08:00
Hevin
e9ddd798ad Add FAQ 2017-09-19 14:33:06 +08:00
Hevin
5c569d00da Merge branch 'dev' 2017-09-08 14:32:18 +08:00
Hevin
5fca83c8b7 Optimize iOS API doc 2017-09-08 14:17:24 +08:00
Hevin
d50b74cfab Add FAQ of Android 2017-09-08 11:04:31 +08:00
Hevin
c7bc0ea4c2 Remove unused doc 2017-09-08 11:04:10 +08:00
Hevin
c5f7963425 Merge branch 'dev' 2017-07-21 14:15:57 +08:00
Hevin
021725e054 Add janalytics 2017-07-21 14:11:24 +08:00
Hevin
a4eaf51455 Merge branch 'dev' 2017-07-21 14:00:30 +08:00
Hevin
5d27dca472 Foramt README 2017-07-21 13:53:07 +08:00
Hevin
09f98f7c38 Update version number to 3.2.3 2017-07-21 13:52:54 +08:00
Hevin
7b1a77aecb Update ios sdk to 3.0.6 2017-07-21 13:52:37 +08:00
Hevin
04fae7d538 Merge branch 'dev' 2017-07-12 10:16:49 +08:00
Hevin
0436cfcf3e Update version to 3.2.2 2017-07-12 10:16:10 +08:00
huangminlinux
3c70127405 fix notification in backgroup bug 2017-07-12 10:14:50 +08:00
Hevin
8e087e102a Merge branch 'dev' 2017-07-07 11:26:20 +08:00
Hevin
9f5fccefec Update version to 3.2.1 2017-07-07 11:26:04 +08:00
Hevin
be07c7383b Update setTagsWithAlias callback. 2017-07-07 11:23:56 +08:00
huangminlinux
2df6ea47a8 fix setTags/Alias bug 2017-07-07 11:21:14 +08:00
Hevin
35c09c0c92 Merge branch 'dev' 2017-07-04 17:51:51 +08:00
Hevin
c72cde6632 Add new qq group & how to custom notification sound. 2017-07-04 17:43:24 +08:00
Hevin
f0a87962e7 Merge branch 'dev' 2017-06-30 15:44:35 +08:00
Hevin
f31881d88a Add install note. 2017-06-30 15:43:58 +08:00
Hevin
31eef706e4 Update version number 2017-06-30 15:43:38 +08:00
Hevin
2cf2bcf970 Rm ios hook 2017-06-30 15:41:14 +08:00
Hevin
5d42764438 Merge branch 'master' into dev 2017-06-30 10:57:54 +08:00
Hevin
a5a03a3214 Merge pull request #249 from snipking/master
check does `com.apple.Push` attribute exist in .pbxproj
2017-06-30 10:52:56 +08:00
DerekChia jingqiang.jia@hand-china.com
7b70564f82 add: check does com.apple.Push attribute exist in .pbxproj to avoid not found error. 2017-06-29 15:15:12 +08:00
DerekChia jingqiang.jia@hand-china.com
6059f546f6 Merge remote-tracking branch 'jpush/master' 2017-06-29 15:07:28 +08:00
Hevin
d855a07271 Merge branch 'dev' 2017-06-29 10:55:27 +08:00
Hevin
c1e70448b1 Update plugin version to 3.1.9 2017-06-29 10:55:07 +08:00
Hevin
a9f6adb7af Merge branch 'master' into dev 2017-06-29 10:04:08 +08:00
Hevin
847d94c080 Merge pull request #248 from snipking/master
fix #245
2017-06-29 09:51:55 +08:00
DerekChia jingqiang.jia@hand-china.com
c959fdddeb add: check does ios.release.developmentTeam exist in build.json
fix #245
2017-06-28 16:50:26 +08:00
DerekChia jingqiang.jia@hand-china.com
4285170332 Merge remote-tracking branch 'jpush/master' 2017-06-28 16:50:04 +08:00
Hevin
86f07c9729 Merge branch 'dev' 2017-06-28 10:00:16 +08:00
Hevin
e3d8d69147 Fix spelling error. 2017-06-28 09:59:57 +08:00
Hevin
8970e44dc1 Merge branch 'dev' 2017-06-27 10:23:48 +08:00
Hevin
7f3682e2a8 fix #244 2017-06-27 10:23:33 +08:00
Hevin
dd716aaca7 Merge branch 'master' into dev 2017-06-23 16:30:32 +08:00
Hevin
f5394d6d01 Merge pull request #243 from snipking/master
fix #242
2017-06-23 16:29:09 +08:00
DerekChia jingqiang.jia@hand-china.com
2fc0bc9213 Merge remote-tracking branch 'jpush/master' 2017-06-23 14:33:15 +08:00
4bc2fe3dc1 fix #242 2017-06-23 14:31:46 +08:00
Hevin
3bf9dae294 Merge branch 'dev' 2017-06-22 12:31:18 +08:00
Hevin
ca88f5878a Update npm version 2017-06-22 12:31:00 +08:00
Hevin
8d9a7fa8b0 Add getConnectionState API 2017-06-22 12:30:47 +08:00
Hevin
dead85a931 Merge branch 'dev' 2017-06-21 13:05:04 +08:00
Hevin
95330b11ed Fix spelling error 2017-06-21 13:04:42 +08:00
hevin
cba5ffbabb Merge branch 'dev' 2017-06-14 14:02:52 +08:00
hevin
d524d8db00 Update README 2017-06-14 14:02:19 +08:00
DerekChia jingqiang.jia@hand-china.com
e20a10588f Merge remote-tracking branch 'jpush/master' 2017-06-06 13:57:52 +08:00
DerekChia jingqiang.jia@hand-china.com
eefc2e13cb fix typo 2017-06-06 13:57:38 +08:00
hevin
e8417df550 Merge branch 'master' into dev 2017-06-06 13:54:48 +08:00
Hevin
89293001e8 Merge pull request #235 from snipking/master
After hook to turn on 'Push Notification' switch on Xcode 8
2017-06-06 13:47:46 +08:00
Hevin
78222b7123 Merge branch 'dev' 2017-06-06 09:55:11 +08:00
Hevin
1fb48e886f Remove community link 2017-06-06 09:50:26 +08:00
DerekChia jingqiang.jia@hand-china.com
28a9c298c8 Remove useless execution path log 2017-06-05 22:09:22 +08:00
DerekChia jingqiang.jia@hand-china.com
c65c5a4057 After hook to turn on 'Push Notification' switch on Xcode 8 2017-06-05 21:55:55 +08:00
hevin
6a47116b82 Merge branch 'dev' 2017-06-05 19:51:34 +08:00
hevin
68b217d8a8 Remove unused link 2017-06-05 19:49:33 +08:00
hevin
13b36b746c Merge branch 'dev' 2017-05-31 17:37:08 +08:00
hevin
b234861e44 Fix package name 2017-05-31 17:34:53 +08:00
hevin
2287ef10dd Optimize ios native methods
- setTags
- setAlias
- setTagsWithAlias
2017-05-26 20:46:21 +08:00
Hevin
2a05ea1784 Merge branch 'master' into dev 2017-05-26 16:18:08 +08:00
Hevin
9d3d32d725 Optimize API
- setTags
- setAlias
- setTagsAndAlias
2017-05-26 16:17:54 +08:00
hevin
3c88e87b17 Merge branch 'dev' 2017-05-24 14:46:02 +08:00
hevin
b3b2af1520 Change package name 2017-05-24 14:43:22 +08:00
hevin
6e8b5931fb Update package name & npm version 2017-05-24 11:20:52 +08:00
hevin
23ed4817a4 Update .gitignore 2017-05-16 22:15:59 +08:00
Hevin
9a1da318cc Merge remote-tracking branch 'refs/remotes/origin/master' into dev 2017-05-15 16:15:00 +08:00
lhw5123
2fab3a9e60 Update npm version. 2017-05-10 17:29:31 +08:00
lhw5123
a032906b1f Merge branch 'dev' 2017-05-10 16:53:03 +08:00
lhw5123
d362ee788b Update Android SDK to v3.0.6 2017-05-10 16:51:28 +08:00
huangminlinux
50588d593c update jpush to 3.0.5 2017-05-03 16:33:44 +08:00
lhw5123
ea06f04415 Merge branch 'dev' 2017-05-02 23:24:40 +08:00
Hevin
e4d8752065 Update android sdk to v3.0.5 2017-05-02 17:53:16 +08:00
Hevin
9765352969 Merge remote-tracking branch 'refs/remotes/origin/dev' 2017-04-13 13:52:02 +08:00
Hevin
0589ac82ea Update Android API doc 2017-04-13 13:50:26 +08:00
Hevin
ff1fa91d67 Update API doc 2017-04-13 13:44:55 +08:00
lhw5123
14f91aacf8 Change plugin name. 2017-03-30 10:30:27 +08:00
lhw5123
15c403a471 Merge branch 'master' into dev 2017-03-29 15:30:05 +08:00
lhw5123
8b0b8cc26f Change npm dependencies. 2017-03-29 15:29:20 +08:00
pikacode
78e2e9736e Merge branch 'dev' 2017-03-27 16:32:53 +08:00
pikacode
a8daded81b iOS - fix #220 2017-03-27 16:32:28 +08:00
Hevin
18f69303ce Update Android SDK to v3.0.3 2017-03-16 14:18:04 +08:00
Hevin
390fbb9fda Add jpush.receiveRegistrationId event. 2017-03-16 10:56:04 +08:00
Hevin
3a4ceb32ce Merge remote-tracking branch 'refs/remotes/origin/dev' 2017-03-09 17:22:58 +08:00
Hevin
20ab9319bc Resolve conflicts. 2017-03-09 17:19:59 +08:00
Hevin
ef33ad5a85 Sync plugin.xml with jmessage-phonegap-plugin 2017-03-09 17:18:10 +08:00
Hevin
c355cd2b9f Update plugin.xml
Change android config.
2017-03-06 16:43:14 +08:00
pikacode
2463368cc1 Merge branch 'dev' 2017-03-01 16:56:14 +08:00
pikacode
7279fdd0ce update README 2017-03-01 16:55:27 +08:00
pikacode
75cb7dfe97 Merge branch 'dev' 2017-03-01 16:53:49 +08:00
pikacode
3b25b73adf iOS 分离 JCore 2017-03-01 16:53:05 +08:00
Hevin
2b2189f6cb Android 分离 jcore 2017-03-01 16:43:00 +08:00
pikacode
a48915f115 Merge branch 'dev' 2017-03-01 16:18:26 +08:00
pikacode
1fe6d0da8c iOS - update
1.更新 SDK 3.0.2
2017-02-20 13:25:41 +08:00
Hevin Lau
42790c71f3 统一 API,规范代码格式
- setDebugMode
- clearLocalNotifications
2017-01-17 22:59:13 +08:00
pikacode
7d868be664 Merge branch 'dev' 2017-01-17 16:57:25 +08:00
pikacode
7b65a1f469 iOS update SDK
1.JPush 3.0.1,JCore 1.1.0
2017-01-17 14:45:17 +08:00
pikacode
20d93c0047 iOS - update 2017-01-17 14:45:16 +08:00
Hevin Lau
b1a77669a2 Merge branch 'dev' 2017-01-09 10:37:49 +08:00
Hevin Lau
1cf537dacb Update android sdk to 3.0.1 2017-01-08 18:07:06 +08:00
pikacode
575fe40faf iOS - update
1.修改文件名
2016-12-30 12:32:47 +08:00
pikacode
6734bf9160 iOS - fix #194 2016-12-30 12:29:43 +08:00
pikacode
fbfe621aa3 Merge branch 'dev' 2016-12-22 16:38:01 +08:00
pikacode
df6adddc75 iOS - fix #196 2016-12-19 15:24:04 +08:00
Hevin Lau
974838d5de Merge branch 'dev' 2016-12-18 20:29:40 +08:00
Hevin Lau
727af516e8 Update version number. 2016-12-18 20:26:07 +08:00
63 changed files with 5092 additions and 2344 deletions

70
.gitignore vendored
View File

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

144
README.md
View File

@@ -1,59 +1,143 @@
# JPush PhoneGap / Cordova Plugin # JPush PhoneGap / Cordova Plugin
[![Build Status](https://travis-ci.org/jpush/jpush-phonegap-plugin.svg?branch=master)](https://travis-ci.org/jpush/jpush-phonegap-plugin) [![Build Status](https://travis-ci.org/jpush/jpush-phonegap-plugin.svg?branch=master)](https://travis-ci.org/jpush/jpush-phonegap-plugin)
[![QQ Group](https://img.shields.io/badge/QQ%20Group-413602425-red.svg)]() [![release](https://img.shields.io/badge/release-3.4.1-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases)
[![release](https://img.shields.io/badge/release-3.0.1-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases)
[![platforms](https://img.shields.io/badge/platforms-iOS%7CAndroid-lightgrey.svg)](https://github.com/jpush/jpush-phonegap-plugin) [![platforms](https://img.shields.io/badge/platforms-iOS%7CAndroid-lightgrey.svg)](https://github.com/jpush/jpush-phonegap-plugin)
[![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1) [![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1)
支持 iOS, Android Cordova 推送插件。 极光官方支持的 cordova 推送插件。
> 如需要 IM 功能的插件,可关注 [JMessage PhoneGap Plugin](https://github.com/jpush/jmessage-phonegap-plugin)。
> 如需要短信验证码功能的插件,可关注 [JSMS Cordova Plugin](https://github.com/jpush/cordova-plugin-jsms)。 - 如需要 IM 功能的插件,可关注 [jmessage-phonegap-plugin](https://github.com/jpush/jmessage-phonegap-plugin)
- 如需要短信验证码功能插件,可关注 [cordova-plugin-jsms](https://github.com/jpush/cordova-plugin-jsms)
> QQ 交流群413602425。 - 如需要统计分析功能插件,可关注 [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 ## Install
> 注意:
> - 应用的包名一定要和 APP_KEY 对应应用的包名一致,否则极光推送服务无法注册成功。
> - 在使用 8 或以上版本的 Xcode 调试 iOS 项目时,需要先在项目配置界面的 Capabilities 中打开 Push Notifications 开关。
- 通过 Cordova Plugins 安装,要求 Cordova CLI 5.0+ - 通过 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 安装: - 或直接通过 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 ## Usage
### API ### API
- [Common](/doc/Common_detail_api.md) - [Common](/doc/Common_detail_api.md)
- [iOS](/doc/iOS_API.md) - [iOS](/doc/iOS_API.md)
- [Android](/doc/Android_detail_api.md) - [Android](/doc/Android_detail_api.md)
### Demo ### Demo
插件项目中包含一个简单的 Demo。若想参考可以在 */example* 文件夹内找到并拷贝以下文件: 插件项目中包含一个简单的 Demo。若想参考可以在 */example* 文件夹内找到并拷贝以下文件:
example/index.html -> www/index.html example/index.html -> www/index.html
example/css/* -> www/css example/css/* -> www/css
example/js/* -> www/js example/js/* -> www/js
### 关于 PhoneGap build 云服务 ### 关于 PhoneGap build 云服务
该项目基于 Cordova 实现,目前无法使用 PhoneGap build 云服务进行打包,建议使用本地环境进行打包。 该项目基于 Cordova 实现,目前无法使用 PhoneGap build 云服务进行打包,建议使用本地环境进行打包。
## FAQ ## FAQ
> 如果遇到了疑问,请优先参考 Demo 和 API 文档。若还无法解决,可访问[极光社区](http://community.jiguang.cn/)或 [Issues](https://github.com/jpush/jpush-phonegap-plugin/issues) 提问。
> 如果遇到了疑问,请优先参考 Demo 和 API 文档。若还无法解决,可到 [Issues](https://github.com/jpush/jpush-phonegap-plugin/issues) 提问。
### Android ### Android
#### 在 Eclipse 中 import 工程之后出现:*Type CallbackContext cannot be resolved to a type* #### 在 Eclipse 中 import 工程之后出现:*Type CallbackContext cannot be resolved to a type*
右键单击工程名 -> Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add。 右键单击工程名 -> 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 后收不到通知 #### 关闭 App 后收不到通知
Android 的推送通过长连接的方式实现,只有在连接保持的情况下才能收到通知。而有的第三方 ROM 会限制一般应用服务的自启动,也就是
在退出应用后,应用的所有服务均被杀死,且无法自启动,所以就会收不到通知。 Android 的推送通过长连接的方式实现,只有在保持连接的情况下才能收到通知。而有的第三方 ROM 会限制一般应用服务的自启动,也就是在退出应用后,应用的所有服务均被杀死,且无法自启动,所以就会收不到通知。
目前 JPush 是做了应用互相拉起机制的,也就是当用户打开其他集成了 JPush 的应用时,你的应用也能同时收到推送消息。 目前 JPush 是做了应用互相拉起机制的,也就是当用户打开其他集成了 JPush 的应用时,你的应用也能同时收到推送消息。
@@ -62,32 +146,48 @@ Android 的推送通过长连接的方式实现,只有在连接保持的情况
或者自己实现应用保活,网上有很多相关文章(不推荐)。 或者自己实现应用保活,网上有很多相关文章(不推荐)。
> 为什么 QQ、微信之类的应用退出后还能够收到通知因为这些大厂应用手机厂商默认都会加入自启动白名单中也不会在应用退出后杀死它们的相关服务。 > 为什么 QQ、微信之类的应用退出后还能够收到通知因为这些大厂应用手机厂商默认都会加入自启动白名单中也不会在应用退出后杀死它们的相关服务。
如果你多加留意,就会发现非大厂的应用如果你一段时间不用都是收不到推送的。 > 如果你多加留意,就会发现非大厂的应用如果你一段时间不用都是收不到推送的。
### iOS ### iOS
#### XCode 10 收不到推送怎么办?
打开 xcode -> file -> WorkSpace Settings… -> Build System 改成 Legacy Build System 然后卸载 App 重新运行。
#### 打包时遇到 i386 打包失败怎么办?
```shell
cordova platform update ios
```
#### PushConfig.plist 文件中的字段都是什么意思? #### PushConfig.plist 文件中的字段都是什么意思?
- Appkey应用标识。 - Appkey应用标识。
- Channel渠道标识。 - Channel渠道标识。
- IsProduction是否生产环境。 - IsProduction是否生产环境。
- IsIDFA是否使用 IDFA 启动 SDK。 - IsIDFA是否使用 IDFA 启动 SDK。
#### 刚集成完插件收不到推送怎么办? #### 刚集成完插件收不到推送怎么办?
请首先按照正确方式再次配置证书、描述文件,具体可参考 [iOS 证书设置指南](https://docs.jiguang.cn/jpush/client/iOS/ios_cer_guide/)。 请首先按照正确方式再次配置证书、描述文件,具体可参考 [iOS 证书设置指南](https://docs.jiguang.cn/jpush/client/iOS/ios_cer_guide/)。
#### iOS 集成插件白屏、或无法启动插件、或打包报错无法找到需要引入的文件怎么办? #### iOS 集成插件白屏、或无法启动插件、或打包报错无法找到需要引入的文件怎么办
按照以下步骤逐个尝试: 按照以下步骤逐个尝试:
- 升级至 Xcode 8 - 升级至最新版本 Xcode
-删除插件、再重装插件 - 删除插件、再重装插件(先使用 `cordova platform add ios`,后使用 `cordova plugin add`
- 先使用 `cordova platform add ios`,后使用 `cordova plugin add`
## Support ## Support
- QQ 群413602425
- QQ 群413602425 / 524248013
- [JPush 官网文档](https://docs.jiguang.cn/jpush/guideline/intro/) - [JPush 官网文档](https://docs.jiguang.cn/jpush/guideline/intro/)
- [极光社区](http://community.jiguang.cn/) - [极光社区](http://community.jiguang.cn/)
## Contribute ## Contribute
Please contribute! [Look at the issues](https://github.com/jpush/jpush-phonegap-plugin/issues). Please contribute! [Look at the issues](https://github.com/jpush/jpush-phonegap-plugin/issues).
## License ## License
MIT © [JiGuang](/license) MIT © [JiGuang](/license)

View File

@@ -1,45 +1,15 @@
# Android API简介 # Android API 简介
- [接收通知时获得通知的内容](#接收通知时获得通知的内容)
- [打开通知时获得通知的内容](#打开通知时获得通知的内容)
- [收到自定义消息时获取消息的内容](#收到自定义消息时获取消息的内容)
- [获取集成日志](#获取集成日志)
- [接收消息和点击通知事件](#接收消息和点击通知事件)
- [统计分析](#统计分析)
- [清除通知](#清除通知) - [清除通知](#清除通知)
- [设置允许推送时间](#设置允许推送时间) - [设置允许推送时间](#设置允许推送时间)
- [设置通知静默时间](#设置通知静默时间) - [设置通知静默时间](#设置通知静默时间)
- [通知栏样式定制](#通知栏样式定制) - [通知栏样式定制](#通知栏样式定制)
- [设置保留最近通知条数](#设置保留最近通知条数) - [设置保留最近通知条数](#设置保留最近通知条数)
- [本地通知](#本地通知) - [本地通知](#本地通知)
- [富媒体页面 JavaScript 回调 API](#富媒体页面-javascript-回调-api) - [获取推送连接状态](#获取推送连接状态)
- [地理围栏](#地理围栏)
## 接收通知时获得通知的内容 ## 获取集成日志(同时适用于 iOS
- 内容:
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
## 获取集成日志
### API - setDebugMode ### API - setDebugMode
@@ -47,90 +17,15 @@
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.setDebugMode(mode) ```js
window.JPush.setDebugMode(mode)
```
#### 参数说明 #### 参数说明
- mode: - mode:
- true 显示集成日志。 - true 显示集成日志。
- false 不显示集成日志。 - 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: 关闭统计分析功能。
### API - reportNotificationOpened ### API - reportNotificationOpened
@@ -138,13 +33,14 @@
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.reportNotificationOpened(msgID) ```js
window.JPush.reportNotificationOpened(msgID)
```
#### 参数说明 #### 参数说明
- msgID: 收到的通知或者自定义消息的 id。 - msgID: 收到的通知或者自定义消息的 id。
## 清除通知 ## 清除通知
### API - clearAllNotification ### API - clearAllNotification
@@ -155,36 +51,46 @@
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.clearAllNotification() ```js
window.JPush.clearAllNotification()
```
### API - clearNotificationById ### API - clearNotificationById
根据通知 Id 清除通知(包括本地通知)。 根据通知 Id 清除通知(包括本地通知)。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.clearNotificationById(notificationId) ```js
window.JPush.clearNotificationById(notificationId)
```
#### 参数说明 #### 参数说明
- notificationIdint通知的 id。 - notificationIdint通知的 id。
#### 代码示例 #### 代码示例
window.plugins.jPushPlugin.clearNotificationById(1) ```js
window.JPush.clearNotificationById(1)
```
## 设置允许推送时间 ## 设置允许推送时间
### API - setPushTime ### API - setPushTime
默认情况下用户在任何时间都允许推送。即任何时候有推送下来,客户端都会收到,并展示。 默认情况下用户在任何时间都允许推送。即任何时候有推送下来,客户端都会收到,并展示。
开发者可以调用此 API 来设置允许推送的时间。 开发者可以调用此 API 来设置允许推送的时间。
如果不在该时间段内收到消息,当前的行为是:推送到的通知会被扔掉。 如果不在该时间段内收到消息,当前的行为是:推送到的通知会被扔掉。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.setPushTime(days, startHour, endHour) ```js
window.JPush.setPushTime(days, startHour, endHour)
```
#### 参数说明 #### 参数说明
- days: 数组0 表示星期天1 表示星期一以此类推7天制数组中值的范围为 0 到 6 )。 - days: 数组0 表示星期天1 表示星期一以此类推7天制数组中值的范围为 0 到 6 )。
数组的值为 null, 表示任何时间都可以收到消息和通知,数组的 size 为 0则表示任何时间都收不到消息和通知。 数组的值为 null, 表示任何时间都可以收到消息和通知,数组的 size 为 0则表示任何时间都收不到消息和通知。
- startHour: 整形,允许推送的开始时间 24 小时制startHour 的范围为 0 到 23 - startHour: 整形,允许推送的开始时间 24 小时制startHour 的范围为 0 到 23
- endHour: 整形,允许推送的结束时间 24 小时制endHour 的范围为 0 到 23 - endHour: 整形,允许推送的结束时间 24 小时制endHour 的范围为 0 到 23
@@ -197,7 +103,9 @@
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.setSilenceTime(startHour, startMinute, endHour, endMinute) ```js
window.JPush.setSilenceTime(startHour, startMinute, endHour, endMinute)
```
#### 参数说明 #### 参数说明
@@ -206,9 +114,13 @@
- endHour: 整形,静音时段的结束时间 - 小时 24小时制范围0~23 )。 - endHour: 整形,静音时段的结束时间 - 小时 24小时制范围0~23 )。
- endMinute: 整形,静音时段的结束时间 - 分钟范围0~59 )。 - endMinute: 整形,静音时段的结束时间 - 分钟范围0~59 )。
## 通知栏样式定制 ## 通知栏样式定制
目前 REST API 与极光控制台均已支持「大文本通知栏样」、「文本条目通知栏样式」和「大图片通知栏样式」。可直接推送对应样式
的通知。
此外也能够通过设置 Notification 的 flag 来控制通知提醒方式,具体用法可参考 [后台 REST API](https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push/#notification)。
### API - setBasicPushNotificationBuilder, setCustomPushNotificationBuilder ### API - setBasicPushNotificationBuilder, setCustomPushNotificationBuilder
当用户需要定制默认的通知栏样式时,则可调用此方法。 当用户需要定制默认的通知栏样式时,则可调用此方法。
@@ -227,9 +139,10 @@ JPush SDK 提供了 2 个用于定制通知栏样式的构建类:
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.setBasicPushNotificationBuilder() ```js
window.plugins.jPushPlugin.setCustomPushNotificationBuilder() window.JPush.setBasicPushNotificationBuilder()
window.JPush.setCustomPushNotificationBuilder()
```
## 设置保留最近通知条数 ## 设置保留最近通知条数
@@ -241,97 +154,110 @@ JPush SDK 提供了 2 个用于定制通知栏样式的构建类:
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.setLatestNotificationNum(num) ```js
window.JPush.setLatestNotificationNum(num)
```
#### 参数说明 #### 参数说明
- num: 保存的条数。 - num: 保存的条数。
## 本地通知 ## 本地通知
### API - addLocalNotification, removeLocalNotification, clearLocalNotifications ### API - addLocalNotification, removeLocalNotification, clearLocalNotifications
本地通知 API 不依赖于网络,无网条件下依旧可以触发。 本地通知 API 不依赖于网络,无网条件下依旧可以触发。
本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制。 本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制。
本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响。 本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响。
三个接口的功能分别为:添加一个本地通知,除一个本地通知,除所有的本地通知。 三个接口的功能分别为:添加一个本地通知,除一个本地通知,除所有的本地通知。
#####接口定义 #### 接口定义
window.plugins.jPushPlugin.addLocalNotification(builderId, content, title, ```js
notificaitonID, broadcastTime, extras) window.JPush.addLocalNotification(builderId, content, title, notificationID, broadcastTime, extras)
window.plugins.jPushPlugin.removeLocalNotification(notificationID) window.JPush.removeLocalNotification(notificationID)
window.plugins.jPushPlugin.clearLocalNotifications() window.JPush.clearLocalNotifications() // 同时适用于 iOS
```
#### 参数说明 #### 参数说明
- builderId: 设置本地通知样式。 - builderId: 设置本地通知样式。
- content: 设置本地通知的 content。 - content: 设置本地通知的 content。
- title: 设置本地通知的 title。 - title: 设置本地通知的 title。
- notificaitonID: 设置本地通知的 ID。 - notificationID: 设置本地通知的 ID(不要为 0
- broadcastTime: 设置本地通知触发时间,为距离当前时间的数值,单位是毫秒。 - broadcastTime: 设置本地通知触发时间,为距离当前时间的数值,单位是毫秒。
- extras: 设置额外的数据信息 extras 为 json 字符串。 - extras: 设置额外的数据信息 extras 为 json 字符串。
## 获取推送连接状态
## 富媒体页面 JavaScript 回调 API ### API - getConnectionState
富媒体推送通知时用户可以用自定义的Javascript 函数来控制页面,如关闭当前页面,点击按钮跳转到指定的 Activity通知应用程序做一些指定的动作等。
此 API 提供的回调函数包括:关闭当前页面、打开应用的主 Activity、根据 Activity 名字打开对应的 Activity、以广播的形式传递页面参数到应用程序等功能。 开发者可以使用此功能获取当前 Push 服务的连接状态
### API - 关闭当前页面 #### 接口定义
JPushWeb.close(); // 在富文本 HTML 页面中调用后会关闭当前页面。 ```js
window.JPush.getConnectionState(callback)
```
### API - 打开主 Activity #### 参数说明
JPushWeb.startMainActivity(String params); - callback: 回调函数,用来通知 JPush 的推送服务是否开启。
在HTML中调用此函数后,会打开程序的主Activity 并在对应的 Intent 传入参数 ”params“ Key 为 JPushInterface.EXTRA_EXTRA。
对应 Activity 获取 params 示例代码:
Intent intent = getIntent();
if (null != intent ) {
String params = intent.getStringExtra(JPushInterface.EXTRA_EXTRA);
}
### API - 触发应用中的操作
JPushWeb.triggerNativeAction(String params);
调用了该方法后需要在 MyReceiver.java 中实现后面的业务逻辑:
if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
Log.d(TAG, "用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
//在这里根据 JPushInterface.EXTRA_EXTRA 的内容触发客户端动作比如打开新的Activity 、打开一个网页等。
}
#### 代码示例 #### 代码示例
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> ```js
<html> window.JPush.getConnectionState(function (result) {
<head> if (result == 0) {
<title>JPush Webview Test</title> // 链接状态
<script> } else {
function clickButton() { // 断开状态
JPushWeb.close(); }
} })
```
function openUrl() { ## 地理围栏
var json = "{'action':'open', 'url':'www.jpush.cn'}";
JPushWeb.triggerNativeAction(json); ### API - setGeofenceInterval
JPushWeb.close(); //客服端在广播中收到json 后可以打开对应的URL。
} 设置地理围栏监控周期最小3分钟最大1天。默认为15分钟当距离地理围栏边界小于1000米周期自动调整为3分钟。设置成功后一直使用设置周期不会进行调整。
</script>
</head> #### 接口定义
<body>
<button onclick="javascript:clickButton(this);return false;">Close</button> ```js
<button onclick="javascript:JPushWeb.startMainActivity('test - startMainActivity');return false;">StartMainActivity</button> window.JPush.setGeofenceInterval(interval)
<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> - interval: 监控周期,单位是毫秒。
### API - setMaxGeofenceNumber
设置最多允许保存的地理围栏数量超过最大限制后如果继续创建先删除最早创建的地理围栏。默认数量为10个允许设置最小1个最大100个。
#### 接口定义
```js
window.JPush.setMaxGeofenceNumber(maxNumber)
```
#### 参数说明
- maxNumber: 最多允许保存的地理围栏个数
### API - setBadgeNumber
设置App角标目前仅华为系手机支持。
#### 接口定义
```js
window.JPush.setBadgeNumber(badgeNumb)
```
#### 参数说明
- badgeNumb: 角标显示数字小于或等0角标显示数字清楚

View File

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

View File

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

View File

@@ -3,7 +3,6 @@
- [延迟注册和启动推送通知服务](#延迟注册和启动推送通知服务) - [延迟注册和启动推送通知服务](#延迟注册和启动推送通知服务)
- [开始与停止推送服务](#开始与停止推送服务) - [开始与停止推送服务](#开始与停止推送服务)
- [获取 RegistrationID](#获取-registrationid) - [获取 RegistrationID](#获取-registrationid)
- [别名与标签](#别名与标签)
- [获取 APNS 推送内容](#获取-apns-推送内容) - [获取 APNS 推送内容](#获取-apns-推送内容)
- [点击推送通知](#点击推送通知) - [点击推送通知](#点击推送通知)
- [前台收到推送](#前台收到推送) - [前台收到推送](#前台收到推送)
@@ -20,8 +19,6 @@
- [获取用户推送设置](#获取用户推送设置) - [获取用户推送设置](#获取用户推送设置)
- [监听事件统一说明](#监听事件统一说明) - [监听事件统一说明](#监听事件统一说明)
## 延迟注册和启动推送通知服务 ## 延迟注册和启动推送通知服务
本插件默认在 App 启动完成之后,立即「注册苹果通知服务」+「启动 JPush SDK」其中 本插件默认在 App 启动完成之后,立即「注册苹果通知服务」+「启动 JPush SDK」其中
@@ -31,8 +28,8 @@
开发者可以根据自己的需求,延迟注册和启动,需做以下操作: 开发者可以根据自己的需求,延迟注册和启动,需做以下操作:
1. 查找并配置 `PushConfig.plist` 文件中的 `Delay` 字段为 `YES`,表明会延迟使用,此时插件不再自动注册、启动通知。 1.查找并配置 `PushConfig.plist` 文件中的 `Delay` 字段为 `YES`,表明会延迟使用,此时插件不再自动注册、启动通知。
2. 在需要注册并启动通知的地方调用 API - startJPushSDK。 2.在需要注册并启动通知的地方调用 API - `startJPushSDK`
### API - startJPushSDK ### API - startJPushSDK
@@ -40,11 +37,9 @@
#### 接口定义 #### 接口定义
```js
window.JPush.startJPushSDK()
``` ```
window.plugins.jPushPlugin.startJPushSDK()
```
## 开始与停止推送服务 ## 开始与停止推送服务
@@ -52,30 +47,30 @@ window.plugins.jPushPlugin.startJPushSDK()
调用此 API用来开启 JPush SDK 提供的推送服务。 调用此 API用来开启 JPush SDK 提供的推送服务。
#### 接口定义
```js
window.JPush.init()
```
### API - stopPush
开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
```
本功能是一个完全本地的状态操作。也就是说:停止推送服务的状态不会保存到服务器上。 本功能是一个完全本地的状态操作。也就是说:停止推送服务的状态不会保存到服务器上。
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据, 如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。 JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息, 本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。 恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
```
#### 接口定义
```
window.plugins.jPushPlugin.init()
```
### API - stopPush
- 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。 - 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。
- 推荐:设置一个 UI 界面,提醒用户在 设置-通知 中关闭推送服务。 - 推荐:设置一个 UI 界面,提醒用户在 设置-通知 中关闭推送服务。
#### 接口定义 #### 接口定义
window.plugins.jPushPlugin.stopPush() ```js
window.JPush.stopPush()
```
### API - resumePush ### API - resumePush
@@ -83,11 +78,9 @@ window.plugins.jPushPlugin.init()
#### 接口定义 #### 接口定义
```js
window.JPush.resumePush()
``` ```
window.plugins.jPushPlugin.resumePush()
```
### API - isPushStopped ### API - isPushStopped
@@ -95,8 +88,8 @@ iOS平台检查推送服务是否停止。
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.isPushStopped(callback) window.JPush.isPushStopped(callback)
``` ```
#### 参数说明 #### 参数说明
@@ -106,13 +99,13 @@ window.plugins.jPushPlugin.isPushStopped(callback)
#### 代码示例 #### 代码示例
```js ```js
window.plugins.jPushPlugin.isPushStopped(function(data) { window.JPush.isPushStopped(function(data) {
if(data > 0) { if(data > 0) {
// 已关闭 // 已关闭
} else { } else {
// 已开启 // 已开启
} }
}) })
``` ```
## 获取 RegistrationID ## 获取 RegistrationID
@@ -129,7 +122,7 @@ JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
#### 接口定义 #### 接口定义
```js ```js
JPushPlugin.prototype.getRegistrationID(callback) JPushPlugin.getRegistrationID(callback)
``` ```
#### 返回值 #### 返回值
@@ -139,137 +132,50 @@ JPushPlugin.prototype.getRegistrationID(callback)
#### 调用示例 #### 调用示例
```js ```js
window.plugins.jPushPlugin.getRegistrationID(function(data) { window.JPush.getRegistrationID(function(data) {
console.log("JPushPlugin:registrationID is " + data) console.log("JPushPlugin:registrationID is " + data)
}) })
``` ```
## 别名与标签
### API - setTagsWithAlias, setTags, setAlias
提供几个相关 API 用来设置别名alias与标签tags
这几个 API 可以在 App 里任何地方调用。
**别名 Alias**
为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
每个用户只能指定一个别名。
同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端 API 会同时给这多个用户发送消息。
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端 API 发通知到客户端提醒用户。
**标签 Tag**
为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push 消息。
可为每个用户打多个标签。
不同应用程序、不同的用户,可以打同样的标签。
举例: game, old_page, women。
#### 接口定义
```
JPushPlugin.prototype.setTagsWithAlias(tags, alias)
JPushPlugin.prototype.setTags(tags)
JPushPlugin.prototype.setAlias(alias)
```
#### 参数说明
- tags:
- 参数类型为数组。
- nil 此次调用不设置此值。
- 空集合表示取消之前的设置。
- 每次调用至少设置一个 tag覆盖之前的设置不是新增。
- 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
- 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag但总长度不得超过1K字节判断长度需采用UTF-8编码
- 单个设备最多支持设置 100 个 tagApp 全局 tag 数量无限制。
- alias:
- 参数类型为字符串。
- nil 此次调用不设置此值。
- 空字符串 "")表示取消之前的设置。
- 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
- 限制alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
#### 返回值说明
函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果。
```js
var onTagsWithAlias = function(event) {
console.log("onTagsWithAlias")
var result = "result code:"+event.resultCode + " "
result += "tags:" + event.tags + " "
result += "alias:" + event.alias + " "
$("#tagAliasResult").html(result)
}
document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false)
```
#### 错误码定义
| Code | 描述 | 详细解释 |
| ---- | :-------------------------- | :-------------------------------- |
| 6001 | 无效的设置tag/alias 不应参数都为 null | |
| 6002 | 设置超时 | 建议重试。 |
| 6003 | alias 字符串不合法 | 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。 |
| 6004 | alias超长 | 最多 40个字节 中文 UTF-8 是 3 个字节。 |
| 6005 | 某一个 tag 字符串不合法 | 有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。 |
| 6006 | 某一个 tag 超长 | 一个 tag 最多 40个字节 中文 UTF-8 是 3 个字节。 |
| 6007 | tags 数量超出限制(最多 100 个) | 这是一台设备的限制。一个应用全局的标签数量无限制。 |
| 6008 | tag/alias 超出总长度限制 | 总长度最多 1K 字节。 |
| 6011 | 10s内设置tag或alias大于3次 | 短时间内操作过于频繁。 |
## 获取 APNS 推送内容 ## 获取 APNS 推送内容
### 点击推送通知 ### 点击推送通知
#### event - jpush.openNotification #### event - jpush.openNotification
点击通知启动或唤醒应用程序时会发该事件 点击通知(包括 localNotification 和 remoteNotification启动或唤醒应用程序时会发该事件
#### 代码示例 #### 代码示例
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
```js ```js
document.addEventListener("jpush.openNotification", onOpenNotification, false) document.addEventListener("jpush.openNotification", onOpenNotification, false)
``` ```
- onOpenNotification 需要这样写: - onOpenNotification 需要这样写:
```js ```js
var onOpenNotification = function(event) { var onOpenNotification = function(event) {
var alertContent var alertContent = event.aps.alert
alertContent = event.aps.alert alert("open notification:" + alertContent)
alert("open Notificaiton:" + alertContent) }
} ```
```
- event 举例: - event 举例:
```json ```json
{ {
"aps":{ "aps":{
"badge":1, "badge":1,
"sound":"default", "sound":"default",
"alert":"今天去哪儿" "alert":"今天去哪儿"
}, },
"key1":"value1", "key1":"value1",
"key2":"value2", "key2":"value2",
"_j_msgid":154604475 "_j_msgid":154604475
} }
``` ```
### 前台收到推送 ### 前台收到推送
@@ -281,34 +187,33 @@ document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false)
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
```js ```js
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false) document.addEventListener("jpush.receiveNotification", onReceiveNotification, false)
``` ```
- onReceiveNotification 需要这样写: - onReceiveNotification 需要这样写:
```js ```js
var onReceiveNotification = function(event) { var onReceiveNotification = function(event) {
var alertContent var alertContent = event.aps.alert
alertContent = event.aps.alert alert("open Notification:" + alertContent)
alert("open Notificaiton:" + alertContent) }
} ```
```
- event 举例 - event 举例
```json ```json
{ {
"aps":{ "aps":{
"badge":1, "badge":1,
"sound":"default", "sound":"default",
"alert":"今天去哪儿" "alert":"今天去哪儿"
}, },
"key1":"value1", "key1":"value1",
"key2":"value2", "key2":"value2",
"_j_msgid":154604475 "_j_msgid":154604475
} }
``` ```
### 后台收到推送 ### 后台收到推送
@@ -320,100 +225,92 @@ document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false)
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
```js ```js
document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false) document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false)
``` ```
- onBackgroundNotification 需要这样写: - onBackgroundNotification 需要这样写:
```js ```js
var onBackgroundNotification = function(event) { var onBackgroundNotification = function(event) {
var alertContent var alertContent = event.aps.alert
alertContent = event.aps.alert alert("open Notification:" + alertContent)
alert("open Notificaiton:" + alertContent) }
} ```
```
- event 举例 - event 举例
```json ```json
{ {
"aps":{ "aps":{
"badge":1, "badge":1,
"sound":"default", "sound":"default",
"alert":"今天去哪儿" "alert":"今天去哪儿"
}, },
"key1":"value1", "key1":"value1",
"key2":"value2", "key2":"value2",
"_j_msgid":154604475 "_j_msgid":154604475
} }
``` ```
## 获取自定义消息内容
### event - jpush.receiveMessage ### event - jpush.receiveMessage
收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。 收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 `receiveMessageIniOSCallback` 的回调函数,兼容以前的代码。
#### 代码示例 #### 代码示例
- 在你需要接收通知的的 js 文件中加入: - 在你需要接收通知的的 js 文件中加入:
```js ```js
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false) document.addEventListener("jpush.receiveMessage", onReceiveMessage, false)
``` ```
- onReceiveMessage 需要这样写: - onReceiveMessage 需要这样写:
```js ```js
var onReceiveMessage = function(event) { var onReceiveMessage = function(event) {
try { try {
var message = event.content var message = event.content
$("#messageResult").html(message) $("#messageResult").html(message)
} catch(exception) { } catch(exception) {
console.log("JPushPlugin:onReceiveMessage-->" + exception); console.log("JPushPlugin:onReceiveMessage-->" + exception);
}
} }
``` }
```
- event 举例: - event 举例:
```json ```json
{
"content":"今天去哪儿",
"extras":
{ {
"content":"今天去哪儿", "key":"不填写没有"
"extras":
{
"key":"不填写没有"
}
} }
``` }
```
## 设置Badge ## 设置Badge
### API - setBadge, resetBadge ### API - setBadge, resetBadge
JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。 JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
(本接口不会直接改变应用本地的角标值. 要修改本地 badege 值,使用 setApplicationIconBadgeNumber (本接口不会直接改变应用本地的角标值. 要修改本地 badge 值,使用 `setApplicationIconBadgeNumber`
实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。 实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。
#### 接口定义 #### 接口定义
```js ```js
window.plugins.jPushPlugin.prototype.setBadge(value) window.JPush.setBadge(value)
window.plugins.jPushPlugin.prototype.reSetBadge() window.JPush.resetBadge()
``` ```
resetBadge 相当于 setBadge(0)。 `resetBadge` 相当于 `setBadge(0)`
#### 参数说明 #### 参数说明
value 取值范围:[0,99999] value 取值范围:0 ~ 99999。
#### 返回值 #### 返回值
@@ -422,8 +319,8 @@ value 取值范围:[0,99999]。
#### 代码示例 #### 代码示例
```js ```js
window.plugins.jPushPlugin.setBadge(5) window.JPush.setBadge(5)
window.plugins.jPushPlugin.reSetBadge() window.JPush.resetBadge()
``` ```
### API - setApplicationIconBadgeNumber ### API - setApplicationIconBadgeNumber
@@ -433,17 +330,17 @@ window.plugins.jPushPlugin.reSetBadge()
#### 接口定义 #### 接口定义
```js ```js
window.plugins.jPushPlugin.prototype.setApplicationIconBadgeNumber(badge) window.JPush.setApplicationIconBadgeNumber(badge)
``` ```
#### 参数说明 #### 参数说明
- badge: 整,例如 012当 badge 为 0 时,角标被清除)。 - badge: 整,例如 0, 1, 2当 badge 为 0 时,角标被清除)。
#### 代码示例 #### 代码示例
``` ```js
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0) window.JPush.setApplicationIconBadgeNumber(0)
``` ```
### API - getApplicationIconBadgeNumber ### API - getApplicationIconBadgeNumber
@@ -452,8 +349,8 @@ window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0)
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.getApplicationIconBadgeNumber(callback) window.JPush.getApplicationIconBadgeNumber(callback)
``` ```
#### 参数说明 #### 参数说明
@@ -463,8 +360,8 @@ window.plugins.jPushPlugin.prototype.getApplicationIconBadgeNumber(callback)
#### 代码示例 #### 代码示例
```js ```js
window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data) { window.JPush.getApplicationIconBadgeNumber(function(badgeNum) {
console.log(data) console.log(badgeNum)
}) })
``` ```
@@ -477,12 +374,12 @@ window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data) {
#### 接口定义 #### 接口定义
```js ```js
window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras) window.JPush.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
``` ```
#### 参数说明 #### 参数说明
- delayTime: 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可。 - delayTime: 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可,单位为秒
- content: 本地推送需要显示的内容。 - content: 本地推送需要显示的内容。
- badge: 角标的数字。如果不需要改变角标传-1。数值类型或纯数字的字符型均可。 - badge: 角标的数字。如果不需要改变角标传-1。数值类型或纯数字的字符型均可。
- notificationID: 本地推送标识符,字符串。 - notificationID: 本地推送标识符,字符串。
@@ -491,7 +388,7 @@ window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, conte
#### 代码示例 #### 代码示例
```js ```js
window.plugins.jPushPlugin.addLocalNotificationForIOS(24*60*60, "本地推送内容", 1, "notiId", {"key":"value"}); window.JPush.addLocalNotificationForIOS(24*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
``` ```
### API - deleteLocalNotificationWithIdentifierKeyInIOS ### API - deleteLocalNotificationWithIdentifierKeyInIOS
@@ -501,7 +398,7 @@ window.plugins.jPushPlugin.addLocalNotificationForIOS(24*60*60, "本地推送内
#### 接口定义 #### 接口定义
```js ```js
window.plugins.jPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey) window.JPush.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey)
``` ```
#### 参数说明 #### 参数说明
@@ -510,8 +407,8 @@ window.plugins.jPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInI
#### 代码示例 #### 代码示例
``` ```js
window.plugins.jPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS("identifier") window.JPush.deleteLocalNotificationWithIdentifierKeyInIOS("identifier")
``` ```
### API - clearAllLocalNotifications ### API - clearAllLocalNotifications
@@ -520,17 +417,15 @@ window.plugins.jPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS("identi
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.clearAllLocalNotifications() window.JPush.clearAllLocalNotifications()
``` ```
#### 代码示例 #### 代码示例
```js
window.JPush.clearAllLocalNotifications()
``` ```
window.plugins.jPushPlugin.clearAllLocalNotifications()
```
## 获取本地通知内容 ## 获取本地通知内容
@@ -538,7 +433,33 @@ window.plugins.jPushPlugin.clearAllLocalNotifications()
监听 `jpush.receiveLocalNotification` 事件获取「App 在后台时点击通知横幅」或「App 在前台时收到」均会触发该事件。 监听 `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 收到本地通知 ### iOS 10 收到本地通知
@@ -546,12 +467,6 @@ window.plugins.jPushPlugin.clearAllLocalNotifications()
### 点击本地通知横幅启动 App
监听 `jpush.startLocalNotification` 事件。
## 页面的统计 ## 页面的统计
### API - startLogPageView, stopLogPageView, beginLogPageView ### API - startLogPageView, stopLogPageView, beginLogPageView
@@ -561,16 +476,16 @@ window.plugins.jPushPlugin.clearAllLocalNotifications()
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.startLogPageView(pageName) window.JPush.startLogPageView(pageName)
window.plugins.jPushPlugin.prototype.stopLogPageView(pageName) window.JPush.stopLogPageView(pageName)
window.plugins.jPushPlugin.prototype.beginLogPageView(pageName, duration) window.JPush.beginLogPageView(pageName, duration)
``` ```
#### 参数说明 #### 参数说明
- pageName: 需要统计页面自定义名称 - pageName: 需要统计页面自定义名称
- duration: 自定义的页面时间 - duration: 自定义的页面时间
#### 调用说明 #### 调用说明
@@ -580,10 +495,10 @@ window.plugins.jPushPlugin.prototype.beginLogPageView(pageName, duration)
#### 代码示例 #### 代码示例
``` ```js
window.plugins.jPushPlugin.beginLogPageView("newPage", 5); window.JPush.beginLogPageView("newPage", 5);
window.plugins.jPushPlugin.startLogPageView("onePage"); window.JPush.startLogPageView("onePage");
window.plugins.jPushPlugin.stopLogPageView("onePage"); window.JPush.stopLogPageView("onePage");
``` ```
## 日志等级设置 ## 日志等级设置
@@ -592,18 +507,12 @@ window.plugins.jPushPlugin.stopLogPageView("onePage");
用于开启 Debug 模式,显示更多的日志信息。 用于开启 Debug 模式,显示更多的日志信息。
建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 setLogOFF 是相反的一对。 建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 `setLogOFF` 是相反的一对。
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.setDebugModeFromIos() window.JPush.setDebugModeFromIos();
```
#### 代码示例
```
window.plugins.jPushPlugin.setDebugModeFromIos();
``` ```
### API - setLogOFF ### API - setLogOFF
@@ -614,14 +523,8 @@ window.plugins.jPushPlugin.setDebugModeFromIos();
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.setLogOFF() window.JPush.setLogOFF();
```
#### 代码示例
```
window.plugins.jPushPlugin.setLogOFF();
``` ```
### API - setCrashLogON ### API - setCrashLogON
@@ -632,14 +535,8 @@ window.plugins.jPushPlugin.setLogOFF();
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.setCrashLogON() window.JPush.setCrashLogON();
```
#### 代码示例
```
window.plugins.jPushPlugin.setCrashLogON();
``` ```
## 地理位置上报 ## 地理位置上报
@@ -650,8 +547,8 @@ window.plugins.jPushPlugin.setCrashLogON();
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.setLocation(latitude, longitude) window.JPush.prototype.setLocation(latitude, longitude)
``` ```
#### 参数说明 #### 参数说明
@@ -659,12 +556,6 @@ window.plugins.jPushPlugin.prototype.setLocation(latitude, longitude)
- latitude: 地理位置纬度,数值类型或纯数字的字符型均可。 - latitude: 地理位置纬度,数值类型或纯数字的字符型均可。
- longitude: 地理位置精度,数值类型或纯数字的字符型均可。 - longitude: 地理位置精度,数值类型或纯数字的字符型均可。
#### 代码示例
```
window.plugins.jPushPlugin.setLocation(39.26,115.25);
```
## 设备平台判断 ## 设备平台判断
### API - isPlatformIOS ### API - isPlatformIOS
@@ -673,22 +564,20 @@ window.plugins.jPushPlugin.setLocation(39.26,115.25);
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.isPlatformIOS() window.JPush.isPlatformIOS()
``` ```
#### 代码示例 #### 代码示例
```js ```js
if(window.plugins.jPushPlugin.isPlatformIOS()) { if(window.JPush.isPlatformIOS()) {
// iOS // iOS
} else { } else {
// Android // Android
} }
``` ```
## iOS 10 进阶推送特性 ## iOS 10 进阶推送特性
### API - addDismissActions ### API - addDismissActions
@@ -705,8 +594,8 @@ if(window.plugins.jPushPlugin.isPlatformIOS()) {
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.addDismissActions(actions, categoryId); window.JPush.addDismissActions(actions, categoryId);
``` ```
#### 参数说明 #### 参数说明
@@ -727,7 +616,9 @@ window.plugins.jPushPlugin.prototype.addDismissActions(actions, categoryId);
#### 代码示例 #### 代码示例
```js ```js
window.plugins.jPushPlugin.addDismissActions([{"title":"t1", "identifier":"id1", "option":"0"}, {"title":"t2", "identifier":"id2", "option":"3", "type":"textInput", "textInputButtonTitle":"回复", "textInputPlaceholder":"点此输入回复内容"}], "categoryId_t1_t2"); window.JPush.addDismissActions([
{"title":"t1", "identifier":"id1", "option":"0"},
{"title":"t2", "identifier":"id2", "option":"3", "type":"textInput", "textInputButtonTitle":"回复", "textInputPlaceholder":"点此输入回复内容"}], "categoryId_t1_t2");
``` ```
### API - addNotificationActions ### API - addNotificationActions
@@ -744,8 +635,8 @@ iPhone 6s 及以后设备且 iOS 9 以后系统支持 3d-touch。
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId) window.JPush.addNotificationActions(actions, categoryId)
``` ```
#### 参数说明 #### 参数说明
@@ -764,23 +655,23 @@ window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId)
#### 配置方法 #### 配置方法
1. 首先配置好 iOS 项目的证书。如下图所示没有任何异常警告: 1.首先配置好 iOS 项目的证书。如下图所示没有任何异常警告:
![](res/MediaAttachments_01.png) ![](res/MediaAttachments_01.png)
2. 打开 iOS Xcode Project - File - New - Target - iOS - Notification Service Extension - Next - Product Name 填写 `jpushNotificationService` - Finish如下图所示 ![](res/MediaAttachments_02.png) 2.打开 iOS Xcode Project - File - New - Target - iOS - Notification Service Extension - Next - Product Name 填写 `jpushNotificationService` - Finish如下图所示 ![](res/MediaAttachments_02.png)
![MediaAttachments_03](res/MediaAttachments_03.png) ![MediaAttachments_03](res/MediaAttachments_03.png)
![MediaAttachments_04](res/MediaAttachments_04.png) ![MediaAttachments_04](res/MediaAttachments_04.png)
3. 在 Xcode 工程目录左侧系统自动创建了 jpushNotificationService 文件夹及三个文件,下载本插件目录 `jpush-phonegap-plugin/src/ios/notificationService/` 下的 `NotificationService.h`、`NotificationService.m` 文件,全部复制替换对应文件内代码。 3.在 Xcode 工程目录左侧系统自动创建了 jpushNotificationService 文件夹及三个文件,下载本插件目录 `jpush-phonegap-plugin/src/ios/notificationService/` 下的 `NotificationService.h``NotificationService.m` 文件,全部复制替换对应文件内代码。
4. 在 Xcode 中拖拽图片、gif、audio、video 等资源文件至 `jpushNotificationService` 文件夹目录下,弹出菜单选择如下: ![MediaAttachments_06](res/MediaAttachments_06.png) 4.在 Xcode 中拖拽图片、gif、audio、video 等资源文件至 `jpushNotificationService` 文件夹目录下,弹出菜单选择如下: ![MediaAttachments_06](res/MediaAttachments_06.png)
5. 在极光控制台 - 发送通知 - 可选设置 - mutable-content 打勾。 5.在极光控制台 - 发送通知 - 可选设置 - mutable-content 打勾。
6. 添加附加字段, key 为 `JPushPluginAttachment` value 为资源名称如 `aPic.png`,该资源必须在第 4 步中已经添加至工程且文件名和拓展名完全对应。5、6 如下图所示: 6.添加附加字段, key 为 `JPushPluginAttachment` value 为资源名称如 `aPic.png`,该资源必须在第 4 步中已经添加至工程且文件名和拓展名完全对应。5、6 如下图所示:
![MediaAttachments_05](res/MediaAttachments_05.png) ![MediaAttachments_05](res/MediaAttachments_05.png)
@@ -788,15 +679,15 @@ window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId)
```json ```json
{ {
aps:{ aps:{
alert:{...}, alert:{...},
mutable-content:1 //必须 mutable-content:1 //必须
} }
JPushPluginAttachment:aPic.png //必须 JPushPluginAttachment:aPic.png //必须
} }
``` ```
7. 立即发送。 7.立即发送。
## 获取用户推送设置 ## 获取用户推送设置
@@ -806,8 +697,8 @@ window.plugins.jPushPlugin.prototype.addNotificationActions(actions, categoryId)
#### 接口定义 #### 接口定义
``` ```js
window.plugins.jPushPlugin.prototype.getUserNotificationSettings(callback) window.JPush.getUserNotificationSettings(callback)
``` ```
#### 返回值 #### 返回值
@@ -833,53 +724,30 @@ window.plugins.jPushPlugin.prototype.getUserNotificationSettings(callback)
- UNAlertStyleAlert = 2 - UNAlertStyleAlert = 2
## 监听事件统一说明 ## 监听事件统一说明
可在 js 监听全部事件如下: 可在 js 监听全部事件如下:
##### jpush.receiveNotification ### jpush.receiveNotification
> [前台收到远程通知](#前台收到推送) [前台收到远程通知](#前台收到推送)
>
> [iOS 10 前台收到本地通知](#ios-10-收到本地通知)
[iOS 10 前台收到本地通知](#ios-10-收到本地通知)
### jpush.openNotification
##### jpush.openNotification [点击远程通知横幅使 App「进入前台」或「启动」](#点击推送通知)
> [点击远程通知横幅使 App「进入前台」或「启动」](#点击推送通知) [iOS 10 点击本地通知横幅使 App「进入前台」或「启动」](#ios-10-收到本地通知)
>
> [iOS 10 点击本地通知横幅使 App「进入前台」或「启动」](#ios-10-收到本地通知)
### jpush.backgroundNotification
[iOS 7 以后后台收到远程通知](#后台收到推送)
##### jpush.backgroundNotification ### jpush.receiveMessage
> [iOS 7 以后后台收到远程通知](#后台收到推送) [获取自定义消息内容](#获取自定义消息内容)
### jpush.receiveLocalNotification
[iOS 10 before 收到本地通知](#ios-10-before-收到本地通知)
##### jpush.setTagsWithAlias
> [设置标签别名回调](#返回值说明)
##### jpush.receiveMessage
> [获取自定义消息内容](#获取自定义消息内容)
##### jpush.startLocalNotification
> [点击本地通知横幅启动 App](#点击本地通知横幅启动-app)
##### jpush.receiveLocalNotification
> [iOS 10 before 收到本地通知](#ios-10-before-收到本地通知)

View File

@@ -1,41 +0,0 @@
## iOS 手动安装
> **不建议使用手动安装,请参照 README.md 进行自动安装。**
1. 下载 JPush PhoneGap Plugin 插件,并解压
2. 将 [/src/ios](/src/ios) 文件夹及内容在 xcode 中拖到你的工程里,并配置 [/src/ios/PushConfig.plist](/src/ios/PushConfig.plist) 中相应参数:
Appkey 应用标识
Channel 渠道标识
IsProduction是否生产环境
IsIDFA 是否使用 IDFA 启动 sdk
3. 打开 xcode点击工程目录中顶部的 工程,选择(Target -> Build Phases -> Link Binary With Libraries),添加以下框架:
CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
AdSupport.framework
libz.tbd(若存在 libz.dylib 则替换为 libz.tbd)
UserNotifications.framework
libresolv.tbd
4. 修改 phonegap config.xml 文件以添加 JPushPlugin 插件
```xml
<feature name="JPushPlugin">
<param name="ios-package" value="JPushPlugin" />
<param name="onload" value="true" />
</feature>
```
5. 将 [/www/JPushPlugin.js](/www/JPushPlugin.js) 在 xcode 中拖到工程的 www 目录下面
6. 在需要使用插件处加入以下代码,并根据 [iOS API](/doc/iOS_API.md) 文档说明调用相应接口
```xml
<script type="text/javascript" src="JPushPlugin.js"></script>
```

View File

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

BIN
example/js/.DS_Store vendored

Binary file not shown.

8
hooks/apns.entitlements Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
</dict>
</plist>

93
hooks/common.js Normal file
View File

@@ -0,0 +1,93 @@
/*
* Author: Derek Chia <snipking@gmail.com>
* common functions for cordova plugin after hook
*/
const fs = require('fs');
const path = require('path');
module.exports.addAPNSinEntitlements = (entitlementPath, isProduction) => {
if( fs.existsSync(entitlementPath) ) {
fs.readFile(entitlementPath, "utf8", function(err, data) {
if (err) {
throw err;
}
console.log("Reading entitlements file asynchronously");
let toInsert = '<key>aps-environment</key>\n' +
'\t\t<string>development</string>';
if(isProduction) {
toInsert = '<key>aps-environment</key>\n' +
'\t\t<string>production</string>';
}
let re1 = new RegExp('<key>aps-environment<\/key>(.|[\r\n])*<string>.*<\/string>');
let matched = data.match(re1);
let result;
if (matched === null) {
if(data.match(/<\/dict>/g)) {
result = data.replace(/<\/dict>/, '\t' + toInsert + '\n\t</dict>');
} else if(data.match(/<dict\/>/g)) {
result = data.replace(/<dict\/>/, '\t<dict>\n\t\t' + toInsert + '\n\t</dict>');
}
} else {
result = data.replace(re1, toInsert);
}
// write result to entitlements file
fs.writeFile(entitlementPath, result, {"encoding": 'utf8'}, function(err) {
if (err) {
throw err;
}
console.log(entitlementPath + " written successfully");
});
});
} else {
console.log("Entitlement File '" + entitlementPath + "' not found. Make sure your ios platform upper than 4.3.0");
}
}
module.exports.removeAPNSinEntitlements = (entitlementPath) => {
if( fs.existsSync(entitlementPath) ) {
fs.readFile(entitlementPath, "utf8", function(err, data) {
if (err) {
throw err;
}
console.log("Reading entitlements file asynchronously");
let re1 = new RegExp('<key>aps-environment<\/key>(.|[\r\n])*<string>.*<\/string>');
let matched = data.match(re1);
let result;
if (matched != null) {
result = data.replace(re1, "");
}
// write result to entitlements file
fs.writeFile(entitlementPath, result, {"encoding": 'utf8'}, function(err) {
if (err) {
throw err;
}
console.log(entitlementPath + " written successfully");
});
});
} else {
console.log("Entitlement File '" + entitlementPath + "' not found. Make sure your ios platform upper than 4.3.0");
}
}
module.exports.getXcodeProjName = (searchPath) => {
if(searchPath == null || searchPath == undefined) {
searchPath = './';
}
let resultFolderName = null;
let folderNames = fs.readdirSync(searchPath).filter(file => fs.lstatSync(path.join(searchPath, file)).isDirectory());
let folderNamesReg = new RegExp('.*\.xcodeproj', 'g') // get filder name like `*.xcodeproj`
for(let folderName of folderNames) {
if(folderName.match(folderNamesReg)) {
resultFolderName = folderName;
break;
}
}
return resultFolderName.substr(0, resultFolderName.length - 10);
}

66
hooks/iosDisablePush.js Normal file
View File

@@ -0,0 +1,66 @@
/*
* Author: Derek Chia <snipking@gmail.com>
* Cordova plugin after hook to disable `Push Notification` capability for XCode 8
*/
const fs = require('fs');
const path = require('path');
let commonFuncs = require('./common');
/**
* remove APNS env from cordova project Entitlements-Debug.plist and Entitlements-Release.plist
* This two file will work when xcode archive app
*/
let disablePushNotificationForCI = (basePath, xcodeprojName) => {
commonFuncs.removeAPNSinEntitlements(basePath + xcodeprojName + '/Entitlements-Debug.plist');
commonFuncs.removeAPNSinEntitlements(basePath + xcodeprojName + '/Entitlements-Release.plist');
}
/**
* remove APNS env to entitlement file; disable Push Notification capability in .pbxproj file
* This two file will work when xcode archive app
*/
let disablePushNotificationForXCode = (entitlementsPath, pbxprojPath) => {
/**
* remove APNS env to entitlement file
*/
if( fs.existsSync(entitlementsPath) ) {
commonFuncs.removeAPNSinEntitlements(entitlementsPath);
}
/**
* disable Push Notification capability in .pbxproj file
* equally disable "Push Notification" switch in xcode
*/
fs.readFile(pbxprojPath, "utf8", function(err, data) {
if (err) {
throw err;
}
console.log("Reading pbxproj file asynchronously");
// turn off Push Notification Capability
let re4rep = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*SystemCapabilities(.|[\r\n])*com\.apple\.Push = {(.|[\r\n])*enabled = [01]');
let parts = re4rep.exec(data);
if(parts !== null && parts !== undefined && parts.length > 0) {
result = data.replace(re4rep, parts[0].substr(0, parts[0].length - 1) + '0');
// write result to project.pbxproj
fs.writeFile(pbxprojPath, result, {"encoding": 'utf8'}, function(err) {
if (err) {
throw err;
}
console.log(pbxprojPath + " written successfully");
});
}
});
}
let basePath = './platforms/ios/';
let buildType = 'dev';
let xcodeprojName = commonFuncs.getXcodeProjName(basePath);
let pbxprojPath = basePath + xcodeprojName + '.xcodeproj/project.pbxproj';
let entitlementsPath = basePath + xcodeprojName + '/' + xcodeprojName + '.entitlements';
disablePushNotificationForCI(basePath, xcodeprojName);
disablePushNotificationForXCode(entitlementsPath, pbxprojPath);

172
hooks/iosEnablePush.js Normal file
View File

@@ -0,0 +1,172 @@
/*
* Author: Derek Chia <snipking@gmail.com>
* Cordova plugin after hook to enable `Push Notification` capability for XCode 8
*/
const fs = require('fs');
const path = require('path');
let commonFuncs = require('./common');
/**
* add APNS env to cordova project Entitlements-Debug.plist and Entitlements-Release.plist
* This two file will work when xcode archive app
*/
let enablePushNotificationForCI = (basePath, xcodeprojName) => {
commonFuncs.addAPNSinEntitlements(basePath + xcodeprojName + '/Entitlements-Debug.plist', false);
commonFuncs.addAPNSinEntitlements(basePath + xcodeprojName + '/Entitlements-Release.plist', true);
}
/**
* add APNS env to entitlement file; enable Push Notification capability in .pbxproj file
* This two file will work when xcode archive app
*/
let enablePushNotificationForXCode = (entitlementsPath, pbxprojPath, cordovaBuildConfig) => {
console.log('will enable push notification capability for XCode');
let needAddEntitlementToPbxproj = false;
/**
* add APNS env to entitlement file
* without this file will cause a worning in xcode
*/
if( fs.existsSync(entitlementsPath) ) {
commonFuncs.addAPNSinEntitlements(entitlementsPath, false);
} else {
// copy default entitlements file
fs.readFile(__dirname + '/apns.entitlements', 'utf8', function(err, data) {
if (err) {
throw err;
}
fs.writeFileSync(entitlementsPath, data);
console.log(entitlementsPath + " written successfully");
});
needAddEntitlementToPbxproj = true;
}
/**
* enable Push Notification capability in .pbxproj file
* equally enable "Push Notification" switch in xcode
*/
fs.readFile(pbxprojPath, "utf8", function(err, data) {
if (err) {
throw err;
}
console.log("Reading pbxproj file asynchronously");
// add Push Notification Capability
let re1 = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes', 'g');
let re1rep = new RegExp('isa = PBXProject;(.|[\r\n])*attributes = {', 'g');
let re2 = new RegExp('(?:isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*)SystemCapabilities', 'g');
let re2rep = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes = {', 'g');
let re3 = new RegExp('(?:isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*SystemCapabilities(.|[\r\n])*)com\.apple\.Push', 'g');
let re3rep = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*SystemCapabilities = {', 'g');
let re4rep = new RegExp('isa = PBXProject;(.|[\r\n])*TargetAttributes(.|[\r\n])*SystemCapabilities(.|[\r\n])*com\.apple\.Push = {(.|[\r\n])*enabled = [01]');
let matched = data.match(re1);
let result;
if (matched === null) {
console.log('re1 not match, no TargetAttributes');
result = data.replace(re1rep, 'isa = PBXProject;\n' +
'\t\t\tattributes = {\n' +
'\t\t\t\tTargetAttributes = {\n' +
'\t\t\t\t\t1D6058900D05DD3D006BFB54 = {\n' +
'\t\t\t\t\t\tDevelopmentTeam = ' + cordovaBuildConfig.ios.release.developmentTeam + ';\n' +
'\t\t\t\t\t\tSystemCapabilities = {\n' +
'\t\t\t\t\t\t\tcom.apple.Push = {\n' +
'\t\t\t\t\t\t\t\tenabled = 1;\n' +
'\t\t\t\t\t\t\t};\n' +
'\t\t\t\t\t\t};\n' +
'\t\t\t\t\t};\n' +
'\t\t\t\t};');
} else {
matched = data.match(re2);
if(matched === null) {
console.log('re2 not match, nothing under TargetAttributes');
let parts = re2rep.exec(data);
result = data.replace(re2rep, parts[0] + '\n' + '\t\t\t\t\t1D6058900D05DD3D006BFB54 = {\n' +
'\t\t\t\t\t\tDevelopmentTeam = ' + cordovaBuildConfig.ios.release.developmentTeam + ';\n' +
'\t\t\t\t\t\tSystemCapabilities = {\n' +
'\t\t\t\t\t\t\tcom.apple.Push = {\n' +
'\t\t\t\t\t\t\t\tenabled = 1;\n' +
'\t\t\t\t\t\t\t};\n' +
'\t\t\t\t\t\t};\n' +
'\t\t\t\t\t};');
} else {
matched = data.match(re3);
if(matched === null) {
console.log('re3 not match, no com.apple.Push defined');
let parts = re3rep.exec(data);
result = data.replace(re3rep, parts[0] + '\n' + '\t\t\t\t\t\t\tcom.apple.Push = {\n' +
'\t\t\t\t\t\t\t\tenabled = 1;\n' +
'\t\t\t\t\t\t\t};');
} else {
console.log('just enable com.apple.Push');
let parts = re4rep.exec(data);
result = data.replace(re4rep, parts[0].substr(0, parts[0].length - 1) + '1');
}
}
}
// add entitlements
if (needAddEntitlementToPbxproj) {
let pathArray = entitlementsPath.split("/");
let entitlementsFileName = pathArray[pathArray.length - 1];
let projectFolderName = pathArray[pathArray.length - 2];
result = result.replace(new RegExp('\\/\\* Begin PBXFileReference section \\*\\/'), '/* Begin PBXFileReference section */\n' +
'\t\tD7BB385F1E4DB54800345BF4 /* ' + entitlementsFileName + ' */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = "' + entitlementsFileName + '"; path = "' + projectFolderName + '/' + entitlementsFileName + '"; sourceTree = "<group>"; };');
result = result.replace(new RegExp('\\/\\* CustomTemplate \\*\\/.*\n.*isa = PBXGroup;.*\n.*children = \\('), '/* CustomTemplate */ = {\n' +
'\t\t\tisa = PBXGroup;\n' +
'\t\t\tchildren = (\n' +
'\t\t\t\tD7BB385F1E4DB54800345BF4 /* ' + entitlementsFileName + ' */,');
let re5rep = new RegExp('\\/\\* Debug \\*\\/.*\n.*isa = XCBuildConfiguration;.*\n.*\n.*buildSettings = {');
let parts = result.match(re5rep);
result = result.replace(re5rep, parts + '\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = "' + projectFolderName + '/' + entitlementsFileName + '";');
let re6rep = new RegExp('\\/\\* Release \\*\\/.*\n.*isa = XCBuildConfiguration;.*\n.*\n.*buildSettings = {');
parts = result.match(re6rep);
result = result.replace(re6rep, parts + '\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = "' + projectFolderName + '/' + entitlementsFileName + '";');
}
// write result to project.pbxproj
fs.writeFile(pbxprojPath, result, {"encoding": 'utf8'}, function(err) {
if (err) {
throw err;
}
console.log(pbxprojPath + " written successfully");
});
});
}
module.exports = (context) => {
let basePath = './platforms/ios/';
let buildType = 'dev';
let xcodeprojName = commonFuncs.getXcodeProjName(basePath);
let pbxprojPath = basePath + xcodeprojName + '.xcodeproj/project.pbxproj';
let entitlementsPath = basePath + xcodeprojName + '/' + xcodeprojName + '.entitlements';
let cordovaBuildConfigPath = './build.json'
let cordovaBuildConfig = null;
let willEnablePushNotificationForXCode = true;
try { // try to read ios developmentTeam from build.json
cordovaBuildConfig = JSON.parse(fs.readFileSync(cordovaBuildConfigPath, "utf8"));
if(cordovaBuildConfig.ios.release.developmentTeam === null && cordovaBuildConfig.ios.release.developmentTeam === undefined) {
throw 'no valid developmentTeam found in build.json';
}
} catch(e) {
console.log("Do not detected 'build.json' or ios.release.developmentTeam not avaliable in 'build.json' \n" +
"Will not enable XCode Push Notification Capability. \n" +
"Will only enable Push Notification for CI by add config to '" + basePath + xcodeprojName + "/Entitlements-Debug.plist' and '" + basePath + xcodeprojName + "/Entitlements-Release.plist' \n" +
"Please add 'build.json' to cordova project root folder to make after hook fully functional. \n" +
"Reference [1]https://cordova.apache.org/docs/en/latest/reference/cordova-cli/#cordova-build-command \n" +
"Reference [2]https://cordova.apache.org/docs/en/latest/guide/platforms/ios/#signing-an-app");
willEnablePushNotificationForXCode = false;
}
enablePushNotificationForCI(basePath, xcodeprojName);
if(willEnablePushNotificationForXCode) {
enablePushNotificationForXCode(entitlementsPath, pbxprojPath, cordovaBuildConfig);
}
}

View File

@@ -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);
});
}
}

View File

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

View 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 {}

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

View File

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

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

File diff suppressed because one or more lines are too long

95
ionic/jpush/ngx/index.d.ts vendored Normal file
View 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

File diff suppressed because one or more lines are too long

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

View File

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

View File

@@ -2,15 +2,16 @@
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
id="jpush-phonegap-plugin" id="jpush-phonegap-plugin"
version="3.0.1"> version="3.7.6">
<name>JPush Plugin</name> <name>JPush</name>
<description>JPush for cordova plugin</description> <description>JPush for cordova plugin</description>
<author>JPush</author> <author>JPush</author>
<keywords>JPush,push</keywords> <keywords>JPush,push</keywords>
<license>MIT License</license> <license>MIT License</license>
<preference name="API_KEY" /> <preference name="APP_KEY" />
<preference name="CHANNEL" default="developer-default" />
<engines> <engines>
<engine name="cordova" version=">=3.0" /> <engine name="cordova" version=">=3.0" />
@@ -18,6 +19,7 @@
<!-- dependencies --> <!-- dependencies -->
<dependency id="cordova-plugin-device" /> <dependency id="cordova-plugin-device" />
<dependency id="cordova-plugin-jcore" />
<js-module src="www/JPushPlugin.js" name="JPushPlugin"> <js-module src="www/JPushPlugin.js" name="JPushPlugin">
<clobbers target="JPush" /> <clobbers target="JPush" />
@@ -29,7 +31,17 @@
<param name="ios-package" value="JPushPlugin" /> <param name="ios-package" value="JPushPlugin" />
</feature> </feature>
</config-file> </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/JPushDefine.h" />
<header-file src="src/ios/Plugins/JPushPlugin.h" /> <header-file src="src/ios/Plugins/JPushPlugin.h" />
<source-file src="src/ios/Plugins/JPushPlugin.m" /> <source-file src="src/ios/Plugins/JPushPlugin.m" />
@@ -37,9 +49,8 @@
<source-file src="src/ios/Plugins/AppDelegate+JPush.m" /> <source-file src="src/ios/Plugins/AppDelegate+JPush.m" />
<header-file src="src/ios/lib/JPUSHService.h" /> <header-file src="src/ios/lib/JPUSHService.h" />
<source-file src="src/ios/lib/jpush-ios-3.0.0.a" framework="true" /> <source-file src="src/ios/lib/jpush-ios-3.3.3.a" framework="true" />
<source-file src="src/ios/lib/jcore-ios-1.0.0.a" framework="true" /> <resource-file src="src/ios/JPushConfig.plist" />
<resource-file src="src/ios/PushConfig.plist" />
<framework src="CFNetwork.framework" weak="true" /> <framework src="CFNetwork.framework" weak="true" />
<framework src="CoreFoundation.framework" weak="true" /> <framework src="CoreFoundation.framework" weak="true" />
@@ -54,40 +65,67 @@
<framework src="UserNotifications.framework" weak="true" /> <framework src="UserNotifications.framework" weak="true" />
<framework src="libresolv.tbd" weak="true" /> <framework src="libresolv.tbd" weak="true" />
<config-file target="*JPushConfig.plist" parent="Appkey">
<config-file target="*PushConfig.plist" parent="Appkey"> <string>$APP_KEY</string>
<string>$API_KEY</string>
</config-file> </config-file>
</platform> </platform>
<platform name="android"> <platform name="android">
<config-file target="res/xml/config.xml" parent="/*"> <config-file target="res/xml/config.xml" parent="/*">
<feature name="JPushPlugin"> <feature name="JPushPlugin">
<param name="android-package" value="cn.jpush.phonegap.JPushPlugin" /> <param name="android-package" value="cn.jiguang.cordova.push.JPushPlugin" />
</feature> </feature>
</config-file> </config-file>
<config-file target="AndroidManifest.xml" parent="/manifest"> <config-file target="AndroidManifest.xml" parent="/manifest" mode="merge">
<!-- Required 一些系统要求的权限,如访问网络等 -->
<permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
<!-- Required 一些系统要求的权限,如访问网络等--> <!-- Required 一些系统要求的权限,如访问网络等-->
<uses-permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE" /> <uses-permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /> <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.INTERNET" /> <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.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_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.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<permission android:name="$PACKAGE_NAME.permission.JPUSH_MESSAGE" android:protectionLevel="signature" />
<!-- Optional for location -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
<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.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<!--华为角标-->
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE "/>
</config-file> </config-file>
<config-file target="AndroidManifest.xml" parent="/manifest/application">
<config-file target="AndroidManifest.xml" parent="/manifest/application" mode="merge">
<!-- Rich push 核心功能 since 2.0.6-->
<activity
android:name="cn.jpush.android.ui.PopWinActivity"
android:theme="@style/MyDialogStyle"
android:exported="false">
</activity>
<!-- Required SDK核心功能--> <!-- Required SDK核心功能-->
<activity android:name="cn.jpush.android.ui.PushActivity" <activity
android:theme="@android:style/Theme.Translucent.NoTitleBar" android:name="cn.jpush.android.ui.PushActivity"
android:configChanges="orientation|keyboardHidden"> android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.NoTitleBar"
android:exported="false">
<intent-filter> <intent-filter>
<action android:name="cn.jpush.android.ui.PushActivity" /> <action android:name="cn.jpush.android.ui.PushActivity" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
@@ -95,22 +133,12 @@
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Rich push 核心功能 since 2.0.6-->
<activity android:name="cn.jpush.android.ui.PopWinActivity"
android:theme="@style/MyDialogStyle"
android:exported="false">
</activity>
<!-- Required SDK核心功能-->
<service android:name="cn.jpush.android.service.DownloadService"
android:enabled="true"
android:exported="false">
</service>
<!-- Required SDK 核心功能--> <!-- Required SDK 核心功能-->
<service android:name="cn.jpush.android.service.PushService" <!-- 可配置android:process参数将PushService放在其他进程中 -->
android:enabled="true" <service
android:exported="false"> android:name="cn.jpush.android.service.PushService"
android:process=":pushcore"
android:exported="false">
<intent-filter> <intent-filter>
<action android:name="cn.jpush.android.intent.REGISTER" /> <action android:name="cn.jpush.android.intent.REGISTER" />
<action android:name="cn.jpush.android.intent.REPORT" /> <action android:name="cn.jpush.android.intent.REPORT" />
@@ -119,12 +147,41 @@
</intent-filter> </intent-filter>
</service> </service>
<!-- 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"
/>
<!-- 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>
<!-- since 3.1.0 Required SDK 核心功能-->
<provider
android:authorities="$PACKAGE_NAME.DownloadProvider"
android:name="cn.jpush.android.service.DownloadProvider"
android:exported="true"
/>
<!-- Required SDK核心功能--> <!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.PushReceiver" <receiver
android:enabled="true"> android:name="cn.jpush.android.service.PushReceiver"
android:enabled="true"
android:exported="false">
<intent-filter android:priority="1000"> <intent-filter android:priority="1000">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <!--Required 显示通知栏 -->
<!--Required 显示通知栏 -->
<category android:name="$PACKAGE_NAME" /> <category android:name="$PACKAGE_NAME" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
@@ -135,68 +192,101 @@
<intent-filter> <intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" /> <action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 --> <!-- Required SDK核心功能-->
<!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 --> <receiver android:name="cn.jpush.android.service.AlarmReceiver" android:exported="false"/>
<service android:name="cn.jpush.android.service.DaemonService" android:enabled="true" android:exported="true">
<!-- 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">
<intent-filter> <intent-filter>
<action android:name="cn.jpush.android.intent.DaemonService" /> <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="$PACKAGE_NAME"></category>
</intent-filter>
</receiver>
<!--since 3.3.0 Required SDK核心功能-->
<activity
android:name="cn.jpush.android.service.JNotifyActivity"
android:exported="true"
android:taskAffinity="jpush.custom"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="cn.jpush.android.intent.JNotifyActivity" />
<category android:name="$PACKAGE_NAME" /> <category android:name="$PACKAGE_NAME" />
</intent-filter> </intent-filter>
</activity>
<!-- 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">
<intent-filter>
<action android:name="cn.jiguang.user.service.action" />
</intent-filter>
</service> </service>
<!-- User defined. For test only 用户自定义的广播接收器 -->
<receiver android:name="cn.jpush.phonegap.MyReceiver" android:enabled="true"> <receiver
<intent-filter android:priority="1000"> android:name="cn.jiguang.cordova.push.JPushReceiver"
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> android:enabled="true"
<!-- Required 显示通知栏 --> android:exported="false">
<category android:name="$PACKAGE_NAME" />
</intent-filter>
<intent-filter> <intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION" /> <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" /> <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
<!-- Required 用户接收SDK消息的intent -->
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
<!-- Required 用户接收SDK通知栏信息的intent -->
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<!-- Required 用户打开自定义通知栏的intent --> <action android:name="cn.jpush.android.intent.CONNECTION" />
<action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" />
<!-- Optional 用户接受Rich Push Javascript 回调函数的intent -->
<category android:name="$PACKAGE_NAME" /> <category android:name="$PACKAGE_NAME" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<!-- Required SDK核心功能-->
<receiver android:name="cn.jpush.android.service.AlarmReceiver" /> <!-- Required . Enable it you can get statistics data with channel -->
<!-- Required. Enable it you can get statistics data with channel --> <meta-data android:name="JPUSH_CHANNEL" android:value="$CHANNEL"/>
<meta-data android:name="JPUSH_CHANNEL" android:value="developer-default" /> <meta-data android:name="JPUSH_APPKEY" android:value="$APP_KEY" /> <!-- </>值来自开发者平台取得的AppKey-->
<meta-data android:name="JPUSH_APPKEY" android:value="$API_KEY" />
</config-file> </config-file>
<source-file src="src/android/libs/jpush-android_v3.0.0.jar" target-dir="libs" /> <lib-file src="src/android/libs/jpush-android-3.6.6.jar" />
<source-file src="src/android/libs/jcore-android_v1.0.0.jar" target-dir="libs" />
<source-file src="src/android/libs/armeabi/libjcore100.so" target-dir="libs/armeabi" />
<source-file src="src/android/libs/armeabi-v7a/libjcore100.so" target-dir="libs/armeabi-v7a" />
<source-file src="src/android/libs/arm64-v8a/libjcore100.so" target-dir="libs/arm64-v8a" />
<source-file src="src/android/libs/x86/libjcore100.so" target-dir="libs/x86" />
<source-file src="src/android/libs/x86_64/libjcore100.so" target-dir="libs/x86_64" />
<source-file src="src/android/MyReceiver.java" target-dir="src/cn/jpush/phonegap" /> <source-file src="src/android/PushService.java" target-dir="src/cn/jiguang/cordova/push" />
<source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jpush/phonegap" /> <source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jiguang/cordova/push" />
<source-file src="src/android/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/res/drawable-hdpi/jpush_richpush_btn_selector.xml" target-dir="res/drawable" /> <resource-file src="src/android/res/drawable-hdpi/jpush_richpush_btn_selector.xml"
<source-file src="src/android/res/drawable-hdpi/jpush_richpush_progressbar.xml" target-dir="res/drawable" /> target="res/drawable/jpush_richpush_btn_selector.xml" />
<resource-file src="src/android/res/drawable-hdpi/jpush_richpush_progressbar.xml"
target="res/drawable/jpush_richpush_progressbar.xml" />
<source-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_back.png" target-dir="res/drawable-hdpi" /> <resource-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_back.png"
<source-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png" target-dir="res/drawable-hdpi" /> target="res/drawable-hdpi/jpush_ic_richpush_actionbar_back.png" />
<resource-file src="src/android/res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png"
target="res/drawable-hdpi/jpush_ic_richpush_actionbar_divider.png" />
<source-file src="src/android/res/layout/jpush_popwin_layout.xml" target-dir="res/layout" /> <resource-file src="src/android/res/layout/jpush_popwin_layout.xml"
<source-file src="src/android/res/layout/jpush_webview_layout.xml" target-dir="res/layout" /> target="res/layout/jpush_popwin_layout.xml" />
<source-file src="src/android/res/layout/test_notification_layout.xml" target-dir="res/layout" /> <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-v21/push_notification.xml"
target="res/layout-v21/push_notification.xml" />
<source-file src="src/android/res/values/jpush_style.xml" target-dir="res/values" /> <resource-file src="src/android/res/values/jpush_style.xml"
target="res/values/jpush_style.xml" />
<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" />
</platform> </platform>
</plugin> </plugin>

View File

@@ -0,0 +1,202 @@
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.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.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);
//Log.e(TAG,"onTagOperatorResult:"+jPushMessage);
JSONObject resultJson = new JSONObject();
int sequence = jPushMessage.getSequence();
try {
resultJson.put("sequence", sequence);
} catch (JSONException e) {
e.printStackTrace();
}
CallbackContext callback = JPushPlugin.eventCallbackMap.get(sequence);
if (callback == null) {
Log.i(TAG, "Unexpected error, callback is null!");
return;
}
if (jPushMessage.getErrorCode() == 0) { // success
Set<String> tags = jPushMessage.getTags();
JSONArray tagsJsonArr = new JSONArray();
for (String tag : tags) {
tagsJsonArr.put(tag);
}
try {
if (tagsJsonArr.length() != 0) {
resultJson.put("tags", tagsJsonArr);
}
} catch (JSONException e) {
e.printStackTrace();
}
callback.success(resultJson);
} else {
try {
resultJson.put("code", jPushMessage.getErrorCode());
} catch (JSONException e) {
e.printStackTrace();
}
callback.error(resultJson);
}
JPushPlugin.eventCallbackMap.remove(sequence);
}
@Override
public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
super.onCheckTagOperatorResult(context, jPushMessage);
//Log.e(TAG,"onCheckTagOperatorResult:"+jPushMessage);
JSONObject resultJson = new JSONObject();
int sequence = jPushMessage.getSequence();
try {
resultJson.put("sequence", sequence);
} catch (JSONException e) {
e.printStackTrace();
}
CallbackContext callback = JPushPlugin.eventCallbackMap.get(sequence);
if (callback == null) {
Log.i(TAG, "Unexpected error, callback is null!");
return;
}
if (jPushMessage.getErrorCode() == 0) {
try {
resultJson.put("tag", jPushMessage.getCheckTag());
resultJson.put("isBind", jPushMessage.getTagCheckStateResult());
} catch (JSONException e) {
e.printStackTrace();
}
callback.success(resultJson);
} else {
try {
resultJson.put("code", jPushMessage.getErrorCode());
} catch (JSONException e) {
e.printStackTrace();
}
callback.error(resultJson);
}
JPushPlugin.eventCallbackMap.remove(sequence);
}
@Override
public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
super.onAliasOperatorResult(context, jPushMessage);
//Log.e(TAG,"onAliasOperatorResult:"+jPushMessage);
JSONObject resultJson = new JSONObject();
int sequence = jPushMessage.getSequence();
try {
resultJson.put("sequence", sequence);
} catch (JSONException e) {
e.printStackTrace();
}
CallbackContext callback = JPushPlugin.eventCallbackMap.get(sequence);
if (callback == null) {
Log.i(TAG, "Unexpected error, callback is null!");
return;
}
if (jPushMessage.getErrorCode() == 0) { // success
try {
if (!TextUtils.isEmpty(jPushMessage.getAlias())) {
resultJson.put("alias", jPushMessage.getAlias());
}
} catch (JSONException e) {
e.printStackTrace();
}
callback.success(resultJson);
} else {
try {
resultJson.put("code", jPushMessage.getErrorCode());
} catch (JSONException e) {
e.printStackTrace();
}
callback.error(resultJson);
}
JPushPlugin.eventCallbackMap.remove(sequence);
}
@Override
public void onRegister(Context context, String regId) {
//Log.e(TAG,"onRegister:"+regId);
JPushPlugin.transmitReceiveRegistrationId(regId);
}
@Override
public void onMessage(Context context, CustomMessage customMessage) {
super.onMessage(context,customMessage);
//Log.e(TAG,"onMessage:"+customMessage);
// String msg = customMessage.message;//intent.getStringExtra(JPushInterface.EXTRA_MESSAGE);
// Map<String, Object> extras = getNotificationExtras(intent);
// JPushPlugin.transmitMessageReceive(msg, extras);
}
@Override
public void onNotifyMessageArrived(Context context, NotificationMessage notificationMessage) {
super.onNotifyMessageArrived(context, notificationMessage);
//Log.e(TAG,"onNotifyMessageArrived:"+notificationMessage);
}
@Override
public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) {
super.onNotifyMessageOpened(context, notificationMessage);
//Log.e(TAG,"onNotifyMessageOpened:"+notificationMessage);
}
@Override
public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) {
super.onMobileNumberOperatorResult(context, jPushMessage);
//Log.e(TAG,"onMobileNumberOperatorResult:"+jPushMessage);
}
@Override
public void onMultiActionClicked(Context context, Intent intent) {
super.onMultiActionClicked(context, intent);
//Log.e(TAG,"onMultiActionClicked:"+intent);
}
}

View File

@@ -1,8 +1,8 @@
package cn.jpush.phonegap; package cn.jiguang.cordova.push;
import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.os.Build; import android.os.Build;
@@ -20,16 +20,12 @@ import org.json.JSONObject;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; 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.BasicPushNotificationBuilder;
import cn.jpush.android.api.JPushInterface; import cn.jpush.android.api.JPushInterface;
@@ -37,51 +33,23 @@ import cn.jpush.android.api.TagAliasCallback;
import cn.jpush.android.data.JPushLocalNotification; import cn.jpush.android.data.JPushLocalNotification;
public class JPushPlugin extends CordovaPlugin { 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 JPushPlugin instance;
private static Activity cordovaActivity; private static Activity cordovaActivity;
private static String TAG = "JPushPlugin";
private static boolean shouldCacheMsg = false; static String notificationTitle;
private static boolean isStatisticsOpened = false; // 是否开启统计分析功能 static String notificationAlert;
static Map<String, Object> notificationExtras = new HashMap<String, Object>();
public static String notificationTitle; static String openNotificationTitle;
public static String notificationAlert; static String openNotificationAlert;
public static Map<String, Object> notificationExtras = new HashMap<String, Object>(); static Map<String, Object> openNotificationExtras = new HashMap<String, Object>();
public static String openNotificationTitle; static Map<Integer, CallbackContext> eventCallbackMap = new HashMap<Integer, CallbackContext>();
public static String openNotificationAlert;
public static Map<String, Object> openNotificationExtras = new HashMap<String, Object>();
public JPushPlugin() { public JPushPlugin() {
instance = this; instance = this;
@@ -89,49 +57,31 @@ public class JPushPlugin extends CordovaPlugin {
@Override @Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) { public void initialize(CordovaInterface cordova, CordovaWebView webView) {
Log.i(TAG, "JPush initialize.");
super.initialize(cordova, webView); super.initialize(cordova, webView);
JPushInterface.init(cordova.getActivity().getApplicationContext()); mContext = cordova.getActivity().getApplicationContext();
JPushInterface.init(mContext);
cordovaActivity = cordova.getActivity(); cordovaActivity = cordova.getActivity();
//如果同时缓存了打开事件 openNotificationAlert 和 消息事件 notificationAlert只向 UI 发打开事件。 // 如果同时缓存了打开事件 openNotificationAlert 和 消息事件 notificationAlert只向 UI 发打开事件。
//这样做是为了和 iOS 统一。 // 这样做是为了和 iOS 统一。
if (openNotificationAlert != null) { if (openNotificationAlert != null) {
notificationAlert = null; notificationAlert = null;
transmitNotificationOpen(openNotificationTitle, openNotificationAlert, transmitNotificationOpen(openNotificationTitle, openNotificationAlert, openNotificationExtras);
openNotificationExtras);
} }
if (notificationAlert != null) { if (notificationAlert != null) {
transmitNotificationReceive(notificationTitle, notificationAlert, transmitNotificationReceive(notificationTitle, notificationAlert, notificationExtras);
notificationExtras);
}
}
public void onPause(boolean multitasking) {
Log.i(TAG, "---------------- onPause");
shouldCacheMsg = true;
if (isStatisticsOpened && multitasking) {
JPushInterface.onPause(this.cordova.getActivity());
} }
} }
public void onResume(boolean multitasking) { public void onResume(boolean multitasking) {
shouldCacheMsg = false;
Log.i(TAG, "---------------- onResume" + "-" + openNotificationAlert
+ "-" + notificationAlert);
if (isStatisticsOpened && multitasking) {
JPushInterface.onResume(this.cordova.getActivity());
}
if (openNotificationAlert != null) { if (openNotificationAlert != null) {
notificationAlert = null; notificationAlert = null;
transmitNotificationOpen(openNotificationTitle, openNotificationAlert, transmitNotificationOpen(openNotificationTitle, openNotificationAlert, openNotificationExtras);
openNotificationExtras);
} }
if (notificationAlert != null) { if (notificationAlert != null) {
transmitNotificationReceive(notificationTitle, notificationAlert, transmitNotificationReceive(notificationTitle, notificationAlert, notificationExtras);
notificationExtras);
} }
} }
@@ -142,15 +92,14 @@ public class JPushPlugin extends CordovaPlugin {
instance = null; instance = null;
} }
private static JSONObject getMessageObject(String message, private static JSONObject getMessageObject(String message, Map<String, Object> extras) {
Map<String, Object> extras) {
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
try { try {
data.put("message", message); data.put("message", message);
JSONObject jExtras = new JSONObject(); JSONObject jExtras = new JSONObject();
for (Entry<String, Object> entry : extras.entrySet()) { for (Entry<String, Object> entry : extras.entrySet()) {
if (entry.getKey().equals("cn.jpush.android.EXTRA")) { if (entry.getKey().equals("cn.jpush.android.EXTRA")) {
JSONObject jo = null; JSONObject jo;
if (TextUtils.isEmpty((String) entry.getValue())) { if (TextUtils.isEmpty((String) entry.getValue())) {
jo = new JSONObject(); jo = new JSONObject();
} else { } else {
@@ -176,8 +125,7 @@ public class JPushPlugin extends CordovaPlugin {
return data; return data;
} }
private static JSONObject getNotificationObject(String title, private static JSONObject getNotificationObject(String title, String alert, Map<String, Object> extras) {
String alert, Map<String, Object> extras) {
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
try { try {
data.put("title", title); data.put("title", title);
@@ -226,8 +174,7 @@ public class JPushPlugin extends CordovaPlugin {
}); });
} }
static void transmitNotificationOpen(String title, String alert, static void transmitNotificationOpen(String title, String alert, Map<String, Object> extras) {
Map<String, Object> extras) {
if (instance == null) { if (instance == null) {
return; return;
} }
@@ -244,8 +191,7 @@ public class JPushPlugin extends CordovaPlugin {
JPushPlugin.openNotificationAlert = null; JPushPlugin.openNotificationAlert = null;
} }
static void transmitNotificationReceive(String title, String alert, static void transmitNotificationReceive(String title, String alert, Map<String, Object> extras) {
Map<String, Object> extras) {
if (instance == null) { if (instance == null) {
return; return;
} }
@@ -262,18 +208,34 @@ public class JPushPlugin extends CordovaPlugin {
JPushPlugin.notificationAlert = null; JPushPlugin.notificationAlert = null;
} }
@Override static void transmitReceiveRegistrationId(String rId) {
public boolean execute(final String action, final JSONArray data, if (instance == null) {
final CallbackContext callbackContext) throws JSONException { return;
if (!methodList.contains(action)) {
return false;
} }
threadPool.execute(new Runnable() { 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 {
cordova.getThreadPool().execute(new Runnable() {
@Override @Override
public void run() { public void run() {
try { try {
Method method = JPushPlugin.class.getDeclaredMethod(action, Method method = JPushPlugin.class.getDeclaredMethod(action, JSONArray.class, CallbackContext.class);
JSONArray.class, CallbackContext.class);
method.invoke(JPushPlugin.this, data, callbackContext); method.invoke(JPushPlugin.this, data, callbackContext);
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, e.toString()); Log.e(TAG, e.toString());
@@ -284,7 +246,7 @@ public class JPushPlugin extends CordovaPlugin {
} }
void init(JSONArray data, CallbackContext callbackContext) { void init(JSONArray data, CallbackContext callbackContext) {
JPushInterface.init(this.cordova.getActivity().getApplicationContext()); JPushInterface.init(mContext);
} }
void setDebugMode(JSONArray data, CallbackContext callbackContext) { void setDebugMode(JSONArray data, CallbackContext callbackContext) {
@@ -299,18 +261,17 @@ public class JPushPlugin extends CordovaPlugin {
} }
void stopPush(JSONArray data, CallbackContext callbackContext) { void stopPush(JSONArray data, CallbackContext callbackContext) {
JPushInterface.stopPush(this.cordova.getActivity().getApplicationContext()); JPushInterface.stopPush(mContext);
callbackContext.success(); callbackContext.success();
} }
void resumePush(JSONArray data, CallbackContext callbackContext) { void resumePush(JSONArray data, CallbackContext callbackContext) {
JPushInterface.resumePush(this.cordova.getActivity().getApplicationContext()); JPushInterface.resumePush(mContext);
callbackContext.success(); callbackContext.success();
} }
void isPushStopped(JSONArray data, CallbackContext callbackContext) { void isPushStopped(JSONArray data, CallbackContext callbackContext) {
boolean isStopped = JPushInterface.isPushStopped( boolean isStopped = JPushInterface.isPushStopped(mContext);
this.cordova.getActivity().getApplicationContext());
if (isStopped) { if (isStopped) {
callbackContext.success(1); callbackContext.success(1);
} else { } else {
@@ -337,8 +298,7 @@ public class JPushPlugin extends CordovaPlugin {
callbackContext.error("error reading num json"); callbackContext.error("error reading num json");
} }
if (num != -1) { if (num != -1) {
JPushInterface.setLatestNotificationNumber( JPushInterface.setLatestNotificationNumber(mContext, num);
this.cordova.getActivity().getApplicationContext(), num);
} else { } else {
callbackContext.error("error num"); callbackContext.error("error num");
} }
@@ -364,13 +324,13 @@ public class JPushPlugin extends CordovaPlugin {
} catch (JSONException e) { } catch (JSONException e) {
callbackContext.error("error reading hour json"); callbackContext.error("error reading hour json");
} }
Context context = this.cordova.getActivity().getApplicationContext(); Context context = mContext;
JPushInterface.setPushTime(context, days, startHour, endHour); JPushInterface.setPushTime(context, days, startHour, endHour);
callbackContext.success(); callbackContext.success();
} }
void getRegistrationID(JSONArray data, CallbackContext callbackContext) { void getRegistrationID(JSONArray data, CallbackContext callbackContext) {
Context context = this.cordova.getActivity().getApplicationContext(); Context context = mContext;
String regID = JPushInterface.getRegistrationID(context); String regID = JPushInterface.getRegistrationID(context);
callbackContext.success(regID); callbackContext.success(regID);
} }
@@ -393,58 +353,183 @@ 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) { void setAlias(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
String alias = null;
try { try {
String alias = data.getString(0); JSONObject params = data.getJSONObject(0);
JPushInterface.setAlias(this.cordova.getActivity().getApplicationContext(), sequence = params.getInt("sequence");
alias, mTagWithAliasCallback); alias = params.getString("alias");
callbackContext.success();
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
callbackContext.error("Error reading alias JSON"); callbackContext.error("Parameters error.");
} }
JPushInterface.setAlias(mContext, sequence, alias);
eventCallbackMap.put(sequence, callbackContext);
} }
void setTagsWithAlias(JSONArray data, CallbackContext callbackContext) { void deleteAlias(JSONArray data, CallbackContext callbackContext) {
HashSet<String> tags = new HashSet<String>(); int sequence = -1;
String alias;
try { try {
alias = data.getString(0); JSONObject params = data.getJSONObject(0);
JSONArray tagsArray = data.getJSONArray(1); sequence = params.getInt("sequence");
for (int i = 0; i < tagsArray.length(); i++) {
tags.add(tagsArray.getString(i));
}
JPushInterface.setAliasAndTags(this.cordova.getActivity().getApplicationContext(),
alias, tags, mTagWithAliasCallback);
callbackContext.success();
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
callbackContext.error("Error reading tagAlias JSON"); callbackContext.error("Parameters error.");
}
JPushInterface.deleteAlias(mContext, sequence);
eventCallbackMap.put(sequence, callbackContext);
}
void getAlias(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.getAlias(mContext, sequence);
eventCallbackMap.put(sequence, callbackContext);
}
void setTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
Set<String> tags = new HashSet<String>();
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
JSONArray tagsArr = params.getJSONArray("tags");
for (int i = 0; i < tagsArr.length(); i++) {
tags.add(tagsArr.getString(i));
}
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.setTags(mContext, sequence, tags);
eventCallbackMap.put(sequence, callbackContext);
}
void addTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
Set<String> tags = new HashSet<String>();
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
JSONArray tagsArr = params.getJSONArray("tags");
for (int i = 0; i < tagsArr.length(); i++) {
tags.add(tagsArr.getString(i));
}
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.addTags(mContext, sequence, tags);
eventCallbackMap.put(sequence, callbackContext);
}
void deleteTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
Set<String> tags = new HashSet<String>();
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
JSONArray tagsArr = params.getJSONArray("tags");
for (int i = 0; i < tagsArr.length(); i++) {
tags.add(tagsArr.getString(i));
}
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.deleteTags(mContext, sequence, tags);
eventCallbackMap.put(sequence, callbackContext);
}
void cleanTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.cleanTags(mContext, sequence);
eventCallbackMap.put(sequence, callbackContext);
}
void getAllTags(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.getAllTags(mContext, sequence);
eventCallbackMap.put(sequence, callbackContext);
}
void checkTagBindState(JSONArray data, CallbackContext callbackContext) {
int sequence = -1;
String tag = null;
try {
JSONObject params = data.getJSONObject(0);
sequence = params.getInt("sequence");
tag = params.getString("tag");
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("Parameters error.");
}
JPushInterface.checkTagBindState(mContext, sequence, tag);
eventCallbackMap.put(sequence, callbackContext);
}
void getConnectionState(JSONArray data, CallbackContext callback) {
boolean isConnected = JPushInterface.getConnectionState(cordovaActivity.getApplicationContext());
if (isConnected) {
callback.success(1);
} else {
callback.success(0);
} }
} }
/** /**
* 自定义通知行为,声音、震动、呼吸灯等。 * 自定义通知行为,声音、震动、呼吸灯等。
*/ */
void setBasicPushNotificationBuilder(JSONArray data, void setBasicPushNotificationBuilder(JSONArray data, CallbackContext callbackContext) {
CallbackContext callbackContext) { BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(this.cordova.getActivity());
BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(
this.cordova.getActivity());
builder.developerArg0 = "Basic builder 1"; builder.developerArg0 = "Basic builder 1";
JPushInterface.setPushNotificationBuilder(1, builder); JPushInterface.setPushNotificationBuilder(1, builder);
JSONObject obj = new JSONObject(); JSONObject obj = new JSONObject();
@@ -456,14 +541,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, void setCustomPushNotificationBuilder(JSONArray data, CallbackContext callbackContext) {
CallbackContext callbackContext) {
// CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder( // CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
// this.cordova.getActivity(), R.layout.test_notification_layout, // this.cordova.getActivity(), R.layout.test_notification_layout,
// R.id.icon, R.id.title, R.id.text); // R.id.icon, R.id.title, R.id.text);
// JPushInterface.setPushNotificationBuilder(2, builder); // JPushInterface.setPushNotificationBuilder(2, builder);
// JPushInterface.setDefaultPushNotificationBuilder(builder); // JPushInterface.setDefaultPushNotificationBuilder(builder);
} }
@@ -479,6 +562,7 @@ public class JPushPlugin extends CordovaPlugin {
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
callbackContext.error("error reading id json"); callbackContext.error("error reading id json");
return;
} }
if (notificationId != -1) { if (notificationId != -1) {
JPushInterface.clearNotificationById(this.cordova.getActivity(), notificationId); JPushInterface.clearNotificationById(this.cordova.getActivity(), notificationId);
@@ -487,8 +571,7 @@ public class JPushPlugin extends CordovaPlugin {
} }
} }
void addLocalNotification(JSONArray data, CallbackContext callbackContext) void addLocalNotification(JSONArray data, CallbackContext callbackContext) throws JSONException {
throws JSONException {
int builderId = data.getInt(0); int builderId = data.getInt(0);
String content = data.getString(1); String content = data.getString(1);
String title = data.getString(2); String title = data.getString(2);
@@ -511,8 +594,7 @@ public class JPushPlugin extends CordovaPlugin {
JPushInterface.addLocalNotification(this.cordova.getActivity(), ln); JPushInterface.addLocalNotification(this.cordova.getActivity(), ln);
} }
void removeLocalNotification(JSONArray data, CallbackContext callbackContext) void removeLocalNotification(JSONArray data, CallbackContext callbackContext) throws JSONException {
throws JSONException {
int notificationID = data.getInt(0); int notificationID = data.getInt(0);
JPushInterface.removeLocalNotification(this.cordova.getActivity(), notificationID); JPushInterface.removeLocalNotification(this.cordova.getActivity(), notificationID);
} }
@@ -522,19 +604,7 @@ public class JPushPlugin extends CordovaPlugin {
} }
/** /**
* 决定是否启用统计分析功能。 * 设置通知静默时间 http://docs.jpush.io/client/android_api/#api_5
*/
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
*/ */
void setSilenceTime(JSONArray data, CallbackContext callbackContext) { void setSilenceTime(JSONArray data, CallbackContext callbackContext) {
try { try {
@@ -550,14 +620,28 @@ public class JPushPlugin extends CordovaPlugin {
callbackContext.error("结束时间数值错误"); callbackContext.error("结束时间数值错误");
return; return;
} }
JPushInterface.setSilenceTime(this.cordova.getActivity(), startHour, startMinute, JPushInterface.setSilenceTime(this.cordova.getActivity(), startHour, startMinute, endHour, endMinute);
endHour, endMinute);
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
callbackContext.error("error: reading json data."); 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);
}
private boolean isValidHour(int hour) { private boolean isValidHour(int hour) {
return !(hour < 0 || hour > 23); return !(hour < 0 || hour > 23);
} }
@@ -585,8 +669,7 @@ public class JPushPlugin extends CordovaPlugin {
data.put("resultCode", code); data.put("resultCode", code);
data.put("tags", tags); data.put("tags", tags);
data.put("alias", alias); data.put("alias", alias);
final String jsEvent = String.format( final String jsEvent = String.format("cordova.fireDocumentEvent('jpush.setTagsWithAlias',%s)",
"cordova.fireDocumentEvent('jpush.setTagsWithAlias',%s)",
data.toString()); data.toString());
cordova.getActivity().runOnUiThread(new Runnable() { cordova.getActivity().runOnUiThread(new Runnable() {
@Override @Override
@@ -600,37 +683,43 @@ public class JPushPlugin extends CordovaPlugin {
} }
}; };
@TargetApi(Build.VERSION_CODES.KITKAT)
private boolean hasPermission(String appOpsServiceId) { private boolean hasPermission(String appOpsServiceId) {
Context context = cordova.getActivity().getApplicationContext(); Context context = cordova.getActivity().getApplicationContext();
AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); if (Build.VERSION.SDK_INT >= 24) {
ApplicationInfo appInfo = context.getApplicationInfo(); 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(); String pkg = context.getPackageName();
int uid = appInfo.uid; int uid = appInfo.uid;
Class appOpsClazz = null; Class appOpsClazz;
try { try {
appOpsClazz = Class.forName(AppOpsManager.class.getName()); appOpsClazz = Class.forName(AppOpsManager.class.getName());
Method checkOpNoThrowMethod = appOpsClazz.getMethod("checkOpNoThrow", Method checkOpNoThrowMethod = appOpsClazz.getMethod("checkOpNoThrow", Integer.TYPE, Integer.TYPE,
Integer.TYPE, Integer.TYPE, String.class); String.class);
Field opValue = appOpsClazz.getDeclaredField(appOpsServiceId); Field opValue = appOpsClazz.getDeclaredField(appOpsServiceId);
int value = opValue.getInt(Integer.class); int value = opValue.getInt(Integer.class);
Object result = checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg); Object result = checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg);
return Integer.parseInt(result.toString()) == AppOpsManager.MODE_ALLOWED;
return Integer.parseInt(result.toString()) == AppOpsManager.MODE_ALLOWED; } catch (InvocationTargetException e) {
} catch (InvocationTargetException e) { e.printStackTrace();
e.printStackTrace(); } catch (IllegalAccessException e) {
} catch (IllegalAccessException e) { e.printStackTrace();
e.printStackTrace(); } catch (NoSuchMethodException e) {
} catch (NoSuchMethodException e) { e.printStackTrace();
e.printStackTrace(); } catch (NoSuchFieldException e) {
} catch (NoSuchFieldException e) { e.printStackTrace();
e.printStackTrace(); } catch (ClassNotFoundException e) {
} catch (ClassNotFoundException e) { e.printStackTrace();
e.printStackTrace(); }
} }
return true;
return false;
} }
} }

View File

@@ -1,41 +1,33 @@
package cn.jpush.phonegap; package cn.jiguang.cordova.push;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import cn.jpush.android.api.JPushInterface;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver { import cn.jpush.android.api.JPushInterface;
private static String TAG = "JPushPlugin";
private static final List<String> IGNORED_EXTRAS_KEYS = public class JPushReceiver extends BroadcastReceiver {
Arrays.asList(
"cn.jpush.android.TITLE", private static final List<String> IGNORED_EXTRAS_KEYS = Arrays.asList("cn.jpush.android.TITLE",
"cn.jpush.android.MESSAGE", "cn.jpush.android.MESSAGE", "cn.jpush.android.APPKEY", "cn.jpush.android.NOTIFICATION_CONTENT_TITLE","key_show_entity","platform");
"cn.jpush.android.APPKEY",
"cn.jpush.android.NOTIFICATION_CONTENT_TITLE"
);
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); String action = intent.getAction();
if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(action)) { if (action.equals(JPushInterface.ACTION_REGISTRATION_ID)) {
String rId = intent.getStringExtra(JPushInterface.EXTRA_REGISTRATION_ID);
JPushPlugin.transmitReceiveRegistrationId(rId);
} else if (action.equals(JPushInterface.ACTION_MESSAGE_RECEIVED)) {
handlingMessageReceive(intent); handlingMessageReceive(intent);
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(action)) { } else if (action.equals(JPushInterface.ACTION_NOTIFICATION_RECEIVED)) {
handlingNotificationReceive(context, intent); handlingNotificationReceive(context, intent);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(action)) { } else if (action.equals(JPushInterface.ACTION_NOTIFICATION_OPENED)) {
handlingNotificationOpen(context, intent); handlingNotificationOpen(context, intent);
} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(action)) {
// 当在 HTML 页面中调用 JPushWeb.triggerNativeAction(String params) 方法时触发此方法
// 再进行相关的操作
} else {
Log.d(TAG, "Unhandled intent - " + action);
} }
} }
@@ -46,8 +38,6 @@ public class MyReceiver extends BroadcastReceiver {
} }
private void handlingNotificationOpen(Context context, Intent intent) { private void handlingNotificationOpen(Context context, Intent intent) {
Log.i(TAG, "---------------- handlingNotificationOpen");
String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE); String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
JPushPlugin.openNotificationTitle = title; JPushPlugin.openNotificationTitle = title;
@@ -59,21 +49,15 @@ public class MyReceiver extends BroadcastReceiver {
JPushPlugin.transmitNotificationOpen(title, alert, extras); JPushPlugin.transmitNotificationOpen(title, alert, extras);
Intent launch = context.getPackageManager().getLaunchIntentForPackage( Intent launch = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
context.getPackageName()); if (launch != null) {
launch.addCategory(Intent.CATEGORY_LAUNCHER); launch.addCategory(Intent.CATEGORY_LAUNCHER);
launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(launch); context.startActivity(launch);
}
} }
private void handlingNotificationReceive(Context context, Intent intent) { private void handlingNotificationReceive(Context context, Intent intent) {
Log.i(TAG, "---------------- handlingNotificationReceive");
Intent launch = context.getPackageManager().getLaunchIntentForPackage(
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); String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
JPushPlugin.notificationTitle = title; JPushPlugin.notificationTitle = title;
@@ -99,5 +83,4 @@ public class MyReceiver extends BroadcastReceiver {
} }
return extrasMap; return extrasMap;
} }
} }

View File

@@ -0,0 +1,6 @@
package cn.jiguang.cordova.push;
import cn.jpush.android.service.JCommonService;
public class PushService extends JCommonService {
}

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 695 B

After

Width:  |  Height:  |  Size: 695 B

View File

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 181 B

View File

View File

View File

@@ -0,0 +1,169 @@
<?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"
android:paddingTop="2dp"
android:paddingRight="8dp"
android:paddingLeft="8dp"
android:paddingBottom="4dp">
<FrameLayout
android:id="@+id/v21"
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">
<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:layout_marginLeft="6dp"
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:text="· "
android:textSize="20sp" />
<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>
<ImageView
android:id="@+id/push_notification_big_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="8dp"
android:scaleType="centerInside" />
<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:layout_below="@id/push_notification_layout_lefttop"
android:layout_toLeftOf="@+id/push_notification_big_icon"
android:layout_marginLeft="6dp"
android:layout_marginRight="4dp"
android:maxLines="1"
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:layout_marginRight="4dp"
android:layout_below="@id/push_notification_sub_title"
android:layout_toLeftOf="@+id/push_notification_big_icon"
android:layout_marginLeft="6dp"
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:layout_marginRight="4dp"
android:layout_toLeftOf="@+id/push_notification_big_icon"
android:layout_below="@id/push_notification_sub_title"
android:ellipsize="end"
android:layout_marginLeft="6dp"
android:layout_marginTop="1dp"
android:textSize="13sp"
android:maxLines="1"
android:visibility="gone" />
</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:layout_marginLeft="6dp"
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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
style="@android:style/TextAppearance.Material.Notification.Time"
android:id="@+id/push_notification_style_1_date"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:textSize="12sp" />
<TextView
style="@android:style/TextAppearance.Material.Notification.Title"
android:id="@+id/push_notification_style_1_title"
android:layout_alignParentLeft="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/push_notification_style_1_date"
android:maxLines="1"
android:layout_marginRight="8dp"
android:textSize="12sp"
android:textStyle="bold" />
</RelativeLayout>
<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="2"
android:textSize="13sp" />
</LinearLayout>
</RelativeLayout>
</RelativeLayout>

0
src/android/res/layout/jpush_popwin_layout.xml Normal file → Executable file
View File

0
src/android/res/layout/jpush_webview_layout.xml Normal file → Executable file
View File

View File

@@ -0,0 +1,169 @@
<?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"
android:paddingTop="2dp"
android:paddingRight="8dp"
android:paddingLeft="8dp"
android:paddingBottom="4dp">
<FrameLayout
android:id="@+id/v"
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">
<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:layout_marginLeft="6dp"
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.StatusBar.EventContent.Info"
android:id="@+id/push_notification_dot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:text="· "
android:textSize="20sp" />
<TextView
style="@*android:style/TextAppearance.StatusBar.EventContent.Time"
android:id="@+id/push_notification_date"
android:maxLines="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp" />
</LinearLayout>
<ImageView
android:id="@+id/push_notification_big_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="8dp"
android:scaleType="centerInside" />
<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:layout_below="@id/push_notification_layout_lefttop"
android:layout_toLeftOf="@+id/push_notification_big_icon"
android:layout_marginLeft="6dp"
android:layout_marginRight="4dp"
android:maxLines="1"
android:textSize="13sp"
android:visibility="gone" />
<TextView
style="@*android:style/TextAppearance.StatusBar.EventContent.Info"
android:id="@+id/push_notification_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="4dp"
android:layout_below="@id/push_notification_sub_title"
android:layout_toLeftOf="@+id/push_notification_big_icon"
android:layout_marginLeft="6dp"
android:ellipsize="end"
android:layout_marginTop="1dp"
android:maxLines="2"
android:textSize="13sp" />
<TextView
style="@*android:style/TextAppearance.StatusBar.EventContent.Info"
android:id="@+id/push_notification_content_one_line"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="4dp"
android:layout_toLeftOf="@+id/push_notification_big_icon"
android:layout_below="@id/push_notification_sub_title"
android:ellipsize="end"
android:layout_marginLeft="6dp"
android:layout_marginTop="1dp"
android:textSize="13sp"
android:maxLines="1"
android:visibility="gone" />
</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:layout_marginLeft="6dp"
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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
style="@*android:style/TextAppearance.StatusBar.EventContent.Time"
android:id="@+id/push_notification_style_1_date"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:textSize="12sp" />
<TextView
style="@android:style/TextAppearance.Material.Notification.Title"
android:id="@+id/push_notification_style_1_title"
android:layout_alignParentLeft="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/push_notification_style_1_date"
android:maxLines="1"
android:layout_marginRight="8dp"
android:textSize="12sp"
android:textStyle="bold" />
</RelativeLayout>
<TextView
style="@*android:style/TextAppearance.StatusBar.EventContent.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="2"
android:textSize="13sp" />
</LinearLayout>
</RelativeLayout>
</RelativeLayout>

View File

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

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

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

0
src/android/res/values/jpush_style.xml Normal file → Executable file
View File

View File

@@ -3,9 +3,9 @@
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>Appkey</key> <key>Appkey</key>
<string>1c29cb5814072b5b1f8ef829</string> <string></string>
<key>Channel</key> <key>Channel</key>
<string>Subscription</string> <string>channel name</string>
<key>IsProduction</key> <key>IsProduction</key>
<false/> <false/>
<key>IsIDFA</key> <key>IsIDFA</key>

View File

@@ -1,153 +1,213 @@
// //
// AppDelegate+JPush.m // AppDelegate+JPush.m
// delegateExtention // delegateExtention
// //
// Created by on 15/8/3. // Created by on 15/8/3.
// Copyright (c) 2015 JPush. All rights reserved. // Copyright (c) 2015 JPush. All rights reserved.
// //
#import "AppDelegate+JPush.h" #import "AppDelegate+JPush.h"
#import "JPushPlugin.h" #import "JPushPlugin.h"
#import <objc/runtime.h> #import <objc/runtime.h>
#import <AdSupport/AdSupport.h> #import <AdSupport/AdSupport.h>
#import <UserNotifications/UserNotifications.h> #import <UserNotifications/UserNotifications.h>
#import "JPushDefine.h" #import "JPushDefine.h"
@implementation AppDelegate (JPush) @implementation AppDelegate (JPush)
+(void)load{ +(void)load{
Method origin1; Method origin1;
Method swizzle1; Method swizzle1;
origin1 = class_getInstanceMethod([self class],@selector(init)); origin1 = class_getInstanceMethod([self class],@selector(init));
swizzle1 = class_getInstanceMethod([self class], @selector(init_plus)); swizzle1 = class_getInstanceMethod([self class], @selector(init_plus));
method_exchangeImplementations(origin1, swizzle1); method_exchangeImplementations(origin1, swizzle1);
} }
-(instancetype)init_plus{ -(instancetype)init_plus{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:UIApplicationDidFinishLaunchingNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:UIApplicationDidFinishLaunchingNotification object:nil];
return [self init_plus]; return [self init_plus];
} }
NSDictionary *_launchOptions; NSDictionary *_launchOptions;
-(void)applicationDidLaunch:(NSNotification *)notification{
-(void)applicationDidLaunch:(NSNotification *)notification{
if (notification) { if (!_jpushEventCache) {
if (notification.userInfo) { _jpushEventCache = @{}.mutableCopy;
NSDictionary *userInfo1 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; }
if (userInfo1.count > 0) {
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo1 toJsonString]]; [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
} NSDictionary *event = @{@"registrationId": registrationID?:@""};
NSDictionary *userInfo2 = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]; [JPushPlugin fireDocumentEvent:JPushDocumentEvent_receiveRegistrationId jsString:[event toJsonString]];
if (userInfo2.count > 0) { }];
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_StartLocalNotification jsString:[userInfo1 toJsonString]];
} if (notification != nil &&
} [[UIDevice currentDevice].systemVersion floatValue] < 10.0) {// iOS 10 openNotification
[JPUSHService setDebugMode]; if (notification.userInfo) {
NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"]; if ([notification.userInfo valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; [JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification
NSNumber *delay = [plistData valueForKey:JPushConfig_Delay]; jsString:[[self jpushFormatAPNSDic: notification.userInfo[UIApplicationLaunchOptionsRemoteNotificationKey]] toJsonString]];
}
_launchOptions = notification.userInfo;
if ([notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]) {
if (![delay boolValue]) { UILocalNotification *localNotification = [notification.userInfo valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
[self startJPushSDK]; NSMutableDictionary *localNotificationEvent = @{}.mutableCopy;
} localNotificationEvent[@"content"] = localNotification.alertBody;
localNotificationEvent[@"badge"] = @(localNotification.applicationIconBadgeNumber);
} localNotificationEvent[@"extras"] = localNotification.userInfo;
}
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[localNotificationEvent toJsonString]];
-(void)startJPushSDK{ }
[self registerForRemoteNotification]; }
[JPushPlugin setupJPushSDK:_launchOptions]; }
}
[JPUSHService setDebugMode];
-(void)registerForRemoteNotification{
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"];
#ifdef NSFoundationVersionNumber_iOS_9_x_Max NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init]; NSNumber *delay = [plistData valueForKey:JPushConfig_Delay];
entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self]; _launchOptions = notification.userInfo;
#endif
}else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { if (![delay boolValue]) {
//categories [self startJPushSDK];
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | }
UIUserNotificationTypeSound | }
UIUserNotificationTypeAlert)
categories:nil]; -(void)startJPushSDK{
} else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){ [self registerForRemoteNotification];
//categories nil [JPushPlugin setupJPushSDK:_launchOptions];
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | }
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert) - (void)jpushSDKDidLoginNotification {
categories:nil]; NSDictionary *event = @{@"registrationId": JPUSHService.registrationID};
} [JPushPlugin fireDocumentEvent:JPushDocumentEvent_receiveRegistrationId jsString:[event toJsonString]];
} }
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { - (NSMutableDictionary *)jpushFormatAPNSDic:(NSDictionary *)dic {
[JPUSHService registerDeviceToken:deviceToken]; NSMutableDictionary *extras = @{}.mutableCopy;
} for (NSString *key in dic) {
if([key isEqualToString:@"_j_business"] ||
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ [key isEqualToString:@"_j_msgid"] ||
[JPUSHService handleRemoteNotification:userInfo]; [key isEqualToString:@"_j_uid"] ||
[key isEqualToString:@"actionIdentifier"] ||
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]]; [key isEqualToString:@"aps"]) {
} continue;
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ extras[key] = dic[key];
[JPUSHService handleRemoteNotification:userInfo]; }
NSString *eventName; NSMutableDictionary *formatDic = dic.mutableCopy;
switch ([UIApplication sharedApplication].applicationState) { formatDic[@"extras"] = extras;
case UIApplicationStateInactive: return formatDic;
eventName = JPushDocumentEvent_OpenNotification; }
break;
case UIApplicationStateActive: -(void)registerForRemoteNotification{
eventName = JPushDocumentEvent_ReceiveNotification; if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
break; #ifdef NSFoundationVersionNumber_iOS_9_x_Max
case UIApplicationStateBackground: JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
eventName = JPushDocumentEvent_BackgroundNotification; entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
break; [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
default: #endif
break; }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
} //categories
[SharedJPushPlugin jpushFireDocumentEvent:eventName jsString:[userInfo toJsonString]]; [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
completionHandler(UIBackgroundFetchResultNewData); UIUserNotificationTypeSound |
} UIUserNotificationTypeAlert)
categories:nil];
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{ } else if([[UIDevice currentDevice].systemVersion floatValue] < 8.0){
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:notification.request.content.userInfo]; //categories nil
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
if ([SharedJPushPlugin respondsToSelector:@selector(jpushFireDocumentEvent:jsString:)]) { UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
} categories:nil];
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]]; }
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); }
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{ [JPUSHService registerDeviceToken:deviceToken];
if ([SharedJPushPlugin respondsToSelector:@selector(jpushFireDocumentEvent:jsString:)]) { }
} -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:response.notification.request.content.userInfo]; [JPUSHService handleRemoteNotification:userInfo];
@try {
[userInfo setValue:[response valueForKey:@"userText"] forKey:@"userText"]; [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
} @catch (NSException *exception) { } }
[userInfo setValue:response.actionIdentifier forKey:@"actionIdentifier"];
[SharedJPushPlugin jpushFireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo toJsonString]]; -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
completionHandler(); [JPUSHService handleRemoteNotification:userInfo];
} NSString *eventName;
switch ([UIApplication sharedApplication].applicationState) {
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { case UIApplicationStateBackground:
[[NSNotificationCenter defaultCenter] postNotificationName:JPushDocumentEvent_ReceiveLocalNotification object:notification.userInfo]; eventName = JPushDocumentEvent_BackgroundNotification;
} break;
default:
- (void)applicationWillEnterForeground:(UIApplication *)application { eventName = JPushDocumentEvent_ReceiveNotification;
// [application setApplicationIconBadgeNumber:0]; break;
// [application cancelAllLocalNotifications]; }
}
[JPushPlugin fireDocumentEvent:eventName jsString:[[self jpushFormatAPNSDic:userInfo] toJsonString]];
- (void)applicationDidEnterBackground:(UIApplication *)application { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(30 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; completionHandler(UIBackgroundFetchResultNewData);
} });
}
@end
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler{
NSMutableDictionary *userInfo = @{}.mutableCopy;
if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
userInfo = [self jpushFormatAPNSDic:notification.request.content.userInfo];
} else {
UNNotificationContent *content = notification.request.content;
userInfo[@"content"] = content.body;
userInfo[@"badge"] = content.badge;
userInfo[@"extras"] = content.userInfo;
userInfo[@"identifier"] = notification.request.identifier;
}
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
if ([userInfo[@"aps"][@"content-available"] isEqualToNumber:@(1)]) {// content-available
return;
}
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveNotification jsString:[userInfo toJsonString]];
}
-(void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
UNNotification *notification = response.notification;
NSMutableDictionary *userInfo = @{}.mutableCopy;
if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
userInfo = [self jpushFormatAPNSDic:notification.request.content.userInfo];
} else {
UNNotificationContent *content = notification.request.content;
userInfo[@"content"] = content.body;
userInfo[@"badge"] = content.badge;
userInfo[@"extras"] = content.userInfo;
userInfo[@"identifier"] = notification.request.identifier;
}
[JPushPlugin fireDocumentEvent:JPushDocumentEvent_OpenNotification jsString:[userInfo toJsonString]];
completionHandler();
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
NSMutableDictionary *localNotificationEvent = @{}.mutableCopy;
localNotificationEvent[@"content"] = notification.alertBody;
localNotificationEvent[@"badge"] = @(notification.applicationIconBadgeNumber);
localNotificationEvent[@"extras"] = notification.userInfo;
[[NSNotificationCenter defaultCenter] postNotificationName:JPushDocumentEvent_ReceiveLocalNotification object:localNotificationEvent];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// [application setApplicationIconBadgeNumber:0];
// [application cancelAllLocalNotifications];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}
@end

View File

@@ -15,7 +15,7 @@
#define WEAK_SELF(weakSelf) __weak __typeof(&*self)weakSelf = self; #define WEAK_SELF(weakSelf) __weak __typeof(&*self)weakSelf = self;
static NSString *const JPushConfig_FileName = @"PushConfig"; static NSString *const JPushConfig_FileName = @"JPushConfig";
static NSString *const JPushConfig_Appkey = @"Appkey"; static NSString *const JPushConfig_Appkey = @"Appkey";
static NSString *const JPushConfig_Channel = @"Channel"; static NSString *const JPushConfig_Channel = @"Channel";
static NSString *const JPushConfig_IsProduction = @"IsProduction"; static NSString *const JPushConfig_IsProduction = @"IsProduction";
@@ -24,10 +24,9 @@ static NSString *const JPushConfig_Delay = @"Delay";
static NSString *const JPushDocumentEvent_ReceiveNotification = @"receiveNotification"; static NSString *const JPushDocumentEvent_ReceiveNotification = @"receiveNotification";
static NSString *const JPushDocumentEvent_OpenNotification = @"openNotification"; static NSString *const JPushDocumentEvent_OpenNotification = @"openNotification";
static NSString *const JPushDocumentEvent_BackgroundNotification = @"backgroundNotification"; static NSString *const JPushDocumentEvent_BackgroundNotification = @"backgroundNotification";
static NSString *const JPushDocumentEvent_SetTagsWithAlias = @"setTagsWithAlias"; static NSString *const JPushDocumentEvent_SetTagsWithAlias = @"setTagsWithAlias";
static NSString *const JPushDocumentEvent_ReceiveMessage = @"receiveMessage"; static NSString *const JPushDocumentEvent_ReceiveMessage = @"receiveMessage";
static NSString *const JPushDocumentEvent_StartLocalNotification = @"startLocalNotification";
static NSString *const JPushDocumentEvent_ReceiveLocalNotification = @"receiveLocalNotification"; static NSString *const JPushDocumentEvent_ReceiveLocalNotification = @"receiveLocalNotification";
static NSString *const JPushDocumentEvent_receiveRegistrationId = @"receiveRegistrationId";

View File

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

View File

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

325
src/ios/lib/JPUSHService.h Normal file → Executable file
View File

@@ -6,10 +6,10 @@
* | | | | / /\ \ | | | | \ \______| | * | | | | / /\ \ | | | | \ \______| |
* | | | | /_/ \_\ | | | | \_________| * | | | | /_/ \_\ | | | | \_________|
* *
* Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved. * Copyright (c) 2011 ~ 2017 Shenzhen HXHG. All rights reserved.
*/ */
#define JPUSH_VERSION_NUMBER 3.0.0 #define JPUSH_VERSION_NUMBER 3.3.3
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@@ -21,6 +21,11 @@
@class UNNotificationRequest; @class UNNotificationRequest;
@class UNNotification; @class UNNotification;
@protocol JPUSHRegisterDelegate; @protocol JPUSHRegisterDelegate;
@protocol JPUSHGeofenceDelegate;
typedef void (^JPUSHTagsOperationCompletion)(NSInteger iResCode, NSSet *iTags, NSInteger seq);
typedef void (^JPUSHTagValidOperationCompletion)(NSInteger iResCode, NSSet *iTags, NSInteger seq, BOOL isBind);
typedef void (^JPUSHAliasOperationCompletion)(NSInteger iResCode, NSString *iAlias, NSInteger seq);
extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中 extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中
extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接 extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接
@@ -36,6 +41,18 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
JPAuthorizationOptionBadge = (1 << 0), // the application may badge its icon 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 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 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.
}; };
/*! /*!
@@ -68,6 +85,17 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
@end @end
/*!
* 推送通知声音实体类
* iOS10以上有效
*/
@interface JPushNotificationSound : NSObject <NSCopying, NSCoding>
@property (nonatomic, copy) NSString *soundName; //普通通知铃声
@property (nonatomic, copy) NSString *criticalSoundName NS_AVAILABLE_IOS(12.0); //警告通知铃声
@property (nonatomic, assign) float criticalSoundVolume NS_AVAILABLE_IOS(12.0); //警告通知铃声音量有效值在0~1之间默认为1
@end
/*! /*!
* 推送内容实体类 * 推送内容实体类
*/ */
@@ -81,12 +109,17 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
@property (nonatomic, copy) NSString *categoryIdentifier; // 行为分类标识 @property (nonatomic, copy) NSString *categoryIdentifier; // 行为分类标识
@property (nonatomic, copy) NSDictionary *userInfo; // 本地推送时可以设置userInfo来增加附加信息远程推送时设置的payload推送内容作为此userInfo @property (nonatomic, copy) NSDictionary *userInfo; // 本地推送时可以设置userInfo来增加附加信息远程推送时设置的payload推送内容作为此userInfo
@property (nonatomic, copy) NSString *sound; // 声音名称,不设置则为默认声音 @property (nonatomic, copy) NSString *sound; // 声音名称,不设置则为默认声音
@property (nonatomic, copy) JPushNotificationSound *soundSetting NS_AVAILABLE_IOS(10.0); //推送声音实体
@property (nonatomic, copy) NSArray *attachments NS_AVAILABLE_IOS(10_0); // 附件iOS10以上有效需要传入UNNotificationAttachment对象数组类型 @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 *threadIdentifier NS_AVAILABLE_IOS(10_0); // 线程或与推送请求相关对话的标识iOS10以上有效可用来对推送进行分组
@property (nonatomic, copy) NSString *launchImageName 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) 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.
@end @end
/*! /*!
* 推送触发方式实体类 * 推送触发方式实体类
* 注dateComponents、timeInterval、region在iOS10以上可选择其中一个参数传入有效值如果同时传入值会根据优先级I、II、III使其中一种触发方式生效fireDate为iOS10以下根据时间触发时须传入的参数 * 注dateComponents、timeInterval、region在iOS10以上可选择其中一个参数传入有效值如果同时传入值会根据优先级I、II、III使其中一种触发方式生效fireDate为iOS10以下根据时间触发时须传入的参数
@@ -123,12 +156,6 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
/// @name Setup 启动相关 /// @name Setup 启动相关
///---------------------------------------------------- ///----------------------------------------------------
/*!
* @abstract 启动SDK
*
* @discussion 这是旧版本的启动方法, 依赖于 PushConfig.plist 文件. 建议不要使用, 已经过期.
*/
+ (void)setupWithOption:(NSDictionary *)launchingOption __attribute__((deprecated("JPush 2.1.0 版本已过期")));
/*! /*!
* @abstract 启动SDK * @abstract 启动SDK
@@ -137,7 +164,7 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识. * @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
* @param channel 发布渠道. 可选. * @param channel 发布渠道. 可选.
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES. * @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
* @param advertisingIdentifier 广告标识符IDFA 如果不需要使用IDFA传nil. * App 证书环境取决于profile provision的配置此处建议与证书环境保持一致.
* *
* @discussion 提供SDK启动必须的参数, 来启动 SDK. * @discussion 提供SDK启动必须的参数, 来启动 SDK.
* 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作. * 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作.
@@ -147,7 +174,19 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
channel:(NSString *)channel channel:(NSString *)channel
apsForProduction:(BOOL)isProduction; 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:(NSDictionary *)launchingOption + (void)setupWithOption:(NSDictionary *)launchingOption
appKey:(NSString *)appKey appKey:(NSString *)appKey
channel:(NSString *)channel channel:(NSString *)channel
@@ -180,47 +219,134 @@ typedef NS_OPTIONS(NSUInteger, JPAuthorizationOptions) {
+ (void)registerDeviceToken:(NSData *)deviceToken; + (void)registerDeviceToken:(NSData *)deviceToken;
/*! /*!
* @abstract 处理收到的 APNs 消息 * @abstract 处理收到的 APNs 消息
*/ */
+ (void)handleRemoteNotification:(NSDictionary *)remoteInfo; + (void)handleRemoteNotification:(NSDictionary *)remoteInfo;
/*!
* @abstract 向极光服务器提交Token
*
* @param voipToken 推送使用的Voip Token
*/
+ (void)registerVoipToken:(NSData *)voipToken;
///----------------------------------------------------
/// @name Tag alias setting 设置别名与标签
///----------------------------------------------------
/*! /*!
* 下面的接口是可选的 * @abstract 处理收到的 Voip 消息
* 设置标签和(或)别名若参数为nil则忽略若是空对象则清空详情请参考文档https://docs.jiguang.cn/jpush/client/iOS/ios_api/ *
* setTags:alias:fetchCompletionHandle:是新的设置标签别名的方法不再需要显示声明回调函数只需要在block里面处理设置结果即可. * @param remoteInfo 下发的 Voip 内容
* WARN: 使用block时需要注意循环引用问题
*/ */
+ (void) setTags:(NSSet *)tags + (void)handleVoipNotification:(NSDictionary *)remoteInfo;
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 * @abstract 检测通知授权状态
object:(id)theTarget; * @param completion 授权结果通过status值返回详见JPAuthorizationStatus
*/
+ (void)requestNotificationAuthorization:(void (^)(JPAuthorizationStatus status))completion;
+ (void)setTags:(NSSet *)tags /*!
alias:(NSString *)alias * @abstract 跳转至系统设置页面iOS8及以上有效
fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler; */
+ (void)openSettingsForNotification:(void (^)(BOOL success))completionHandler NS_AVAILABLE_IOS(8_0);
+ (void) setTags:(NSSet *)tags /*!
aliasInbackground:(NSString *)alias; * Tags操作接口
* 支持增加/覆盖/删除/清空/查询操作
* 详情请参考文档https://docs.jiguang.cn/jpush/client/iOS/ios_api/
*/
/**
增加tags
@param tags 需要增加的tags集合
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)addTags:(NSSet<NSString *> *)tags
completion:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
/**
覆盖tags
调用该接口会覆盖用户所有的tags
@param tags 需要设置的tags集合
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)setTags:(NSSet<NSString *> *)tags
completion:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
/**
删除指定tags
@param tags 需要删除的tags集合
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)deleteTags:(NSSet<NSString *> *)tags
completion:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
/**
清空所有tags
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)cleanTags:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
/**
查询全部tags
@param completion 响应回调,请在回调中获取查询结果
@param seq 请求序列号
*/
+ (void)getAllTags:(JPUSHTagsOperationCompletion)completion
seq:(NSInteger)seq;
/**
验证tag是否绑定
@param completion 响应回调,回调中查看是否绑定
@param seq 请求序列号
*/
+ (void)validTag:(NSString *)tag
completion:(JPUSHTagValidOperationCompletion)completion
seq:(NSInteger)seq;
/**
设置Alias
@param alias 需要设置的alias
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)setAlias:(NSString *)alias + (void)setAlias:(NSString *)alias
callbackSelector:(SEL)cbSelector completion:(JPUSHAliasOperationCompletion)completion
object:(id)theTarget; seq:(NSInteger)seq;
/**
删除alias
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)deleteAlias:(JPUSHAliasOperationCompletion)completion
seq:(NSInteger)seq;
/**
查询当前alias
@param completion 响应回调
@param seq 请求序列号
*/
+ (void)getAlias:(JPUSHAliasOperationCompletion)completion
seq:(NSInteger)seq;
/*! /*!
* @abstract 过滤掉无效的 tags * @abstract 过滤掉无效的 tags
@@ -230,7 +356,6 @@ callbackSelector:(SEL)cbSelector
*/ */
+ (NSSet *)filterValidTags:(NSSet *)tags; + (NSSet *)filterValidTags:(NSSet *)tags;
///---------------------------------------------------- ///----------------------------------------------------
/// @name Stats 统计功能 /// @name Stats 统计功能
///---------------------------------------------------- ///----------------------------------------------------
@@ -239,23 +364,26 @@ callbackSelector:(SEL)cbSelector
* @abstract 开始记录页面停留 * @abstract 开始记录页面停留
* *
* @param pageName 页面名称 * @param pageName 页面名称
* @discussion JCore 1.1.8 版本后,如需统计页面流,请使用 JAnalytics
*/ */
+ (void)startLogPageView:(NSString *)pageName; + (void)startLogPageView:(NSString *)pageName __attribute__((deprecated("JCore 1.1.8 版本已过期")));
/*! /*!
* @abstract 停止记录页面停留 * @abstract 停止记录页面停留
* *
* @param pageName 页面 * @param pageName 页面
* @discussion JCore 1.1.8 版本后,如需统计页面流,请使用 JAnalytics
*/ */
+ (void)stopLogPageView:(NSString *)pageName; + (void)stopLogPageView:(NSString *)pageName __attribute__((deprecated("JCore 1.1.8 版本已过期")));
/*! /*!
* @abstract 直接上报在页面的停留时间 * @abstract 直接上报在页面的停留时间
* *
* @param pageName 页面 * @param pageName 页面
* @param seconds 停留的秒数 * @param seconds 停留的秒数
* @discussion JCore 1.1.8 版本后,如需统计页面流,请使用 JAnalytics
*/ */
+ (void)beginLogPageView:(NSString *)pageName duration:(int)seconds; + (void)beginLogPageView:(NSString *)pageName duration:(int)seconds __attribute__((deprecated("JCore 1.1.8 版本已过期")));
/*! /*!
* @abstract 开启Crash日志收集 * @abstract 开启Crash日志收集
@@ -282,6 +410,26 @@ callbackSelector:(SEL)cbSelector
*/ */
+ (void)setLocation:(CLLocation *)location; + (void)setLocation:(CLLocation *)location;
/**
设置地理围栏的最大个数
默认值为 10 iOS系统默认地理围栏最大个数为20
@param count 个数 count
*/
+ (void)setGeofenecMaxCount:(NSInteger)count;
/**
注册地理围栏的代理
@param delegate 代理
@param launchOptions app启动完成是收到的字段参数
*/
+ (void)registerLbsGeofenceDelegate:(id<JPUSHGeofenceDelegate>)delegate withLaunchOptions:(NSDictionary *)launchOptions;
/**
删除地理围栏
@param geofenceId 地理围栏id
*/
+ (void)removeGeofenceWithIdentifier:(NSString *)geofenceId;
///---------------------------------------------------- ///----------------------------------------------------
/// @name Local Notification 本地通知 /// @name Local Notification 本地通知
@@ -310,7 +458,7 @@ callbackSelector:(SEL)cbSelector
* @abstract 查找推送 (支持iOS10并兼容iOS10以下版本) * @abstract 查找推送 (支持iOS10并兼容iOS10以下版本)
* *
* JPush 2.1.9新接口 * 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)返回相应对象数组。 * @param identifier JPushNotificationIdentifier类型iOS10以上可以通过设置identifier.delivered和identifier.identifiers来查找相应在通知中心显示推送或待推送请求identifier.identifiers如果设置为nil或空数组则返回相应标志下所有在通知中心显示推送或待推送请求iOS10以下identifier.delivered属性无效identifier.identifiers如果设置nil或空数组则返回所有未触发的推送。须要设置identifier.findCompletionHandler回调才能得到查找结果通过(NSArray *results)返回相应对象数组。
* @discussion 旧的查找推送接口被废弃,使用此接口可以替换 * @discussion 旧的查找推送接口被废弃,使用此接口可以替换
* *
*/ */
@@ -428,6 +576,20 @@ callbackSelector:(SEL)cbSelector
*/ */
+ (void)resetBadge; + (void)resetBadge;
///----------------------------------------------------
/// @name Other Feature 其他功能
///----------------------------------------------------
/*!
* @abstract 设置手机号码(到服务器)
*
* @param mobileNumber 手机号码. 会与用户信息一一对应。可为空,为空则清除号码
* @param completion 响应回调。成功则error为空失败则error带有错误码及错误信息
*
* @discussion 设置手机号码后可实现“推送不到短信到”的通知方式提高推送达到率。结果信息通过completion异步返回也可将completion设置为nil不处理结果信息。
*
*/
+ (void)setMobileNumber:(NSString *)mobileNumber completion:(void (^)(NSError *error))completion;
///---------------------------------------------------- ///----------------------------------------------------
/// @name Logs and others 日志与其他 /// @name Logs and others 日志与其他
@@ -456,7 +618,7 @@ callbackSelector:(SEL)cbSelector
* *
* SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志. * SDK 默认开启的日志级别为: Info. 只显示必要的信息, 不打印调试日志.
* *
* 调用本接口可打开日志级别为: Debug, 打印调试日志. * 请在SDK启动后调用本接口调用本接口可打开日志级别为: Debug, 打印调试日志.
*/ */
+ (void)setDebugMode; + (void)setDebugMode;
@@ -471,6 +633,47 @@ callbackSelector:(SEL)cbSelector
*/ */
+ (void)setLogOFF; + (void)setLogOFF;
/*!
* @abstract 设置SDK地理位置权限开关
*
* @discussion 关闭地理位置之后SDK地理围栏的相关功能将受到影响默认是开启。
*
*/
+ (void)setLocationEanable:(BOOL)isEanble;
///----------------------------------------------------
///********************下列方法已过期********************
///**************请使用新版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 @end
@class UNUserNotificationCenter; @class UNUserNotificationCenter;
@@ -491,6 +694,42 @@ callbackSelector:(SEL)cbSelector
* @param response 通知响应对象 * @param response 通知响应对象
* @param completionHandler * @param completionHandler
*/ */
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())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:(NSDictionary *)info;
@end
@protocol JPUSHGeofenceDelegate <NSObject>
/**
进入地理围栏区域
@param geofenceId 地理围栏id
@param userInfo 地理围栏触发时返回的信息
@param error 错误信息
*/
- (void)jpushGeofenceIdentifer:(NSString *)geofenceId didEnterRegion:(NSDictionary *)userInfo error:(NSError *)error;
/**
离开地理围栏区域
@param geofenceId 地理围栏id
@param userInfo 地理围栏触发时返回的信息
@param error 错误信息
*/
- (void)jpushGeofenceIdentifer:(NSString *)geofenceId didExitRegion:(NSDictionary *)userInfo error:(NSError *)error;
@end @end

Binary file not shown.

Binary file not shown.

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

Binary file not shown.

View File

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