文档章节

【更新】PhoneGap实现信息推送-基于极光推送(Android版)

crazymus
 crazymus
发布于 2015/02/07 10:23
字数 945
阅读 11118
收藏 19

极光推送插件安装地址:

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 <说明来自开源中国>

© 著作权归作者所有

crazymus

crazymus

粉丝 71
博文 80
码字总数 111033
作品 8
武汉
后端工程师
私信 提问
加载中

评论(3)

l
liangyu1234
那我每次发送消息都要同光极光推送的后台发送吗?还有我返回来的data里面没有数据,window.plugins.jPushPlugin.openNotificationInAndroidCallback= function(data){
console.log(data);
},这个data是怎么配置的?谢谢了
crazymus
crazymus 博主

引用来自“qiaoxiaobei”的评论

你好,非常感谢你的分享,非常有用,只是我想请教一个问题:
window.plugins.jPushPlugin.openNotificationInAndroidCallback= function(data){
  console.log(data);
}
在这块逻辑里我添加的是 传回来一个url并且跳转到这个url,当我打开应用时推送,点击通知栏可以跳转到指定页,但是应用退出后推送,点击通知栏 是跳转到首页,不知道有什么好的方法,求指点。
我们也遇到这个问题了,暂时没有解决方案,抱歉。
qiaoxiaobei
qiaoxiaobei
你好,非常感谢你的分享,非常有用,只是我想请教一个问题:
window.plugins.jPushPlugin.openNotificationInAndroidCallback= function(data){
  console.log(data);
}
在这块逻辑里我添加的是 传回来一个url并且跳转到这个url,当我打开应用时推送,点击通知栏可以跳转到指定页,但是应用退出后推送,点击通知栏 是跳转到首页,不知道有什么好的方法,求指点。
如何在Cordova Android 7.0.0 以下版本集成最新插件 极光插件为例

前提 Cordova Android 7.0.0开始改变了项目安卓平台的架构。新建一个空项目分别添加Android 6.4.0 和 Android 7.0.0平台: 生成的安卓平台结构分别为: 可以看到Cordova从7.0.0项目结构开始和...

JoshLiPan
2018/07/17
0
0
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0
PhoneGap使用PushPlugin插件实现消息推送

概括 Android设备通过GCM服务来接收推送消息,而iOS设备这从苹果的APN服务获取。虽然按照负载来说这是两种不同的服务,但是证书都在从第三方接收消息的时候是需要作为一个存储和转发类型的服...

Mr-iu
2014/04/04
7.2K
0
实现PhoneGap应用里的消息推送

在此教程中你将学会实现PhoneGap应用里的消息推送,你想学会下述内容: · 消息推送的大体处理过程 · 如何使用PhoneGap内置支持的PushPlugin · PushPlugin API概括 · 如何注册自己的应用来...

james_laughing
2014/12/17
63
0
【转载】phonegap push-消息推送实现

最近一直在研究各种推送,ios的由于是apns,比较容易实现,但是andriod的就比较麻烦。后来看了很多解决方案,gcm明显是不行的,其他的方案更是一头雾水,而且需要做第二次开发,太麻烦,后来...

极光推送
2013/02/22
5.4K
59

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
30分钟前
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部