Compare commits

...

52 Commits

Author SHA1 Message Date
Hevin
380c09283d update Android API Doc
add Rich Push callback API.
2016-05-13 11:23:52 +08:00
Hevin
730b93d82a update npm version 2016-05-13 11:04:19 +08:00
Hevin
39d65d61c8 Merge branch 'dev' 2016-05-13 10:57:56 +08:00
Hevin
4ed844e0c5 support rich push. 2016-05-13 10:49:36 +08:00
Hevin
1f2499a893 Merge branch 'master' into dev 2016-05-13 10:34:30 +08:00
Hevin
bca6853a4e Merge branch 'dev' 2016-05-10 14:12:57 +08:00
Hevin
0015cd23e4 update README 2016-05-10 14:11:29 +08:00
Hevin
8b5efdcdcc Merge branch 'master' into dev 2016-05-10 14:11:16 +08:00
Hevin
4bc24e66d4 Merge branch 'dev' 2016-04-28 09:27:32 +08:00
Hevin
53dcfa0087 update READEME
更新 cordova device 插件安装命令。
2016-04-28 09:25:42 +08:00
Hevin
c9755d4f64 Merge branch 'master' into dev 2016-04-28 09:24:01 +08:00
E.B
6409ce4934 Merge branch 'dev' 2016-04-27 10:37:30 +08:00
E.B
aa3a4a218c iOS - update
1.更新目录
2.更新 README.md
3.重写 iOS_install.md
2016-04-26 14:43:52 +08:00
E.B
79fb3b76ca iOS - update
1.更新 iOS sdk
2.更改启动 sdk 的方法
3.PushConfig.plist 添加 isIDFA 字段
2016-04-26 14:02:35 +08:00
Hevin
adb385a90b Merge branch 'dev' 2016-04-25 14:34:26 +08:00
Hevin
76b3014417 v 2.1.4 2016-04-25 14:33:45 +08:00
Hevin
5fb1a440c4 fix bug
修复应用在后台点击通知无法触发点击事件的 bug。
2016-04-25 14:03:57 +08:00
Hevin
4edee3e2d3 Merge branch 'master' into dev 2016-04-25 13:54:19 +08:00
E.B
1a6800a7b4 iOS - update API
1. 解决冲突 添加接口
2016-04-22 15:53:24 +08:00
E.B
95c9b12124 iOS - new feature
1. 增加 jpush.backgroundNotification 事件
2. 重新区分原有事件的触发条件
3. 更新 文档接口说明
2016-04-22 15:44:04 +08:00
Hevin
e11b80f80c Merge branch 'dev' 2016-04-22 13:21:22 +08:00
Hevin
d1e4f70188 对某些方法添加更加详细的说明
eg.setBasicPushNotificationBuilder, setCustomPushNotificationBuilder
2016-04-22 13:16:17 +08:00
Hevin
8241b364cc format doc 2016-04-22 11:22:07 +08:00
Hevin
706f32a972 update doc 2016-04-21 20:32:28 +08:00
Hevin
c64304e632 Merge branch 'dev' 2016-04-21 14:51:58 +08:00
Hevin
c9cb88b9ef update doc 2016-04-21 14:51:22 +08:00
Hevin
f177e8ae46 Merge branch 'master' into dev 2016-04-20 17:25:03 +08:00
Hevin
d4e9eb9b67 update README 2016-04-20 17:22:38 +08:00
Hevin
eb1fc6ef13 2.1.4 2016-04-20 13:19:46 +08:00
Hevin
b698a2bfd3 Merge branch 'dev' 2016-04-20 12:51:57 +08:00
Hevin
3bd75e0799 optimise init process. 2016-04-20 12:50:57 +08:00
E.B
404f19037e iOS - update
1.更新手动安装文档
2.fix 影响其他插件使用的 bug
2016-04-20 09:59:10 +08:00
Hevin
b02e3faef0 add new API & update doc
添加设置允许推送时间和设置通知静默时间的 API
2016-04-18 21:35:43 +08:00
E.B
8b481ddd92 update README.md
1.更新 README.md
2.更新 iOS_install.md
2016-04-18 19:01:50 +08:00
E.B
a599a02a14 update API
1.更新 iOS api
2.修改文件名称
2016-04-18 17:31:15 +08:00
Hevin
84da6e065e Merge branch 'dev' 2016-04-18 15:44:21 +08:00
Hevin
15dee5cd1c update doc 2016-04-18 15:42:11 +08:00
Hevin
87da25a8f2 Merge branch 'master' into dev 2016-04-18 11:15:11 +08:00
Hevin
20cd9b0964 Merge branch 'dev' 2016-04-17 18:12:53 +08:00
Hevin
560e1bb9bd Optimise code 2016-04-17 18:11:43 +08:00
Hevin
d208306884 Merge branch 'master' into dev 2016-04-16 21:37:45 +08:00
Hevin
cd9ca28ba8 update version num. 2016-04-16 11:25:23 +08:00
Hevin
c2bf4db67a Merge branch 'dev' 2016-04-15 17:08:19 +08:00
Hevin
2783be37af fix bug
解决当应用在后台时无法获取通知标题的 bug
2016-04-15 16:17:33 +08:00
Hevin
ffe2fee88d Merge branch 'master' into dev 2016-04-12 14:50:27 +08:00
Hevin
5a1aa16e40 fix bug
fix bug about add local notification.
2016-04-12 14:49:42 +08:00
Hevin
f75430fcc4 optimize code
rename method
2016-04-12 11:23:44 +08:00
Hevin
b515caf1e4 optimize code & update doc
rename some functions name.
format doc & make some instructions more clearer.
2016-04-11 15:21:59 +08:00
Hevin
46b2a5ab1a optimize code
fix spelling mistake.
2016-04-11 10:01:55 +08:00
Hevin
3bccb896e2 Merge branch 'master' into dev 2016-04-09 18:06:46 +08:00
Hevin
dfb883e24c update doc & add some new features
支持安卓直接获得通知标题;
优化安卓获取附加字段的方法。
2016-04-09 18:06:11 +08:00
Hevin
1ff72e4df4 update android sdk to 2.1.3 2016-04-08 18:01:27 +08:00
43 changed files with 1976 additions and 1413 deletions

4
.travis.yml Normal file
View File

@@ -0,0 +1,4 @@
language: node_js
sudo: false
node_js:
- "4.2"

227
README.md
View File

