2015-07-15 31 views
7

Tôi gặp sự cố với plugin. Khi tôi đang ở trong ứng dụng, và tôi gửi thông báo với Parse, tôi nhận được một cảnh báo với thông điệp (điều này hoạt động như dự định). Tuy nhiên, khi ứng dụng ở chế độ nền, không có gì hiển thị trên điện thoại. Dưới đây là cách tôi sử dụng plugin và cách tôi xử lý thông báo:Parse CorodvaPush Ionic: Android không hiển thị thông báo khi ứng dụng ở chế độ nền

var gmcId = "xxxxxxx"; 
var androidConfig = { 
    senderID: gmcId 
}; 

document.addEventListener("deviceready", function(){ 
    $cordovaPush.register(androidConfig).then(function(result) { 
    console.log("result: " + result); 
    }, function(err) { 
    // Error 
    }) 

    $rootScope.$on('$cordovaPush:notificationReceived', function(event, e) { 


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. 
     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) 
    { 


     // if the notification contains a soundname, play it. 
     navigator.notification.beep(1); 
     alert(e.payload.data.alert) 
    } 
    else 
    { // otherwise we were launched because the user touched a notification in the notification tray. 
     if (e.coldstart) 
     { 

     } 
     else 
     { 

     navigator.notification.beep(1); 
     alert(e.payload.data.alert) 
     } 
    } 


    break; 

    case 'error': 
    $("#app-status-ul").append('<li>ERROR -> MSG:' + e.msg + '</li>'); 
    break; 

    default: 
    $("#app-status-ul").append('<li>EVENT -> Unknown, an event was received and we do not know what it is</li>'); 
    break; 
} 

    }); 

}, false); 

Cảm ơn !!

Btw, đây là cấu trúc của thông báo Parse mà tôi nhận được:

{"collapse_key":"do_not_collapse", 
"event":"message", 
"foreground":true, 
"from":"xxxxxxxxxx", 
"payload":{ 
"data":  {"alert":"asdasdas","push_hash":"bff149a0b87f5b0e00d9dd364e9ddaa0"},"push_id":"2iFhVp2R4u","time":"2015-07-21T12:24:09.905Z"}} 

ĐÁP:

Vì vậy, sau hai ngày kéo tóc của tôi, tôi cuối cùng đã cố gắng để khắc phục vấn đề. Vì vậy, vấn đề là nó không quan trọng làm thế nào bạn chỉ định JSON trong Parse, nó luôn luôn gửi trong biểu mẫu được trình bày ở trên - có nghĩa là những gì bạn chỉ định luôn ở trong payload-> data -> 'key': 'value'. Tuy nhiên, GCMIntentService tìm kiếm một thông báo, có "message" trong lớp đầu tiên của JSON. Ý nghĩa, nó phải trông như thế:

{"collapse_key":"do_not_collapse", 
    "event":"message", 
    "foreground":true, 
    "from":"xxxxxxxxxx", 
    "message":"ssadasdasdsa" 
......} 

Bạn có thể thấy rằng nó được quy định trong GCMIntentService.java bên dưới dòng bắt đầu "protected void onMessage" (Tôi nghĩ rằng dòng của nó 53).

Dù sao, bạn sửa lỗi này, chúng ta cần phải thay đổi cách xử lý thông báo khi ứng dụng không ở nền trước. Chúng ta cần phải thay đổi nó thành:

@Override 
protected void onMessage(Context context, Intent intent) { 
    Log.d(TAG, "onMessage - context: " + context); 

    // Extract the payload from the message 
    Bundle extras = intent.getExtras(); 
    if (extras != null) 
    { 
     // if we are in the foreground, just surface the payload, else post it to the statusbar 
     if (PushPlugin.isInForeground()) { 
      extras.putBoolean("foreground", true); 
      PushPlugin.sendExtras(extras); 
     } 
     else { 

     try { 
       JSONObject object_example = new JSONObject(extras.getString("data")); 
       String message = object_example.getString("alert"); 
       extras.putString("message", message); 
      } catch (JSONException e) { 
       //some exception handler code. 
      } 

         createNotification(context, extras); 
     } 
    } 
} 

Ở đây, mã của chúng ta sẽ đi vào xem xét rằng thông báo của chúng tôi doesnt có 'thông điệp' trong lớp đầu tiên của JSON - nó sẽ tìm kiếm nó ở đĩa dữ liệu> alert (mẫu của thông báo từ PARSE).

