0

我做了什么:-

我正在使用Gimbal 信标并使用"angular js + ionic + cordova"创建一个混合应用程序。我的应用程序运行良好,但信标进入和退出在前台和后台都需要很长时间。我该如何解决这个问题?我在下面附上了我的代码片段:

脚步:-

  1. 首先,我使用科尔多瓦从角度呼叫代表

  2. 我的 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];
    }];
}
4

1 回答 1

1

我们注意到原生 iBeacon 区域功能的类似行为,尤其是关于 didExitRegion。行为似乎因 iOS 版本和应用程序状态(前台/后台)而异。我个人也注意到不同设备和世代之间的差异,即 iPhone 6 与较旧的 iPad mini,这似乎跳过了一些导致延迟的广播数据包。

您使用的是哪个 iOS 版本?你提到的延迟是一致的,还是在 iBeacon 附近时会随着时间的推移而变得更好?尤其是较旧的 iOS 版本更容易出现这种行为(基于我们的测试)。

关于我们如何改进反应时间的一些说明:

我们决定自己实现,使用测距和我们自己的地理围栏比较,模拟进入和退出“区域”。确实,这会带来一些关于地理围栏实施的额外工作,但会产生更好的结果。

显然,当应用程序被挂起并且没有在后台主动运行时,这是有限制的。“位置”后台模式为应用程序提供了简短的窗口来进行测距,即使它在后台也是如此。背景模式受到 Apple 的严格监管,因此需要适当的增值理由。

所以总而言之,在使用原生 iBeacon 区域时可能有一些方法可以改善延迟,但总的来说,如果时间对应用程序至关重要,我建议尝试上面大致解释的替代路线。

披露:我为 Proximi.io 接近平台工作

于 2016-08-10T14:53:20.060 回答