未调用 Cordova 插件回调 (iOS)

Posted

技术标签:

【中文标题】未调用 Cordova 插件回调 (iOS)【英文标题】:Cordova plugin callback not being called (iOS) 【发布时间】:2017-01-25 20:16:46 【问题描述】:

我正在为 ios 开发一个 Cordova 插件。我的“plugin.js”中有一个方法,我只从我的应用程序(javascript)调用一次,开始监听来自本机部分的回调。调用此方法时,我将 callbackId 存储在 Objective-C 类中,并希望稍后发送回调(可能有多个回调),因此我使用存储的 callbackId 发送 CDVPluginResult,并将 'keepCallback' 设置为 true .但是回调永远不会到达'plugin.js',因此不会到达应用程序。

Objective-C 方法一(即监听部分):

- (void)listenForNews:(CDVInvokedUrlCommand *)command

   self.storedCallbackId = command.callbackId;
   ...

Objective-C Method 2(即异步调用多次的方法)

- (void)onNewsReceived

   CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
   [pluginResult setKeepCallbackAsBool:YES];
   [self.commandDelegate sendPluginResult:pluginResult callbackId:self.storedCallbackId];

我已验证“storedCallbackId”已正确存储和读取。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我做了类似以下in my plugin 的操作,它可以工作,所以试一试:

- (void)listenForNews:(CDVInvokedUrlCommand *)command

   self.storedCallbackId = command.callbackId;
   ...
   CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_NO_RESULT];
   [pluginResult setKeepCallback:[NSNumber numberWithBool:YES]];
   [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];


- (void)onNewsReceived

   CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
   [pluginResult setKeepCallback:[NSNumber numberWithBool:YES]];
   [self.commandDelegate sendPluginResult:pluginResult callbackId:self.storedCallbackId];

【讨论】:

感谢@DaveAlden。我们可以解决这个问题。最后是插件类的多个实例的问题,这导致 Cordova 失去了回调(当然)。 谢谢!我能够在我一直在研究的 Swift 插件中实现这一点。这是我让它工作所需的最后一小部分!我很感激你。 我实现了相同的,但回调仅第一次到达 .js 文件。对于下一个委托方法调用,它不再调用。请帮忙。

以上是关于未调用 Cordova 插件回调 (iOS)的主要内容,如果未能解决你的问题,请参考以下文章

来自 Cordova iOS 插件的后续回调不会触发

Cordova 插件从本机函数获取异步响应

Cordova:如何编写可以重复调用 Javascript 回调的本机插件?

Cordova 文件插件 FileReader.readAsText 得到错误但不调用错误回调

如何获取对我的 Cordova iOS 插件实例的引用?

Cordova SocialSharing 插件 - Facebook 回调错误