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

极光推送插件安装地址: java

https://github.com/jpush/jpush-phonegap-plugin

安装插件后,须要在AndroidManifest.xml中配置极光平台申请的App Key: android

<meta-data android:name="JPUSH_APPKEY" android:value="aca4b37e5c00d477b*****" />

在JPushPlugin.java文件的22行处有报错,须要把这里修改成你本身的主包名。 git

插件中JpushPlugin.js中setTags方法存在bug,须要在data参数加上[],以下所示: github

JPushPlugin.prototype.setTags = function(data){        
    try{	
	this.call_native("setTags",[data],null);	
    }catch(exception){
    	console.log(exception);	
    }
 }

另外因为极光推送插件使用了PhoneGap的device插件,所以须要安装它: apache

cordova plugin add org.apache.cordova.device

若是须要对全部用户推送信息,只须要在App启动时初始化插件便可: json

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: app

//登陆后设置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数据便可完成自定义逻辑: this

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

相关文章
相关标签/搜索