如果 iBeacon 已在范围内,则未找到它

Posted

技术标签:

【中文标题】如果 iBeacon 已在范围内,则未找到它【英文标题】:iBeacon not found if it is already in range 【发布时间】:2014-11-18 19:36:46 【问题描述】:

我找到了这个使用 iBeacon 开发应用程序的好教程:

http://www.appcoda.com/ios7-programming-ibeacons-tutorial/

但是,正如作者所说,通过这种实现,如果您在接收器已经在信标范围内时启动接收器,它就不会触发。如果你想找到一个 ibeacon,你需要远离它的区域,然后再回到范围内。

我如何修改此代码以在应用程序午餐时找到它在范围内的信标?

我使用 Xcode6、iPad air、IOS 8

这是教程中的简化代码:

在 ViewController.h 中

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController<CLLocationManagerDelegate>

@property (strong, nonatomic) CLBeaconRegion *myBeaconRegion;
@property (strong, nonatomic) CLLocationManager *locationManager;

@end

在 ViewController.m 中

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad

[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;

NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"ACFD065E-C3C0-11E3-9BBE-1A514932AC01"];

self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
                                               identifier:@"com.appcoda.testregion"];

[self.locationManager startMonitoringForRegion:self.myBeaconRegion];





- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion *)region
 
    NSLog(@"Finding beacons.");
    [self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion];





-(void)locationManager:(CLLocationManager*)manager didExitRegion:(CLRegion *)region

    NSLog(@"None found.");
    [self.locationManager stopRangingBeaconsInRegion:self.myBeaconRegion];





-(void)locationManager:(CLLocationManager*)manager
   didRangeBeacons:(NSArray*)beacons
          inRegion:(CLBeaconRegion*)region

NSLog(@"Beacon found");

【问题讨论】:

【参考方案1】:

didEnterRegion 和 didExitRegion 回调仅在用户跨越区域边界时触发。对于 iBeacon,这意味着从“内部”移动到“外部”,反之亦然。

当您启动应用并开始监控您的信标区域时,您可以请求您的信标区域的当前状态,以确定您的用户是在室内还是室外。

实现 didDetermineState 回调:

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region

此回调在您开始监控您的区域后触发,只要跨越区域边界(因此请注意不要在此处和 didEnter/ExitRegion 内部重复逻辑),并响应对 requestStateForRegion 的调用:

希望这会有所帮助...如果您需要更多 -> https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManagerDelegate_Protocol/index.html#//apple_ref/occ/intfm/CLLocationManagerDelegate/locationManager:didDetermineState:forRegion:

【讨论】:

以上是关于如果 iBeacon 已在范围内,则未找到它的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CoreLocation 获取多个 iBeacon?

快速,在后台检测 ibeacons 并在范围内发送通知

在蓝牙重置之前,蓝牙设备在测距和监控 iBeacons 后无法连接

如何查找 iBeacon 范围内的设备数量?

iBeacon /发送者/接收者如何处理冲突?

基于 UUID 监控 iBeacon 区域时,何时收到通知?