[英]Firebase: How to clear specific data from firebase when user kill app?
我有一個使用firebase數據庫的應用程序,我想在用戶殺死應用程序時清除名為current_venue
特定用戶字段,為此,我正在使用AppDelegate
方法applicationWillTerminate
,實際上是在我殺死應用程序時調用,但沒有完全取消。
以下是我在AppDelegate
代碼:
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
WebServiceAPI.checkOutVenue()
}
另一種方法是:
static func checkOutVenue() {
WebServiceAPI.sharedInstance.current_venue = ""
if WebServiceAPI.sharedInstance.user == nil {
return
}
let user = WebServiceAPI.sharedInstance.user!
let ref = FIRDatabase.database().reference()
ref.child("Clients").child(user.uid).child("current_venue").setValue("") { (err, venueIdRef) in
if err == nil {
WebServiceAPI.sharedInstance.current_venue = ""
}
}
}
我嘗試調試它,如下圖所示:
當我殺死應用程序斷點1和2時,但它從未到達斷點3。
我從以下位置閱讀文檔:
https://developer.apple.com/reference/uikit/uiapplicationdelegate/1623111-applicationwillterminate
其中說:
此方法的實現大約需要五秒鍾來執行任何任務並返回。 如果該方法在時間到期之前沒有返回,則系統可能會完全終止該過程。
實際上,從firebase清除該字段所需的時間不超過5秒。
打開應用程序時,相同的代碼工作正常。
因此我的代碼運行正常,但是在終止應用程序時卻缺少一些東西。
謝謝你的幫助。
確保用戶斷開連接時清理數據的更好方法是使用onDisconnect
處理程序。 Firebase文檔對它們進行了解釋 ,但這是一個簡單的示例,說明了如何使用它:
ref.child("Clients")
.child(user.uid)
.child("current_venue")
.onDisconnectRemoveValue()
執行此代碼后,客戶端斷開連接時,指令將發送到服務器以刪除節點。 這意味着它將始終運行,即使客戶端(甚至電話)崩潰並且客戶端代碼永遠也沒有機會執行。
在applicationWillTerminat中有一個異步任務不是最好的方法 ,因為您有5秒鍾的時間來確保根據Internet連接強度的異步任務應完成其執行(對於您來說,對於普通用戶而言,這可能需要不到5秒鍾的時間)這可能會花費更多),否則該進程將被終止。
正如我在評論部分中提到的,即使您完成了這項工作,您也沒有想到過另一種情況:
如果用戶首先將應用切換到后台,然后嘗試終止應用,則不會調用applicationWillTerminate。
您正在嘗試理論上不可能的事情
嘗試考慮這樣的事情:
func applicationDidEnterBackground(_ application: UIApplication) {
WebServiceAPI.checkOutVenue()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.