【问题标题】:Update Firebase Document on Application Will Terminate更新应用程序的 Firebase 文档将终止
【发布时间】:2021-03-24 02:30:21
【问题描述】:

当我的应用程序强制被用户终止时,我正在尝试将 API 写入 Firebase。我尝试更新我的 info.plist 以将“应用程序不在前台运行”包括为否,并从 AppDelegate 文件中的 func ApplicationWillEnterBackground 调用我的方法,但我也没有成功。事实上,我无法使用该方法注册任何打印语句。我的打印语句正在 ApplicationWillTerminate 下注册,但我猜应用程序实例在 Firebase 写入发生之前就被杀死了。有谁知道这样做的正确方法?新手来了代码如下:

应用程序委托(不包括默认方法):

protocol ForcedOfflineDelegate {
    func goOffline(_ AppDelegate: AppDelegate)
}

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

   var delegate: ForcedOfflineDelegate?

   func applicationWillTerminate(_ application: UIApplication) {  
        self.delegate?.goOffline(self)
    }

我的视图控制器:

class MyViewController: UIViewController, ForcedOfflineDelegate  {

   override func viewDidLoad() {
        super.viewDidLoad()  
        let appDelegate = AppDelegate()
        appDelegate.delegate = self
    }

    func goOffline(_ AppDelegate: AppDelegate) { 
        // API Call to Firebase etc. etc.    
    }
 }

【问题讨论】:

    标签: swift xcode firebase google-cloud-firestore appdelegate


    【解决方案1】:

    Apple 文档声明applicationWillTerminate

    “您应该使用此方法为您的应用执行任何最终清理任务,例如释放共享资源、保存用户数据和使计时器无效。您的此方法的实现大约有五秒钟的时间来执行任何任务并返回。”

    这意味着,如果您想保存信息,或最后一次调用 firebase,您的应用程序有 5 秒的时间从这条路线完成。如果您需要更多时间,您可以致电 beginBackgroundTask(expirationHandler:)

    applicationDidEnterBackground 方法用于准备应用程序在进入后台后返回。

    要在应用程序被强制关闭时在最后一分钟发布到 firebase,applicationWillTerminate 是您想要的

    【讨论】:

      【解决方案2】:

      从 iOS 13 开始,Apple 引入了 SceneDelegate 所以,AppDelegate 方法不起作用所以需要在 SceneDelegate 文件中编写逻辑。如果项目中有 SceneDelegate 类文件,则使用以下方法。

       func sceneDidDisconnect(_ scene: UIScene) {
      // write your code here.
        }
      

      另外,如果您的项目中没有 SceneDelegate 类文件,那么在您的代码中,您将在视图控制器 viewDidLoad() 方法中创建 AppDelegate 实例,这将不起作用。使用现有的 AppDelegate 共享实例。 在 AppDelegate 文件中创建一个共享实例。

      static let shared = AppDelegate()
      

      然后, 在 viewDidLoad() 方法中。

      AppDelegate.shared.delegate = self
      

      第二个选项是使用 NotificationCenter,因此您不需要使用协议委托模式。 在 viewDidLoad() 方法中添加观察者。

      override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(self.willTerminateNotification), name: UIApplication.willTerminateNotification, object: nil)
      }
      
      // This function will call when the application terminates.
      @objc private func willTerminateNotification() {
           
      }
      

      注意:根据@Jwoodland 的回答,请使用 beginBackgroundTask(expirationHandler:),因为当您调用 firebase API 时,执行此任务需要时间,因此您需要更多时间来更新离线状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 2016-04-07
        • 1970-01-01
        • 2022-10-06
        • 2017-07-30
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多