保存插件调用
在大多数情况下,插件方法被调用来执行任务并可以立即完成。但有些情况下,你需要保持插件调用可用,以便稍后访问。
概述
你可能需要让插件调用(iOS 上的 CAPPluginCall 或 Android 上的 PluginCall)在插件方法之外持久化,原因有两个:
- 执行异步操作,例如网络请求。
- 向 JavaScript 环境提供重复更新,例如流式传输实时地理定位数据。
这两个原因可能重叠,但有一个重要的区别。具体来说,即调用是否需要多次返回数据。Capacitor bridge 会记录从 JavaScript 到原生端的每次调用,以便在插件返回结果时将结果与正确的代码进行匹配。默认行为是在 resolve() 或 reject() 被调用一次后,清除这些记账信息。但如果你的方法是一个会多次调用 resolve() 的回调函数,则需要额外的步骤。关于如何声明回调的更多信息可以在此处找到。
保存调用以用于单次完成
如果你需要保存一个调用以便在将来完成一次,你有两个选择。一种选择是简单地将其保存在本地实例变量中。第二种是使用 bridge 的方法集来保存它,然后通过 callbackId 稍后检索它。在调用 resolve() 或 reject() 之后,你可以释放调用对象,因为它将不再相关(如果使用了 saveCall(),请不要忘记调用 releaseCall())。
iOS
func saveCall(_ call: CAPPluginCall)
func savedCall(withID: String) -> CAPPluginCall?
func releaseCall(_ call: CAPPluginCall)
func releaseCall(withID: String)
Android
void saveCall(PluginCall call)
PluginCall getSavedCall(String callbackId)
void releaseCall(PluginCall call)
void releaseCall(String callbackId)
保存调用以用于多次完成
保存一个调用以便在将来多次完成,意味着两件事:保存原生调用对象本身(如上所述),以及告诉 bridge 保留其记账信息,以便可以重复调用 resolve() 或 reject()。
要以此方式标记调用,设置其 keepAlive 属性(在 3.0 版本之前称为 isSaved,但已重命名以使行为更清晰)。
iOS
call.keepAlive = true
Android
call.setKeepAlive(true);