iPhone4S 在 Beacon 检测中的奇怪行为

Posted

技术标签:

【中文标题】iPhone4S 在 Beacon 检测中的奇怪行为【英文标题】:iPhone4S strange behavior at Beacon detection 【发布时间】:2014-06-16 07:39:18 【问题描述】:

我正在开发包含 ibeacon 检测的应用程序。 但是,当设备在后台接收到 B 之后的信标 A 时,什么都没有发生。

条件 1. iPhone4S(iPhone5 没问题) 2. 应用在后台 3. 检测到另一个信标后(BeaconRegion 与另一个不同)。 有人能帮我吗?任何建议将不胜感激。

感谢您的回复。 进入 Beacon A(第二个)区域比进入 Beacon B(第一个)区域延迟了大约 30 秒,我等待了大约 20 秒,等待“Beacon A”触发的 LocalNotification。 (Beacon-A区和Beacon-B区部分重叠,我在重叠区等待。)

这是一段代码。

- (void)startBeaconMonitoring

    if ([CLLocationManager respondsToSelector:@selector(isMonitoringAvailableForClass:)] && [CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]] && !self.locationManager) 
        self.locationManager = [CLLocationManager new];
        self.locationManager.delegate = self;

        _storeUUID = [[NSUUID alloc] initWithUUIDString:@"MY UUID HERE"];
        CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:_storeUUID major:CENSOR_TYPE_A  identifier:@"MY ID1"];
        region.notifyOnExit  = YES;
        region.notifyOnEntry = YES;

        CLBeaconRegion *region2 = [[CLBeaconRegion alloc] initWithProximityUUID:_storeUUID major:CENSOR_TYPE_B identifier:@"MY ID2"];
        region.notifyOnExit  = YES;
        region.notifyOnEntry = YES;

        [self.locationManager startMonitoringForRegion:region];
        [self.locationManager startMonitoringForRegion:region2];
    


# pragma CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region

    [self.locationManager requestStateForRegion:region];


- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region

    if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) 
        CLBeaconRegion *beacon = (CLBeaconRegion*)region;
        [self.locationManager startRangingBeaconsInRegion:beacon];
    


- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region

    switch (state) 
        case CLRegionStateInside:
            if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) 
                CLBeaconRegion *beacon = (CLBeaconRegion*)region;
                int major = [beacon.major intValue];
                [self.locationManager startRangingBeaconsInRegion:beacon];
            
            break;
        case CLRegionStateOutside:
        case CLRegionStateUnknown:
        default:
            break;
    


- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region

    if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) 
        [self.locationManager stopRangingBeaconsInRegion:(CLBeaconRegion *)region];
    


- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

    switch (status) 
        case kCLAuthorizationStatusAuthorized:
            if (_locationDisabled) 
                _locationDisabled = NO;
                self.locationManager = nil;
                [self startBeaconMonitoring];
            
            break;
        case kCLAuthorizationStatusRestricted:
        case kCLAuthorizationStatusNotDetermined:
            break;
        case kCLAuthorizationStatusDenied:
            _locationDisabled = YES;
            break;
        default:
            break;
    


- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region

    if (beacons.count > 0 && !_regionExit) 
        for (CLBeacon *beacon in beacons) 
            if ([beacon.proximityUUID.UUIDString isEqualToString:_storeUUID.UUIDString]) 
                NSString *censorType = [NSString stringWithFormat:@"%@", beacon.major];
                if ([censorType intValue] == CENSOR_TYPE_A) 
                    // DO ACTION A
                 else if ([censorType intValue] == CENSOR_TYPE_B) 
                    // DO ACTION B
                
            
        
    

【问题讨论】:

您应该发布一些检测代码 除了显示你的代码之外,能否请你告诉我们在iPhone 5上检测到每个信标需要多长时间,以及你在4s上等待多长时间? 如果您已经在该地区,您有什么需要处理的吗?当您开始在 didEnterRegion 中测距信标时。 是的。在 didDetermineState 中,如果状态为“CLRegionStateInside”,则开始测距信标。(您可以在我上面编写的代码中看到它。) 【参考方案1】:

ios 8 上的 iPhone4s 似乎在检测背景中的快速区域变化方面存在问题。我的测试表明,如果您松开第一个区域超过 1 分钟并进入新区域,则会立即检测到它。但是,如果您松开区域不到 1 分钟,iPhone 4s 将无法识别它,您将不得不等待(大约 15 分钟)进行完整的蓝牙扫描才能注意到它。我做了解决方法,在丢失第一个区域 60 秒后开始测距,如果我将在 60 秒内进入下一个信标,测距会检测到它。

【讨论】:

我还发现 iPhone4 手机的行为非常奇怪,而不是 iPhone5 或 6 ***.com/questions/27380241/…

以上是关于iPhone4S 在 Beacon 检测中的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 休眠时无法检测到 Beacon 设备。(进入后台)

在 iOS 8 Beacon 中未检测到

使用 android-beacon-library 检测蓝牙设备

如何在后台将检测到的 Beacon 信息的详细信息发送到服务器?

使用android-beacon-library检测蓝牙设备

如何检测iphone4s [重复]