2016-09-29 28 views
0

我正在開發IBM Mobilefirst原生Android應用程序。我已經編寫了用於啓用推送通知的代碼。我收到通知,但我有一個問題在這裏。Mobilefirst PushNotification:在服務器上使用wl_anonymousUserRealm時,應用程序在單擊通知時未調用onReceive方法

啓動應用程序我打電話下面的代碼。

final WLClient client = WLClient.getInstance(); 
      push = client.getPush(); 
     ResponseListener listener = new ResponseListener(ResponseListener.AUTHENTICITY_CONNECT);  
     client.getPush().setOnReadyToSubscribeListener(listener); 
     challengeHandler = new AndroidChallengeHandler(realm); 
     client.registerChallengeHandler(challengeHandler);  
     WLRequestOptions options=new WLRequestOptions(); 
     options.setAppUserId("sample"); 
     client.connect(listener,options); 

當我啓動應用程序,第一次所有上面的代碼會被執行並且在此之後偵聽獲取執行我打電話訂閱方法的偵聽器調用下面的方法

@Override 
     public void onReadyToSubscribe() { 
      WLClient.getInstance().getPush().registerEventSourceCallback(pushAliasName, "PushAdapter","PushEventSource", this); 
     } 

。我推動訂閱獲得成功。

在服務器端,我打電話過程發送推送通知,併到達手機。

現在,當我的應用程序轉到後臺,我收到通知。我點擊通知和應用程序重新啓動,並且永遠不會調用已註冊界面的onRecieve方法。

點擊通知後,它會重新啓動應用程序,並再次調用onReadyToSubscribe(),它永遠不會調用onRecieve方法。我應該怎麼做才能調用onReceive()方法,並且應用程序不應該在通知單擊時重新啓動(如果應用程序已經在後臺)?

我的服務器端安全測試是如下

<customSecurityTest name="AuthSecurityTest"> 
     <test realm="wl_antiXSRFRealm" step="1"/> 
     <test realm="wl_authenticityRealm" step="1"/> 
     <test realm="wl_remoteDisableRealm" step="1"/> 
     <test realm="wl_anonymousUserRealm" isInternalUserID="true" step="1"/> 
     <test realm="wl_deviceAutoProvisioningRealm" step="2" isInternalDeviceID="true"/> 
     </customSecurityTest> 

的的UserIdentity不綁定到安全測試,但我把它在應用applicationdescriptor。所以它永遠不會要求在連接上挑戰處理程序所需的憑據。

在這裏,我想這可能是由MFP提供了7.1版本的安全測試有過的UserIdentity境界,但在我的情況,我不使用自定義的UserIdentity境界,但我使用的是默認wl_anonymousUserRealm示例代碼中的問題。這是問題,因爲當我嘗試使用示例代碼時,它在所有場景下都可以正常工作。但與wl_anonymousUserRealm我有這個問題。

+0

該應用程序已關閉或關閉?如果你殺了應用程序,它會退出推送服務,如果你關閉了應用程序,服務仍然在監聽。你究竟如何關閉應用程序? –

+0

我可能會在我的應用程序中單擊可能會關閉應用程序的按鈕,或者我會轉到手機的後退堆棧並清除可能會終止應用程序的應用程序。在這兩種情況下,我都會收到推送通知。但我的onRecieve方法不是通知點擊。 – Bender

+0

點擊通知應用程序正在重新啓動。我該如何阻止它。 – Bender

回答

0

由於Vivin的建議。 以下是由MFP在7.1版本中提供的示例代碼中的問題安全測試具有用戶身份領域,但在我的情況下,我沒有使用自定義用戶身份領域,但我使用的是默認的wl_anonymousUserRealm。

實際問題是wl_anonymousUserRealm每次都會生成一個新的隨機userid。所以,當我的應用程序重新啓動時,我的用戶名被更改,我不會推入onrecieve,因爲它認爲不同的用戶登錄到應用程序。

現在,因爲我不能更改wl_anonymousUserRealm我使用deviceid發送推送。請檢查下面的鏈接(適配器代碼如下)。 https://www.ibm.com/support/knowledgecenter/SSHS8R_7.1.0/com.ibm.worklight.apiref.doc/html/refjavascript-server/html/WL.Server.html#sendMessage

查看下面的鏈接樣本客戶端代碼。 https://mobilefirstplatform.ibmcloud.com/tutorials/en/foundation/7.1/notifications/push-notifications-overview/push-notifications-native-android-applications/tag-based-notifications-in-native-android-applications/

2

onReadyToSubscribe()方法每次應用程序連接到服務器時都會調用(即使已經預訂了推送)。

onReadyToSubscribe()是一個回調,觸發客戶端表示客戶端和服務器之間的令牌交換完成。這是必需的,因爲中介發給應用程序的標記可以更改。這就要求服務器始終保持最新的令牌更新。如果不是,推送通知將失敗並出現無效令牌錯誤。

當客戶端連接到服務器時,它們比較令牌 - 客戶端顯示它現在具有的令牌,並且服務器顯示它存儲的內容。發生三種情況:

1)在新的註冊中,服務器沒有令牌。在這裏,客戶端傳遞從中介獲得的內容,服務器保持它併發布成功。客戶端觸發onReadyToSubscribe()回調來指示推送握手已完成,客戶端現在可以訂閱別名或標籤。

2)客戶端收到中介的新令牌。這與一臺服務器已有的不匹配。客戶端將新令牌傳遞給服務器,服務器使用新令牌更新其記錄並讓客戶端知道。 onReadyToSubscribe()在客戶端觸發指示握手成功。較早的訂閱記錄保持不變。

3)如果令牌匹配,則onReadyToSubscribe()火災表示此推握手完成(不需要改變)

+0

感謝您的回覆..這是好的,但有兩件事情發生1)如果我點擊通知我的應用程序獲取重新啓動,即使我的應用程序在後臺打開2)通知onrecieve消息不被調用。我失去了一些東西。 – Bender

+0

Vivin你有沒有時間研究這個問題。如果你有一些解決方案,請分享。 – Bender

+0

@Bender,如果應用程序在後臺,應該只將它放在前臺並輸入onReceive回調。 2)onReceive應該被調用。 我會驗證這一點。您正在嘗試的確切MFP版本是什麼? –

相關問題