iOS Cordova:当Cordova多次调用时,Cordova会创build多个Objective-C插件实例吗?

我正在开发基于Cordova的iOS混合应用程序。 我们有一个Objective-C插件文件(MyPlugin.h和MyPlugin.m),它通常是CDVPlugin的一个子类。

我们从下面的JavaScript文件中调用Objective-C插件。

cordova.exec(success, error, "MyPlugin", "callNativeActivity", args); 

在这里, 成功callback函数,错误callback函数和参数的参数数组。

以下是原生插件方法签名。

 -(void)callNativeActivity:(CDVInvokedUrlCommand *)cdvCommand; 

我们在插件类中asynchronous启动一个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]; } 

很less有这样的情况,我们需要从JavaScript中同时调用插件(而不是等待插件类的响应)。

如果我们多次称呼cordova,cordova如何处理。 它会搞乱我回发给JavaScript的回应吗? 我知道cordova有不同的callbackID发送插件结果。 但是,有没有机会将我的回复发送给错误的实例呢?

希望我的问题是明确的! 任何build议将不胜感激。

从规格插件初始化和生命周期 :

一个插件对象的实例是为每个UIWebView的生命创build的。 插件通常是在第一次被JavaScript调用引用时实例化的。 否则,可以通过在config.xml文件中将名为onload的param设置为true来实例化它们。

这意味着,每个CordovaApp / WebView只有一个插件实例。

通过ID正确处理callback。

这样工作(不确定实际的实现):

  • 每次调用cordova.exec(...)都会生成一个callbackID。
  • 应用程序映射到callback[ID] = {成功,错误}
  • 你的本地代码调用成功(ID),成功将被调用
  • 在调用onSuccess或onError之后,callback[ID]被设置为null

在现实世界中,也可能有某种进度监听器,但也应该使用正确的callbackID。