我创建了一个注册信标区域的应用程序,并使用CLLocationManager
开始监视这些区域CLLocationManager *manager = [[CLLocationManager alloc] init];
manager.delegate = self;
CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:estimoteUUID major:12445 identifier:@"id"];
region.notifyEntryStateOnDisplay = YES;
region.notifyOnEntry = YES;
[manager startMonitoringForRegion:region];
当我从灯塔走得足够远并走回范围时,这很有效。但是,如果我已经在信标区域的范围内启动应用程序,而不仅仅是当我回到边界时,我还希望激活委托方法didEnterRegion
。有没有一种简单的方法来实现这一目标?或者让CLLocationManager认为我们已经离开了信标范围?
另一篇文章说,设置region.notifyEntryStateOnDisplay = YES;
并按下按钮会执行此操作 - 但我还没有这样做(iOS 7.1,iPhone 5S)。
答案 0 :(得分:3)
来自apple的文档:
之后立即开始监测地理区域 注册授权的应用程序。但是,不要指望收到 事件立即发生,因为只有边界交叉产生一个事件。 特别是,如果用户的位置已经在该区域内 在注册时,位置管理员不会自动进行 生成一个事件。相反,您的应用必须等待用户交叉 生成事件并发送到事件之前的区域边界 代表。 检查用户是否已经在边界内 一个区域,使用requestStateForRegion:方法 CLLocationManager类。
所以我最终这样做了:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSDictionary *regionDictionary;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// setup regions in case you have multiple regions
self.regionDictionary = @{@"com.test" : @"2FAE2A83-1634-443B-8A0C-56704F81A181"};
// setup location manager
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
}
[self.locationManager startUpdatingLocation];
//start monitoring for all regions
for (NSString *key in self.regionDictionary.allKeys) {
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:self.regionDictionary[key]] identifier:key];
[self.locationManager startMonitoringForRegion:beaconRegion];
}
}
- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion *)region {
if (region.identifier.length != 0) {
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:self.regionDictionary[region.identifier]] identifier:region.identifier];
[self.locationManager startRangingBeaconsInRegion:beaconRegion];
}
}
- (void)locationManager:(CLLocationManager*)manager didExitRegion:(CLRegion *)region {
if (region.identifier.length != 0) {
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:self.regionDictionary[region.identifier]] identifier:region.identifier];
[self.locationManager stopRangingBeaconsInRegion:beaconRegion];
}
}
- (void)locationManager:(CLLocationManager*)manager didRangeBeacons:(NSArray*)beacons inRegion:(CLBeaconRegion*)region {
// Beacon found!
CLBeacon *foundBeacon = [beacons firstObject];
NSLog(@"UUID:%@; major:%@; minor:%@;", foundBeacon.proximityUUID.UUIDString, foundBeacon.major, foundBeacon.minor);
}
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
if ([region isKindOfClass:[CLBeaconRegion class]] && state == CLRegionStateInside) {
[self locationManager:manager didEnterRegion:region];
}
}
- (void)locationManager:(CLLocationManager *) manager didStartMonitoringForRegion:(CLRegion *) region {
[manager requestStateForRegion:region];
}
答案 1 :(得分:0)
根据用户当前位置计算仪表中的值,其中信标的起点和终点应位于信标完整的无线电中,然后强制调用didEnterRegion或执行您想要执行的任何操作。
答案 2 :(得分:0)
尝试在startMonitoringForeRegion:
之后插入此行:[self.locationManager requestStateForRegion:region];
。