保存插件调用
大多数情况下,插件方法被调用执行任务后可以立即完成。但在某些场景中,你需要保持插件调用可用以便后续访问。
概述
在插件方法外部需要持久化插件调用(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()
并按预期返回结果。设置此标志为 true 也意味着桥接层会在方法返回后自动为你调用 saveCall()
。