如果 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?