如果应用程序在区域内启动,则startMonitoringForRegion不会调用didEnterRegion

时间:2013-08-20 19:57:26

标签: ios cllocationmanager geofencing

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

如果该应用程序在该地区打开,如果有关如何启动它的任何建议将非常感谢!

4 个答案:

答案 0 :(得分:6)

我建议你使用这段代码

[locationManager requestStateForRegion:region];

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

答案 1 :(得分:3)

我认为你不能那样做。

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

答案 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];
}