Tôi hy vọng điều đó sẽ hữu ích, bởi vì tôi đã dành nhiều thời gian để cố gắng tìm ra nó :).

Trả lời

1

Vì vậy, sau hai ngày kéo tóc của tôi, tôi cuối cùng đã cố gắng để khắc phục vấn đề. Vì vậy, vấn đề là nó không quan trọng làm thế nào bạn chỉ định JSON trong Parse, nó luôn luôn gửi trong biểu mẫu được trình bày ở trên - có nghĩa là những gì bạn chỉ định luôn ở trong payload-> data -> 'key': 'value'. Tuy nhiên, GCMIntentService tìm kiếm một thông báo, có "message" trong lớp đầu tiên của JSON. Ý nghĩa, nó phải trông như thế:

{"collapse_key":"do_not_collapse", 
    "event":"message", 
    "foreground":true, 
    "from":"xxxxxxxxxx", 
    "message":"ssadasdasdsa" 
......} 

Bạn có thể thấy rằng nó được quy định trong GCMIntentService.java bên dưới dòng mà bắt đầu "protected void onMessage" (Tôi nghĩ rằng dòng của nó 53).

Dù sao, bạn sửa lỗi này, chúng ta cần phải thay đổi cách xử lý thông báo khi ứng dụng không ở nền trước.Chúng tôi cần phải thay đổi nó thành:

@Override 
protected void onMessage(Context context, Intent intent) { 
    Log.d(TAG, "onMessage - context: " + context); 

    // Extract the payload from the message 
    Bundle extras = intent.getExtras(); 
    if (extras != null) 
    { 
     // if we are in the foreground, just surface the payload, else post it to the statusbar 
     if (PushPlugin.isInForeground()) { 
      extras.putBoolean("foreground", true); 
      PushPlugin.sendExtras(extras); 
     } 
     else { 

     try { 
       JSONObject object_example = new JSONObject(extras.getString("data")); 
       String message = object_example.getString("alert"); 
       extras.putString("message", message); 
      } catch (JSONException e) { 
       //some exception handler code. 
      } 

         createNotification(context, extras); 
     } 
    } 
} 

Ở đây, mã của chúng tôi sẽ không xem xét thông báo của chúng tôi ở lớp đầu tiên của JSON - nó sẽ tìm kiếm thông báo này ở dạng dữ liệu thông báo từ PARSE).

Tôi hy vọng điều đó sẽ hữu ích, bởi vì tôi đã dành nhiều thời gian để cố gắng tìm ra nó :).

0

Tôi đã sử dụng plugin được xây dựng riêng cho thông báo đẩy Parse.com ở đây là cách tôi đăng ký nhận thông báo và nó hoạt động trong mọi tình huống.

registerCallback: function (_pushCallback) { 
    var deferred = $q.defer(); 
    $window.parsePlugin.registerCallback('onNotification', function() { 

     $window.onNotification = function (pnObj) { 

      _pushCallback && _pushCallback(pnObj); 

      alert('We received this push notification: ' + JSON.stringify(pnObj)); 
      if (pnObj.receivedInForeground === false) { 
       // TODO: route the user to the uri in pnObj 
      } 
     }; 
     deferred.resolve(true); 

    }, function (error) { 
     deferred.reject(error); 
    }); 
    return deferred.promise; 

} 

bạn sẽ nhìn thấy mã hoàn chỉnh nguồn ở đây: https://github.com/aaronksaunders/dcww/blob/master/www/js/parseService.js

Dùng Parse Plugin này - https://github.com/grrrian/phonegap-parse-plugin

+0

Tôi đã gặp rất nhiều vấn đề khi sử dụng Plugin Parse, do đó tôi muốn gắn với cordovaPush. Tôi không có bất kỳ vấn đề nào liên quan đến phần đăng ký của mã thông báo và userId, tôi gặp sự cố khi đăng ký thông báo - tôi có thể nhận thông báo bằng cảnh báo (notification.payload.data.alert), nhưng tôi không thể nhận được thông báo khi ứng dụng ở trong lý lịch. – uksz

+0

ok, tò mò bạn gặp phải vấn đề gì với plugin? chúng tôi đã triển khai một ngã ba của phiên bản mới nhất trong 3 ứng dụng của khách hàng cho đến nay mà không có vấn đề gì, sẽ đánh giá cao bất kỳ sự khởi đầu nào bạn có thể cung cấp. –

Các vấn đề liên quan