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

Posted

技术标签:

【中文标题】来自 Cordova iOS 插件的后续回调不会触发【英文标题】:Subsequent callbacks from a Cordova iOS plugin don't fire 【发布时间】:2014-07-16 09:14:39 【问题描述】:

我无法立即从 cordova 插件(ios 插件)触发后续回调。 在 XCode 调试器中,我清楚地看到它跨越了

[self.commandDelegate sendPluginResult:pluginResult callbackId:monitoredRegions.callbackId];

多次(立即连续),每次使用略有不同的pluginResult。 这会触发

[locationManager requestStateForRegion:region];

我没有(也不能)控制。

问题是,在 javascript 端,回调只被触发一次。

奇怪的是(实际上并非如此),如果我在该回调中引入一些阻塞,例如alert(),回调会被触发多次(如预期的那样)。这很酷,但我在应用中不需要任何 alert()

如果我理解的话,commandDelegate 应该负责线程和排队,但它似乎没有。问题是,如何在每次调用sendPluginResult 时触发 JS 回调。

非常感谢!

【问题讨论】:

【参考方案1】:

所以,问题不在于线程/队列。

事实证明,您只能使用一次callbackId除非您通过将CDVPluginResult.keepCallback 设置为true 来告诉Cordova 不要清理callbackId。注意keepCallback 不是BOOL 属性,所以你可能需要调用[pluginResult setKeepCallbackAsBool:YES];

CDVPluginResult* pluginResult = [sendPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:key];
[pluginResult setKeepCallbackAsBool:YES]; // here we tell Cordova not to cleanup the callback id after sendPluginResult()
[self.commandDelegate sendPluginResult:pluginResult callbackId:monitoredRegions.callbackId];

麻烦的是,如果您在该回调中引入像 alert() 这样的阻塞调用,Cordova 将允许您使用相同的 callbackId 进行多个连续的 sendPluginResult

请记住,您可能需要sendPluginResultCDVPluginResult 其中keepCallbackfalse 来释放您不再需要的callbackId

【讨论】:

感谢您解释 setKeepCallback 的作用。我一直在努力解决这种情况。 我有pluginResult.keepCallback = [NSNumber numberWithBool:YES];,但它根本不起作用。我把它改成了[pluginResult setKeepCallbackAsBool:YES];,它神奇地起作用了! 谢谢@meandre,我也遇到了同样的问题

以上是关于来自 Cordova iOS 插件的后续回调不会触发的主要内容,如果未能解决你的问题,请参考以下文章

Cordova SocialSharing 插件 - Facebook 回调错误

来自实例方法的具有静态 void 的 Objective C Cordova 回调

来自 iOS 4.0.0 中 Native 的 Cordova 插件 Javascript 函数调用

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

PhoneGap 插件:从未调用过 AudioEncode 成功回调

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