如何减少信标进入和退出时间的延迟

时间:2016-08-09 15:30:10

标签: ios angularjs cordova ibeacon gimbal

我做了什么: -

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

步骤: -

  1. 首先,我使用cordova

  2. 从角度呼叫代表
  3. 我的iOS委托方法会在长时间延迟后被调用

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

1 个答案:

答案 0 :(得分:1)

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

您使用的iOS版本是什么?您提到的延迟是否一致,或者当附近的iBeacons随着时间的推移变得更好?特别是较旧的iOS版本容易出现这种行为(基于我们的测试)。

关于我们如何改善反应时间的一些注意事项:

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

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

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

披露:我为Proximi.io Proximity Platform工作