在applicationWillTerminate中调用云函数

时间:2020-03-13 03:47:49

标签: ios swift firebase firebase-realtime-database google-cloud-functions

当应用程序将要关闭时,我想从实时数据库中删除一些数据。

我定义了这样的函数(稍后将向其添加逻辑):

exports.removeAllAssignedTeams = functions.https.onCall((data, context) => {
  const judgeId = data.judgeId;
  console.log("Will unassign all teams assigned to judge id: ", judgeId);
});

我正在从我的应用程序代表处调用它:

func applicationWillTerminate(_ application: UIApplication) {
    print("Application will terminate")
    functions.httpsCallable("removeAllAssignedTeams").call(["judgeId": getUserPhoneNumber()]) { (_, _) in }
}

但是在我的云功能控制台中,我从未看到任何有关此功能的日志,甚至没有任何迹象表明该功能已开始执行。我在做什么错了?

2 个答案:

答案 0 :(得分:1)

我怀疑您没有做错任何事情。在请求真正到达函数之前,应用程序终止的可能性更大。根据{{​​3}}:

您实现此方法大约需要五秒钟 执行任何任务并返回。如果该方法之前未返回 时间到期,系统可能会完全终止该进程。

我建议在applicationWillTerminate之外测试您的代码,以查看其是否按您期望的方式工作。如果是这样,那么您可以假设在该过程终止之前,该函数的调用尚未及时完成。

还要记住,调用可调用函数是异步的,call()将在收到结果之前立即返回。因此,您的实现将立即返回,这很可能向iOS发出信号,表明您已完成工作。即使您设法在调用完成之前阻止实现,也可能在大约5秒钟用完之前就无法完成。

答案 1 :(得分:0)

如果要在用户断开连接时从实时数据库中删除数据,请考虑using an onDisconnect handler。使用这种处理程序,服务器将在检测到客户端消失时删除数据。这可能需要几分钟(取决于应用程序的关闭方式),但通常比在应用程序关闭时尝试进行任何网络调用更为可靠,因为当您执行操作时,相关指示会立即发送到服务器致电onDisconnect

如果您使用的是onDisconnect处理程序,那么您在applicationWillTerminate中可以做什么 是通过告诉{{3 }}。尽管这也有可能不起作用,但在那种情况下,服务器仍会在几分钟后检测到客户端已消失,而在脱机呼叫通过的情况下,onDisconnect处理程序将立即执行。

如果删除数据的代码很复杂,请考虑使用onDisconnect处理程序删除数据库中的简单值。然后,通过将Cloud Function附加到该简单值的去除上,当服务器检测到客户端消失时,Cloud Functions代码将运行。