请问为什么苹果官方Demo检测不到设备的进入或退出状态?

您好,我用苹果官方的AirLocate Demo注册UUID,我试用了一个微信的UUID,前台可以扫描到该Beacon,但退到后台,不回调进入或退出事件,我用了一个自定义的UUID,随机生成的,就走进入或退出事件,请问这是为什么?很奇怪

用startMonitorRegion相关的方法试试

偶尔出现一次,很不准确。麻烦我再咨询两个问题:1、比如我们的门店都是用微信的UUID,major与minor不同,初始化的时候也就只初始化微信的UUID,当走到一个门店的时候,回调进入事件,比如这个门店中有10个beacon,都通过major与minor区分,当走到每一个beacon的时候,都回调进入方法,这就得在进入startRange方法中将获取的beacon都进行startMonitorRegion?

2、如果相邻有两个门店,我在临近其中一个门店时回调了进入方法,此时我离另一个门店也很近,那这时是不是就不会重复回调进入方法了?只有我离开第一个门店之后,回调离开方法之后,才会回调第二个门店的进入方法?

  1. 这个没看明白
  2. 第二个门店也会调用,如果Region的构成不一样的话

都是startMonitorRegion的微信的UUID,第二个也会调用么?

你直接贴代码吧,更能说明问题。看看你怎么构建的Region

第一个问题的意思是:比如我走到一个门店附近,提示我欢迎光临之类的,进入门店之后,该门店有10个beacon,走到每个beacon周围都提示我一条相应消息。这种情况下改如何处理?

if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
{
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
}

[[NSUserDefaults standardUserDefaults] setObject:WinXinUUID forKey:@"WXUUID"];
[[NSUserDefaults standardUserDefaults] synchronize];

_beacons = [[NSMutableDictionary alloc] init];
_rangedRegions = [NSMutableArray array];
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager requestAlwaysAuthorization];
_locationManager.activityType = CLActivityTypeFitness;
_locationManager.distanceFilter = kCLDistanceFilterNone;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;

NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:WinXinUUID];
_region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:[uuid UUIDString]];
_region.notifyOnEntry = YES;
_region.notifyOnExit = YES;
_region.notifyEntryStateOnDisplay = YES;
[_rangedRegions addObject:_region];

[_locationManager startMonitoringForRegion:_region];
[_locationManager requestStateForRegion:_region];

我把UUID换成我自定义的一个UUID,进入和退出回调都能准确提示,但把UUID换成微信的UUID(FDA50693-A4E2-4FB1-AFCF-C6EB07647825)都不走进入和回调方法

你测试的时候,最好先走出微信UUID的这个beacon的范围,远一点。然后再走回来,看看能不能触发回调,这个跟哪种UUID是没有关系的

你区分一下两种监控方法:

  1. startMonitorRegion,可以在后台运行,但是监控的颗粒度比较粗,可以获得didEnter和didExit事件。
  2. startRange, 只能在前台运行。可以获得具体的CLBeacon对象,比如具体的UUID/major/minor

你得根据实际情况来处理

这种情况下该门店的10个beacon都得注册一个region吧,才可以回调进入或退出方法吧,不过初始化region的时候,可以使用初始化 UUID major minor的初始化方法- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major minor:(CLBeaconMinorValue)minor identifier:(NSString *)identifier;应该是这样吧?

是的,请注意identifier要各不相同

恩,很奇怪,我在办公室拿着beacon设备(微信UUID),就是检测不到进入退出,其他的都可以,拿着这个beacon去外面街上,就恢复了,每次都能检测到进入退出很准确。吃完饭一回来,就又检测不到了,难道是公司的微信Beacon太多了?这也太奇怪了

因为你周围微信uuid的beacon比较多。startMonitoringForRegion的时候只传了uuid,所以enter,exit就会比较难出现。你可以试着把startMonitoringForRegion 时候region初始化 用
- (instancetype)initWithProximityUUID:(NSUUID *)proximityUUID major:(CLBeaconMajorValue)major minor:(CLBeaconMinorValue)minor identifier:(NSString *)identifier;
确保周围uuid,major,minor的该beacon就这一个。

恩,这样应该是可行的,但比如一个商户有不止一个beacon,空间越大,beacon可能就越多,那这样应该就会影响到达商户附近,对用户的提示通知了

startMonitoringForRegion 的个数应该也有取舍的,如果太多,推送多了用户也会反感,苹果建议是大多数时候用range去处理。

恩对,一般range是在enter或exit中进行调用的,如果商户中beacon很多,用户到达商户附近,检测不到enter或exit方法,也就不能调用range进行通知了,这样肯定会受影响的吧

range可以在app处于激活状态时跳用,一般情况下,进入商场时候Monitoring通知一下用户,让用户主动打开app,从而进行操作。微信摇一摇不就是range的么。太多的Monitoring其实是不太友好的。

但这样就做不到,比如走到某个展台,就推送响应的介绍之类的,只有Monitoring才能够做到这点吧,range只能扫描,无法获得区域

range可以的到距离,你自己可以设定距离推送么。