我遇到了一个涉及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问题,有人可以启发我吗?
答案 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。