我想在应用程序即将关闭时从实时数据库中删除一些数据。
我定义了这样的函数(稍后将添加逻辑(:
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
处理程序删除一个简单的值。通过将云函数附加到该简单值的删除,当服务器检测到客户端不在时,云函数代码将运行。