Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Subsequent callbacks from a Cordova iOS plugin don't fire

I have troubles with firing immediately subsequent callbacks from a cordova plugin (an iOS one). In XCode debugger I clearly see it steps over

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

several times (in immediate succession), each time with a slightly different pluginResult. That gets triggered by

[locationManager requestStateForRegion:region];

which I don't (and can't) control.

The problem is, on the Javascript side, the callback gets fired only once.

What's (actually not so) strange is that if I introduce some blocking in that callback, like alert(), the callback gets fired several times (as expected). That's cool but I don't need any alert() in the app.

If I understand it, the commandDelegate should take care of threading and queueing, but it seems like it doesn't. The question is, how to get the JS callback fired each time sendPluginResult gets called.

Many thanks!

like image 799
meandre Avatar asked Jul 16 '14 09:07

meandre


1 Answers

So, the issue wasn't in threading/queueing.

It turned out that you are allowed to use a callbackId only once unless you tell Cordova not to cleanup that callbackId by setting CDVPluginResult.keepCallback to true. Pay attention that keepCallback isn't a BOOL property, so you may need to call [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];

What messes things up is that if you introduce a blocking call like alert() in that callback, Cordova will let you make multiple successive sendPluginResult with the same callbackId.

Keep in mind that you may need to sendPluginResult with a CDVPluginResult which keepCallback is false to release the callbackId that you don't need anymore.

like image 176
meandre Avatar answered Nov 09 '22 20:11

meandre