极光推送插件安装地址:
https://github.com/jpush/jpush-phonegap-plugin
安装插件后,需要在AndroidManifest.xml中配置极光平台申请的App Key:
<meta-data android:name="JPUSH_APPKEY" android:value="aca4b37e5c00d477b*****" />
在JPushPlugin.java文件的22行处有报错,需要把这里修改为你自己的主包名。
插件中JpushPlugin.js中setTags方法存在bug,需要在data参数加上[],如下所示:
JPushPlugin.prototype.setTags = function(data){ try{ this.call_native("setTags",[data],null); }catch(exception){ console.log(exception); } }
另外由于极光推送插件使用了PhoneGap的device插件,因此需要安装它:
cordova plugin add org.apache.cordova.device
如果需要对所有用户推送信息,只需要在App启动时初始化插件即可:
document.addEventListener("deviceready",function(){ //插件初始化 window.plugins.jPushPlugin.init(); }, false );
如果需要对某一个用户进行推送,需要在插件初始化后,获取用户的设备ID,并存储至服务端:
document.addEventListener("deviceready",function(){ //插件初始化 window.plugins.jPushPlugin.init(); window.plugins.jPushPlugin.getRegistrationID(function(id){ //将获取到的id存入服务端 }); }, false);
如果需要对某一类人推送信息,可以为设备设置tag,比如为同年级同专业的用户设置相同的tag:
//登录后设置tag,tag格式为'tag_'+年级id+'_'+专业id,如下所示,多个标签用逗号隔开var tag = 'tag_16_1'; //为当前设备设置tag window.plugins.jPushPlugin.setTags(tag); //退出登录时,清除tag,就不会再接收到推送信息了 window.plugins.jPushPlugin.setTags('');
点击通知栏的回调方法:
//点击通知栏的回调,在这里编写特定逻辑 window.plugins.jPushPlugin.openNotificationInAndroidCallback= function(data){ console.log(data); }
data的格式类似于下面的例子,解析JSON数据即可完成自定义逻辑:
{ "alert": "你好 , 这是灵动工大推送的一条信息", "extras": { "cn.jpush.android.MSG_ID": "692692481", "app": "com.jiusem.jingle", "cn.jpush.android.ALERT": "详细内容", "cn.jpush.android.EXTRA": "{ "article_id":1 }", //文章id "cn.jpush.android.PUSH_ID": "692692481", "cn.jpush.android.NOTIFICATION_ID": 692692481, "cn.jpush.android.NOTIFICATION_TYPE": "0" } }
好了,上面的配置完成后,就可以在极光后台进行通知的推送了。
然而,根据上面的介绍,却存在一个严重的问题,只有当App处于运行状态时,点击通知栏,才能成功调用openNotificationInAndroidCallback回调函数。
当App最小化或者没有开启时,即使收到推送消息,点击后也只能打开App首页,并不能完成更多的逻辑。
针对这个问题,我对官方的插件进行了改进:
1 在JPushPlugin.java中添加以下方法:
//获取推送信息,供App启动或恢复活动时调用 //如果有信息返回json字符串,否则返回空 void getPushData(JSONArray data, CallbackContext callbackContext) { JSONObject jsonData = openNotificationObject(JPushPlugin.notificationAlert,JPushPlugin.notificationExtras); callbackContext.success(jsonData.toString()); JPushPlugin.notificationAlert = null; JPushPlugin.notificationExtras = null; }
记得在methodList数组中添加该方法名,否则方法不能被JS接口调用。
2 在JPushPlugin.js中添加以下方法:
JPushPlugin.prototype.getPushData = function(callback){ try{ var data=[]; this.call_native("getPushData",[data],callback); }catch(exception){ console.log(exception); } }
3 不再使用openNotificationInAndroidCallback作为获取推送信息的回调,而采用下面的方法:
document.addEventListener('deviceready', function(data){ window.plugins.jPushPlugin.getPushData(function(data){ if(data!='{}'){ alert(data); } }); }, false); document.addEventListener('resume', function(data){ window.plugins.jPushPlugin.getPushData(function(data){ if(data!='{}'){ alert(data); } }); }, false); //data即为获取到的推送消息,格式为json字符串 { "alert": "你好 , 这是灵动工大推送的一条信息", "extras": { "cn.jpush.android.MSG_ID": "692692481", "app": "com.jiusem.jingle", "cn.jpush.android.ALERT": "详细内容", "cn.jpush.android.EXTRA": "{"article_id":1}", //文章id "cn.jpush.android.PUSH_ID": "692692481", "cn.jpush.android.NOTIFICATION_ID": 692692481, "cn.jpush.android.NOTIFICATION_TYPE": "0" } }
这样,问题便迎刃而解了!
示例代码已上传到git上,可供参考:
http://git.oschina.net/jiusem/TestPush
当然,极光推送的内容远比上面介绍的要多,还支持自定义消息和富媒体消息的推送,这里只是做一个简单的介绍和入门,具体请移步官方文档。
另外,除了在极光后台进行推送操作,还可以利用极光提供的服务端SDK或API来完成该工作,请参考我其他的文章。
欢迎加QQ群交流:454566813 <说明来自开源中国>