2013-07-10 106 views
2

我有一個Worklight混合應用程序,其中包含基本推送通知,可在android中使用。如果應用程序正在運行並且在通知被推送時處於焦點狀態,則其行爲與我預期的完全相同。我的應用程序中的通知回調被調用,並彈出一個SimpleDialog。 全部好的IBM Worklight 5.0.6.1 - 手機/應用程序關閉時未收到推送通知

如果我通過單擊主頁按鈕來關閉應用程序,並且有新消息到達,我會在Android通知區域看到通知,並且當我點擊android通知列表中的項目時,該項目會被解除該列表(但該應用程序不會回到焦點)如果我然後從應用程序菜單啓動我的應用程序,它就在我離開它的位置並顯示SimpleDialog。 (我的通知處理程序被稱爲)主要是好的,但我希望應用程序進入焦點,當我在android通知列表中選擇通知。

如果我通過單擊後退按鈕來關閉應用程序,並且有新消息到達,我會在Android通知區域看到通知,並且當我點擊android通知列表中的項目時,該項目將被解除該列表(但該應用程序不會回到焦點)如果我然後從應用程序菜單啓動我的應用程序,它啓動應用程序新鮮(我必須再次登錄),我的通知處理程序永遠不會被調用。 不太好

如果我強制停止應用程序,或者在通知正在發送時關閉手機(但保留了訂閱),手機上就不會顯示通知。當我重新啓動手機時,我沒有在Android通知區域看到它,並且在啓動應用程序時從未調用應用程序中的通知處理程序。 非常差

這是預期的行爲?

我用工作燈5.0.6.1,和我見過的平臺4.2.2 Android模擬器這種行爲和物理電話在平臺4.1.2

EDT:添加代碼。

適配器:

WL.Server.createEventSource({ 
    name : "MyPushEventSource", 
    securityTest: "MyApp-strong-mobile-securityTest" 
}); 

function submitNotification(userId) { 

    var userSubscription = WL.Server.getUserNotificationSubscription(
      'MyPushNotification.MyPushEventSource', userId); 

    if (userSubscription == null) { 
     return { 
      result : "No subscription found for user :: " + userId 
     }; 
    } 

    var notification = WL.Server 
      .createDefaultNotification("There's work to be done!", 1, {}); 

    WL.Server.notifyAllDevices(userSubscription, notification); 

    return { 
     result : "Notification sent to user :: " + userId 
    }; 
} 

,並在應用程序:

WL.Client.Push.onReadyToSubscribe = function() { 

    var pushSubscribe_Success_Callback = function(response) { 
     WL.Logger.debug("Enter: pushSubscribe_Success_Callback"); 
    }; 

    var pushSubscribe_Fail_Callback = function(response) { 
     WL.Logger.debug("Enter: pushSubscribe_Fail_Callback"); 
    }; 

    var pushNotificationReceived = function(props, payload) { 

     WL.SimpleDialog.show("Notification", props.alert, [ 
       { text : "OK" }]); 
    }; 

    WL.Client.Push.registerEventSourceCallback("myPush", 
      "MyPushNotification", "MyPushEventSource", 
      pushNotificationReceived); 

    if (!WL.Client.Push.isSubscribed("myPush")) { 

     WL.Client.Push.subscribe("myPush", { 
      onSuccess : pushSubscribe_Success_Callback, 
      onFailure : pushSubscribe_Fail_Callback 
     }); 
    } 
}; 

正如我所說的,如果應用程序處於焦點,順利這一切的作品,所以我知道我有Google消息帳戶和密鑰設置正確。但出於某種原因,如果通知發佈時應用程序未處於焦點狀態,我會看到意想不到的結果。

+0

「這是預期的行爲嗎?」 - 對於「力量停止」部分肯定是。 – CommonsWare

+0

我不這麼認爲。我試過這個。見下文。也許「強制關閉」部分,但它在設備斷電時工作正常。 –

+0

它看起來像通知代碼實際上工作正常,(相同的代碼在一個簡單的應用程序中表現完美)但我的應用程序中有其他事情正在導致我看到的行爲。我需要做更多的研究來查明它,但基本的Push通知行爲不是問題。 –

回答

7

好的。這花了我足夠的時間來弄清楚這個問題,所以如果有人跟着,這裏是問題:

我已經重命名應用程序通過打開[android項目] /res/values/strings.xml和更改值APP_NAME。

這會導致應用程序在選擇應用程序的推送通知時不啓動。

我通過將app_name更改回其原始值,併爲友好名稱添加一個名爲app_label的新String來解決此問題。然後,我進入AndroidManifest.xml,並將android:label =「@ string/app_name」的2個實例更改爲:android:label =「@ string/app_label」並且sha-zam!我的應用程序有一個友好的名稱,並點擊通知啓動它。

爲了更好的衡量,我修改了strings.xml中的push_notification_title作爲友好名稱,並且改進了通知的顯示並且不會中斷應用的啓動。

+0

您的意思是應用程序圖標下顯示在設備中的應用程序名稱?這在屬性displayName屬性AFAIK中的application-descriptor.xml中處理... –

+0

就是這樣。默認情況下,它指向@ string/app_name。互聯網上的一些人建議改變strings.xml中的值,而不是在Manifest中硬編碼一個值。無論哪種方式工作,但在strings.xml中改變它有這種奇怪的結果,打破接收通知和應用程序之間的連接。 –

+0

最好使用application-descriptor.xml的displayName屬性,而不是編輯AndroidManifest.xml,但適用於您。 –

0

所有四種情況都按預期工作。
使用Worklight v5.0.6.1和the accompaning PushNotifications project進行測試。

使用GCM Key和GCM ID設置項目後,部署適配器和應用程序,然後在運行Android 4.2的Galaxy S4上啓動應用程序。2:

  1. 我已經登錄,訂閱和發送
  2. 我已經登錄,訂閱通知,拍了拍Home鍵的應用程序發送到後臺和發送通知
  3. 我有登錄,suscribed,抽頭返回按鈕來關閉該應用程序和發送的通知
  4. 我已登錄的,訂閱,關閉應用程序,關閉設備

  1. 當應用程序處於前臺時,顯示收到通知的對話框
  2. 應用程序在後臺時,我收到通知欄中的通知。點擊它將應用程序置於前臺,並顯示接收到的通知對話框
  3. 應用程序關閉時,我收到通知欄中的通知。點擊它啓動應用程序,登錄後收到的通知對話框顯示
  4. 打開設備,等待它連接到網絡,我收到通知欄中的通知。攻絲它,它推出的應用程序,日誌記錄,在收到通知的對話框中顯示

如果這是一個推送通知的應用程式,你自己編寫後,我建議你檢查你的代碼。您可以使用示例應用程序作爲指導。

+0

我將上面的代碼逐字記錄下來,並將其放在一個簡單的新應用程序中,突然它工作正常。所以我的問題必須在應用程序的其他地方(這是一個相當複雜的應用程序) –

+0

很高興聽到問題不在推送通知。 :-)如果這個具體的問題已經回答,請將其標記爲已回答。如果您的應用中的其他部分存在其他問題,請打開一個新問題。謝謝。 –

相關問題