我遇到的问题是,如果我在该区域内启动应用,我的应用将不会触发didEnterRegion事件。如果我在区域外启动应用程序,然后进入该区域,则会触发。如果我在区域内启动应用程序,然后离开该区域,然后重新进入该区域,它将触发。
如果该应用程序在该地区打开,如果有关如何启动它的任何建议将非常感谢!
答案 0 :(得分:6)
我建议你使用这段代码
[locationManager requestStateForRegion:region];
使用委托方法didDetermineState:来检查状态是CLRegionStateInside还是CLRegionStateOutside。
答案 1 :(得分:3)
我认为你不能那样做。
但是,您可以获取当前位置并检查它是否在您自己指定的区域内。 CLCircularRegion
有containsCoordinate:
方法。
答案 2 :(得分:2)
第一个结论是didEnterRegion
与其名称一致地实施。 :)
在CLLocationManagerDelegate
:
- (void) locationManager: (CLLocationManager *) manager
didStartMonitoringForRegion: (CLRegion *) region
{
if ([self insideRegion: region location: manager.location])
[self locationManager: manager
didEnterRegion: region];
}
答案 3 :(得分:2)
来自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];
}