2016-05-19 83 views
10

我剛剛根據本指南here將GCM更新爲FCM。該網站表示,我的服務擴展FirebaseInstanceIdService將被稱爲一旦生成令牌。出於某種原因,我的服務從未被調用,並且從未執行過onTokenRefreshFirebase Cloud Messaging not calling FirebaseInstanceId

我的服務註冊這樣的,根據指南:

<service android:name=".fcm.FcmService"> 
    <intent-filter> 
     <action android:name="com.google.firebase.MESSAGING_EVENT"/> 
    </intent-filter> 
</service> 

<service android:name=".fcm.InstanceIdService"> 
    <intent-filter> 
     <action android:name="com.google.firebase.INSTANCEID_EVENT"/> 
    </intent-filter> 
</service> 

我的服務:

public class InstanceIdService extends FirebaseInstanceIdService { 

    private static final String TAG = "InstanceIdService"; 

    @Override 
    public void onTokenRefresh() { 
     String token = FirebaseInstanceId.getInstance().getToken(); 

     Log.e(TAG, "Got token: " + token); 
    } 
} 

的logcat的沒有說的缺少配置文件或其他任何東西,我可以請參閱關於FirebaseApp的日誌和提及該令牌的日誌條目,但仍然不會調用我的服務。

我需要在我的活動某處啓動此服務嗎? 我做錯了什麼?有人能以正確的方向引導我嗎?

編輯:使用Log.e("TOKEN", "Token: " + FirebaseInstanceId.getInstance().getToken());正確打印我的令牌,這意味着它已成功生成。該服務仍然不叫...

編輯2:更改INSTANCEID_EVENT INSTANCE_ID_EVENT固定的問題,雖然我不得不重新安裝該應用程序。由於我已經發布了包含新FCM的測試版本,因此我的測試版測試人員將無法訂閱主題以回覆收到的消息。那麼我應該如何解決這個問題?

+2

對於它的價值,一個文檔(https://firebase.google.com/docs/cloud-messaging/android/client#manifest)表示意圖過濾器應該是'INSTANCE_ID_EVENT',另一個(https://developers.google.com/cloud-messaging/android/android-migrate-fcm#update_the_android_manifest)表示'INSTANCE ID_EVENT'。這兩者似乎都不適合我 - 我和你有同樣的問題。 –

+2

@ZachRattner這對我來說很好,很好!確保在更改後重新安裝應用程序。 – Endanke

+2

我可以確認INSTANCE_ID_EVENT爲我工作,但不是INSTANCEID_EVENT – hordurh

回答

9

非常感謝Endanke和我解決這個問題。看起來Firebase文檔不一致。 One page表示您的清單文件中的您的意圖過濾器應該是INSTANCE_ID_EVENTanother表示INSTANCEID_EVENT

您應該使用INSTANCE_ID_EVENT,一旦你做出改變,你需要完全卸載並重新安裝應用程序,以使更改一命嗚呼。

+1

我已經做了這個,但它仍然不會調用'onTokenRefresh()' – natsumiyu

+2

這個想法卸載外部和重新運行爲我工作。謝謝。 –

2

FCM應作爲GCM的替代品使用。在你的情況下,它看起來像你的清單中有FCM和GCM的服務。嘗試刪除gcm.GcmService,並僅使用擴展FirebaseInstanceId的那個。

+0

但是,當我刪除gcm.GcmService時,我應該在哪裏接收傳入消息? – qwertz

+0

在您的FirebaseMessageService擴展中,您還需要爲其添加一項服務 –

+0

對不起忘了重命名GcmService,但它已經擴展了FirebaseMessagingService – qwertz

0

我有同樣的問題,並通過卸載並重新安裝應用程序onTokenRefresh()被調用一次。所以我想它從G​​CM經常被調用到只有被調用一次的時候,實際上沒有令牌。

0

只是改變INSTANCE_ID_EVENT到INSTANCEID_EVENT。它爲我工作

0

此外,檢查手機的日期!我曾經有過5-7天的差距!修復這一天並重新安裝應用程序解決了這個問題!

0

確保您的Firebase「MyFirebaseInstanceIDService.java」文件直接位於包名稱樹「com」下。公司」

不要把他們像獨立的子‘com.company.services’,這是因爲你的谷歌,services.json將尋找文件直接在‘com.company’目錄。

添加下面的下面的元標記您的清單應用程序標籤(如果有的話)

<service 
    android:name=".MyFirebaseInstanceIDService"> 
    <intent-filter> 
     <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> 
    </intent-filter> 
</service> 

您將獲得的公共無效onTokenRefresh您的TOKEN()方法

PS:下載並更換最新的谷歌服務.json從您的項目控制檯。

0

什麼 '火力地堡雲通訊' 希望是:

  • FirebaseInstanceIdService實現一個派生類(MyFirebaseInstanceIdService)。
  • 執行覆蓋onTokenRefresh來處理設備的 令牌的更新。
  • 在AndroidManifest.xml參考中,「派生」類帶有前綴 並帶有「。」。

MyFirebaseInstanceIdService是'建議'的名稱。我個人更喜歡在這個派生類中加上一個首字母縮寫詞或者名字,這個名字在整個應用程序中都會使用。

1

一噸的試驗後和錯誤我的問題是有工具:節點=我的應用程序標籤「取代」 ...刪除它解決了這個問題對我來說

0

onTokenRefresh()會調用只有一個時間。當時你的應用程序是第一次安裝,如果你想從其他活動訪問令牌,你必須調用這個方法:

FirebaseInstanceId.getInstanceId().getToken();