2016-10-19 57 views
6

我試圖通過Node.js服務器在我的Android應用中實現Firebase雲消息傳遞,並且遇到了一個用例。處理FCM設備組的刷新令牌

我看到了使用註冊令牌創建設備組的Firebase教程,它向使用相同用戶登錄的所有設備發送消息/通知,但我不明白當註冊令牌之一被刷新時會發生什麼onTokenRefresh()方法。

我將如何區分要更改哪個標記,因爲所有標記都屬於同一用戶?

更新:

好了,現在我已經得到了另一個阻塞使用情況stucked。我從我的服務器創建用戶組標識的用戶組。如果用戶立即卸載並重新安裝應用程序,並且其他用戶在設備上登錄,如果我在前一個用戶組上調用gcm消息,則該設備仍會接收該消息。

有沒有什麼辦法可以讓gcm識別它發送通知的設備是否已登錄,如果是,是否與組中的用戶登錄?

回答

4

所以我一直在考慮如何去與這種情況。首先,讓我們把在情況下,當onRefreshToken()叫做:

這將不會被調用非常頻繁,則需要密鑰輪換和處理實例ID的變化,由於:

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

猜測與,你可以說,「onTokenRefresh()`將一前一後上述情況,如果該設備是在線(當然它必須是在爲了得到一個新的在線名爲代幣)。所以我想這是我怎麼去的場景:

首先,註冊後,我會保存註冊令牌,並沿着另一個標識符,讓我們說一個deviceId(,因爲我們處於一個用戶在我的應用服務器中有多個設備)。

因此,假設我添加了3個註冊令牌,這些令牌也與他們的deviceId配對。我將它們全部添加到設備組中。

現在說其中一個設備觸發onTokenRefresh(),我會立即向我的應用服務器發送一個刪除請求,用於當前與該deviceId配對的註冊令牌(您也應該在任何設備組中刪除它)連接到),將其替換爲新的,然後將其重新添加到相應的設備組中。

這是我能想到的最簡單的方法。這裏的關鍵是讓您將註冊令牌與另一個標識符配對,並使用它來查找您需要替換的註冊令牌。

+1

@ AL.Could你讓我知道你用作deviceId嗎? – amarok

+0

@amarok我也有這個問題。看到這個:對於Web - https://stackoverflow.com/a/10747/3114383爲android:https://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId或https://開發人員。 android.com/reference/android/net/wifi/WifiInfo.html#getMacAddress – CantThinkOfAnything

0

現在我使用這種方法。在我的數據庫中,我創建的設備ID

deviceId: { 
    uid1: deviceId, 
    uid2: deviceId, 
    uid3: deviceId 
} 

與訂閱收到通知

newsSubscriber: { 
    uid1: [array of subscribers], 
    uid2: [array of subscribers], 
    uid3: [array of subscribers] 
} 

時,我可以通過我的NodeJS腳本發送通知的用戶的另一個節點的節點我得到的所有用戶保存在newsSubscriber節點中,並且對於任何用戶,我獲取他的deviceId並將其放入設備數組中以發送通知。 只有一個問題,我現在看到,在這種模式下有一個限制只有20個設備

但我認爲這是一個很好的方法來爲任何用戶提供相應的deviceId,因爲當我在應用程序中使用註銷或登錄時,我可以更改任何用戶的通訊錄deviceId,以便用戶和設備。

如果繞過20臺設備的限制,我發送同樣的通知到20臺設備的不同組會發生什麼情況?