iPhone 4S无法找到iBeacon

时间:2013-12-02 12:34:35

标签: iphone ios7 ibeacon

我遇到了一个涉及iPhone 4S的奇怪问题。我正在开发一个使用iBeacons的应用程序。以下代码是在iPad mini,iPhone 5s和iPhone 4s上运行的代码,但只有iPad和5S能够在遇到iBeacon时做出响应,4S不会做任何事情。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //start ibeacon monitoring mode
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
    [self enableMonitoring];
}

- (void)enableMonitoring
{
    [self initRegion];
    [self locationManager:self.locationManager didStartMonitoringForRegion:self.beaconRegion];
}

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

- (void) initRegion
{
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:UUID]
                                                           identifier:@"iBeacon"];
    [self.locationManager startMonitoringForRegion:self.beaconRegion];
    hasAlerted = NO;
}

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    ST_UNUSED(manager);
    ST_UNUSED(region);
    NSLog(@"Beacon Found");
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    ST_UNUSED(manager);
    ST_UNUSED(region);
    NSLog(@"Left Region");
    [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
}

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    ST_UNUSED(manager);
    ST_UNUSED(region);
    CLBeacon *beacon = [beacons lastObject];

    // stuff gets done here

}

4S可以毫无问题地播放iBeacons,另外2个可以找到它们。

我已经在4S上完成了[CLLocationManager isMonitoringAvailableForClass:[CLBeacon class]][CLLocationManager isRangingAvailable]测试,但它们并没有失败。

如果这只是我们的4S问题,或者一般来说是4S问题,有人可以启发我吗?

4 个答案:

答案 0 :(得分:4)

我不认为你有一个有缺陷的单位,因为我有完全相同的问题! 相同的代码在5S上运行良好,但没有找到使用4S的信标。 结果(看来)4S BLE堆栈的工作方式与5S略有不同。

我编写代码的方式,直到调用“locationManager didDetermineState forRegion”之后才开始测量信标,我确定我实际上是在信标区域内。这在iPhone 5S上运行得很好,而且你没有充分的理由。但是在4S你永远不会得到回调!

但是,如果你提前开始测量:

[locationManager startRangingBeaconsInRegion:beaconRegion];

在“locationManager didStartMonitoringForRegion”回调中,它就像一个冠军!

答案 1 :(得分:2)

我在#4; iPhone4s"中也遇到了同样的问题。 。尽管有蓝牙服务和位置服务,但感觉没有任何信标服务正在工作。

我刚刚重新启动它,它开始工作了。有一会儿,我很开心,因为它现在正在工作,但这个问题到底是什么我仍然无法理解。如果最终用户发生这种情况他将如何知道他需要重新启动他的设备?

答案 2 :(得分:1)

我遇到了与此问题中提到的类似问题: IBeacon region monitoring not work consistently across devices

我发现差异在于设备是否启用了后台刷新。要检查这一点,我使用以下代码段:

if ([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusAvailable) {

    NSLog(@"Background updates are available for the app.");
}else if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusDenied)
{
    NSLog(@"The user explicitly disabled background behavior for this app or for the whole system.");
}else if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusRestricted)
{
    NSLog(@"Background updates are unavailable and the user cannot enable them again. For example, this status can occur when parental controls are in effect for the current user.");
}

在此答案中找到:在iOS 7中检测后台应用程序刷新的用户设置

答案 3 :(得分:0)

听起来你可能有4s缺陷。可以肯定的是,我建议下载Apple的AirLocate演示(来自2013 WWDC)并在所有设备上运行。它将既是灯塔又是“中心”(使用BLE术语),又称信标接收器。

我有2个iPhone 4s',他们非常肯定兼具信标发射器和接收器,我们的第5代iPod touch(4英寸型号)也是如此。可悲的是,我的iPad 2没有。 mini和iPad 3是第一款支持BLE的iPad。