应用程序在区域中启动时,iBeacon - didEnterRegion未被调用

时间:2014-06-10 05:28:27

标签: ios cllocationmanager ibeacon estimote

我创建了一个注册信标区域的应用程序,并使用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)。

3 个答案:

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