正在调用applicationWillTerminate中的云函数



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

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

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 }
}

但在我的云函数控制台中,我从未看到该函数的任何日志,甚至没有看到该函数开始执行的指示。我做错了什么?

我怀疑你没有做错什么。更有可能的情况是,在请求真正到达函数之前,应用程序进程就已经终止了。根据应用程序的文档WillTerminate:

此方法的实现大约有五秒钟的时间执行任何任务并返回。如果方法在时间到了,系统可能会完全终止进程。

我建议在applicationWillTerminate之外测试您的代码,看看它是否按您期望的方式工作。如果它完成了,那么您可以假设它只是没有及时完成,以便在进程终止之前调用函数。

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

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

如果使用onDisconnect处理程序,applicationWillTerminate中可以执行的操作是通过调用goOffline()方法主动通知客户端关闭连接。虽然这也有可能不起作用,但在这种情况下,服务器仍会在几分钟后检测到客户端不在了,而在离线调用成功的情况下,onDisconnect处理程序将立即执行。

如果删除数据的代码很复杂,请考虑在数据库中使用onDisconnect处理程序删除一个简单的值。通过将云函数附加到该简单值的删除,当服务器检测到客户端不在时,云函数代码将运行。

相关内容

  • 没有找到相关文章

最新更新