2017-02-10 44 views
1

我有一個系統,其中一個用戶可以登錄到多個設備。用例如下:如何在Firebase中的多個設備上處理同步主題

假設用戶A訂閱來自設備A的天氣主題。此用戶現在將從此主題獲得常規推送消息。

現在假設同一用戶登錄到設備B.該器件還需要得到訂閱天氣的話題,因爲沒有出示擔保,用戶只需要使用設備A.

相同的使用情況可以反向應用於取消訂閱以及兩個以上的設備。

解決此類問題的最佳方法是什麼?

我已經想到的當前方法是:

1)使每個用戶ID下一個節點內火力分貝稱爲訂閱。此節點將在

Topidname的形式已經訂閱數據:布爾issubscribed

這種方法具有附加到該位置在後臺服務的偵聽器。每個具有相同用戶ID的設備將始終收聽相同的位置,從而在大多數情況下解決問題。由於正常的服務生命週期原因,它不能保證完整性。

服務被使用,因爲如果監聽程序僅保留在應用程序的生命週期中,如果用戶從一個設備上的主題取消訂閱並且第二個設備應用程序已關閉,則第二個應用程序將在註冊時繼續接收通知令牌仍然與該主題相關,並且只會在應用重新啓動時取消訂閱。

這裏的服務已經做了START_STICKY,在onCreate中有一個監聽器,並且有一個備用警報設置爲在onDestroy方法中重新啓動服務。因此,這種情況不起作用的唯一情況是應用程序強制停止或由於長時間非連接而使監聽器處於退避模式。

當應用程序啓動時,它也會與位置同步一次,並且會隱藏左側的主題。服務將在退出時停止,並取消所有之前用戶的主題。我已在該位置保留一個keepSynced以確保它保持同步

潛在的問題是 - >強制停止服務中止服務。可能會導致一些內存使用情況。同步可能不是即時的,具體取決於連接丟失的時間以及Firebase與數據庫重新同步需要多長時間。重新同步並在每次服務重新啓動時取消所有主題的覆蓋。

2)這是一個相對比較複雜的方法:

從保存在應用程序服務器的每個用戶實例ID服務的火力令牌。

在每次登出時,不要調用delete iid,而要保留相同的標記,但會覆蓋附加了新登錄的uid的用戶。

在每個訂閱上,使用實例Id服務器api使用所有註冊令牌爲一個用戶批量訂閱主題。

每次用戶使用該設備特定令牌的實例id api逐個退出所有主題的取消訂閱。令牌刷新的過程相同。

對每個主題的取消訂閱做同樣的處理。

這種情況將需要爲所有的主題訂閱或取消訂閱一個同步調用。它還需要令牌在應用服務器中不斷更新。

請建議任何其他更好的方案來解決這個問題。

如果我的情況下有任何瑕疵或需要修改,請建議。我被卡住了,現在無法想到其他任何東西。

回答

1

我假設你正在跟蹤每個令牌對用戶的設備。因此,對於給定用戶,服務器上的代碼應能夠知道如何向其設備發送消息到全部,而不管訂閱。以同樣的方式用戶主題訂閱,你認爲這些主題中的廣播數據的

嘗試思考。當用戶的主題訂閱發生變化時,該事件可能會通過FCM廣播到他們的所有設備,並告訴您的應用程序從您的數據庫中讀取訂閱,並根據需要再次設置訂閱。您的應用只會在用戶請求時喚醒接收通知以更改訂閱。

然後,當談到時間發佈消息的話題,你可以肯定的是所有的檢查在這樣的裝置將接收消息的話題。

熬下來: 1.當用戶的訂閱在您的應用程序改變,通知變化的服務器。 2.在您的服務器中,更新用戶的數據庫訂閱。 3.然後,向所有用戶的設備發送FCM數據消息以重新加載訂閱。 4.當您的應用程序收到該消息時,請從您的數據庫中讀取訂閱更新並相應地更新FCM訂閱。只要需要執行此操作,您的應用就必須安排保持活躍狀態​​。

+0

我以前曾想過這種方法。可能會導致此功能失效的是......假設其中一個用戶設備根本沒有連接到互聯網。他在該設備中收到了100條未傳送的消息。現在每個unsub/sub都會添加一個通知。這增加了100多條未傳送的消息的風險,並且所有這些都消失了。那麼這將是另一個麻煩,同步丟失的消息大聲笑 – Kushan

+0

這不是一個問題。第一個將啓動應用程序(它將建立一個監聽器),然後,如果你已經有一個監聽器,那麼你可以忽略後面的消息。您還可以查看自上次同步以來傳遞的時間量,如果您認爲事情可能過時,則僅處理消息。 –

+0

Touchè我會研究這一點。非常感謝道格..你知道Google是否有創業公司的孵化器嗎?我正在研究一個非常新的概念,這在現實生活中非常有用。我很想幫助它成爲一家有利可圖的公司。 – Kushan

相關問題