@@ -1,93 +1,91 @@
## JPush PhoneGap/Cordova Plugin ##
# JPush PhoneGap / Cordova Plugin
JPush-PhoneGap-Plugin 支持 iOS, Android 的推送插件。
[![Build Status](https://travis-ci.org/jpush/jpush-phonegap-plugin.svg?branch=master)](https://travis-ci.org/jpush/jpush-phonegap-plugin)
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jpush/jpush-phonegap-plugin)
[![release](https://img.shields.io/badge/release-2.1.5-blue.svg)](https://github.com/jpush/jpush-phonegap-plugin/releases)
[![platforms](https://img.shields.io/badge/platforms-iOS%7CAndroid-lightgrey.svg)](https://github.com/jpush/jpush-phonegap-plugin)
[![weibo](https://img.shields.io/badge/weibo-JPush-blue.svg)](http://weibo.com/jpush?refer_flag=1001030101_&is_all=1)
**功能特性:**
支持 iOS, Android 的极光推送插件。
支持 iOS, Android 的 Cordova 推送插件。
### 功能特性
+ 发送推送通知
+ 发送推送自定义消息
+ 设置推送标签和别名
+ 设置角标iOS
## 功能特性
+ 发送推送通知
+ 发送推送自定义消息
+ 设置推送标签和别名
+ 设置角标iOS
*如需要 IM 功能插件,请关注 [jmessage-phonegap-plugin](https://github.com/jpush/jmessage-phonegap-plugin)*
*如需要 IM 功能插件,请关注 [jmessage-phonegap-plugin](https://github.com/jpush/jmessage-phonegap-plugin)*
## 安装 ##
###准备工作
## 安装
### 准备工作
1. cordova create 文件夹名字 包名 应用名字
cordova create Myproj com.myproj.jpush MyTestProj
2. 添加平台
2. 添加平台:
cd Myproj
cordova platform add android
cordova platform add ios
ps:这里请注意iOS平台必须先执行 `cordova platform add ios`,
然后再执行 `cordova plugin add xxxxx` 命令,不然有一些必须要的链接库需要手动添加
ps: 这里请注意iOS平台必须先执行 cordova platform add ios,
然后再执行 cordova plugin add xxxxx 命令,不然有一些必须要的链接库需要手动添加
###Cordova CLI / PhoneGap 安装 Android & iOS
### 安装插件(Android & iOS)
1). 安装 JPush PhoneGap Plugin, 有两种方法:
#### 1.安装 JPush PhoneGap Plugin
安装 JPush PhoneGap Plugin 有两种方法:
方法一:在线安装
通过 cordova plugins 安装,要求 phonegap/cordova CLI 5.0+ (current stable v2.1.1)
通过 cordova plugins 安装,要求 phonegap/cordova CLI 5.0+:
cordova plugin add jpush-phonegap-plugin --variable API_KEY=your_jpush_appkey
直接通过 url 安装unstable
直接通过 url 安装:
cordova plugin add https://github.com/jpush/jpush-phonegap-plugin.git --variable API_KEY=your_jpush_appkey
方法二:下载到本地再安装
使用 git 命令将 JPush PhoneGap 插件下载的本地,将这个目录标记为 `$JPUSH_PLUGIN_DIR`
使用 git 命令将 JPush PhoneGap 插件下载的本地目录标记为 $JPUSH_PLUGIN_DIR
git clone https://github.com/jpush/jpush-phonegap-plugin.git
cordova plugin add $JPUSH_PLUGIN_DIR --variable API_KEY=your_jpush_appkey
[Android 手动安装文档地址](/doc/Android_handle_install.md)
2). 安装 org.apache.cordova.device
cordova plugin add org.apache.cordova.device
[IOS 手动安装文档地址](/doc/iOS_install.md)
3). 在 js 中调用函数,初始化 JPush SDK
#### 2.安装 cordova device 插件
cordova plugin add cordova-plugin-device
#### 3.在 js 中调用函数,初始化 JPush
//由于 PhoneGap 插件采用了 Lazy load 的特性,所以建议在 js 文件能执行的最开始就添加
window.plugins.jPushPlugin.init();
### Android 手工安装
[Android 手工安装文档地址](document/Android_handle_install.md)
## Demo
插件中包含示例 Demo。若想参考可以在 $JPUSH_PLUGIN_DIR/example 文件夹内找到并拷贝以下文件:
src/example/index.html -> www/index.html
src/example/css/* -> www/css
src/example/js/* -> www/js
### iOS 手工安装
## 关于 PhoneGap build 云服务
[IOS手工安装文档地址](document/iOS_handle_install.md)
该项目基于 cordova 实现,目前无法使用 PhoneGap build 云服务进行打包,建议使用本地环境进行打包。
## API 说明
###示例
"$JPUSH_PLUGIN_DIR/example"文件夹内找到并拷贝以下文件
src/example/index.html to www/index.html
src/example/css/* to www/css
src/example/js/* to www/js
###关于'PhoneGap build'云服务
该项目基于 cordova 实现,目前无法使用 'PhoneGap build' 云服务进行打包,建议使用本地环境进行打包
### API 说明
插件的 API 集中在 JPushPlugin.js 文件中,该文件的具体位置如下:
插件的 API 集中在 JPushPlugin.js 文件中,该文件的具体位置如下:
Android:
@@ -97,140 +95,43 @@ iOS:
[Project]/www/plugins/cn.jpush.phonegap.JPushPlugin/www
具体的 API 请参考下面
### 具体的 API 请参考:
#### iOS 和 Android 通用 API 简介
- [公共 API](/doc/Common_detail_api.md)
+ 停止与恢复推送服务
- [iOS API](/doc/iOS_API.md)
window.plugins.jPushPlugin.init()
window.plugins.jPushPlugin.stopPush()
window.plugins.jPushPlugin.resumePush()
window.plugins.jPushPlugin.isPushStopped(callback)
+ 获取 RegistrationID
window.plugins.jPushPlugin.getRegistrationID(callback)
+ 别名与标签
window.plugins.jPushPlugin.setTagsWithAlias(tags, alias)
window.plugins.jPushPlugin.setTags(tags)
window.plugins.jPushPlugin.setAlias(alias)
+ 获取点击通知内容
event - jpush.openNotification
+ 获取通知内容
event - jpush.receiveNotification
+ 获取自定义消息推送内容
event - jpush.receiveMessage
- [Android API](/doc/Android_detail_api.md)
[通用 API 详细说明](document/Common_detail_api.md)
## 常见问题
#### iOS API简介
若要使用 CLI 来编译项目,注意使用 cordova compile 而不是 cordova build因为 cordova build 会清除对插件文件的修改。
具体 cordova CLI 用法可参考[cordova CLI 官方文档](https://cordova.apache.org/docs/en/latest/reference/cordova-cli/index.html)。
+ 获取自定义消息推送内容
### 1. Android
event - jpush.receiveMessage
//推荐使用事件的方式传递,但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码
window.plugins.jPushPlugin.receiveMessageIniOSCallback(data)
eclipse 中 import PhoneGap 工程之后出现:`Type CallbackContext cannot be resolved to a type`
+ 页面的统计
解决方案eclipse 中右键单击工程名Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add。
window.plugins.jPushPlugin.startLogPageView(pageName)
window.plugins.jPushPlugin.stopLogPageView(pageName)
window.plugins.jPushPlugin.beginLogPageView(pageName, duration)
### 2. iOS
+ 设置 Badge
- 收不到推送:
window.plugins.jPushPlugin.setBadge(value)
window.plugins.jPushPlugin.resetBadge()
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(badge)
window.plugins.JPushPlugin.getApplicationIconBadgeNumber(callback)
请首先按照正确方式再次配置证书、描述文件
[iOS 证书设置指南](http://docs.jpush.io/client/ios_tutorials/#ios_1)
+ 本地通知
- 设置 PushConfig.plist
window.plugins.JPushPlugin.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
window.plugins.JPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS()
window.plugins.JPushPlugin.clearAllLocalNotifications()
+ 日志等级设置
window.plugins.jPushPlugin.setDebugModeFromIos()
window.plugins.jPushPlugin.setLogOFF()
window.plugins.JPushPlugin.setCrashLogON()
+ 地理位置上报
window.plugins.JPushPlugin.setLocation(latitude, longitude)
[iOS API 详细说明](document/iOS_detail_api.md)
#### Android API简介
+ 获取集成日志
window.plugins.jPushPlugin.setDebugMode(mode)
+ 接收推送消息和点击通知
//下面这两个 API 是兼容旧有的代码
window.plugins.jPushPlugin.receiveMessageInAndroidCallback(data)
window.plugins.jPushPlugin.openNotificationInAndroidCallback(data)
+ 统计分析
window.plugins.jPushPlugin.setStatisticsOpen(boolean)
或在 MainActivity 中的 onPause() 和 onResume() 方法中分别调用
JPushInterface.onPause(this) 和 JPushInterface.onResume(this) 来启用统计分析功能,
如果使用这种方式启用统计分析功能,则 window.plugins.jPushPlugin.setStatisticsOpen(boolean)
方法不再有效,建议不要同时使用。
+ 清除通知
window.plugins.jPushPlugin.clearAllNotification()
+ 通知栏样式定制
window.plugins.jPushPlugin.setBasicPushNotificationBuilder = function()
window.plugins.jPushPlugin.setCustomPushNotificationBuilder = function()
+ 设置保留最近通知条数
window.plugins.jPushPlugin.setLatestNotificationNum(num)
+ 本地通知
window.plugins.jPushPlugin.addLocalNotification(builderId, content,
title, notificaitonID, broadcastTime, extras)
window.plugins.jPushPlugin.removeLocalNotification(notificationID)
window.plugins.jPushPlugin.clearLocalNotifications()
[Android API 详细说明](document/Android_detail_api.md)
###常见问题
####1. Android
eclipse 中 PhoneGap 工程 import 之后出现:`Type CallbackContext cannot be resolved to a type`
解决方案eclipse 中右键单击工程名Build Path -> Config Build Path -> Projects -> 选中工程名称 -> CordovaLib -> 点击 add
####2. iOS 设置 / 修改 APP_KEY
在 PushConfig.plist 中修改。
PushConfig.plist 其他值说明:
CHANNEL: 渠道标识
IsProduction: 是否生产环境(暂未启用)
- APP_KEY应用标识
- CHANNEL渠道标识
- IsProduction是否生产环境
- IsIDFA是否使用 IDFA 启动 sdk
###更多
[ JPush 官网文档](http://docs.jpush.io/)
## 更多
[JPush 官网文档](http://docs.jpush.io/)
如有问题可访问[极光社区](http://community.jpush.cn/)

324
doc/Android_detail_api.md Normal file
View File

@@ -0,0 +1,324 @@
# Android API简介
- [接收通知时获得通知的内容](#接收通知时获得通知的内容)
- [打开通知时获得通知的内容](#打开通知时获得通知的内容)
- [收到自定义消息时获取消息的内容](#收到自定义消息时获取消息的内容)
- [获取集成日志](#获取集成日志)
- [接收消息和点击通知事件](#接收消息和点击通知事件)
- [统计分析](#统计分析)
- [清除通知](#清除通知)
- [设置允许推送时间](#设置允许推送时间)
- [设置通知静默时间](#设置通知静默时间)
- [通知栏样式定制](#通知栏样式定制)
- [设置保留最近通知条数](#设置保留最近通知条数)
- [本地通知](#本地通知)
- [富媒体页面 JavaScript 回调 API](#富媒体页面-javascript-回调-api)
## 接收通知时获得通知的内容
- 内容:
window.plugins.jPushPlugin.receiveNotification.alert
- 标题:
window.plugins.jPushPlugin.receiveNotification.title
- 附加字段:
window.plugins.jPushPlugin.receiveNotification.extras.yourKey
## 打开通知时获得通知的内容
- 内容:
window.plugins.jPushPlugin.openNotification.alert
- 标题:
window.plugins.jPushPlugin.openNotification.title
- 附加字段
window.plugins.jPushPlugin.openNotification.extras.yourKey
## 收到自定义消息时获取消息的内容
- 内容:
window.plugins.jPushPlugin.receiveMessage.message
- 附加字段:
window.plugins.jPushPlugin.receiveMessage.extras.yourKey
## 获取集成日志
### API - setDebugMode
用于开启调试模式,可以查看集成 JPush 过程中的 Log如果集成失败可方便定位问题所在。
#### 接口定义
window.plugins.jPushPlugin.setDebugMode(mode)
#### 参数说明
- mode:
- true 显示集成日志。
- false 不显示集成日志。
## 接收消息和点击通知事件
### API - receiveMessageInAndroidCallback
用于 Android 收到应用内消息的回调函数(请注意和通知的区别),该函数不需要主动调用。
#### 接口定义
window.plugins.jPushPlugin.receiveMessageInAndroidCallback(data)
#### 参数说明
- data: 接收到的 js 字符串,包含的 key:value 请进入该函数体查看。
### API - openNotificationInAndroidCallback
当点击 Android 手机的通知栏进入应用程序时,会调用这个函数,这个函数不需要主动调用,是作为回调函数来用的。
#### 接口定义
window.plugins.jPushPlugin.openNotificationInAndroidCallback(data)
#### 参数说明
- data: js 字符串。
## 统计分析
### API - onResume / onPause
这是一个 Android Local API不是 js 的 API请注意。
本 API 用于“用户使用时长”,“活跃用户”,“用户打开次数”的统计,并上报到服务器,在 Portal 上展示给开发者。
#### 接口定义
public static void onResume(final Activity activity)
public static void onPause(final Activity activity)
#### 参数说明
- Activity: 当前所在的 Activity。
#### 调用说明
应在所有的 Activity 的 onResume / onPause 方法里调用。
#### 代码示例
@Override
protected void onResume() {
super.onResume();
JPushInterface.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
JPushInterface.onPause(this);
}
### API - setStatisticsOpen
用于在 js 中控制是否打开应用的统计分析功能,但如果已经添加了上面的 onResume / onPause 方法,
就不能再通过这个方法来控制统计分析功能了。
#### 接口定义
window.plugins.jPushPlugin.setStatisticsOpen(boolean)
#### 参数说明
- boolean:
- true: 打开统计分析功能。
- false: 关闭统计分析功能。
### API - reportNotificationOpened
用于上报用户的通知栏被打开,或者用于上报用户自定义消息被展示等客户端需要统计的事件。
#### 接口定义
window.plugins.jPushPlugin.reportNotificationOpened(msgID)
#### 参数说明
- msgID: 收到的通知或者自定义消息的 id。
## 清除通知
### API - clearAllNotification
推送通知到客户端时,由 JPush SDK 展现通知到通知栏上。
此 API 提供清除通知的功能,包括:清除所有 JPush 展现的通知(不包括非 JPush SDK 展现的)。
#### 接口定义
window.plugins.jPushPlugin.clearAllNotification()
## 设置允许推送时间
### API - setPushTime
默认情况下用户在任何时间都允许推送。即任何时候有推送下来,客户端都会收到,并展示。
开发者可以调用此 API 来设置允许推送的时间。
如果不在该时间段内收到消息,当前的行为是:推送到的通知会被扔掉。
#### 接口定义
window.plugins.jPushPlugin.setPushTime(days, startHour, endHour)
#### 参数说明
- days: 数组0 表示星期天1 表示星期一以此类推7天制数组中值的范围为 0 到 6 )。
数组的值为 null, 表示任何时间都可以收到消息和通知,数组的 size 为 0则表示任何时间都收不到消息和通知。
- startHour: 整形,允许推送的开始时间 24 小时制startHour 的范围为 0 到 23
- endHour: 整形,允许推送的结束时间 24 小时制endHour 的范围为 0 到 23
## 设置通知静默时间
### API - setSilenceTime
默认情况下用户在收到推送通知时,客户端可能会有震动,响铃等提示。
但用户在睡觉、开会等时间点希望为 "免打扰" 模式,也是静音时段的概念。
开发者可以调用此 API 来设置静音时段。如果在该时间段内收到消息,则:不会有铃声和震动。
#### 接口定义
window.plugins.jPushPlugin.setSilenceTime(startHour, startMinute, endHour, endMinute)
#### 参数说明
- startHour: 整形,静音时段的开始时间 - 小时 24小时制范围0~23 )。
- startMinute: 整形,静音时段的开始时间 - 分钟范围0~59 )。
- endHour: 整形,静音时段的结束时间 - 小时 24小时制范围0~23 )。
- endMinute: 整形,静音时段的结束时间 - 分钟范围0~59 )。
## 通知栏样式定制
### API - setBasicPushNotificationBuilder, setCustomPushNotificationBuilder
当用户需要定制默认的通知栏样式时,则可调用此方法。
需要用户去自定义 ../JPushPlugin.java 中的同名方法代码,然后再在 js 端 调用该方法。
具体用法可参考[官方文档](http://docs.jpush.io/client/android_tutorials/#_11)。
JPush SDK 提供了 2 个用于定制通知栏样式的构建类:
- setBasicPushNotificationBuilder:
Basic 用于定制 Android Notification 里的 defaults / flags / icon 等基础样式(行为)。
- setCustomPushNotificationBuilder:
继承 Basic 进一步让开发者定制 Notification Layout。
如果不调用此方法定制,则极光 Push SDK 默认的通知栏样式是 Android 标准的通知栏。
#### 接口定义
window.plugins.jPushPlugin.setBasicPushNotificationBuilder()
window.plugins.jPushPlugin.setCustomPushNotificationBuilder()
## 设置保留最近通知条数
### API - setLatestNotificationNum
通过极光推送,推送了很多通知到客户端时,如果用户不去处理,就会有很多保留在那里。
默认为保留最近 5 条通知,开发者可通过调用此 API 来定义为不同的数量。
#### 接口定义
window.plugins.jPushPlugin.setLatestNotificationNum(num)
#### 参数说明
- num: 保存的条数。
## 本地通知
### API - addLocalNotification, removeLocalNotification, clearLocalNotifications
本地通知 API 不依赖于网络,无网条件下依旧可以触发。
本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制。
本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响。
三个接口的功能分别为:添加一个本地通知,删除一个本地通知,删除所有的本地通知。
#####接口定义
window.plugins.jPushPlugin.addLocalNotification(builderId, content, title,
notificaitonID, broadcastTime, extras)
window.plugins.jPushPlugin.removeLocalNotification(notificationID)
window.plugins.jPushPlugin.clearLocalNotifications()
#### 参数说明
- builderId: 设置本地通知样式。
- content: 设置本地通知的 content。
- title: 设置本地通知的 title。
- notificaitonID: 设置本地通知的 ID。
- broadcastTime: 设置本地通知触发时间,为距离当前时间的数值,单位是毫秒。
- extras: 设置额外的数据信息 extras 为 json 字符串。
## 富媒体页面 JavaScript 回调 API
富媒体推送通知时用户可以用自定义的Javascript 函数来控制页面,如关闭当前页面,点击按钮跳转到指定的 Activity通知应用程序做一些指定的动作等。
此 API 提供的回调函数包括:关闭当前页面、打开应用的主 Activity、根据 Activity 名字打开对应的 Activity、以广播的形式传递页面参数到应用程序等功能。
### API - 关闭当前页面
JPushWeb.close(); // 在富文本 HTML 页面中调用后会关闭当前页面。
### API - 打开主 Activity
JPushWeb.startMainActivity(String params);
在HTML中调用此函数后,会打开程序的主Activity 并在对应的 Intent 传入参数 ”params“ Key 为 JPushInterface.EXTRA_EXTRA。
对应 Activity 获取 params 示例代码:
Intent intent = getIntent();
if (null != intent ) {
String params = intent.getStringExtra(JPushInterface.EXTRA_EXTRA);
}
### API - 触发应用中的操作
JPushWeb.triggerNativeAction(String params);
调用了该方法后需要在 MyReceiver.java 中实现后面的业务逻辑:
if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
Log.d(TAG, "用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
//在这里根据 JPushInterface.EXTRA_EXTRA 的内容触发客户端动作比如打开新的Activity 、打开一个网页等。
}
#### 代码示例
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>JPush Webview Test</title>
<script>
function clickButton() {
JPushWeb.close();
}
function openUrl() {
var json = "{'action':'open', 'url':'www.jpush.cn'}";
JPushWeb.triggerNativeAction(json);
JPushWeb.close(); //客服端在广播中收到json 后可以打开对应的URL。
}
</script>
</head>
<body>
<button onclick="javascript:clickButton(this);return false;">Close</button>
<button onclick="javascript:JPushWeb.startMainActivity('test - startMainActivity');return false;">StartMainActivity</button>
<button onclick="javascript:JPushWeb.triggerNativeAction('test - triggerNativeAction');Javascript:JPushWeb.close();">triggerNativeAction and Close current webwiew</button>
<button onclick="javascript:JPushWeb.startActivityByName('com.example.jpushdemo.TestActivity','test - startActivityByName');">startActivityByName</button>
<button onclick="javascript:openUrl();">open a url</button>
</body>
</html>

View File

@@ -1,13 +1,21 @@
#Android安装
#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. 修改 AndroidManifest.xml 在 manifest 节点下添加以下权限
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"/>

372
doc/Common_detail_api.md Normal file
View File

@@ -0,0 +1,372 @@
# 通用 API 说明
- [停止与恢复推送服务](#停止与恢复推送服务)
- [获取 RegistrationID](#获取-registrationid)
- [设置别名与标签](#设置别名与标签)
- [获取点击通知内容](#获取点击通知内容)
- [获取通知内容](#获取通知内容)
- [获取自定义消息推送内容](#获取自定义消息推送内容)
## 停止与恢复推送服务
### API - init
调用此 API用来开启 JPush SDK 提供的推送服务。
开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务。当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
本功能是一个完全本地的状态操作,也就是说:停止推送服务的状态不会保存到服务器上。
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
#### 接口定义
window.plugins.jPushPlugin.init()
### API - stopPush
+ Android 平台:
+ 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
+ 调用了本 API 后JPush 推送服务完全被停止,具体表现为:
+ JPush Service 不在后台运行。
+ 收不到推送消息。
+ 不能通过 JPushInterface.init 恢复,需要调用 resumePush 恢复。
+ 极光推送所有的其他 API 调用都无效。
+ iOS 平台:
+ 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。
+ 推荐:设置一个 UI 界面, 提醒用户在 设置-通知 中关闭推送服务。
#### 接口定义
window.plugins.jPushPlugin.stopPush()
### API - resumePush
恢复推送服务。调用了此 API 后:
+ Android 平台:
+ 极光推送完全恢复正常工作。
+ iOS 平台:
+ 重新去APNS注册。
#### 接口定义
window.plugins.jPushPlugin.resumePush()
### API - isPushStopped
+ Android 平台:
+ 用来检查 Push Service 是否已经被停止。
+ iOS 平台:
+ 平台检查推送服务是否注册。
#### 接口定义
window.plugins.jPushPlugin.isPushStopped(callback)
#### 参数说明
+ callback: 回调函数,用来通知 JPush 的推送服务是否开启。
#### 代码示例
window.plugins.jPushPlugin.resumePush(callback)
var onCallback = function(data) {
if(data > 0) {
// 开启
} else {
// 关闭
}
}
## 获取 RegistrationID
### API - getRegistrationID
RegistrationID 定义:
集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时JPush 服务器会给客户端返回一个唯一的该设备的标识 - RegistrationID。
JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
应用程序可以把此 RegistrationID 保存以自己的应用服务器上,然后就可以根据 RegistrationID 来向设备推送消息或者通知。
#### 接口定义
JPushPlugin.prototype.getRegistrationID(callback)
#### 返回值
调用此 API 来取得应用程序对应的 RegistrationID。 只有当应用程序成功注册到 JPush 的服务器时才返回对应的值,否则返回空字符串。
#### 代码示例
window.plugins.jPushPlugin.getRegistrationID(onGetRegistradionID);
var onGetRegistradionID = function(data) {
try {
console.log("JPushPlugin:registrationID is " + data);
} catch(exception) {
console.log(exception);
}
}
## 设置别名与标签
### API - setTagsWithAlias, setTags, setAlias
提供几个相关 API 用来设置别名alias与标签tags
这几个 API 可以在 App 里任何地方调用。
**别名 Alias**:
为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
每个用户只能指定一个别名。
同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端 API 会同时给这多个用户发送消息。
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端 API 发通知到客户端提醒用户。
**标签 Tag**:
为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push 消息。
可为每个用户打多个标签。
不同应用程序、不同的用户,可以打同样的标签。
举例: game, old_page, women。
#### 接口定义
JPushPlugin.prototype.setTagsWithAlias(tags, alias)
JPushPlugin.prototype.setTags(tags)
JPushPlugin.prototype.setAlias(alias)
#### 参数说明
* tags:
* 参数类型为数组。
* nil 此次调用不设置此值。
* 空集合表示取消之前的设置。
* 每次调用至少设置一个 tag覆盖之前的设置不是新增。
* 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
* 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag但总长度不得超过1K字节判断长度需采用 UTF-8 编码)。
* 单个设备最多支持设置 100 个 tagApp 全局 tag 数量无限制。
* alias:
* 参数类型为字符串。
* nil 此次调用不设置此值。
* 空字符串 "")表示取消之前的设置。
* 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
* 限制alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
#### 返回值说明
函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果:
document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false);
var onTagsWithAlias = function(event) {
try {
console.log("onTagsWithAlias");
var result = "result code:" + event.resultCode + " ";
result += "tags:" + event.tags + " ";
result += "alias:" + event.alias + " ";
$("#tagAliasResult").html(result);
} catch(exception) {
console.log(exception);
}
}
#### 错误码定义
|Code|描述 |详细解释 |
|----|:----------------------------------------|:--------|
|6001|无效的设置tag / alias 不应参数都为 null。 | |
|6002|设置超时。 |建议重试。|
|6003|alias 字符串不合法。 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6004|alias超长。 |最多 40个字节中文 UTF-8 是 3 个字节。|
|6005|某一个 tag 字符串不合法。 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6006|某一个 tag 超长。 |一个 tag 最多 40个字节中文 UTF-8 是 3 个字节。|
|6007|tags 数量超出限制,最多 100 个。 |这是一台设备的限制,一个应用全局的标签数量无限制。|
|6008|tag / alias 超出总长度限制。 |总长度最多 1K 字节。|
|6011|10s内设置 tag 或 alias 大于 3 次。 |短时间内操作过于频繁。|
## 获取点击通知内容
### event - jpush.openNotification
点击通知进入应用程序时会出发改事件。
#### 代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.openNotification", onOpenNotification, false);
- onOpenNotification 需要这样写:
var alertContent;
if(device.platform == "Android") {
alertContent = window.plugins.jPushPlugin.openNotification.alert;
} else {
alertContent = event.aps.alert;
}
alert("open Notificaiton:" + alertContent);
ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.openNotification直接访问即可字段示例根据实际推送情况可能略有差别请注意。
+ Android:
{
"title": "title",
"alert":"ding",
"extras":{
"yourKey": "yourValue",
"cn.jpush.android.MSG_ID": "1691785879",
"app": "com.thi.pushtest",
"cn.jpush.android.ALERT": "ding",
"cn.jpush.android.EXTRA": {},
"cn.jpush.android.PUSH_ID": "1691785879",
"cn.jpush.android.NOTIFICATION_ID": 1691785879,
"cn.jpush.android.NOTIFICATION_TYPE": "0"
}
}
+ iOS:
{
"aps":{
"badge": 1,
"sound": "default",
"alert": "今天去哪儿"
},
"key1": "value1",
"key2": "value2",
"_j_msgid": 154604475
}
## 获取通知内容
### event - jpush.receiveNotification
收到通知时会触发该事件。
#### 代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false);
- onReceiveNotification 需要这样写:
var alertContent;
if(device.platform == "Android") {
alertContent = window.plugins.jPushPlugin.receiveNotification.alert;
} else {
alertContent = event.aps.alert;
}
alert("open Notificaiton:" + alertContent);
ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveNotification直接访问即可字段示例根据实际推送情况可能略有差别请注意。
+ Android:
{
"title": "title",
"alert":"ding",
"extras":{
"yourKey": "yourValue",
"cn.jpush.android.MSG_ID":"1691785879",
"app":"com.thi.pushtest",
"cn.jpush.android.ALERT":"ding",
"cn.jpush.android.EXTRA":{},
"cn.jpush.android.PUSH_ID":"1691785879",
"cn.jpush.android.NOTIFICATION_ID":1691785879,
"cn.jpush.android.NOTIFICATION_TYPE":"0"
}
}
+ iOS:
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
## 获取自定义消息推送内容
### event - jpush.receiveMessage
收到自定义消息时触发这个事件,推荐使用事件的方式传递。
但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
#### 代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
- onReceiveMessage 需要这样写:
var onReceiveMessage = function(event) {
try{
var message
if(device.platform == "Android") {
message = window.plugins.jPushPlugin.receiveMessage.message;
} else {
message = event.content;
}
$("#messageResult").html(message);
} catch(exception) {
console.log("JPushPlugin:onReceiveMessage-->" + exception);
}
}
ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveMessage
直接访问即可,字段示例,根据实际推送情况,可能略有差别,请注意。
+ Android:
{
"message":"今天去哪儿",
"extras"{
"yourKey": "yourValue",
"cn.jpush.android.MSG_ID":"154378013",
"cn.jpush.android.CONTENT_TYPE":"",
"cn.jpush.android.EXTRA":{"key":"不添没有"}
}
}
+ iOS
{
"content":"今天去哪儿",
"extras":{"key":"不填写没有"}
}

571
doc/iOS_API.md Normal file
View File

@@ -0,0 +1,571 @@
# iOS API
- [开始与停止推送服务](#开始与停止推送服务)
- [获取 RegistrationID](#获取-registrationid)
- [别名与标签](#别名与标签)
- [获取 APNS 推送内容](#获取-apns-推送内容)
- [点击推送通知](#点击推送通知)
- [前台收到推送](#前台收到推送)
- [后台收到推送](#后台收到推送)
- [获取自定义消息内容](#获取自定义消息内容)
- [设置Badge](#设置badge)
- [本地通知](#本地通知)
- [页面的统计](#页面的统计)
- [日志等级设置](#日志等级设置)
- [地理位置上报](#地理位置上报)
- [设备平台判断](#设备平台判断)
## 开始与停止推送服务
### API - init
调用此 API,用来开启 JPush SDK 提供的推送服务。
开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
```
本功能是一个完全本地的状态操作。也就是说:停止推送服务的状态不会保存到服务器上。
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
```
#### 接口定义
window.plugins.jPushPlugin.init()
### API - stopPush
- 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化。
- 推荐:设置一个 UI 界面,提醒用户在 设置-通知 中关闭推送服务。
#### 接口定义
window.plugins.jPushPlugin.stopPush()
### API - resumePush
恢复推送服务。调用了此 API 后iOS平台重新去APNS注册。
#### 接口定义
window.plugins.jPushPlugin.resumePush()
### API - isPushStopped
iOS平台检查推送服务是否注册。
#### 接口定义
window.plugins.jPushPlugin.isPushStopped(callback)
#### 参数说明
- callback 回调函数,用来通知 JPush 的推送服务是否开启。
#### 代码示例
window.plugins.jPushPlugin.resumePush(callback)
var onCallback = function(data) {
if(data > 0) {
// 开启
} else {
// 关闭
}
}
## 获取 RegistrationID
### API - getRegistrationID
RegistrationID 定义:
集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时JPush 服务器会给客户端返回一个唯一的该设备的标识 - RegistrationID。
JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
应用程序可以把此 RegistrationID 保存以自己的应用服务器上,然后就可以根据 RegistrationID 来向设备推送消息或者通知。
#### 接口定义
JPushPlugin.prototype.getRegistrationID(callback)
#### 返回值
调用此 API 来取得应用程序对应的 RegistrationID。只有当应用程序成功注册到 JPush 的服务器时才返回对应的值,否则返回空字符串。
#### 调用示例
window.plugins.jPushPlugin.getRegistrationID(onGetRegistradionID);
var onGetRegistradionID = function(data) {
try {
console.log("JPushPlugin:registrationID is " + data);
} catch(exception) {
console.log(exception);
}
}
## 别名与标签
### API - setTagsWithAlias, setTags, setAlias
提供几个相关 API 用来设置别名alias与标签tags
这几个 API 可以在 App 里任何地方调用。
**别名 Alias**
为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
每个用户只能指定一个别名。
同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端 API 会同时给这多个用户发送消息。
举例:在一个用户要登录的游戏中,可能设置别名为 userid。游戏运营时发现该用户 3 天没有玩游戏了,则根据 userid 调用服务器端 API 发通知到客户端提醒用户。
**标签 Tag**
为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push 消息。
可为每个用户打多个标签。
不同应用程序、不同的用户,可以打同样的标签。
举例: game, old_page, women。
#### 接口定义
JPushPlugin.prototype.setTagsWithAlias(tags, alias)
JPushPlugin.prototype.setTags(tags)
JPushPlugin.prototype.setAlias(alias)
#### 参数说明
* tags:
* 参数类型为数组。
* nil 此次调用不设置此值。
* 空集合表示取消之前的设置。
* 每次调用至少设置一个 tag覆盖之前的设置不是新增。
* 有效的标签组成:字母(区分大小写)、数字、下划线、汉字。
* 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag但总长度不得超过1K字节判断长度需采用UTF-8编码
* 单个设备最多支持设置 100 个 tagApp 全局 tag 数量无限制。
* alias:
* 参数类型为字符串。
* nil 此次调用不设置此值。
* 空字符串 "")表示取消之前的设置。
* 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
* 限制alias 命名长度限制为 40 字节(判断长度需采用 UTF-8 编码)。
#### 返回值说明
函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果。
document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false);
var onTagsWithAlias = function(event) {
try {
console.log("onTagsWithAlias");
var result = "result code:"+event.resultCode + " ";
result += "tags:" + event.tags + " ";
result += "alias:" + event.alias + " ";
$("#tagAliasResult").html(result);
} catch(exception) {
console.log(exception)
}
}
#### 错误码定义
|Code|描述 |详细解释 |
|----|:----------------------------------------|:--------|
|6001|无效的设置tag/alias 不应参数都为 null | |
|6002|设置超时 |建议重试。|
|6003|alias 字符串不合法 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6004|alias超长 |最多 40个字节 中文 UTF-8 是 3 个字节。|
|6005|某一个 tag 字符串不合法 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6006|某一个 tag 超长 |一个 tag 最多 40个字节 中文 UTF-8 是 3 个字节。|
|6007|tags 数量超出限制(最多 100 个) |这是一台设备的限制。一个应用全局的标签数量无限制。|
|6008|tag/alias 超出总长度限制 |总长度最多 1K 字节。|
|6011|10s内设置tag或alias大于3次 |短时间内操作过于频繁。|
## 获取 APNS 推送内容
### 点击推送通知
#### event - jpush.openNotification
点击通知启动或唤醒应用程序时会出发该事件
#### 代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.openNotification", onOpenNotification, false);
- onOpenNotification 需要这样写:
var onOpenNotification = function(event) {
var alertContent;
alertContent = event.aps.alert;
alert("open Notificaiton:" + alertContent);
}
- event 举例:
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
### 前台收到推送
#### event - jpush.receiveNotification
应用程序处于前台时收到推送会触发该事件
#### 代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false);
- onReceiveNotification 需要这样写:
var onReceiveNotification = function(event) {
var alertContent;
alertContent = event.aps.alert;
alert("open Notificaiton:" + alertContent);
}
- event 举例
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
### 后台收到推送
#### event - jpush.backgroundNotification
应用程序处于后台时收到推送会触发该事件,可以在后台执行一段代码。具体配置参考 [iOS 7 Background Remote Notification](http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification)
#### 代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.backgroundNotification", onBackgroundNotification, false);
- onBackgroundNotification 需要这样写:
var onBackgroundNotification = function(event) {
var alertContent;
alertContent = event.aps.alert;
alert("open Notificaiton:" + alertContent);
}
+ event 举例
{
"aps":{
"badge":1,
"sound":"default",
"alert":"今天去哪儿"
},
"key1":"value1",
"key2":"value2",
"_j_msgid":154604475
}
#### API - receiveMessageIniOSCallback
用于 iOS 收到应用内消息的回调函数(请注意和通知的区别),该函数不需要主动调用
不推荐使用回调函数
##### 接口定义
JPushPlugin.prototype.receiveMessageIniOSCallback(data)
##### 参数说明
- data: 是一个 js 字符串使用如下代码解析js 具体 key 根据应用内消息来确定:
var bToObj = JSON.parse(data);
## 获取自定义消息内容
### event - jpush.receiveMessage
收到应用内消息时触发这个事件, 推荐使用事件的方式传递,但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码。
#### 代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
- onReceiveMessage 需要这样写:
var onReceiveMessage = function(event) {
try{
var message;
message = event.content;
$("#messageResult").html(message);
}catch(exception) {
console.log("JPushPlugin:onReceiveMessage-->" + exception);
}
}
- event 举例:
{
"content":"今天去哪儿",
"extras":
{
"key":"不填写没有"
}
}
## 设置Badge
### API - setBadge, resetBadge
JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,
由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
(本接口不会直接改变应用本地的角标值. 要修改本地 badege 值,使用 setApplicationIconBadgeNumber
实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。
#### 接口定义
window.plugins.jPushPlugin.prototype.setBadge(value)
window.plugins.jPushPlugin.prototype.reSetBadge()
resetBadge相当于setBadge(0)。
#### 参数说明
value 取值范围:[0,99999]。
#### 返回值
无,控制台会有 log 打印设置结果。
#### 代码示例
window.plugins.jPushPlugin.setBadge(5);
window.plugins.jPushPlugin.reSetBadge();
### API - setApplicationIconBadgeNumber
本接口直接改变应用本地的角标值,设置 iOS 的角标,当设置 badge 0 时为清除角标。
#### 接口定义
window.plugins.jPushPlugin.prototype.setApplicationIconBadgeNumber(badge)
#### 参数说明
- badge: 整形,例如 012当 badge 为 0 时,角标被清除)。
#### 代码示例
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0);
### API - getApplicationIconBadgeNumber
获取 iOS 的角标值。
#### 接口定义
window.plugins.jPushPlugin.prototype.getApplicationIconBadgeNumber(callback)
#### 参数说明
- callback: 回调函数。
#### 代码示例
window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data) {
console.log(data);
});
## 本地通知
### API - addLocalNotificationForIOS
用于注册本地通知最多支持64个。
#### 接口定义
window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
#### 参数说明
- delayTime: 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可。
- content: 本地推送需要显示的内容。
- badge: 角标的数字。如果不需要改变角标传-1。数值类型或纯数字的字符型均可。
- notificationID: 本地推送标识符,字符串。
- extras: 自定义参数,可以用来标识推送和增加附加信息。字典类型。
#### 代码示例
window.plugins.jPushPlugin.addLocalNotificationForIOS(6*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
### API - deleteLocalNotificationWithIdentifierKeyInIOS
删除本地推送定义。
#### 接口定义
window.plugins.jPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey)
#### 参数说明
- identifierKey: 本地推送标识符。
#### 代码示例
window.plugins.jPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS("identifier");
### API - clearAllLocalNotifications
清除所有本地推送对象。
#### 接口定义
window.plugins.jPushPlugin.prototype.clearAllLocalNotifications()
#### 代码示例
window.plugins.jPushPlugin.clearAllLocalNotifications();
## 页面的统计
### API - startLogPageView, stopLogPageView, beginLogPageView
用于“用户指定页面使用时长”的统计,并上报到服务器,在 Portal 上展示给开发者。
页面统计集成正确才能够获取正确的页面访问路径、访问深度PV的数据。
#### 接口定义
window.plugins.jPushPlugin.prototype.startLogPageView(pageName)
window.plugins.jPushPlugin.prototype.stopLogPageView(pageName)
window.plugins.jPushPlugin.prototype.beginLogPageView(pageName, duration)
#### 参数说明
- pageName: 需要统计页面自定义名称
- duration: 自定义的页面时间
#### 调用说明
应在所有的需要统计得页面得 viewWillAppear 和 viewWillDisappear 加入 startLogPageView 和 stopLogPageView 来统计当前页面的停留时间。
或者直接使用 beginLogPageView 来自定义加入页面和时间信息。
#### 代码示例
window.plugins.jPushPlugin.beginLogPageView("newPage", 5);
window.plugins.jPushPlugin.startLogPageView("onePage");
window.plugins.jPushPlugin.stopLogPageView("onePage");
## 日志等级设置
### API - setDebugModeFromIos
用于开启 Debug 模式,显示更多的日志信息。
建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 setLogOFF 是相反的一对。
#### 接口定义
window.plugins.jPushPlugin.prototype.setDebugModeFromIos()
#### 代码示例
window.plugins.jPushPlugin.setDebugModeFromIos();
### API - setLogOFF
用来关闭日志信息(除了必要的错误信息)。
不需要任何调试信息的时候,调用此 API发布时建议调用此 API用来屏蔽日志信息节省性能消耗)。
#### 接口定义
window.plugins.jPushPlugin.prototype.setLogOFF()
#### 代码示例
window.plugins.jPushPlugin.setLogOFF();
### API - setCrashLogON
用于统计用户应用崩溃日志。
如果需要统计 Log 信息,调用该接口。当你需要自己收集错误信息时,切记不要调用该接口。
#### 接口定义
window.plugins.jPushPlugin.prototype.setCrashLogON()
#### 代码示例
window.plugins.jPushPlugin.setCrashLogON();
## 地理位置上报
### API - setLocation
用于统计用户地理信息。
#### 接口定义
window.plugins.jPushPlugin.prototype.setLocation(latitude, longitude)
#### 参数说明
- latitude: 地理位置纬度,数值类型或纯数字的字符型均可。
- longitude: 地理位置精度,数值类型或纯数字的字符型均可。
#### 代码示例
window.plugins.jPushPlugin.setLocation(39.26,115.25);
## 设备平台判断
### API - isPlatformIOS
用于区分 iOS, Android 平台,以便不同设置。
#### 接口定义
window.plugins.jPushPlugin.prototype.isPlatformIOS()
#### 代码示例
if(window.plugins.jPushPlugin.isPlatformIOS()) {
// iOS
} else {
// Android
}

35
doc/iOS_install.md Normal file
View File

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

View File

@@ -1,192 +0,0 @@
## Android API简介
### 获取集成日志
#### API - setDebugMode
用于开启调试模式,可以查看集成 JPush 过程中的 Log如果集成失败可方便定位问题所在
##### 接口定义
window.plugins.jPushPlugin.setDebugMode(mode)
##### 参数说明
- mode的值
- true 显示集成日志
- false 不显示集成日志
### 接收消息和点击通知事件
#### API - receiveMessageInAndroidCallback
用于 Android 收到应用内消息的回调函数(请注意和通知的区别),该函数不需要主动调用
##### 接口定义
window.plugins.jPushPlugin.receiveMessageInAndroidCallback = function(data)
##### 参数说明
- data 接收到的 js 字符串,包含的 key:value 请进入该函数体查看
##### 代码示例
#### API - openNotificationInAndroidCallback
当点击 Android 手机的通知栏进入应用程序时,会调用这个函数,这个函数不需要主动调用,是作为回调函数来用的
##### 接口定义
window.plugins.jPushPlugin.openNotificationInAndroidCallback = function(data)
##### 参数说明
- data js字符串
##### 代码示例
### 统计分析 API
#### 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。
####调用说明
应在所有的 Activity 的 onResume / onPause 方法里调用。
####代码示例
@Override
protected void onResume() {
super.onResume();
JPushInterface.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
JPushInterface.onPause(this);
}
#### API - setStatisticsOpen(boolean)
用于在 js 中控制是否打开应用的统计分析功能,但如果已经添加了上面的 onResume / onPause 方法,
就不能再通过这个方法来控制统计分析功能了。
#### 接口定义
window.plugins.jPushPlugin.setStatisticsOpen(boolean)
#### 参数说明
- boolean
-true : 打开统计分析功能
-false: 关闭统计分析功能
#### API - reportNotificationOpened
用于上报用户的通知栏被打开,或者用于上报用户自定义消息被展示等客户端需要统计的事件。
##### 接口定义
window.plugins.jPushPlugin.reportNotificationOpened(msgID)
##### 参数说明
- msgID
-收到的通知或者自定义消息的 id
### 清除通知 API
#### API - clearAllNotification
推送通知到客户端时,由 JPush SDK 展现通知到通知栏上。
此 API 提供清除通知的功能,包括:清除所有 JPush 展现的通知(不包括非 JPush SDK 展现的)
##### 接口定义
window.plugins.jPushPlugin.clearAllNotification = function()
### 设置允许推送时间 API
### 设置通知静默时间 API
### 通知栏样式定制 API
#### API - setBasicPushNotificationBuilder, setCustomPushNotificationBuilder
当用户需要定制默认的通知栏样式时,则可调用此方法。
极光 Push SDK 提供了 2 个用于定制通知栏样式的构建类:
- setBasicPushNotificationBuilder
- Basic 用于定制 Android Notification 里的 defaults / flags / icon 等基础样式(行为)
- setCustomPushNotificationBuilder
- 继承 Basic 进一步让开发者定制 Notification Layout
如果不调用此方法定制,则极光 Push SDK 默认的通知栏样式是Android 标准的通知栏提示。
##### 接口定义
window.plugins.jPushPlugin.setBasicPushNotificationBuilder = function()
window.plugins.jPushPlugin.setCustomPushNotificationBuilder = function()
### 设置保留最近通知条数 API
#### API - setLatestNotificationNum
通过极光推送,推送了很多通知到客户端时,如果用户不去处理,就会有很多保留在那里。
新版本 SDK (v1.3.0) 增加此功能,限制保留的通知条数。默认为保留最近 5 条通知。
开发者可通过调用此 API 来定义为不同的数量。
##### 接口定义
window.plugins.jPushPlugin.setLatestNotificationNum(num)
##### 参数说明
- num 保存的条数
### 本地通知 API
#### API - addLocalNotification,removeLocalNotification,clearLocalNotifications
本地通知 API 不依赖于网络,无网条件下依旧可以触发
本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制
本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响
三个接口的功能分别为:添加一个本地通知,删除一个本地通知,删除所有的本地通知
#####接口定义
window.plugins.jPushPlugin.addLocalNotification = function(builderId,
content, title, notificaitonID, broadcastTime, extras)
window.plugins.jPushPlugin.removeLocalNotification = function(notificationID)
window.plugins.jPushPlugin.clearLocalNotifications = function()
##### 参数说明
- builderId 设置本地通知样式
- content 设置本地通知的 content
- title 设置本地通知的 title
- notificaitonID 设置本地通知的 ID
- broadcastTime 设置本地通知触发时间,为距离当前时间的数值,单位是毫秒
- extras 设置额外的数据信息 extras 为 json 字符串

View File

@@ -1,374 +0,0 @@
#通用 API 说明
## 停止与恢复推送服务 API
### API - init
调用此 API,用来开启
JPush SDK 提供的推送服务。
开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务。当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
```
本功能是一个完全本地的状态操作。也就是说:停止推送服务的状态不会保存到服务器上。
如果停止推送服务后,开发者 App 被重新安装,或者被清除数据,
JPush SDK 会恢复正常的默认行为。(因为保存在本地的状态数据被清除掉了)。
本功能其行为类似于网络中断的效果,即:推送服务停止期间推送的消息,
恢复推送服务后,如果推送的消息还在保留的时长范围内,则客户端是会收到离线消息。
```
#### 接口定义
window.plugins.jPushPlugin.init()
### API - stopPush
+ 在 Android 平台
+ 开发者 App 可以通过调用停止推送服务 API 来停止极光推送服务,当又需要使用极光推送服务时,则必须要调用恢复推送服务 API。
+ 调用了本 API 后JPush 推送服务完全被停止。具体表现为:
+ JPush Service 不在后台运行
+ 收不到推送消息
+ 不能通过 JPushInterface.init 恢复,需要调用 resumePush 恢复
+ 极光推送所有的其他 API 调用都无效
+ iOS 平台
+ 不推荐调用,因为这个 API 只是让你的 DeviceToken 失效,在 设置-通知 中您的应用程序没有任何变化
+ 推荐:设置一个 UI 界面, 提醒用户在 设置-通知 中关闭推送服务
### 接口定义
window.plugins.jPushPlugin.stopPush()
#### API - resumePush
恢复推送服务。调用了此 API 后
+ 在 Android 平台
+ 极光推送完全恢复正常工作,
+ iOS平台
+ 重新去APNS注册
##### 接口定义
window.plugins.jPushPlugin.resumePush()
#### API - isPushStopped
+ 在 Android 平台
+ 用来检查 Push Service 是否已经被停止
+ iOS平台
+ 平台检查推送服务是否注册
##### 接口定义
window.plugins.jPushPlugin.isPushStopped(callback)
##### 参数说明
+ callback 回调函数,用来通知 JPush 的推送服务是否开启
####代码示例
window.plugins.jPushPlugin.resumePush(callback)
var onCallback = function(data) {
if(data > 0){
// 开启
} else {
// 关闭
}
}
##获取 RegistrationID API
### API - getRegistrationID
RegistrationID 定义
集成了 JPush SDK 的应用程序在第一次成功注册到 JPush 服务器时JPush 服务器会给客户端返回一个唯一的该设备的标识 - RegistrationID。
JPush SDK 会以广播的形式发送 RegistrationID 到应用程序。
应用程序可以把此 RegistrationID 保存以自己的应用服务器上,然后就可以根据 RegistrationID 来向设备推送消息或者通知。
#### 接口定义
JPushPlugin.prototype.getRegistrationID = function(callback)
##### 参数说明
#### 返回值
调用此 API 来取得应用程序对应的 RegistrationID。 只有当应用程序成功注册到 JPush 的服务器时才返回对应的值,否则返回空字符串。
#### 调用示例
window.plugins.jPushPlugin.getRegistrationID(onGetRegistradionID);
var onGetRegistradionID = function(data) {
try {
console.log("JPushPlugin:registrationID is " + data)
} catch(exception) {
console.log(exception);
}
}
##别名与标签 API
### 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 = function(tags, alias)
JPushPlugin.prototype.setTags = function(tags)
JPushPlugin.prototype.setAlias = function(alias)
#### 参数说明
* tags
* 参数类型为数组
* nil 此次调用不设置此值
* 空集合表示取消之前的设置
* 每次调用至少设置一个 tag覆盖之前的设置不是新增
* 有效的标签组成:字母(区分大小写)、数字、下划线、汉字
* 限制:每个 tag 命名长度限制为 40 字节,最多支持设置 100 个 tag但总长度不得超过1K字节。判断长度需采用UTF-8编码
* 单个设备最多支持设置 100 个 tagApp 全局 tag 数量无限制。
* alias
* 参数类型为字符串
* nil 此次调用不设置此值
* 空字符串 "")表示取消之前的设置
* 有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
* 限制alias 命名长度限制为 40 字节。(判断长度需采用 UTF-8 编码)
#### 返回值说明
函数本身无返回值,但需要注册 `jpush.setTagsWithAlias` 事件来监听设置结果
document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false);
var onTagsWithAlias = function(event) {
try {
console.log("onTagsWithAlias");
var result = "result code:"+event.resultCode + " ";
result += "tags:" + event.tags + " ";
result += "alias:" + event.alias + " ";
$("#tagAliasResult").html(result);
} catch(exception) {
console.log(exception)
}
}
####错误码定义
|Code|描述 |详细解释 |
|----|:----------------------------------------|:--------|
|6001|无效的设置tag/alias 不应参数都为 null | |
|6002|设置超时 |建议重试|
|6003|alias 字符串不合法 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6004|alias超长。 |最多 40个字节 中文 UTF-8 是 3 个字节|
|6005|某一个 tag 字符串不合法 |有效的别名、标签组成:字母(区分大小写)、数字、下划线、汉字。|
|6006|某一个 tag 超长 |一个 tag 最多 40个字节 中文 UTF-8 是 3 个字节|
|6007|tags 数量超出限制。最多 100个 |这是一台设备的限制。一个应用全局的标签数量无限制。|
|6008|tag/alias 超出总长度限制 |总长度最多 1K 字节|
|6011|10s内设置tag或alias大于3次 |短时间内操作过于频繁|
### 获取点击通知内容
#### event - jpush.openNotification
点击通知进入应用程序时会出发改事件
#####代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.openNotification", onOpenNotification, false);
- onOpenNotification需要这样写
var alertContent;
if(device.platform == "Android"){
alertContent = window.plugins.jPushPlugin.openNotification.alert;
}else{
alertContent = event.aps.alert;
}
alert("open Notificaiton:" + alertContent);
ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.openNotification直接访问即可字段示例根据实际推送情况可能略有差别请注意
+ Android
{"alert":"ding",
"extras":{
"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
}
### 获取通知内容
#### event - jpush.receiveNotification
点击通知进入应用程序时会触发该事件
#####代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false);
- onReceiveNotification 需要这样写:
var alertContent;
if(device.platform == "Android"){
alertContent = window.plugins.jPushPlugin.receiveNotification.alert;
}else{
alertContent = event.aps.alert;
}
alert("open Notificaiton:" + alertContent);
ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveNotification直接访问即可字段示例根据实际推送情况可能略有差别请注意
+ Android
{"alert":"ding",
"extras":{
"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
}
### 获取自定义消息推送内容
####event - jpush.receiveMessage
收到应用内消息时触发这个事件
`推荐使用事件的方式传递,但同时保留了 receiveMessageIniOSCallback 的回调函数,兼容以前的代码`
#####代码示例
- 在你需要接收通知的的 js 文件中加入:
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
- onReceiveMessage 需要这样写:
var onReceiveMessage = function(event) {
try{
var message
if(device.platform == "Android") {
message = window.plugins.jPushPlugin.receiveMessage.message;
} else {
message = event.content;
}
$("#messageResult").html(message);
}
catch(exception) {
console.log("JPushPlugin:onReceiveMessage-->" + exception);
}
}
ps点击通知后传递的 json object 保存在 window.plugins.jPushPlugin.receiveMessage直接访问即可字段示例根据实际推送情况可能略有差别请注意
+ Android
{"message":"今天去哪儿",
"extras"{
"cn.jpush.android.MSG_ID":"154378013",
"cn.jpush.android.CONTENT_TYPE":"",
"cn.jpush.android.EXTRA":{"key":"不添没有"}
}
}
+ iOS
{
"content":"今天去哪儿",
"extras":
{
"key":"不填写没有"
}
}

View File

@@ -1,238 +0,0 @@
## iOS API简介
### 获取 APNs通知 推送内容
#### API - receiveMessageIniOSCallback
用于 iOS 收到应用内消息的回调函数(请注意和通知的区别),该函数不需要主动调用
不推荐使用回调函数
##### 接口定义
JPushPlugin.prototype.receiveMessageIniOSCallback = function(data)
#####参数说明
- data 是一个 js 字符串使用如下代码解析js 具体 key 根据应用内消息来确定
var bToObj = JSON.parse(data)
#####返回值
##### 代码示例
### 页面的统计
#### API - startLogPageView, stopLogPageView, beginLogPageView
本 API 用于“用户指定页面使用时长”的统计,并上报到服务器,在 Portal 上展示给开发者。页面统计集成正确才能够获取正确的页面访问路径、访问深度PV的数据。
##### 接口定义
window.plugins.jPushPlugin.prototype.startLogPageView = function(pageName)
window.plugins.jPushPlugin.prototype.stopLogPageView = function(pageName)
window.plugins.jPushPlugin.prototype.beginLogPageView = function(pageName, duration)
#####参数说明
pageName 需要统计页面自定义名称
duration 自定义的页面时间
#####调用说明
应在所有的需要统计得页面得 viewWillAppear 和 viewWillDisappear 加入 startLogPageView 和 stopLogPageView 来统计当前页面的停留时间。
或者直接使用 beginLogPageView 来自定义加入页面和时间信息。
#####返回值说明
#####代码示例
window.plugins.jPushPlugin.beginLogPageView("newPage", 5);
window.plugins.jPushPlugin.startLogPageView("onePage");
window.plugins.jPushPlugin.stopLogPageView("onePage");
### 设置Badge
#### API - setBadge, resetBadge
JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。
(本接口不会直接改变应用本地的角标值. 要修改本地 badege 值,使用 setApplicationIconBadgeNumber
实际应用中,开发者可以直接对 badge 值做增减操作,无需自己维护用户与 badge 值之间的对应关系。
##### 接口定义
window.plugins.jPushPlugin.prototype.setBadge(value)
window.plugins.jPushPlugin.prototype.reSetBadge()
`resetBadge相当于setBadge(0)`
##### 参数说明
value 取值范围:[0,99999]
##### 返回值
无,控制台会有 log 打印设置结果
#####代码示例
window.plugins.jPushPlugin.setBadge(5);
window.plugins.jPushPlugin.reSetBadge();
#### API - setApplicationIconBadgeNumber
本接口直接改变应用本地的角标值.
设置 iOS 的角标,当设置 badge 0 时为清除角标
##### 接口定义
window.plugins.jPushPlugin.prototype.setApplicationIconBadgeNumber(badge)
##### 参数说明
- badge 整形,例如012
- 当 badge 为 0 时,角标被清除
#####代码示例
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0);
#### API - getApplicationIconBadgeNumber
获取 iOS 的角标值
##### 接口定义
window.plugins.jPushPlugin.prototype.getApplicationIconBadgeNumber(callback)
##### 参数说明
- callback 回调函数
#####代码示例
```
window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data){
console.log(data);
});
```
### 本地通知
#### API - addLocalNotificationForIOS
API 用于注册本地通知
最多支持64个
##### 接口定义
window.plugins.jPushPlugin.prototype.addLocalNotificationForIOS(delayTime, content, badge, notificationID, extras)
##### 参数说明
- delayTime 本地推送延迟多长时间后显示,数值类型或纯数字的字符型均可
- content 本地推送需要显示的内容
- badge 角标的数字。如果不需要改变角标传-1。数值类型或纯数字的字符型均可
- notificationID 本地推送标识符,字符串。
- extras 自定义参数,可以用来标识推送和增加附加信息。字典类型。
#####代码示例
window.plugins.jPushPlugin.addLocalNotificationForIOS(6*60*60, "本地推送内容", 1, "notiId", {"key":"value"});
#### API - deleteLocalNotificationWithIdentifierKeyInIOS
API 删除本地推送定义
##### 接口定义
window.plugins.jPushPlugin.prototype.deleteLocalNotificationWithIdentifierKeyInIOS(identifierKey)
##### 参数说明
- identifierKey 本地推送标识符
#####代码示例
window.plugins.jPushPlugin.deleteLocalNotificationWithIdentifierKeyInIOS("identifier");
#### API - clearAllLocalNotifications
API 清除所有本地推送对象
##### 接口定义
window.plugins.jPushPlugin.prototype.clearAllLocalNotifications()
#####代码示例
window.plugins.jPushPlugin.clearAllLocalNotifications();
### 日志等级设置
#### API - setDebugModeFromIos
API 用于开启 Debug 模式,显示更多的日志信息
建议调试时开启这个选项,不调试的时候注释这句代码,这个函数 setLogOFF 是相反的一对
##### 接口定义
window.plugins.jPushPlugin.prototype.setDebugModeFromIos()
#####代码示例
window.plugins.jPushPlugin.setDebugModeFromIos();
#### API - setLogOFF
API 用来关闭日志信息(除了必要的错误信息)
不需要任何调试信息的时候,调用此 API发布时建议调用此 API用来屏蔽日志信息节省性能消耗)
##### 接口定义
window.plugins.jPushPlugin.prototype.setLogOFF()
#####代码示例
window.plugins.jPushPlugin.setLogOFF();
#### API - setCrashLogON
API 用于统计用户应用崩溃日志
如果需要统计 Log 信息,调用该接口。当你需要自己收集错误信息时,切记不要调用该接口。
##### 接口定义
window.plugins.jPushPlugin.prototype.setCrashLogON()
#####代码示例
window.plugins.jPushPlugin.setCrashLogON();
### 地理位置上报
#### API - setLocation
API 用于统计用户地理信息
##### 接口定义
window.plugins.jPushPlugin.prototype.setLocation(latitude,longitude)
##### 参数说明
- latitude 地理位置纬度,数值类型或纯数字的字符型均可
- longitude 地理位置精度,数值类型或纯数字的字符型均可
#####代码示例
window.plugins.jPushPlugin.setLocation(39.26,115.25);
### 设备平台判断
#### API - isPlatformIOS
API 用于区分 iOS, Android 平台,以便不同设置
##### 接口定义
window.plugins.jPushPlugin.prototype.isPlatformIOS()
#####代码示例
if(window.plugins.jPushPlugin.isPlatformIOS()){
// iOS
}else{
// Android
}

View File

@@ -1,62 +0,0 @@
### iOS手工安装
下载 JPush PhoneGap 插件,并解压缩,标记插件目录为:`$JPUSH_PLUGIN_DIR`
1. 用 xcode 打开 iOS 工程 将 `$JPUSH_PLUGIN_DIR`/src/ios/Plugins/ 拖到 project 中
2.`$JPUSH_PLUGIN_DIR`/src/ios/lib/ 拖到 project 中
4. 添加以下框架,打开 xcode点击 project选择(Target -> Build Phases -> Link Binary With Libraries)
CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
5. 在你的工程中创建一个新的 Property List 文件
并将其命名为 PushConfig.plist填入 Portal 为你的应用提供的 APP_KEY 等参数
10. 在 AppDelegate.m 中包含头文件
#import "APService.h"
#import "JPushPlugin.h"
6. 调用代码,监听系统事件,相应地调用 JPush SDK 提供的 API 来实现功能
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
//原内容保持不变
//Required add
[JPushPlugin setLaunchOptions:launchOptions];
return YES;
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
//原内容保持不变
// Required add
[APService registerDeviceToken:deviceToken];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
//原内容保持不变
// Required
[APService handleRemoteNotification:userInfo];
[[NSNotificationCenter defaultCenter] postNotificationName:kJPushPluginReceiveNotification
object:userInfo];
}
7. 修改 phonegap config.xml 文件用来包含 Plugin/ 内的插件
<feature name="JPushPlugin">
<param name="ios-package" value="JPushPlugin" />
<param name="onload" value="true" />
</feature>
8. 复制 `$JPUSH_PLUGIN_DIR`/www/PushNotification.js 到工程的 www 目录下面
9. 在需要使用插件处加入
<script type="text/javascript" src="JPushPlugin.js"></script>

BIN
example/.DS_Store vendored

Binary file not shown.

View File

@@ -3,49 +3,47 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Phonegap Sample App</title>
<link href="css/jquery.mobile-1.1.1.css" rel="stylesheet" type="text/css"/>
<title>JPush Phonegap Simple Demo</title>
<link href="css/jquery.mobile-1.1.1.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.mobile-1.1.1.js"></script>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript">
var onDeviceReady = function () {
var onDeviceReady = function() {
console.log("JPushPlugin:Device ready!");
initiateUI();
};
function getRegistrationID() {
window.plugins.jPushPlugin.getRegistrationID(onGetRegistradionID);
}
var getRegistrationID = function() {
window.plugins.jPushPlugin.getRegistrationID(onGetRegistrationID);
};
var onGetRegistradionID = function (data) {
var onGetRegistrationID = function(data) {
try {
console.log("JPushPlugin:registrationID is " + data);
if (data.length == 0) {
var t1 = window.setTimeout(getRegistrationID, 1000);
}
$("#registrationid").html(data);
}
catch (exception) {
$("#registrationId").html(data);
} catch (exception) {
console.log(exception);
}
};
var onTagsWithAlias = function (event) {
var onTagsWithAlias = function(event) {
try {
console.log("onTagsWithAlias");
var result = "result code:" + event.resultCode + " ";
result += "tags:" + event.tags + " ";
result += "alias:" + event.alias + " ";
$("#tagAliasResult").html(result);
}
catch (exception) {
} catch (exception) {
console.log(exception)
}
};
var onOpenNotification = function (event) {
var onOpenNotification = function(event) {
try {
var alertContent;
if (device.platform == "Android") {
@@ -53,14 +51,13 @@
} else {
alertContent = event.aps.alert;
}
alert("open Notificaiton:" + alertContent);
}
catch (exception) {
alert("open Notification:" + alertContent);
} catch (exception) {
console.log("JPushPlugin:onOpenNotification" + exception);
}
};
var onReceiveNotification = function (event) {
var onReceiveNotification = function(event) {
try {
var alertContent;
if (device.platform == "Android") {
@@ -69,36 +66,29 @@
alertContent = event.aps.alert;
}
$("#notificationResult").html(alertContent);
}
catch (exeption) {
} catch (exception) {
console.log(exception)
}
};
var onReceiveMessage = function (event) {
try {
var onReceiveMessage = function(event) {
try {
var message;
if (device.platform == "Android") {
message = window.plugins.jPushPlugin.receiveMessage.message;
} else {
message = event.content;
}
//var extras = window.plugins.jPushPlugin.extras
$("#messageResult").html(message);
}
catch (exception) {
} catch (exception) {
console.log("JPushPlugin:onReceiveMessage-->" + exception);
}
};
var initiateUI = function () {
var initiateUI = function() {
try {
window.plugins.jPushPlugin.init();
getRegistrationID();
if (device.platform != "Android") {
window.plugins.jPushPlugin.setDebugModeFromIos();
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0);
@@ -106,117 +96,103 @@
window.plugins.jPushPlugin.setDebugMode(true);
window.plugins.jPushPlugin.setStatisticsOpen(true);
}
}
catch (exception) {
} catch (exception) {
console.log(exception);
}
$("#setTagWithAliasButton").click(function (ev) {
// window.plugins.jPushPlugin.getApplicationIconBadgeNumber(function(data){
// console.log(data);
// });
$("#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 dd = [];
var tags = [];
if (tag1 == "" && tag2 == "" && tag3 == "") {
if (tag1 != "") {
tags.push(tag1);
}
else {
if (tag1 != "") {
dd.push(tag1);
}
if (tag2 != "") {
dd.push(tag2);
}
if (tag3 != "") {
dd.push(tag3);
}
if (tag2 != "") {
tags.push(tag2);
}
window.plugins.jPushPlugin.setTagsWithAlias(dd, alias);
}
catch (exception) {
if (tag3 != "") {
tags.push(tag3);
}
window.plugins.jPushPlugin.setTagsWithAlias(tags, alias);
} catch (exception) {
console.log(exception);
}
})
};
document.addEventListener("jpush.setTagsWithAlias", onTagsWithAlias, false);
document.addEventListener("deviceready", onDeviceReady, false);
document.addEventListener("jpush.openNotification", onOpenNotification, false);
document.addEventListener("jpush.receiveNotification", onReceiveNotification, false);
document.addEventListener("jpush.receiveMessage", onReceiveMessage, false);
//jpush.receiveMessage
</script>
</head>
<body>
<div data-role="page" id="page">
<div data-role="content">
<form>
<div class="ui-body ui-body-b">
<div data-role="fieldcontain">
<center><h3>JPushPlugin Example</h3></center>
<span name="alias" id="alias"></span>
<hr/>
<label>RegistrationID: </label>
<label id="registrationid">null</label>
<div data-role="page" id="page">
<div data-role="content">
<form>
<div class="ui-body ui-body-b">
<div data-role="fieldcontain">
<center>
<h3>JPushPlugin Example</h3>
</center>
<span name="alias" id="alias"></span>
<hr/>
<label>RegistrationID: </label>
<label id="registrationId">null</label>
</div>
<div data-role="fieldcontain">
<label>Tags: </label>
<table>
<tr>
<td>
<input type="text" id="tagText1" />
</td>
</tr>
<tr>
<td>
<input type="text" id="tagText2" />
</td>
</tr>
<tr>
<td>
<input type="text" id="tagText3" />
</td>
</tr>
</table>
<label>Alias: </label>
<table>
<tr>
<td>
<input type="text" id="aliasText" />
</td>
</tr>
</table>
</div>
<div data-role="fieldcontain">
<input type="button" id="setTagWithAliasButton"
value="Add tag and alias" />
</div>
<div data-role="fieldcontain">
<label id="tagAliasPrompt">设置tag/alias结果:</label>
<label id="tagAliasResult">null</label>
</div>
<div data-role="fieldcontain">
<label id="notificationPrompt">接受的通知内容:</label>
<label id="notificationResult">null</label>
</div>
<div data-role="fieldcontain">
<label id="messagePrompt">接受的自定义消息:</label>
<label id="messageResult">null</label>
</div>
</div>
<div data-role="fieldcontain">
<label>Tags: </label>
<table>
<tr>
<td>
<input type="text" id="tagText1"/>
</td>
</tr>
<tr>
<td>
<input type="text" id="tagText2"/>
</td>
</tr>
<tr>
<td>
<input type="text" id="tagText3">
</td>
</tr>
</table>
<label>Alias: </label>
<table>
<tr>
<td>
<input type="text" id="aliasText">
</td>
</tr>
</table>
</div>
<div data-role="fieldcontain">
<input type="button" id="setTagWithAliasButton" value="Add tag and alias"/>
</div>
<div data-role="fieldcontain">
<label id="tagAliasPrompt">设置tag/alias结果 </label>
<label id="tagAliasResult">null</label>
</div>
<div data-role="fieldcontain">
<label id="notificationPrompt">接受的通知内容:</label>
<label id="notificationResult">null</label>
</div>
<div data-role="fieldcontain">
<label id="messagePrompt">接受的自定义消息:</label>
<label id="messageResult">null</label>
</div>
</div>
</form>
</form>
</div>
</div>
</div>
</body>
</html>

View File

@@ -1,6 +1,6 @@
{
"name": "jpush-phonegap-plugin",
"version": "2.1.1",
"version": "2.1.7",
"description": "JPush for cordova plugin",
"cordova": {
"id": "cn.jpush.phonegap.JPushPlugin",

View File

@@ -2,7 +2,7 @@
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
id="cn.jpush.phonegap.JPushPlugin"
version="2.1.0">
version="2.1.7">
<name>JPush Plugin</name>
<description>JPush for cordova plugin</description>
@@ -31,7 +31,7 @@
<source-file src="src/ios/Plugins/JPushPlugin.m"/>
<header-file src="src/ios/lib/JPUSHService.h" />
<source-file src="src/ios/lib/jpush-ios-2.1.0.a" framework="true" />
<source-file src="src/ios/lib/jpush-ios-2.1.6.a" framework="true" />
<header-file src="src/ios/Plugins/AppDelegate+JPush.h"/>
<source-file src="src/ios/Plugins/AppDelegate+JPush.m"/>
<resource-file src="src/ios/PushConfig.plist" />
@@ -43,7 +43,8 @@
<framework src="Foundation.framework" weak="true" />
<framework src="UIKit.framework" weak="true" />
<framework src="Security.framework" weak="true" />
<framework src="libz.dylib" weak="true" />
<framework src="libz.tbd" weak="true" />
<framework src="AdSupport.framework" weak="true" />
<config-file target="*PushConfig.plist" parent="APP_KEY">
<string>$API_KEY</string>
@@ -93,12 +94,21 @@
<category android:name="$PACKAGE_NAME"/>
</intent-filter>
</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 核心功能-->
<service
android:name="cn.jpush.android.service.PushService"
@@ -109,9 +119,9 @@
<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"
@@ -163,16 +173,26 @@
<meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
<meta-data android:name="JPUSH_APPKEY" android:value="$API_KEY"/>
</config-file>
<source-file src="src/android/jpush-android-2.1.0.jar" target-dir="libs"/>
<source-file src="src/android/armeabi/libjpush210.so" target-dir="libs/armeabi"/>
<source-file src="src/android/armeabi-v7a/libjpush210.so" target-dir="libs/armeabi-v7a"/>
<source-file src="src/android/arm64-v8a/libjpush210.so" target-dir="libs/arm64-v8a"/>
<source-file src="src/android/x86/libjpush210.so" target-dir="libs/x86"/>
<source-file src="src/android/x86_64/libjpush210.so" target-dir="libs/x86_64"/>
<source-file src="src/android/jpush-android-2.1.3.jar" target-dir="libs"/>
<source-file src="src/android/armeabi/libjpush213.so" target-dir="libs/armeabi"/>
<source-file src="src/android/armeabi-v7a/libjpush213.so" target-dir="libs/armeabi-v7a"/>
<source-file src="src/android/arm64-v8a/libjpush213.so" target-dir="libs/arm64-v8a"/>
<source-file src="src/android/x86/libjpush213.so" target-dir="libs/x86"/>
<source-file src="src/android/x86_64/libjpush213.so" target-dir="libs/x86_64"/>
<!--<source-file src="src/android/JPushPlugin.java" target-dir="src/cn/jpush/phonegap"/>-->
<source-file src="src/android/MyReceiver.java" target-dir="src/cn/jpush/phonegap"/>
<source-file src="src/android/test_notification_layout.xml" target-dir="res/layout"/>
<source-file src="src/android/jpush_notification_icon.png" target-dir="res/drawable"/>
<!-- Rich Push resources -->
<source-file src="src/android/ic_richpush_actionbar_back.png" target-dir="res/drawable" />
<source-file src="src/android/ic_richpush_actionbar_divider.png" target-dir="res/drawable" />
<source-file src="src/android/richpush_btn_selector.xml" target-dir="res/drawable" />
<source-file src="src/android/jpush_popwin_layout.xml" target-dir="res/layout" />
<source-file src="src/android/jpush_webview_layout.xml" target-dir="res/layout" />
<source-file src="src/android/jpush_style.xml" target-dir="res/values" />
</platform>
</plugin>

View File

@@ -7,9 +7,10 @@ module.exports = function (context) {
projectRoot = context.opts.projectRoot,
ConfigParser = context.requireCordovaModule('cordova-lib/src/configparser/ConfigParser'),
config = new ConfigParser(path.join(context.opts.projectRoot, "config.xml")),
packageName = config.android_packageName() || config.packageName();
packageName = config.android_packageName() || config.packageName();
console.info("Running android-install.Hook: " + context.hook + ", Package: " + packageName + ", Path: " + projectRoot + ".");
console.info("Running android-install.Hook: " + context.hook
+ ", Package: " + packageName + ", Path: " + projectRoot + ".");
if (!packageName) {
console.error("Package name could not be found!");
@@ -36,13 +37,13 @@ module.exports = function (context) {
shell.mkdir('-p', targetDir);
// sync the content
fs.readFile(path.join(context.opts.plugin.dir, 'src', 'android', 'JPushPlugin.java'), {encoding: 'utf-8'}, function (err, data) {
if (err) {
throw err;
}
data = data.replace(/^import __PACKAGE_NAME__.R;/m, 'import ' + packageName + '.R;');
fs.writeFileSync(targetFile, data);
fs.readFile(path.join(context.opts.plugin.dir, 'src', 'android', 'JPushPlugin.java'),
{encoding: 'utf-8'}, function (err, data) {
if (err) {
throw err;
}
data = data.replace(/^import __PACKAGE_NAME__.R;/m, 'import ' + packageName + '.R;');
fs.writeFileSync(targetFile, data);
});
}
};

View File

@@ -1,10 +1,8 @@
package cn.jpush.phonegap;
import android.app.Activity;
import android.app.Notification;
import android.content.ComponentName;
import android.content.Intent;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import __PACKAGE_NAME__.R;
@@ -21,6 +19,7 @@ import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -37,30 +36,32 @@ import cn.jpush.android.data.JPushLocalNotification;
public class JPushPlugin extends CordovaPlugin {
private final static List<String> methodList =
Arrays.asList(
"getRegistrationID",
"setTags",
"setTagsWithAlias",
"setAlias",
"addLocalNotification",
"clearAllNotification",
"clearLocalNotifications",
"clearNotificationById",
"getNotification",
"getRegistrationID",
"init",
"isPushStopped",
"onPause",
"onResume",
"requestPermission",
"removeLocalNotification",
"reportNotificationOpened",
"resumePush",
"setAlias",
"setBasicPushNotificationBuilder",
"setCustomPushNotificationBuilder",
"setPushTime",
"init",
"setDebugMode",
"stopPush",
"resumePush",
"isPushStopped",
"setLatestNotificationNum",
"setPushTime",
"clearAllNotification",
"clearNotificationById",
"addLocalNotification",
"removeLocalNotification",
"clearLocalNotifications",
"onResume",
"onPause",
"reportNotificationOpened",
"setStatisticsOpen");
"setTags",
"setTagsWithAlias",
"setSilenceTime",
"setStatisticsOpen",
"stopPush"
);
private ExecutorService threadPool = Executors.newFixedThreadPool(1);
private static JPushPlugin instance;
@@ -70,8 +71,11 @@ public class JPushPlugin extends CordovaPlugin {
private static boolean shouldCacheMsg = false;
private static boolean isStatisticsOpened = false; // 是否开启统计分析功能
public static String notificationTitle;
public static String notificationAlert;
public static Map<String, Object> notificationExtras = new HashMap<String, Object>();
public static String openNotificationTitle;
public static String openNotificationAlert;
public static Map<String, Object> openNotificationExtras = new HashMap<String, Object>();
@@ -83,54 +87,58 @@ public class JPushPlugin extends CordovaPlugin {
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
super.initialize(cordova, webView);
Log.i(TAG, "---------------- initialize" + "-"
+ JPushPlugin.openNotificationAlert + "-"
+ JPushPlugin.notificationAlert);
Log.i(TAG, "---------------- initialize" + "-" + openNotificationAlert
+ "-" + notificationAlert);
cordovaActivity = this.cordova.getActivity();
cordovaActivity = cordova.getActivity();
//如果同时缓存了打开事件openNotificationAlert 和 消息事件notificationAlert只向UI 发 打开事件。
//这样做是为了和iOS 统一
if (JPushPlugin.openNotificationAlert != null) {
JPushPlugin.notificationAlert = null;
JPushPlugin.transmitOpen(JPushPlugin.openNotificationAlert,
JPushPlugin.openNotificationExtras);
//如果同时缓存了打开事件 openNotificationAlert 和 消息事件 notificationAlert只向 UI 发打开事件。
//这样做是为了和 iOS 统一
if (openNotificationAlert != null) {
notificationAlert = null;
transmitNotificationOpen(openNotificationTitle, openNotificationAlert,
openNotificationExtras);
}
if (JPushPlugin.notificationAlert != null) {
JPushPlugin.transmitReceive(JPushPlugin.notificationAlert,
JPushPlugin.notificationExtras);
if (notificationAlert != null) {
transmitNotificationReceive(notificationTitle, notificationAlert,
notificationExtras);
}
//JPushInterface.init(cordova.getActivity().getApplicationContext());
}
public void onPause(boolean multitasking) {
Log.i(TAG, "---------------- onPause");
shouldCacheMsg = true;
if (isStatisticsOpened && multitasking) {
JPushInterface.onPause(cordovaActivity);
JPushInterface.onPause(this.cordova.getActivity());
}
}
public void onResume(boolean multitasking) {
shouldCacheMsg = false;
Log.i(TAG, "---------------- onResume" + "-"
+ JPushPlugin.openNotificationAlert + "-"
+ JPushPlugin.notificationAlert);
Log.i(TAG, "---------------- onResume" + "-" + openNotificationAlert
+ "-" + notificationAlert);
if (isStatisticsOpened && multitasking) {
JPushInterface.onResume(cordovaActivity);
JPushInterface.onResume(this.cordova.getActivity());
}
if (JPushPlugin.openNotificationAlert != null) {
JPushPlugin.notificationAlert = null;
JPushPlugin.transmitOpen(JPushPlugin.openNotificationAlert,
JPushPlugin.openNotificationExtras);
if (openNotificationAlert != null) {
notificationAlert = null;
transmitNotificationOpen(openNotificationTitle, openNotificationAlert,
openNotificationExtras);
}
if (JPushPlugin.notificationAlert != null) {
JPushPlugin.transmitReceive(JPushPlugin.notificationAlert,
JPushPlugin.notificationExtras);
if (notificationAlert != null) {
transmitNotificationReceive(notificationTitle, notificationAlert,
notificationExtras);
}
}
private static JSONObject notificationObject(String message,
@Override
public void onDestroy() {
super.onDestroy();
cordovaActivity = null;
instance = null;
}
private static JSONObject getMessageObject(String message,
Map<String, Object> extras) {
JSONObject data = new JSONObject();
try {
@@ -138,7 +146,18 @@ public class JPushPlugin extends CordovaPlugin {
JSONObject jExtras = new JSONObject();
for (Entry<String, Object> entry : extras.entrySet()) {
if (entry.getKey().equals("cn.jpush.android.EXTRA")) {
JSONObject jo = new JSONObject((String) entry.getValue());
JSONObject jo = null;
if (TextUtils.isEmpty((String) entry.getValue())) {
jo = new JSONObject();
} else {
jo = new JSONObject((String) entry.getValue());
String key;
Iterator keys = jo.keys();
while (keys.hasNext()) {
key = keys.next().toString();
jExtras.put(key, jo.getString(key));
}
}
jExtras.put("cn.jpush.android.EXTRA", jo);
} else {
jExtras.put(entry.getKey(), entry.getValue());
@@ -153,15 +172,27 @@ public class JPushPlugin extends CordovaPlugin {
return data;
}
private static JSONObject openNotificationObject(String alert,
Map<String, Object> extras) {
private static JSONObject getNotificationObject(String title,
String alert, Map<String, Object> extras) {
JSONObject data = new JSONObject();
try {
data.put("title", title);
data.put("alert", alert);
JSONObject jExtras = new JSONObject();
for (Entry<String, Object> entry : extras.entrySet()) {
if (entry.getKey().equals("cn.jpush.android.EXTRA")) {
JSONObject jo = new JSONObject((String) entry.getValue());
JSONObject jo = null;
if (TextUtils.isEmpty((String) entry.getValue())) {
jo = new JSONObject();
} else {
jo = new JSONObject((String) entry.getValue());
String key;
Iterator keys = jo.keys();
while (keys.hasNext()) {
key = keys.next().toString();
jExtras.put(key, jo.getString(key));
}
}
jExtras.put("cn.jpush.android.EXTRA", jo);
} else {
jExtras.put(entry.getKey(), entry.getValue());
@@ -176,11 +207,11 @@ public class JPushPlugin extends CordovaPlugin {
return data;
}
static void transmitPush(String message, Map<String, Object> extras) {
static void transmitMessageReceive(String message, Map<String, Object> extras) {
if (instance == null) {
return;
}
JSONObject data = notificationObject(message, extras);
JSONObject data = getMessageObject(message, extras);
String format = "window.plugins.jPushPlugin.receiveMessageInAndroidCallback(%s);";
final String js = String.format(format, data.toString());
cordovaActivity.runOnUiThread(new Runnable() {
@@ -191,14 +222,12 @@ public class JPushPlugin extends CordovaPlugin {
});
}
static void transmitOpen(String alert, Map<String, Object> extras) {
static void transmitNotificationOpen(String title, String alert,
Map<String, Object> extras) {
if (instance == null) {
return;
}
if (JPushPlugin.shouldCacheMsg) {
return;
}
JSONObject data = openNotificationObject(alert, extras);
JSONObject data = getNotificationObject(title, alert, extras);
String format = "window.plugins.jPushPlugin.openNotificationInAndroidCallback(%s);";
final String js = String.format(format, data.toString());
cordovaActivity.runOnUiThread(new Runnable() {
@@ -207,14 +236,16 @@ public class JPushPlugin extends CordovaPlugin {
instance.webView.loadUrl("javascript:" + js);
}
});
JPushPlugin.openNotificationTitle = null;
JPushPlugin.openNotificationAlert = null;
}
static void transmitReceive(String alert, Map<String, Object> extras) {
static void transmitNotificationReceive(String title, String alert,
Map<String, Object> extras) {
if (instance == null) {
return;
}
JSONObject data = openNotificationObject(alert, extras);
JSONObject data = getNotificationObject(title, alert, extras);
String format = "window.plugins.jPushPlugin.receiveNotificationInAndroidCallback(%s);";
final String js = String.format(format, data.toString());
cordovaActivity.runOnUiThread(new Runnable() {
@@ -223,6 +254,7 @@ public class JPushPlugin extends CordovaPlugin {
instance.webView.loadUrl("javascript:" + js);
}
});
JPushPlugin.notificationTitle = null;
JPushPlugin.notificationAlert = null;
}
@@ -248,8 +280,7 @@ public class JPushPlugin extends CordovaPlugin {
}
void init(JSONArray data, CallbackContext callbackContext) {
JPushInterface.init(cordovaActivity.getApplicationContext());
//callbackContext.success();
JPushInterface.init(this.cordova.getActivity().getApplicationContext());
}
void setDebugMode(JSONArray data, CallbackContext callbackContext) {
@@ -264,18 +295,18 @@ public class JPushPlugin extends CordovaPlugin {
}
void stopPush(JSONArray data, CallbackContext callbackContext) {
JPushInterface.stopPush(cordovaActivity.getApplicationContext());
JPushInterface.stopPush(this.cordova.getActivity().getApplicationContext());
callbackContext.success();
}
void resumePush(JSONArray data, CallbackContext callbackContext) {
JPushInterface.resumePush(cordovaActivity.getApplicationContext());
JPushInterface.resumePush(this.cordova.getActivity().getApplicationContext());
callbackContext.success();
}
void isPushStopped(JSONArray data, CallbackContext callbackContext) {
boolean isStopped = JPushInterface.isPushStopped(
cordovaActivity.getApplicationContext());
this.cordova.getActivity().getApplicationContext());
if (isStopped) {
callbackContext.success(1);
} else {
@@ -293,7 +324,7 @@ public class JPushPlugin extends CordovaPlugin {
}
if (num != -1) {
JPushInterface.setLatestNotificationNumber(
cordovaActivity.getApplicationContext(), num);
this.cordova.getActivity().getApplicationContext(), num);
} else {
callbackContext.error("error num");
}
@@ -319,30 +350,30 @@ public class JPushPlugin extends CordovaPlugin {
} catch (JSONException e) {
callbackContext.error("error reading hour json");
}
Context context = cordovaActivity.getApplicationContext();
Context context = this.cordova.getActivity().getApplicationContext();
JPushInterface.setPushTime(context, days, startHour, endHour);
callbackContext.success();
}
void getRegistrationID(JSONArray data, CallbackContext callbackContext) {
Context context = cordovaActivity.getApplicationContext();
Context context = this.cordova.getActivity().getApplicationContext();
String regID = JPushInterface.getRegistrationID(context);
callbackContext.success(regID);
}
void onResume(JSONArray data, CallbackContext callbackContext) {
JPushInterface.onResume(cordovaActivity);
JPushInterface.onResume(this.cordova.getActivity());
}
void onPause(JSONArray data, CallbackContext callbackContext) {
JPushInterface.onPause(cordovaActivity);
JPushInterface.onPause(this.cordova.getActivity());
}
void reportNotificationOpened(JSONArray data, CallbackContext callbackContext) {
try {
String msgID;
msgID = data.getString(0);
JPushInterface.reportNotificationOpened(cordovaActivity, msgID);
JPushInterface.reportNotificationOpened(this.cordova.getActivity(), msgID);
} catch (JSONException e) {
e.printStackTrace();
}
@@ -354,8 +385,8 @@ public class JPushPlugin extends CordovaPlugin {
for (int i = 0; i < data.length(); i++) {
tags.add(data.getString(i));
}
JPushInterface.setTags(cordovaActivity.getApplicationContext(),
tags, mTagWithAliasCallback);
JPushInterface.setTags(this.cordova.getActivity().getApplicationContext(),
tags, mTagWithAliasCallback);
callbackContext.success();
} catch (JSONException e) {
e.printStackTrace();
@@ -366,8 +397,8 @@ public class JPushPlugin extends CordovaPlugin {
void setAlias(JSONArray data, CallbackContext callbackContext) {
try {
String alias = data.getString(0);
JPushInterface.setAlias(cordovaActivity.getApplicationContext(),
alias, mTagWithAliasCallback);
JPushInterface.setAlias(this.cordova.getActivity().getApplicationContext(),
alias, mTagWithAliasCallback);
callbackContext.success();
} catch (JSONException e) {
e.printStackTrace();
@@ -384,8 +415,8 @@ public class JPushPlugin extends CordovaPlugin {
for (int i = 0; i < tagsArray.length(); i++) {
tags.add(tagsArray.getString(i));
}
JPushInterface.setAliasAndTags(cordovaActivity.getApplicationContext(),
alias, tags, mTagWithAliasCallback);
JPushInterface.setAliasAndTags(this.cordova.getActivity().getApplicationContext(),
alias, tags, mTagWithAliasCallback);
callbackContext.success();
} catch (JSONException e) {
e.printStackTrace();
@@ -393,28 +424,10 @@ public class JPushPlugin extends CordovaPlugin {
}
}
// void getNotification(JSONArray data, CallbackContext callBackContext) {
// String alert = JPushPlugin.notificationAlert;
// Map<String, String> extras = JPushPlugin.notificationExtras;
//
// JSONObject jsonData = new JSONObject();
// try {
// jsonData.put("message", alert);
// jsonData.put("extras", new JSONObject(extras));
// } catch (JSONException e) {
// e.printStackTrace();
// }
//
// callBackContext.success(jsonData);
//
// JPushPlugin.notificationAlert = "";
// JPushPlugin.notificationExtras = new HashMap<String, Obl>();
// }
void setBasicPushNotificationBuilder(JSONArray data,
CallbackContext callbackContext) {
BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(
cordovaActivity);
this.cordova.getActivity());
builder.developerArg0 = "Basic builder 1";
JPushInterface.setPushNotificationBuilder(1, builder);
JSONObject obj = new JSONObject();
@@ -423,16 +436,14 @@ public class JPushPlugin extends CordovaPlugin {
} catch (JSONException e) {
e.printStackTrace();
}
//callbackContext.success(obj);
}
void setCustomPushNotificationBuilder(JSONArray data,
CallbackContext callbackContext) {
CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
cordovaActivity, R.layout.test_notification_layout,
this.cordova.getActivity(), R.layout.test_notification_layout,
R.id.icon, R.id.title, R.id.text);
builder.developerArg0 = "Custom Builder 1";
builder.layoutIconDrawable = R.drawable.jpush_notification_icon;
JPushInterface.setPushNotificationBuilder(2, builder);
JSONObject obj = new JSONObject();
try {
@@ -440,12 +451,10 @@ public class JPushPlugin extends CordovaPlugin {
} catch (JSONException e) {
e.printStackTrace();
}
//callbackContext.success(obj);
}
void clearAllNotification(JSONArray data, CallbackContext callbackContext) {
JPushInterface.clearAllNotifications(cordovaActivity);
//callbackContext.success();
JPushInterface.clearAllNotifications(this.cordova.getActivity());
}
void clearNotificationById(JSONArray data, CallbackContext callbackContext) {
@@ -457,7 +466,7 @@ public class JPushPlugin extends CordovaPlugin {
callbackContext.error("error reading id json");
}
if (notificationId != -1) {
JPushInterface.clearNotificationById(cordovaActivity, notificationId);
JPushInterface.clearNotificationById(this.cordova.getActivity(), notificationId);
} else {
callbackContext.error("error id");
}
@@ -465,13 +474,16 @@ public class JPushPlugin extends CordovaPlugin {
void addLocalNotification(JSONArray data, CallbackContext callbackContext)
throws JSONException {
//builderId,content,title,notificaitonID,broadcastTime,extras
int builderId = data.getInt(0);
String content = data.getString(1);
String title = data.getString(2);
int notificationID = data.getInt(3);
int broadcastTime = data.getInt(4);
JSONObject extras = data.getJSONObject(5);
String extrasStr = data.isNull(5) ? "" : data.getString(5);
JSONObject extras = new JSONObject();
if (!extrasStr.isEmpty()) {
extras = new JSONObject(extrasStr);
}
JPushLocalNotification ln = new JPushLocalNotification();
ln.setBuilderId(builderId);
@@ -479,25 +491,23 @@ public class JPushPlugin extends CordovaPlugin {
ln.setTitle(title);
ln.setNotificationId(notificationID);
ln.setBroadcastTime(System.currentTimeMillis() + broadcastTime);
ln.setExtras(extras.toString());
JPushInterface.addLocalNotification(cordovaActivity, ln);
JPushInterface.addLocalNotification(this.cordova.getActivity(), ln);
}
void removeLocalNotification(JSONArray data, CallbackContext callbackContext)
throws JSONException {
int notificationID = data.getInt(0);
JPushInterface.removeLocalNotification(cordovaActivity, notificationID);
JPushInterface.removeLocalNotification(this.cordova.getActivity(), notificationID);
}
void clearLocalNotifications(JSONArray data, CallbackContext callbackContext) {
JPushInterface.clearLocalNotifications(cordovaActivity);
JPushInterface.clearLocalNotifications(this.cordova.getActivity());
}
/**
* 决定是否启用统计分析功能。
* @param data
* @param callbackContext
*/
void setStatisticsOpen(JSONArray data, CallbackContext callbackContext) {
try {
@@ -507,6 +517,48 @@ public class JPushPlugin extends CordovaPlugin {
}
}
/**
* 设置通知静默时间
* http://docs.jpush.io/client/android_api/#api_5
*/
void setSilenceTime(JSONArray data, CallbackContext callbackContext) {
try {
int startHour = data.getInt(0);
int startMinute = data.getInt(1);
int endHour = data.getInt(2);
int endMinute = data.getInt(3);
if (!isValidHour(startHour) || !isValidMinute(startMinute)) {
callbackContext.error("开始时间数值错误");
return;
}
if (!isValidHour(endHour) || !isValidMinute(endMinute)) {
callbackContext.error("结束时间数值错误");
return;
}
JPushInterface.setSilenceTime(this.cordova.getActivity(), startHour, startMinute,
endHour, endMinute);
} catch (JSONException e) {
e.printStackTrace();
callbackContext.error("error: reading json data.");
}
}
private boolean isValidHour(int hour) {
return !(hour < 0 || hour > 23);
}
private boolean isValidMinute(int minute) {
return !(minute < 0 || minute > 59);
}
/**
* 用于 Android 6.0 以上系统申请权限,具体可参考:
* http://docs.Push.io/client/android_api/#android-60
*/
void requestPermission(JSONArray data, CallbackContext callbackContext) {
JPushInterface.requestPermission(this.cordova.getActivity());
}
private final TagAliasCallback mTagWithAliasCallback = new TagAliasCallback() {
@Override
public void gotResult(int code, String alias, Set<String> tags) {
@@ -521,7 +573,7 @@ public class JPushPlugin extends CordovaPlugin {
final String jsEvent = String.format(
"cordova.fireDocumentEvent('jpush.setTagsWithAlias',%s)",
data.toString());
cordovaActivity.runOnUiThread(new Runnable() {
cordova.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
instance.webView.loadUrl("javascript:" + jsEvent);

View File

@@ -25,32 +25,39 @@ public class MyReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(action)) {
handlingReceivedMessage(intent);
handlingMessageReceive(intent);
} else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(action)) {
handlingNotificationReceive(context, intent);
} else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(action)) {
handlingNotificationOpen(context, intent);
} else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(action)) {
// 当在 HTML 页面中调用 JPushWeb.triggerNativeAction(String params) 方法时触发此方法,
// 再进行相关的操作。
} else {
Log.d(TAG, "Unhandled intent - " + action);
}
}
private void handlingReceivedMessage(Intent intent) {
private void handlingMessageReceive(Intent intent) {
String msg = intent.getStringExtra(JPushInterface.EXTRA_MESSAGE);
Map<String, Object> extras = getNotificationExtras(intent);
JPushPlugin.transmitPush(msg, extras);
JPushPlugin.transmitMessageReceive(msg, extras);
}
private void handlingNotificationOpen(Context context, Intent intent) {
Log.i(TAG, "---------------- handlingNotificationOpen");
String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
JPushPlugin.openNotificationTitle = title;
String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT);
JPushPlugin.openNotificationAlert = alert;
Map<String, Object> extras = getNotificationExtras(intent);
JPushPlugin.openNotificationExtras = extras;
JPushPlugin.transmitOpen(alert, extras);
JPushPlugin.transmitNotificationOpen(title, alert, extras);
Intent launch = context.getPackageManager().getLaunchIntentForPackage(
context.getPackageName());
@@ -62,24 +69,27 @@ public class MyReceiver extends BroadcastReceiver {
private void handlingNotificationReceive(Context context, Intent intent) {
Log.i(TAG, "---------------- handlingNotificationReceive");
Intent launch = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
Intent launch = context.getPackageManager().getLaunchIntentForPackage(
context.getPackageName());
launch.addCategory(Intent.CATEGORY_LAUNCHER);
launch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE);
JPushPlugin.notificationTitle = title;
String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT);
JPushPlugin.notificationAlert = alert;
Map<String, Object> extras = getNotificationExtras(intent);
JPushPlugin.notificationExtras = extras;
JPushPlugin.transmitReceive(alert, extras);
JPushPlugin.transmitNotificationReceive(title, alert, extras);
}
private Map<String, Object> getNotificationExtras(Intent intent) {
Map<String, Object> extrasMap = new HashMap<String, Object>();
for (String key : intent.getExtras().keySet()) {
if (!IGNORED_EXTRAS_KEYS.contains(key)) {
Log.e("key", "key:" + key);
if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
extrasMap.put(key, intent.getIntExtra(key, 0));
} else {

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/popLayoutId"
style="@style/MyDialogStyle"
android:orientation="vertical"
android:layout_width="280dp"
android:layout_height="250dp" >
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/wvPopwin"/>
</LinearLayout>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="MyDialogStyle">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
</resources>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<cn.jpush.android.ui.FullScreenView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/actionbarLayoutId"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/rlRichpushTitleBar"
android:layout_width="match_parent"
android:layout_height="40.0dp"
android:background="#29313a">
<ImageButton
android:id="@+id/imgRichpushBtnBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="9dp"
android:layout_marginRight="10dp"
android:background="@drawable/richpush_btn_selector" />
<ImageView
android:id="@+id/imgView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/imgRichpushBtnBack"
android:clickable="false"
android:src="@drawable/ic_richpush_actionbar_divider" />
<TextView
android:id="@+id/tvRichpushTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="7dp"
android:layout_toRightOf="@id/imgView"
android:clickable="false"
android:text=" "
android:textSize="20sp"
android:textColor="#ffffff" />
</RelativeLayout>
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fullWebView"
android:background="#000000" />
</cn.jpush.android.ui.FullScreenView>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 获得焦点但未按下时的背景图片 -->
<item
android:state_focused="true"
android:state_enabled="true"
android:state_pressed="false"
android:drawable="@drawable/ic_richpush_actionbar_back" />
<!-- 按下时的背景图片 -->
<item
android:state_enabled="true"
android:state_pressed="true"
android:drawable="@android:color/darker_gray" />
<!-- 按下时的背景图片 -->
<item
android:state_enabled="true"
android:state_checked="true"
android:drawable="@android:color/darker_gray" />
<!-- 默认时的背景图片 -->
<item android:drawable="@drawable/ic_richpush_actionbar_back" />
</selector>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -9,20 +9,29 @@
#import "AppDelegate+JPush.h"
#import "JPushPlugin.h"
#import "JPUSHService.h"
#import <objc/runtime.h>
@implementation AppDelegate (JPush)
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[JPushPlugin setLaunchOptions:launchOptions];
+(void)load{
//cordova didFinishLaunchingWithOptions
CGRect screenBounds = [[UIScreen mainScreen] bounds];
self.window = [[UIWindow alloc] initWithFrame:screenBounds];
self.viewController = [[CDVViewController alloc] init];
self.window.rootViewController = self.viewController;
self.window.autoresizesSubviews = YES;
[self.window makeKeyAndVisible];
return YES;
Method origin;
Method swizzle;
origin=class_getInstanceMethod([self class],@selector(init));
swizzle=class_getInstanceMethod([self class], @selector(init_plus));
method_exchangeImplementations(origin, swizzle);
}
-(instancetype)init_plus{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidLaunch:) name:@"UIApplicationDidFinishLaunchingNotification" object:nil];
return [self init_plus];
}
-(void)applicationDidLaunch:(NSNotification *)notification{
if (notification) {
[JPushPlugin setLaunchOptions:notification.userInfo];
}
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

View File

@@ -60,10 +60,11 @@
/*
* 以下为js中可监听到的事件
* jpush.openNotification 点击推送消息唤醒或启动app
* jpush.openNotification 点击推送消息启动或唤醒app
* jpush.setTagsWithAlias 设置标签、别名完成
* jpush.receiveMessage 收到自定义消息
* jpush.receiveNotification 前台收到推送消息
* jpush.receiveNotification 前台收到推送
* jpush.backgoundNotification 后台收到推送
*/
@end

View File

@@ -9,10 +9,12 @@
#import "JPushPlugin.h"
#import "JPUSHService.h"
#import <UIKit/UIKit.h>
#import <AdSupport/AdSupport.h>
static NSString *const JM_APP_KEY = @"APP_KEY";
static NSString *const JM_APP_CHANNEL = @"CHANNEL";
static NSString *const JM_APP_ISPRODUCTION = @"IsProduction";
static NSString *const JP_APP_KEY = @"APP_KEY";
static NSString *const JP_APP_CHANNEL = @"CHANNEL";
static NSString *const JP_APP_ISPRODUCTION = @"IsProduction";
static NSString *const JP_APP_ISIDFA = @"IsIDFA";
static NSString *const JPushConfigFileName = @"PushConfig";
static NSDictionary *_luanchOptions = nil;
@@ -273,17 +275,26 @@ static NSDictionary *_luanchOptions = nil;
}
NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
NSString * appkey = [plistData valueForKey:JM_APP_KEY];
NSString * channel = [plistData valueForKey:JM_APP_CHANNEL];
NSNumber * isProduction = [plistData valueForKey:JM_APP_ISPRODUCTION];
NSString * appkey = [plistData valueForKey:JP_APP_KEY];
NSString * channel = [plistData valueForKey:JP_APP_CHANNEL];
NSNumber * isProduction = [plistData valueForKey:JP_APP_ISPRODUCTION];
NSNumber *isIDFA = [plistData valueForKey:JP_APP_ISIDFA];
if (!appkey || appkey.length == 0) {
NSLog(@"error: app key not found in PushConfig.plist ");
assert(0);
}
[JPUSHService setupWithOption:_luanchOptions appKey:appkey
channel:channel apsForProduction:[isProduction boolValue] ];
NSString *advertisingId = nil;
if(isIDFA){
advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}
[JPUSHService setupWithOption:_luanchOptions
appKey:appkey
channel:channel
apsForProduction:[isProduction boolValue]
advertisingIdentifier:advertisingId];
}
#pragma mark js
@@ -356,29 +367,33 @@ static NSDictionary *_luanchOptions = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:&error];
NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%ld",(long)[UIApplication sharedApplication].applicationState);
switch ([UIApplication sharedApplication].applicationState) {
case UIApplicationStateActive:
{
case UIApplicationStateActive:{
//
dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.receiveNotification',%@)",jsonString]];
});
}
break;
case UIApplicationStateInactive:
case UIApplicationStateBackground:
{
}
case UIApplicationStateInactive:{
//
dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.openNotification',%@)",jsonString]];
});
break;
}
case UIApplicationStateBackground:{
//
dispatch_async(dispatch_get_main_queue(), ^{
[self.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.backgoundNotification',%@)",jsonString]];
});
break;
}
default:
//do nothing
break;
//do nothing
break;
}
}
@end

View File

@@ -8,5 +8,7 @@
<string>Subscription</string>
<key>IsProduction</key>
<false/>
<key>IsIDFA</key>
<true/>
</dict>
</plist>

View File

@@ -9,7 +9,7 @@
* Copyright (c) 2011 ~ 2015 Shenzhen HXHG. All rights reserved.
*/
#define JPUSH_VERSION_NUMBER 2.1.0
#define JPUSH_VERSION_NUMBER 2.1.6
#import <Foundation/Foundation.h>
@@ -51,6 +51,7 @@ extern NSString *const kJPFServiceErrorNotification; // 错误提示
* @param appKey 一个JPush 应用必须的,唯一的标识. 请参考 JPush 相关说明文档来获取这个标识.
* @param channel 发布渠道. 可选.
* @param isProduction 是否生产环境. 如果为开发状态,设置为 NO; 如果为生产状态,应改为 YES.
* @param advertisingIdentifier 广告标识符IDFA 如果不需要使用IDFA传nil.
*
* @discussion 提供SDK启动必须的参数, 来启动 SDK.
* 此接口必须在 App 启动时调用, 否则 JPush SDK 将无法正常工作.
@@ -61,6 +62,13 @@ extern NSString *const kJPFServiceErrorNotification; // 错误提示
apsForProduction:(BOOL)isProduction;
+ (void)setupWithOption:(NSDictionary *)launchingOption
appKey:(NSString *)appKey
channel:(NSString *)channel
apsForProduction:(BOOL)isProduction
advertisingIdentifier:(NSString *)advertisingId;
///----------------------------------------------------
/// @name APNs about 通知相关
///----------------------------------------------------
@@ -78,6 +86,7 @@ extern NSString *const kJPFServiceErrorNotification; // 错误提示
+ (void)registerDeviceToken:(NSData *)deviceToken;
/*!
* @abstract 处理收到的 APNs 消息
*/
@@ -97,7 +106,7 @@ extern NSString *const kJPFServiceErrorNotification; // 错误提示
+ (void) setTags:(NSSet *)tags
alias:(NSString *)alias
callbackSelector:(SEL)cbSelector
target:(id)theTarget;
target:(id)theTarget __attribute__((deprecated("JPush 2.1.1 版本已过期")));;
+ (void) setTags:(NSSet *)tags
alias:(NSString *)alias
@@ -108,9 +117,9 @@ callbackSelector:(SEL)cbSelector
callbackSelector:(SEL)cbSelector
object:(id)theTarget;
+ (void) setTags:(NSSet *)tags
alias:(NSString *)alias
fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler;
+ (void)setTags:(NSSet *)tags
alias:(NSString *)alias
fetchCompletionHandle:(void (^)(int iResCode, NSSet *iTags, NSString *iAlias))completionHandler;
+ (void) setTags:(NSSet *)tags
aliasInbackground:(NSString *)alias;

View File

@@ -27,38 +27,42 @@ JPushPlugin.prototype.call_native = function(name, args, callback) {
return ret;
}
//public plugin function
JPushPlugin.prototype.startLogPageView = function(pageName) {
// public methods
JPushPlugin.prototype.init = function() {
if(this.isPlatformIOS()) {
this.call_native("startLogPageView", [pageName], null);
}
}
JPushPlugin.prototype.stopLogPageView = function(pageName) {
if(this.isPlatformIOS()) {
this.call_native("stopLogPageView", [pageName], null);
var data = [];
this.call_native("initial", data, null);
} else {
data = [];
this.call_native("init", data, null);
}
}
JPushPlugin.prototype.beginLogPageView = function(pageName, duration) {
if(this.isPlatformIOS()) {
this.call_native("beginLogPageView", [pageName, duration], null);
JPushPlugin.prototype.getRegistrationID = function(callback) {
try {
var data = [];
this.call_native("getRegistrationID", [data], callback);
} catch(exception) {
console.log(exception);
}
}
JPushPlugin.prototype.setApplicationIconBadgeNumber = function(badge) {
if(this.isPlatformIOS()) {
this.call_native("setApplicationIconBadgeNumber", [badge], null);
}
JPushPlugin.prototype.stopPush = function() {
data = [];
this.call_native("stopPush", data, null);
}
JPushPlugin.prototype.getApplicationIconBadgeNumber = function(callback) {
if(this.isPlatformIOS()) {
this.call_native("getApplicationIconBadgeNumber", [], callback);
}
JPushPlugin.prototype.resumePush = function() {
data = [];
this.call_native("resumePush", data, null);
}
JPushPlugin.prototype.isPushStopped = function(callback) {
data = [];
this.call_native("isPushStopped", data, callback);
}
// iOS methods
JPushPlugin.prototype.setTagsWithAlias = function(tags, alias) {
try {
if(tags == null) {
@@ -93,15 +97,6 @@ JPushPlugin.prototype.setAlias = function(alias) {
}
}
JPushPlugin.prototype.getRegistrationID = function(callback) {
try {
var data = [];
this.call_native("getRegistrationID", [data], callback);
} catch(exception) {
console.log(exception);
}
}
JPushPlugin.prototype.setBadge = function(value) {
if(this.isPlatformIOS()) {
try {
@@ -185,6 +180,57 @@ JPushPlugin.prototype.receiveMessageIniOSCallback = function(data) {
}
}
JPushPlugin.prototype.startLogPageView = function(pageName) {
if(this.isPlatformIOS()) {
this.call_native("startLogPageView", [pageName], null);
}
}
JPushPlugin.prototype.stopLogPageView = function(pageName) {
if(this.isPlatformIOS()) {
this.call_native("stopLogPageView", [pageName], null);
}
}
JPushPlugin.prototype.beginLogPageView = function(pageName, duration) {
if(this.isPlatformIOS()) {
this.call_native("beginLogPageView", [pageName, duration], null);
}
}
JPushPlugin.prototype.setApplicationIconBadgeNumber = function(badge) {
if(this.isPlatformIOS()) {
this.call_native("setApplicationIconBadgeNumber", [badge], null);
}
}
JPushPlugin.prototype.getApplicationIconBadgeNumber = function(callback) {
if(this.isPlatformIOS()) {
this.call_native("getApplicationIconBadgeNumber", [], callback);
}
}
// Android methods
JPushPlugin.prototype.setDebugMode = function(mode) {
if(device.platform == "Android") {
this.call_native("setDebugMode", [mode], null);
}
}
JPushPlugin.prototype.setBasicPushNotificationBuilder = function() {
if(device.platform == "Android") {
data = [];
this.call_native("setBasicPushNotificationBuilder", data, null);
}
}
JPushPlugin.prototype.setCustomPushNotificationBuilder = function() {
if(device.platform == "Android") {
data = [];
this.call_native("setCustomPushNotificationBuilder", data, null);
}
}
JPushPlugin.prototype.receiveMessageInAndroidCallback = function(data) {
try {
console.log("JPushPlugin:receiveMessageInAndroidCallback");
@@ -221,38 +267,6 @@ JPushPlugin.prototype.receiveNotificationInAndroidCallback = function(data) {
}
}
//android single
JPushPlugin.prototype.setBasicPushNotificationBuilder = function() {
if(device.platform == "Android") {
data = [];
this.call_native("setBasicPushNotificationBuilder", data, null);
}
}
JPushPlugin.prototype.setCustomPushNotificationBuilder = function() {
if(device.platform == "Android") {
data = [];
this.call_native("setCustomPushNotificationBuilder", data, null);
}
}
JPushPlugin.prototype.stopPush = function() {
data = [];
this.call_native("stopPush", data, null);
}
JPushPlugin.prototype.resumePush = function() {
data = [];
this.call_native("resumePush", data, null);
}
JPushPlugin.prototype.setDebugMode = function(mode) {
if(device.platform == "Android") {
this.call_native("setDebugMode", [mode], null);
}
}
JPushPlugin.prototype.clearAllNotification = function() {
if(device.platform == "Android") {
data = [];
@@ -273,21 +287,6 @@ JPushPlugin.prototype.setLatestNotificationNum = function(num) {
}
}
JPushPlugin.prototype.isPushStopped = function(callback) {
data = [];
this.call_native("isPushStopped", data, callback);
}
JPushPlugin.prototype.init = function() {
if(this.isPlatformIOS()) {
var data = [];
this.call_native("initial", data, null);
} else {
data = [];
this.call_native("init", data, null);
}
}
JPushPlugin.prototype.setDebugMode = function(mode) {
if(device.platform == "Android") {
this.call_native("setDebugMode", [mode], null);
@@ -295,9 +294,9 @@ JPushPlugin.prototype.setDebugMode = function(mode) {
}
JPushPlugin.prototype.addLocalNotification = function(builderId, content, title,
notificaitonID, broadcastTime, extras) {
notificationID, broadcastTime, extras) {
if(device.platform == "Android") {
data = [builderId, content, title, notificaitonID, broadcastTime, extras];
data = [builderId, content, title, notificationID, broadcastTime, extras];
this.call_native("addLocalNotification", data, null);
}
}
@@ -324,14 +323,34 @@ JPushPlugin.prototype.reportNotificationOpened = function(msgID) {
/**
*是否开启统计分析功能,用于“用户使用时长”,“活跃用户”,“用户打开次数”的统计,并上报到服务器上,
*在 Portal 上展示给开发者。
**/
*/
JPushPlugin.prototype.setStatisticsOpen = function(mode) {
if(device.platform == "Android") {
this.call_native("setStatisticsOpen", [mode], null);
}
}
//iOS single
/**
* 用于在 Android 6.0 及以上系统,申请一些权限
* 具体可看http://docs.jpush.io/client/android_api/#android-60
*/
JPushPlugin.prototype.requestPermission = function() {
if(device.platform == "Android") {
this.call_native("requestPermission", [], null);
}
}
JPushPlugin.prototype.setSilenceTime = function(startHour, startMinute, endHour, endMinute) {
if (device.platform == "Android") {
this.call_native("setSilenceTime", [startHour, startMinute, endHour, endMinute], null);
}
}
JPushPlugin.prototype.setPushTime = function(weekdays, startHour, endHour) {
if (device.platform == "Android") {
this.call_native("setPushTime", [weekdays, startHour, endHour], null);
}
}
if(!window.plugins) {
window.plugins = {};