簡體   English   中英

Firebase:當用戶殺死應用程序時,如何從Firebase中清除特定數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM