我遇到了一个问题,如果我在该区域内启动应用程序,我的应用程序将不会触发 didEnterRegion 事件。如果我在区域外启动应用程序然后进入该区域,它就会触发。如果我在该区域内启动应用程序,然后离开该区域,然后重新进入该区域,它就会触发。
任何有关如何在应用程序打开后立即启动它的建议(如果它在该地区)将不胜感激!
我遇到了一个问题,如果我在该区域内启动应用程序,我的应用程序将不会触发 didEnterRegion 事件。如果我在区域外启动应用程序然后进入该区域,它就会触发。如果我在该区域内启动应用程序,然后离开该区域,然后重新进入该区域,它就会触发。
任何有关如何在应用程序打开后立即启动它的建议(如果它在该地区)将不胜感激!
我建议您使用此代码
[locationManager requestStateForRegion:region];
并使用委托方法 didDetermineState: 来检查状态是 CLRegionStateInside 还是 CLRegionStateOutside。
我不认为你能做到这一点。
但是,您可以获取当前位置并检查它是否在您自己指定的区域内。CLCircularRegion
有一个containsCoordinate:
方法。
从苹果的文档中:
注册授权应用程序后立即开始对地理区域的监控。但是,不要期望立即收到事件,因为只有越界才会产生事件。特别是,如果用户的位置在注册时已经在区域内,则位置管理器不会自动生成事件。相反,您的应用程序必须等待用户跨越区域边界,然后才能生成事件并将其发送给委托。要检查用户是否已经在区域边界内,请使用 CLLocationManager 类的 requestStateForRegion: 方法。
所以我最终这样做了:
#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];
}
第一个结论是它didEnterRegion
的实施与其名称一致。:)
在你的CLLocationManagerDelegate
:
- (void) locationManager: (CLLocationManager *) manager
didStartMonitoringForRegion: (CLRegion *) region
{
if ([self insideRegion: region location: manager.location])
[self locationManager: manager
didEnterRegion: region];
}