我正在开发一个基于Cordova的iOS混合应用程序。我们有一个Objective-C插件文件(MyPlugin.h和MyPlugin.m),它通常是CDVPlugin的子类。
我们从JavaScript文件中调用objective-C插件,如下所示。
cordova.exec(success, error, "MyPlugin", "callNativeActivity", args);
这里,success- success回调函数,error-错误回调函数and args-参数数组
下面是本地插件方法签名。
-(void)callNativeActivity:(CDVInvokedUrlCommand *)cdvCommand;
我们正在插件类中异步启动一个NSURLConnection任务。因此,它将等待来自web服务器的响应。响应出现后,我们将其作为CDVPluginResult对象发送回JavaScript。
if (isSuccess) {
CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:jsonPayload];
[self.commandDelegate sendPluginResult:result callbackId:cdvCommand.callbackId];
}else{
CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:jsonPayload];
[self.commandDelegate sendPluginResult:result callbackId:cdvCommand.callbackId];
}
在少数情况下,我们需要从JavaScript同时调用插件多次(不等待插件类的响应)。
如果我们多次调用它,Cordova会如何处理?它会扰乱我发回给JavaScript的响应吗?我知道Cordova有不同的回调ID来发送插件结果。但是,我的响应是否有可能被发送到错误的实例?
希望我的问题是清楚的!!
From specs Plugin Initialization and Lifetime:
每个插件对象的生命周期只创建一个实例UIWebView。插件通常在第一次引用时实例化通过JavaScript调用。否则,它们可以通过实例化在config.xml文件中设置onload参数为true
这意味着每个CordovaApp/WebView只有一个插件实例。
回调由ID正确处理。
它像这样工作(不确定真正的实现):
- 每次呼叫
cordova.exec(...)
,生成一个回叫id。 - 应用程序映射回调[ID]= {success, error}
- 你的本地代码调用onSuccess(ID),成功将被调用
- 调用onSuccess或onError后,回调[ID]被设置为null
在现实世界中,也可以有某种进度侦听器,但它们也应该使用正确的回调id。