【问题标题】:Cordova Push Notifications (PhoneGap PushPlugin) not firing ecb callback (onNotificationAPN)Cordova 推送通知 (PhoneGap PushPlugin) 未触发 ecb 回调 (onNotificationAPN)
【发布时间】:2014-04-03 23:19:34
【问题描述】:

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

我正在使用演示中的example code

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

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

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

【问题讨论】:

    标签: cordova phonegap-pushplugin


    【解决方案1】:

    问题在于您定义回调函数的方式,导致推送插件评估您的回调(即通过[webView stringByEvaluatingJavaScriptFromString)失败,因为它不会意识到这一点。

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

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

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

    【讨论】:

    • 不确定“解析时间定义”是什么意思。 onNotificationAPN 必须在全局范围内定义,因为这是上下文 stringByEvaluatingJavaScriptFromString 评估 javascript in。
    • 是的,这就是我的意思。我喜欢你的表达方式,+1
    • 无论你写什么,实际上都没有意义。我必须破译你所说的,然后@artemave 说 id 必须在全球范围内定义。最后,让我的设备注册。谢谢!
    • 感谢您拯救了我 2 小时的错误搜索并为我解决了这个问题!
    • 我已经为此工作了一整天,非常感谢!
    【解决方案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;
                    }
                }     
    

    【讨论】:

      【解决方案3】:

      如果你使用 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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多