15

我在使用Firebase時遇到了與我的android應用程序有關的這個嚴重問題。 1.我的應用程序在第一次啓動時收到令牌 2.我可以從Firebase控制檯向註冊令牌發送通知 3.如果我嘗試在步驟2之後再次使用控制檯發送通知,它會向我顯示「未登記的令牌「在第二次嘗試之後。發送一個通知後發現未註冊的令牌錯誤

我在清單中已經有了所有必要的配置,並且google service.json文件也包含正確的配置。我相信事情是正確的,因爲應用程序能夠接收一次通知,並且問題在此之後纔開始。

更新1: 如果我卸載應用程序並重新安裝它,那麼我也只能收到一次通知。

那些誰願意看代碼,這是我如何得到令牌:

@Override 
public void onTokenRefresh() { 

    //Getting registration token 
    refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

    //Displaying token on logcat 
    Log.d(TAG, "Refreshed token: " + refreshedToken); 
    saveDeviceToken(refreshedToken); 
} 

這得到調用只有首先推出,之後,我還沒有看到它獲取調用(我認爲是預期的行爲)。

的onMessage接受也被要求第一個通知,然後它永遠不會被調用關閉:

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Log.d("FCM", "From: " + remoteMessage.getFrom()); 

    if (remoteMessage.getNotification() != null) { 
     Log.d("FCM", "Notification Message Body: " + remoteMessage.getNotification().getBody()); 
     sendNotification(remoteMessage.getNotification().getBody()); 
    } 
} 

更新2: 嘗試使用同一服務器密鑰和令牌擊中FCM的HTTP API,並得到如下回應:

{ 
    "multicast_id": 6286279702096230688, 
    "success": 0, 
    "failure": 1, 
    "canonical_ids": 0, 
    "results": [ 
    { 
     "error": "NotRegistered" 
    } 
    ] 
} 

只是爲了避免交叉問題,這裏有一些細節:

  • Android的工作室:V2.3.1
  • 谷歌播放服務版本:10.0.1
  • 庫包括:核心,數據庫,存儲,通訊 - 一切都具有相同版本的谷歌播放服務10.0.1

更新3:Firebase崩潰,數據庫和存儲在同一個項目中工作(顯示google service.json文件是正確的)。

請幫我解決它。當

+0

測試時,您是否嘗試先卸載並重新安裝應用程序? –

+1

是的!我試過這個。我也嘗試重建緩存,完成包和json文件的更改。 –

+0

我建議你**將google play服務和firebase更新到最新的10.2.4 **。 Firebase仍處於後期測試階段,其許多功能會在更新中得到修復,例如從Firebase 10.0.x到10.2.x,用戶名/照片的更改很麻煩,並且沒有實時顯示-登錄。在與Firebase多次聯繫之後,它已經得到修復。當你的應用程序在後臺運行時,也會調用** onMessageReceived()**。如果您的應用程序已停止,則通知將由默認系統通知處理。 – Nihal

回答

0

這裏是我如何修正。

正如大家所指出的那樣,.json文件的包名可能是這個失敗的主要原因,這裏也是如此,但是有一個轉折點。

我從Firebase下載了.json文件,並假設正確的.json文件正在下載。不幸的是,由於Firebase關於下載文件的一些錯誤,我總是得到我的其他一些項目(firebase應用程序)的.json文件。 在投資下載的文件時,我想出了它,並在.json文件上手動更改軟件包名稱和密鑰。

我建議大家在嘗試其他任何事情之前檢查包含的.json文件,因爲這是此類問題的主要原因。

1

登記令牌可以改變:

  • 該應用程序將刪除實例ID
  • 該應用新的設備
  • 用戶卸載上還原/重新安裝該應用
  • 用戶清除應用程序數據。

可以看到文檔here

,你可以閱讀here也對FCM錯誤 發生這種情況的調試模式只有這樣你就可以在你的發射活動調用這個方法,這將接受測試的HTTPS證書/ Development服務器,因爲HTTPS證書無效/不可信 在發行版中,它將會正常。

private void RegisterFireBase() 
     { 

if (BuildConfig.DEBUG) {  
      Task.Run(() => 
      { 
       var instanceId = FirebaseInstanceId.Instance; 
       instanceId.DeleteInstanceId(); 
       Android.Util.Log.Debug("TAG", "{0} {1}", instanceId?.Token?.ToString(), instanceId.GetToken(GetString(Resource.String.gcm_defaultSenderId), Firebase.Messaging.FirebaseMessaging.InstanceIdScope)); 

      }); 


      ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true; 



     } 
0

FCM與GCM相反。

在使用GCM類時,TokenID每時每刻都會刷新,然後這就是爲什麼它也在服務器上的數據庫中更新。

使用FCM時。 FCM基礎架構適用於唯一的TokenID,這是onTokenRefresh不會多次調用的原因。它只調用一次。

你所要做的只是保存你的INITIALLY生成的TokenID並相應地使用它。

P.S:在FCM令牌中不會刷新,除非應用程序已重新安裝。

+0

只是爲了通知你,我在我的數據庫中保存了令牌ID,並且當我發送通知時,它對第一次通知起作用,然後在所有後續通知之後,它會顯示我上面提到的錯誤。 –

1

我記得以前面臨類似的問題。這是我做的,對我來說工作順利。希望這會有所幫助,

PreferenceStore是一個幫助類,用於保存,編輯和刪除共享首選項。

@Override 
public void onTokenRefresh() { 
    String token = FirebaseInstanceId.getInstance().getToken(); 
    Log.i(TAG, "New FCM Token: " + token); 

    setup_flag = PreferenceStore.getBoolean(getApplicationContext(), PrefKeys.IS_FIRST_FCM_TOKEN); 
    if (!setup_flag) { 
     // save token and boolean value in shared preferences for 
     // the first time you run the app after install 
     PreferenceStore.saveString(getApplicationContext(), "FCM_TOKEN", token); 
     PreferenceStore.saveBoolean(getApplicationContext(), "IS_FIRST_FCM_TOKEN", true); 
    } else { 
     // other time your app loads, update the token (like call the API endpoint). 
    } 
} 
相關問題