iBeacon 接收器无法识别传输的信号
Posted
技术标签:
【中文标题】iBeacon 接收器无法识别传输的信号【英文标题】:iBeacon Receiver is not recognising the transmitted signal 【发布时间】:2015-09-22 06:59:22 【问题描述】:我正在研究 iBeacon 发射器和接收器。我已成功完成发射器部分,但接收器的另一部分无法识别传输的信号。任何人都可以帮我确定我哪里出错了吗?还有什么我必须添加到 .plist 中的吗?我已经尝试过 *** 的答案,但很遗憾没有任何效果。
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Initialize location manager and set ourselves as the delegate
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Create a NSUUID with the same UUID as the broadcasting beacon
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"A77A1B68-49A7-4DBF-914C-760D07FBB87B"];
// Setup a new region with that UUID and same identifier as the broadcasting beacon
self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"xx.xxxxxx.xxxxxxxx"];
// Tell location manager to start monitoring for the beacon region
[self.locationManager startMonitoringForRegion:self.myBeaconRegion];
// Check if beacon monitoring is available for this device
if (![CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]])
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Monitoring not available" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
return;
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion *)region
// We entered a region, now start looking for our target beacons!
self.statusLabel.text = @"Finding beacons.";
[self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion];
-(void)locationManager:(CLLocationManager*)manager didExitRegion:(CLRegion *)region
// Exited the region
self.statusLabel.text = @"None found.";
[self.locationManager stopRangingBeaconsInRegion:self.myBeaconRegion];
-(void)locationManager:(CLLocationManager*)manager
didRangeBeacons:(NSArray*)beacons
inRegion:(CLBeaconRegion*)region
// Beacon found!
self.statusLabel.text = @"Beacon found!";
CLBeacon *foundBeacon = [beacons firstObject];
// You can retrieve the beacon data from its properties
//NSString *uuid = foundBeacon.proximityUUID.UUIDString;
//NSString *major = [NSString stringWithFormat:@"%@", foundBeacon.major];
//NSString *minor = [NSString stringWithFormat:@"%@", foundBeacon.minor];
@end
【问题讨论】:
【参考方案1】:您需要获得使用蓝牙的权限。
使用requestAlwaysAuthorization
(用于背景位置)或requestWhenInUseAuthorization
(用于前景)。
您还需要 Info.plist 中的 NSLocationAlwaysUsageDescription
或 NSLocationWhenInUseUsageDescription
键,并在提示中向用户显示一条消息,例如“我需要您的权限才能访问蓝牙”或其他任何内容。
【讨论】:
非常感谢#playitgreen。它就像魅力一样。你拯救了我的一天。 :) 不客气!请接受我的回答,以便问题得到“解决”【参考方案2】:在以前的系统版本中,在使用定位服务时会自动通知用户授权。在 ios 8 中,Apple 更新了授权策略,需要调用该函数来请求用户的授权。对应的SDK也提供了替代功能。
1.requestAlwaysAuthorization 首先,需要通知内容。调用该函数时,如果用户未授权该App使用该服务,系统会将该段文字推送给用户。您可能需要在 Info.plist 中添加以下键:
NSLocationAlwaysUsageDescription 同时,需要添加书面说明,否则调用该函数无效。其次,调用授权函数。
[locationManger requestAlwaysAuthorization];
【讨论】:
【参考方案3】:只是想尝试调试问题(尽管从您的代码来看,一切似乎都正确编写)。
首先,让我们看看您在初始化监听器时是否遇到了一些错误。为此,让我们实现这些委托,看看您是否在此处遇到错误:
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
其次,执行以下委托以检查位置管理器是否开始监视您的区域。您可以NSLog
您所在地区的 UUID 和标识符来确定。
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
接下来,如果您收到回电,那么您的听众似乎一切正常。现在尝试几件事:
-
您的广播公司真的在广播吗?
如果是,它广播的 UUID 是否与您的听众期望的相同。
如果是,请尝试关闭监听器和广播器。重启设备,然后打开广播器和监听器。
我经历过,位置管理不能立即生效。例如,一旦检测到区域进入,如果您离开该区域,您可能不会立即收到回拨,然后如果您再次进入同一区域而没有收到退出呼叫,您将不会收到进入呼叫。我见过#3,在很多情况下工作。
另外,我不记得我从哪里得到的提示:)。开始测量您的信标并进行监控。有时这会产生更好的结果。
【讨论】:
以上是关于iBeacon 接收器无法识别传输的信号的主要内容,如果未能解决你的问题,请参考以下文章
ActiveMQ 无法识别 Stomp:传输方案无法识别:[stomp+ssl]