(Kontakt.io) iBeacon didEnterRegion 没有被解雇

Posted

技术标签:

【中文标题】(Kontakt.io) iBeacon didEnterRegion 没有被解雇【英文标题】:(Kontakt.io) iBeacon didEnterRegion not fired 【发布时间】:2014-05-28 23:06:34 【问题描述】:

我有三个全新的 Kontakt.io 信标,并使用this tutorial 和它的source 尝试用我的 iPhone 4s 识别它们。我所做的只是更改 UUID(所有 Kontakt.io 信标从一开始就具有相同的 UUID)并添加一些代码:

此行应该强制应用检查它是否已经在该区域中

[self.locationManager requestStateForRegion:self.myBeaconRegion];

这些行应该检查系统是否以正确的方式设置:

NSArray *locationServicesAuthStatuses = @[@"Not determined",@"Restricted",@"Denied",@"Authorized"];
NSArray *backgroundRefreshAuthStatuses = @[@"Restricted",@"Denied",@"Available"];

BOOL monitoringAvailable = [CLLocationManager isMonitoringAvailableForClass:[self.myBeaconRegion class]];
NSLog(@"Monitoring available: %@", [NSNumber numberWithBool:monitoringAvailable]);

int lsAuth = (int)[CLLocationManager authorizationStatus];
NSLog(@"Location services authorization status: %@", [locationServicesAuthStatuses objectAtIndex:lsAuth]);

int brAuth = (int)[[UIApplication sharedApplication] backgroundRefreshStatus];
NSLog(@"Background refresh authorization status: %@", [backgroundRefreshAuthStatuses objectAtIndex:brAuth]);

当我启动应用程序时,我的手机旁边有 iBeacons,didEnterRegion 不会被触发。此外,当我取出电池并将它们放回原处时(模拟超出范围并重新进入),没有任何反应。当我使用真正的 iBeacons 时,其他 Github 示例代码对我也不起作用,只有当我使用另一部 iPhone 传输信号时。

这是 ViewController.h:

- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

// Initialize location manager and set ourselves as the delegate
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;

// Create a NSUUID with the same UUID as the broadcasting beacon
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"A77A1B68-49A7-4DBF-914C-760D07FBB87B"];

// Setup a new region with that UUID and same identifier as the broadcasting beacon
self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
                                                         identifier:@"com.appcoda.testregion"];

// Tell location manager to start monitoring for the beacon region
[self.locationManager startMonitoringForRegion:self.myBeaconRegion];

// Force app to check if it's already IN the region
[self.locationManager requestStateForRegion:self.myBeaconRegion];

// Check if beacon monitoring is available for this device
if (![CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Monitoring not available" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; [alert show]; return;


NSArray *locationServicesAuthStatuses = @[@"Not determined",@"Restricted",@"Denied",@"Authorized"];
NSArray *backgroundRefreshAuthStatuses = @[@"Restricted",@"Denied",@"Available"];

BOOL monitoringAvailable = [CLLocationManager isMonitoringAvailableForClass:[self.myBeaconRegion class]];
NSLog(@"Monitoring available: %@", [NSNumber numberWithBool:monitoringAvailable]);

int lsAuth = (int)[CLLocationManager authorizationStatus];
NSLog(@"Location services authorization status: %@", [locationServicesAuthStatuses objectAtIndex:lsAuth]);

int brAuth = (int)[[UIApplication sharedApplication] backgroundRefreshStatus];
NSLog(@"Background refresh authorization status: %@", [backgroundRefreshAuthStatuses objectAtIndex:brAuth]);


- (void)didReceiveMemoryWarning

[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.


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

// We entered a region, now start looking for our target beacons!
self.statusLabel.text = @"Finding beacons.";
[self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion];


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

// Exited the region
self.statusLabel.text = @"None found.";
[self.locationManager stopRangingBeaconsInRegion:self.myBeaconRegion];


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

// Beacon found!
self.statusLabel.text = @"Beacon found!";

CLBeacon *foundBeacon = [beacons firstObject];

// You can retrieve the beacon data from its properties
//NSString *uuid = foundBeacon.proximityUUID.UUIDString;
//NSString *major = [NSString stringWithFormat:@"%@", foundBeacon.major];
//NSString *minor = [NSString stringWithFormat:@"%@", foundBeacon.minor];

这是 NSLog 输出:

2014-05-29 00:49:19.951 BeaconReceiver[2803:60b] Monitoring available: 1
2014-05-29 00:49:19.967 BeaconReceiver[2803:60b] Location services authorization status: Authorized
2014-05-29 00:49:20.109 BeaconReceiver[2803:60b] Background refresh authorization status: Available

非常感谢您的帮助!!

【问题讨论】:

【参考方案1】:

首先,验证您是否可以使用现成的应用程序(例如 Locate for iBeacon)检测信标:https://itunes.apple.com/us/app/locate-for-ibeacon/id738709014?mt=8。它将验证信标是否正常工作,并且 UUID 是否已配置为您所期望的。

一旦您确定信标可以与您的设备配合使用,然后开始对您的代码进行故障排除。

编辑:还要确保在测试前重新启动手机,以防止已知的 ios 7.1 错误;:https://***.com/a/22949187/1461050

【讨论】:

我忘了提到我显然检查了 Kontakt.io 应用程序,它立即识别了信标。然而,我尝试使用“Locate for iBeacon”并输入了上面提到的 UUID,但没有任何显示。我还有一个 Estimote 信标,我无法通过“Locate for iBeacon”应用程序找到它,尽管它们的 UUID 也是标准化的。然而,当我尝试BLExplr 时,所有信标都完美显示,但该应用程序仅显示蓝牙服务 UUID,而不显示 iBeacon Proximity UUID。所以我的手机理论上可以找到它 我是 Locate for iBeacon 的作者,所以我可以告诉你,该应用程序是一个非常简单的 CoreLocation API 包装器。如果您没有看到该应用程序的信标,我强烈怀疑正在传输的 UUID 未配置。如果您认为您可能没有正确的 UUID,您可以在 android 上尝试相同的应用程序(如果您有 Android 设备)或我们的适用于 Mac 的 ScanBeacon 产品,因为这些允许在不输入匹配 UUID 的情况下检测 iBeacon。最后说明:请参阅我关于重新启动的编辑。 哇,这似乎是 iOS 7.1 的错误,重启后它运行良好。谢谢!

以上是关于(Kontakt.io) iBeacon didEnterRegion 没有被解雇的主要内容,如果未能解决你的问题,请参考以下文章

稳定 iBeacons 上的 rssi

来自蓝牙信标的信号强度不一致 - Kontakt.io

ibeacon相关:锁屏和home键双击左下角显示的应用图标,在ios 10上消失

如何在openpgp JS中将参数消息作为文本传递

如何通过网络管理蓝牙信标?

iBeacon 监控不适用于 Cordova-plugin-ibeacon