我做了什么:-
我正在使用Gimbal信标,并使用“角度js +离子+科尔多瓦”创建一个混合应用程序。我的应用程序运行良好,但是无论进入前台还是后台,信标进入和退出都花费了很长时间。我该如何解决此问题?我在下面附上我的代码段:
脚步:-
首先,我使用cordova从角度召集代表
我的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 Proximity Platform工作
关于ios - 如何减少信标进入和退出时间的延迟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38854866/