在 Android Phonegap 应用程序中处理推送通知消息

Posted

技术标签:

【中文标题】在 Android Phonegap 应用程序中处理推送通知消息【英文标题】:Handling push notification message in Android Phonegap app 【发布时间】:2014-01-15 13:00:09 【问题描述】:

我正在 Phonegap android 应用中实现推送通知。我正在关注教程here。在教程中,onDeviceready 函数如下所示:

onDeviceReady: function() 
    app.receivedEvent('deviceready');
    var pushNotification = window.plugins.pushNotification;
    pushNotification.register(app.successHandler, app.errorHandler,"senderID":"836557454855","ecb":"app.onNotificationGCM");
,

这意味着每次应用启动时,都会向 Google 注册推送通知。我认为这只需要做一次。所以在我的,我有:

onDeviceReady: function() 

        var device_id = window.localStorage.getItem('mountmercy_device_id');

        //if device_id is in local storage, then it means registration 
        // with google has already taken place. If not, then register
        if(typeof(device_id)==='undefined' || device_id===null)

            var pushNotification = window.plugins.pushNotification;
            if (window.device.platform == 'android' || window.device.platform == 'Android') 
                pushNotification.register(app.successHandler, app.errorHandler,"senderID":"475226855592","ecb":"app.onNotificationGCM");                        
            
            else
                //so its apple
                 pushNotification.register(app.tokenHandler,app.errorHandler,"badge":"true","sound":"true","alert":"true","ecb":"app.onNotificationAPN");
            

         


然后在 onNotificationGCM 中,我设置了本地存储,因此设备不会再次注册:

onNotificationGCM: function(e) 

    switch( e.event )
    
        case 'registered':
            if ( e.regid.length > 0 )
            
                  /*
                   save reg id to server and store response in local storage
                   ...
                   ...
                   ...
                  */

                  window.localStorage.setItem('mountmercy_device_id', data.id);
                  window.localStorage.setItem('mountmercy_api_key', data.get('api_key'));

            
            break;

        case 'message':
            // this is the actual push notification. its format depends on the data model from the push server
            alert('message = '+e.message+' msgcnt = '+e.msgcnt);

            break;

        case 'error':
            //alert('GCM error = '+e.msg);
            break;

        default:
           // alert('An unknown GCM event has occurred');
            break;
    
, 

当手机收到新的推送通知时会出现问题。在教程的原始项目中,当用户单击通知消息时,应用程序打开并且用户看到警报:“message = blachblah msgcnt = blahblah”。这是因为 onNotificationGCM() 中“消息”案例中的代码被执行了。

在我的应用程序中,应用程序打开但“消息”案例中的代码未执行。这是因为,在 onDeviceReady() 中,我只向 Google 注册了一次设备。如果我删除条件:

if(typeof(device_id)==='undefined' || device_id===null)

并且每次都注册设备,“消息”案例被执行。但是每次都必须在 onDeviceReady() 中注册设备似乎是错误的。还有其他解决方案吗?

【问题讨论】:

【参考方案1】:

我在 Google Cloud Messaging 的文档中看到它说

Google 可能会定期刷新注册 ID

在这种情况下,我每次打开应用程序时都会向 Google 注册,并更新返回的注册 ID,以防它发生变化。这也解决了在通知栏中单击推送消息时处理消息的问题。

【讨论】:

【参考方案2】:

您还可以将 GCM 应答中的 canonical_id 获取到您的服务器(或您用来发送通知的设备),如下所述:https://developers.google.com/cloud-messaging/registration#canonical-ids

Canonical ID 是设备从 GCM 获得的最新注册 ID。

【讨论】:

以上是关于在 Android Phonegap 应用程序中处理推送通知消息的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中处理货币值的最佳实践?

在 Android 上为 PhoneGap App 更改应用程序主题(使用 phonegap Build)

如何在phonegap中使用android原生代码?

在 android 和 IOS 中运行 phoneGap 应用程序需要进行啥配置?

Phonegap - 为 Android 应用添加启动画面

PhoneGap 应用程序在 android 设备中仅显示白屏