我做了什么:-
我正在使用Gimbal beacons,并使用"angular js+ionic+cordova">创建一个混合应用程序。我的应用程序运行良好,但信标进入和退出在前台和后台都花费了太长时间。我该如何解决此问题?我在下面附上我的代码片段:
步骤:-
-
首先,我使用cordova 从angular呼叫代表
-
我的iOS委派方法被调用,但经过长时间延迟
didEnterRegion-在10秒后调用
didExitRegion-在20-30秒后调用
我已设置万向节传输间隔(MS(-100
我的代码片段:-
Angular js片段:
// Request permission from user to access location info.
cordova.plugins.locationManager.requestAlwaysAuthorization();
// Create delegate object that holds beacon callback functions.
var delegate = new cordova.plugins.locationManager.Delegate();
console.log(delegate)
cordova.plugins.locationManager.setDelegate(delegate);
// Set delegate functions.
delegate.didDetermineStateForRegion = onDidDetermineStateForRegion;
delegate.didRangeBeaconsInRegion = onDidRangeBeaconsInRegion;
delegate.didEnterRegion = onDidRangeBeaconsInRegion
iOS代码片段:-
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
[self.queue addOperationWithBlock:^{
[self _handleCallSafely:^CDVPluginResult *(CDVInvokedUrlCommand *command) {
[[self getLogger] debugLog:@"didEnterRegion: %@", region.identifier];
[[self getLogger] debugNotification:@"didEnterRegion: %@", region.identifier];
NSMutableDictionary* dict = [NSMutableDictionary new];
[dict setObject:[self jsCallbackNameForSelector:(_cmd)] forKey:@"eventType"];
[dict setObject:[self mapOfRegion:region] forKey:@"region"];
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dict];
[pluginResult setKeepCallbackAsBool:YES];
return pluginResult;
} :nil :NO :self.delegateCallbackId];
}];
}
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
[self.queue addOperationWithBlock:^{
[self _handleCallSafely:^CDVPluginResult *(CDVInvokedUrlCommand *command) {
[[self getLogger] debugLog:@"didExitRegion: %@", region.identifier];
[[self getLogger] debugNotification:@"didExitRegion: %@", region.identifier];
NSMutableDictionary* dict = [NSMutableDictionary new];
[dict setObject:[self jsCallbackNameForSelector:(_cmd)] forKey:@"eventType"];
[dict setObject:[self mapOfRegion:region] forKey:@"region"];
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dict];
[pluginResult setKeepCallbackAsBool:YES];
return pluginResult;
} :nil :NO :self.delegateCallbackId];
}];
}
我们已经注意到本地iBeacon区域功能的类似行为,尤其是关于didExitRegion。行为似乎因iOS版本和应用程序状态(前台/后台(而异。我个人也注意到了不同设备和代之间的差异,即iPhone 6与旧版iPad mini,后者似乎跳过了一些广播数据包,从而导致延迟。
你使用的是什么iOS版本?你提到的延迟是一致的,还是随着时间的推移,当附近的iBeacons时情况会好转?尤其是较旧的iOS版本更容易出现这种行为(根据我们的测试(。
关于我们如何改进反应时间的一些注意事项:
我们决定做我们自己的实现,使用测距和我们自己的地理围栏比较,模拟进入和离开"区域"。的确,这带来了一些关于地理围栏实现的额外工作,但会产生更好的结果。
显然,当应用程序被暂停并且没有在后台积极运行时,这是有限制的。"定位"背景模式为应用程序进行测距提供了简短的窗口,即使是在后台。背景模式受到苹果的严格监管,因此它需要一个适当的增值理由。
总之,在使用本地iBeacon区域时,可能有一些方法可以改善延迟,但总的来说,如果时间对应用程序至关重要,我建议尝试上面大致解释的替代路线。
披露:我为Proximi.io ProximityPlatform 工作