来自 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
。
请记住,您可能需要sendPluginResult
和CDVPluginResult
其中keepCallback
是false
来释放您不再需要的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 函数调用