8

我将Cordova Push Notifications Plugin 1.3.4与我的 Cordova/Phonegap 应用程序一起使用。不幸的是,当收到推送通知时,我的 JavaScript 中的 ecb 回调永远不会被触发,我无法处理推送通知(即使应用程序在前台运行时也不行)。

我正在使用演示中的示例代码

pushNotification.register(tokenHandler, errorHandler, {"badge": "true", "sound": "true", "alert": "true", "ecb": "onNotificationAPN"});

注册成功,但从未触发以下回调:

function onNotificationAPN (event) {
    if (event.alert)
    {
        navigator.notification.alert(event.alert);
    }
 }
4

3 回答 3

9

问题在于您定义回调函数的方式,导致 Push Plugin 对您的回调(即 via [webView stringByEvaluatingJavaScriptFromString)的评估失败,因为它不会意识到这一点。

如果您将回调函数定义为全局对象,则插件将在每次新通知到达时正确触发您的回调:

onNotificationAPN = function(event) {
    if (event.alert)
    {
        navigator.notification.alert(event.alert);
    };
};

对于 Android,您可以onNotificationGCM以相同的方式定义回调。

于 2014-04-03T23:19:34.440 回答
2

Mobiletainment的回答为我解决了这个问题!我整个下午都在寻找解决方案,尽管是 GCM 回调,但功能是相同的。

我会赞成 Mobiletainment,但我是新来的,它不会让我这样做,但是谢谢!

对于任何可能正在搜索 GCM 解决方案的人(Googleverse 中有很多但没有很多好的答案),这是我的代码终于奏效了:

// handle GCM notifications for Android 
            onNotificationGCM = function(e){
                alert('onGCM');
                switch( e.event )
                {
                    case 'registered':
                        if ( e.regid.length > 0 )
                        {
                            console.log("Regid " + e.regid);
                            //Do registration work here...
                        }
                    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;
                }
            }     
于 2014-09-08T21:49:34.573 回答
1

如果您使用 azure push..below 是工作代码。(pushplugin for phonegap)

    function InitpushNotificaions() {
      //  alert("Notification setup");
        try {


            mobileServiceClient = new WindowsAzure.MobileServiceClient('https://mobbacktest.azure-mobile.net/', 'RvahPxHKoEsGiLdlCYZpHBllvSVQxl66');
            pushNotification = window.plugins.pushNotification;
            if (device.platform == 'android' || device.platform == 'Android' ||
                    device.platform == 'amazon-fireos')
            {
                // AndroId

                pushNotification.register(successHandler, errorHandler, { "senderID": "724086851305", "ecb": "onNotification" });       // required!
            }
            else
            {
                //IOS
                pushNotification.register(tokenHandler, errorHandler, { "badge": "true", "sound": "true", "alert": "true", "ecb": "onNotificationAPN" });   // required!
            }
        }
        catch (err) {
            txt = "There was an error on this page.\n\n";
            txt += "Error description: " + err.message + "\n\n";
            alert(txt);
        }




    }


    // handle APNS notifications for iOS
 onNotificationAPN=function (e) {
        if (e.alert) {
            $("#app-status-ul").append('<li>push-notification: ' + e.alert + '</li>');
            // showing an alert also requires the org.apache.cordova.dialogs plugin
            navigator.notification.alert(e.alert);
        }

        if (e.sound) {
            // playing a sound also requires the org.apache.cordova.media plugin
            var snd = new Media(e.sound);
            snd.play();
        }

        if (e.badge) {
            pushNotification.setApplicationIconBadgeNumber(successHandler, e.badge);
        }
    }

    //handle GCM notifications for Android
    onNotification = function (e) {
       // alert("gcm");
        switch (e.event) {
            case 'registered':
                if (e.regid.length > 0) {
                    // 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.
                   // alert('step 1 Azure! ' + e.regid);
                    if (mobileServiceClient) {
                       // alert('step 2 Azure!');
                        // Template registration.
                        var template = "{ \"data\" : {\"message\":\"$(message)\"}}";
                        // Register for notifications.
                        mobileServiceClient.push.gcm.registerTemplate(e.regid,
                          "myTemplate", template, null)
                          .done(function () {
                           //   alert('Registered template with Azure!');
                          }).fail(function (error) {
                              //alert('Failed registering with Azure: ' + error);
                          });
                    }



                    console.log("regID = " + 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) {

                    // on Android soundname is outside the payload. 
                    // On Amazon FireOS all custom attributes are contained within payload
                    var soundfile = e.soundname || e.payload.sound;
                    // if the notification contains a soundname, play it.
                    // playing a sound also requires the org.apache.cordova.media plugin
                    var my_media = new Media("/res/" + beep.wav);
                    alert("Message:"+e.message);
                    my_media.play();
                }
                else {  // otherwise we were launched because the user touched a notification in the notification tray.
                    if (e.coldstart) {

                    }
                    else {

                    }
                }


                break;

            case 'error':
                break;

            default:
                break;
        }
    }


    function tokenHandler(result)
    {
       // $("#app-status-ul").append('<li>token: '+ result +'</li>');
        // 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) {
        alert("Success handler:" + result);
     //   $("#app-status-ul").append('<li>success:'+ result +'</li>');
    }

    function errorHandler(error) {
        alert("Error handler:" + error);
    }
于 2015-10-22T12:04:23.123 回答