PushPlugin 不注册设备并在 onNotificationGCM 上返回 regid

Posted

技术标签:

【中文标题】PushPlugin 不注册设备并在 onNotificationGCM 上返回 regid【英文标题】:PushPlugin does not register device and return regid on onNotificationGCM 【发布时间】:2014-04-25 18:40:59 【问题描述】:

我已经用 Phonegap 3.4 安装了 PushPlugin。

onNotificationGCM 案例:registered 从未执行,我无法将 regid 存储在我的服务器数据库中并开始发送通知。

每当我的应用打开时,它就会显示

收到设备就绪事件 注册安卓 成功了

我已经完成了:

已更改发件人 ID 适用于 android 的 Google Cloud Messaging - 开启 已创建服务器密钥(但应该不重要,因为我不在发送部分)

我需要吗:

要安装谷歌播放服务api吗? 我错过了什么?

我等了几分钟,但没有像这样的注册消息

$("#app-status-ul").append('<li>REGISTERED -> REGID:' + e.regid + "</li>");

【问题讨论】:

【参考方案1】:

我也有你的问题。删除包含 html 事物的代码行。如果你想检索它,将它存储到 sessionStorage/localStorage,控制台或警报它。

我的 html 移除版本

var pushNotification;

document.addEventListener("deviceready", onDeviceReady, false);
// device APIs are available
 //

function onDeviceReady() 
    pushNotification = window.plugins.pushNotification;
    if (device.platform == 'android' || device.platform == 'Android') 
        console.log("registering android");
        window.plugins.pushNotification.register(successHandler, errorHandler, 
            "senderID": "xxxxxxxxxxx",
            "ecb": "onNotificationGCM"
        ); // required!
     else 
        console.log("registering ios");
        pushNotification.register(tokenHandler, errorHandler, 
            "badge": "true",
            "sound": "true",
            "alert": "true",
            "ecb": "onNotificationAPN"
        ); // required!
    


// handle APNS notifications for iOS

function onNotificationAPN(e) 
    if (e.alert) 
        navigator.notification.alert(e.alert);
    
    if (e.sound) 
        var snd = new Media(e.sound);
        snd.play();
    
    if (e.badge) 
        pushNotification.setApplicationIconBadgeNumber(successHandler, e.badge);
    

// handle GCM notifications for Android

function onNotificationGCM(e) 
    navigator.notification.alert(e.event);
    switch (e.event) 
    case 'registered':
        if (e.regid.length > 0) 
            navigator.notification.alert(e.regid);
            // Your GCM push server needs to know the regID before it can push to this device
            // here is where you might want to send it the regID for later use.
            console.log("regID = " + e.regid);
            sessionStorage.setItem("deviceId",e.regid);
        
        break;
    case 'message':
        // if this flag is set, this notification happened while we were in the foreground.
        // you might want to play a sound to get the user's attention, throw up a dialog, etc.
        if (e.foreground) 
            navigator.notification.alert('--INLINE NOTIFICATION--');
            // if the notification contains a soundname, play it.
            var my_media = new Media("/android_asset/www/" + e.soundname);
            my_media.play();
         else  // otherwise we were launched because the user touched a notification in the notification tray.
            if (e.coldstart) navigator.notification.alert('--COLDSTART NOTIFICATION--');
            else navigator.notification.alert('--BACKGROUND NOTIFICATION--');
        
        navigator.notification.alert(e.payload.message);
        navigator.notification.alert('MESSAGE -> MSGCNT: ' + e.payload.msgcnt);
        break;
    case 'error':
        navigator.notification.alert('ERROR -> MSG:' + e.msg);
        break;
    default:
        navigator.notification.alert('EVENT -> Unknown, an event was received and we do not know what it is');
        break;
    


function tokenHandler(result) 
    navigator.notification.alert(result, null, 'Alert', 'OK');
    sessionStorage.setItem("deviceId", result);
    sessionStorage.setItem("notificationServer", "APNS");
    // Your iOS push server needs to know the token before it can push to this device
    // here is where you might want to send it the token for later use.


function successHandler(result) 
    navigator.notification.alert(result, null, 'Alert', 'OK');
    sessionStorage.setItem("deviceId", result);
    sessionStorage.setItem("notificationServer", "GCM");


function errorHandler(error) 
    navigator.notification.alert(error, null, 'Alert', 'OK');

【讨论】:

我使用了你的代码。 onNotificationGCM-registered 也永远不会被调用。 确保先将对话框和控制台 phongap 插件安装到您的项目中。 这些是我安装的插件:E:\androidworkspace\pg>phonegap 本地插件列表 [phonegap] com.phonegap.plugins.PushPlugin [phonegap] org.apache.cordova.console [phonegap] org. apache.cordova.device [phonegap] org.apache.cordova.dialogs [phonegap] org.apache.cordova.splashscreen [phonegap] org.apache.cordova.vibration 我需要谷歌播放服务api吗? 不需要。您只需在 google cloud 中获取项目 ID。【参考方案2】:

解决了。经过这么多天的搜索,pushplugin或phonegap没有错。这一轮,是手机本身。许多人在 android 4.2.2 尤其是 s4 上面临推送通知问题。它也不适用于我的 android 4.2.2 平板电脑。我不确定 whatsapp 和 facebook 是如何做到的,无论它们是真正的原生应用程序,所以我相信他们对调试有更多的控制权。

我是如何解决的...首先我进行了出厂重置并安装了相同的应用程序。它无需任何代码更改即可工作!展望未来,因为我担心 4.2.2 的问题会再次出现,我已经升级到固件 4.3,它现在运行良好。

【讨论】:

以上是关于PushPlugin 不注册设备并在 onNotificationGCM 上返回 regid的主要内容,如果未能解决你的问题,请参考以下文章

Netbeans Cordova PushPlugin 无法在 iOS 上运行

iOS PushPlugin Cordova 注册问题

cordova pushplugin 无法在 iOS 中获取设备令牌

如何在cordova android上连接PushPlugin + Parse

Cordova PushPlugin 寄存器出现错误

PushPlugin“不存在”Cordova 3.5