持久化插件调用
大多数情况下,插件方法被调用执行任务后可以立即完成。但有些场景下,您需要保持插件调用处于可用状态以便后续访问。
概述
需要让插件调用(iOS 中的 CAPPluginCall 或 Android 中的 PluginCall)在插件方法之外持久化的两种典型情况:
- 执行异步操作(如网络请求)
- 需要向 JavaScript 环境重复推送更新(如实时地理位置数据流)
这两种情况可能有交集,但存在一个重要区别——核心在于该调用是否需要多次返回数据。Capacitor 桥接层会记录每个从 JavaScript 发起的原生调用,以便在插件返回结果时能正确匹配代码,默认行为是在首次调用 resolve() 或 reject() 后清除相关记录。但如果您的插件方法需要多次调用 resolve(),则需要额外处理。更多关于声明回调方法的信息
单次完成的调用保存
如需保存调用以便未来单次完成,您有两个选择:
- 直接保存在实例变量中
- 使用桥接层提供的方法保存,后续通过
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)
多次完成的调用保存
保存调用用于多次完成意味着:
- 保存原生调用对象(同上)
- 告知桥接层保留记录以便重复调用
resolve()或reject()
通过设置 keepAlive 属性来标记这类调用(3.0 版本前称为 isSaved,重命名后更清晰)
iOS
call.keepAlive = true
Android
call.setKeepAlive(true);
当 keepAlive 为 true 时,可多次调用 resolve() 且结果会正常返回。设置此标志后,桥接层会在方法返回时自动执行 saveCall()。