2013-05-22 48 views
9

我正在爲Android/IOS進行pushnotification。我使用了phonegap push-plugin https://github.com/phonegap-build/PushPlugin,它似乎工作得很好。Phonegap PushNotification打開特定的應用程序頁面

我在我的設備上收到消息現在的問題是當我點擊收到的消息時,它會轉到應用程序的index.html頁面。但我想打開其他頁面,例如home.html,當我點擊消息並在家中.html我會顯示消息。

如何實現這一目標?

MyPhoneGapActivity.java

package com.test; 

import org.apache.cordova.DroidGap; 
import android.os.Bundle; 

public class MyPhoneGapActivity extends DroidGap { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.setIntegerProperty("splashscreen", R.drawable.splash); 
     super.setIntegerProperty("loadUrlTimeoutValue", 60000); 
     super.loadUrl("file:///android_asset/www/index.html", 10000); 
    } 
} 

index.js

<script type="text/javascript"> 
    var pushNotification; 

    function onDeviceReady() { 
     $("#app-status-ul").append('<li>deviceready event received</li>'); 

     document.addEventListener("backbutton", function(e) 
     { 
      $("#app-status-ul").append('<li>backbutton event received</li>'); 

      if($("#home").length > 0) 
      { 
       // call this to get a new token each time. don't call it to reuse existing token. 
       //pushNotification.unregister(successHandler, errorHandler); 
       e.preventDefault(); 
       navigator.app.exitApp(); 
      } 
      else 
      { 
       navigator.app.backHistory(); 
      } 
     }, false); 

     try 
     { 
      pushNotification = window.plugins.pushNotification; 
      if (device.platform == 'android' || device.platform == 'Android') { 
       $("#app-status-ul").append('<li>registering android</li>'); 
       pushNotification.register(successHandler, errorHandler, {"senderID":"661780372179","ecb":"onNotificationGCM"});  // required! 
      } else { 
       $("#app-status-ul").append('<li>registering iOS</li>'); 
       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 
    function onNotificationAPN(e) { 
     if (e.alert) { 
      $("#app-status-ul").append('<li>push-notification: ' + e.alert + '</li>'); 
      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) { 
     $("#app-status-ul").append('<li>EVENT -> RECEIVED:' + e.event + '</li>'); 

     switch(e.event) 
     { 
      case 'registered': 
      if (e.regid.length > 0) 
      { 
       $("#app-status-ul").append('<li>REGISTERED -> REGID:' + e.regid + "</li>"); 
       // 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) 
       { 
        $("#app-status-ul").append('<li>--INLINE NOTIFICATION--' + '</li>'); 

        // 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) 
         $("#app-status-ul").append('<li>--COLDSTART NOTIFICATION--' + '</li>'); 
        else 
        $("#app-status-ul").append('<li>--BACKGROUND NOTIFICATION--' + '</li>'); 
       } 

       $("#app-status-ul").append('<li>MESSAGE -> MSG: ' + e.payload.message + '</li>'); 
       $("#app-status-ul").append('<li>MESSAGE -> MSGCNT: ' + e.payload.msgcnt + '</li>'); 
      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; 
     } 
    } 

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

    function errorHandler (error) { 
     $("#app-status-ul").append('<li>error:'+ error +'</li>'); 
    } 

    document.addEventListener('deviceready', onDeviceReady, true); 

</script> 

回答

12

您可以輕鬆地做到這一點,

步驟1:打開你的GCMIntentService.java文件

檢查的方法onMessage

在該方法中,你會發現從這裏,他們是路過的意圖,你MyPhoneGapActivity.java ......現在你要做的就是你傳遞一些額外的信息.... 傳遞一些額外的信息,意圖

檢查此行

Intent notificationIntent = new Intent(context, MyPhoneGapActivity.class); 
//here you pass the information 
notificationIntent.putExtra ("url",url); 

,你可以在上面看到我已經通過了額外信息,網址...完整的代碼見下文

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) 
    { 
     boolean foreground = this.isInForeground(); 

     extras.putBoolean("foreground", foreground); 

     if (foreground){ 
      PushHandlerActivity.sendToApp(extras); 
     }else{ 
      String message = extras.getString("message"); 
      String title = extras.getString("title"); 
      Notification notif = new Notification(android.R.drawable.btn_star_big_on, message, System.currentTimeMillis()); 
      notif.flags = Notification.FLAG_AUTO_CANCEL; 
      notif.defaults |= Notification.DEFAULT_SOUND; 
      notif.defaults |= Notification.DEFAULT_VIBRATE; 

      String url = "notify"; 

      Intent notificationIntent = new Intent(context, MyPhoneGapActivity.class); 
      //here you pass the information 
      notificationIntent.putExtra ("url",url); 
      notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
      PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 

      notif.setLatestEventInfo(context, title, message, contentIntent); 
      String ns = Context.NOTIFICATION_SERVICE; 
      NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns); 
      mNotificationManager.notify(1, notif); 
     } 
    } 
    } 

第2步:

在你MyPhoneGapActivity.java

package com.test; 

import org.apache.cordova.DroidGap; 

import android.os.Bundle; 

public class MyPhoneGapActivity extends DroidGap { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.setIntegerProperty("splashscreen", R.drawable.splash); 
     super.setIntegerProperty("loadUrlTimeoutValue", 60000); 

     Bundle extras = getIntent().getExtras(); 
     String message = extras.getString("url"); 
     if(message == "notify"){ 
      super.loadUrl("file:///android_asset/www/home.html", 10000); 
     }else{ 
      super.loadUrl("file:///android_asset/www/index.html", 10000); 
     } 
    } 
} 

這就是現在,當您單擊該通知將加載Home.html文件中:-)

+0

非常感謝你......還真管用真棒:-) – Iam4fun

+2

無論如何,用Apple推送通知做同樣的事情嗎?我附加了Phonegap Apple推送通知插件,並且想要在用戶點擊通知時更改頁面。 –

+1

我在這個主要活動課上寫的每件事都在每個科爾多瓦建造後消失。我應該怎麼做才能保留我的更改? – Yashar

2

我以前從來沒有使用這個插件,但它看起來像它會在您可以在應用程序中處理的通知中傳遞message。因此,似乎在您的index.html中,您可以閱讀此消息,並且如果它包含某些特定的字符串,請重定向到main.html或您想去的任何位置。您可以在啓動畫面仍然可見時執行此操作,或者讓用戶看不到重新導向的頁面。

+1

我爲我的應用做了一些非常類似於此的事情。我將一個參數傳遞給通知,如果我找到該參數,我打開一個不同的頁面或調用一個函數或... – Fabrizio

+1

你可以顯示你的代碼嗎? –

相關問題