我遇到了一个涉及 iPhone 4S 的奇怪问题。我正在开发一个使用 iBeacons 的应用程序。下面的代码是在iPad mini、iPhone 5s 和iPhone 4s 上运行的,但是只有iPad 和5S 遇到iBeacon 时能够响应,而4S 没有任何 react 。
- (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 问题,谁能启发我?
最佳答案
我不认为您的设备有缺陷,因为我遇到了完全相同的问题!
相同的代码在 5S 上运行良好,但没有找到使用 4S 的信标。
事实证明(似乎)4S BLE 堆栈的工作方式与 5S 略有不同。
按照我编写代码的方式,直到“locationManager didDetermineState forRegion”被调用并且我确定我实际上在信标区域内时,我才开始为信标进行测距。这在 iPhone 5S 上效果很好,而且您无缘无故地不在范围内。但是在 4S 上,您永远不会收到回调!
但是,如果您通过放置更早地开始测距:
[locationManager startRangingBeaconsInRegion:beaconRegion];
在“locationManager didStartMonitoringForRegion”回调中,它就像一个冠军!
关于iphone - iPhone 4S 无法找到 iBeacon,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20328499/