4

我遇到了一个问题,如果我在该区域内启动应用程序,我的应用程序将不会触发 didEnterRegion 事件。如果我在区域外启动应用程序然后进入该区域,它就会触发。如果我在该区域内启动应用程序,然后离开该区域,然后重新进入该区域,它就会触发。

任何有关如何在应用程序打开后立即启动它的建议(如果它在该地区)将不胜感激!

4

4 回答 4

6

我建议您使用此代码

[locationManager requestStateForRegion:region];

并使用委托方法 didDetermineState: 来检查状态是 CLRegionStateInside 还是 CLRegionStateOutside。

于 2014-01-15T10:07:49.317 回答
3

我不认为你能做到这一点。

但是,您可以获取当前位置并检查它是否在您自己指定的区域内。CLCircularRegion有一个containsCoordinate:方法。

于 2013-08-20T20:02:13.287 回答
2

从苹果的文档中:

注册授权应用程序后立即开始对地理区域的监控。但是,不要期望立即收到事件,因为只有越界才会产生事件。特别是,如果用户的位置在注册时已经在区域内,则位置管理器不会自动生成事件。相反,您的应用程序必须等待用户跨越区域边界,然后才能生成事件并将其发送给委托。要检查用户是否已经在区域边界内,请使用 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];
}
于 2015-01-22T16:07:07.520 回答
2

第一个结论是它didEnterRegion的实施与其名称一致。:)

在你的CLLocationManagerDelegate

- (void)      locationManager: (CLLocationManager *) manager
  didStartMonitoringForRegion: (CLRegion *) region
{
  if ([self insideRegion: region location: manager.location])
    [self locationManager: manager
           didEnterRegion: region];
}
于 2013-08-20T20:21:23.550 回答