iBeacon 接收器无法识别传输的信号
iBeacon Receiver is not recognising the transmitted signal
我正在研究 iBeacon 发射器和接收器。我已成功完成发射器部分,但接收器无法识别发射信号的另一部分。任何人都可以帮我确定我哪里出错了吗?我还需要在 .plist 中添加什么吗?我已经尝试了 Whosebug 的答案,但很抱歉告诉你没有任何效果。
#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
在之前的系统版本中,在使用定位服务时会自动通知用户授权。 iOS8,苹果更新了授权策略,需要调用函数请求用户授权。对应的SDK也提供了替代功能
1.requestAlwaysAuthorization
首先,通知内容是必需的。调用该函数时,如果he/she没有授权App使用该服务,系统会将这段文字推送给用户。您可能需要将以下键添加到 Info.plist:
NSLocationAlwaysUsageDescription
同时,应增加书面说明,否则调用该功能将无效。其次,调用授权函数。
[locationManger requestAlwaysAuthorization];
您需要请求使用蓝牙的权限。
使用 requestAlwaysAuthorization
(用于背景位置)或 requestWhenInUseAuthorization
(用于前景)。
您还需要 Info.plist 中的 NSLocationAlwaysUsageDescription
或 NSLocationWhenInUseUsageDescription
键以及要在提示中向用户显示的消息,例如 "I need your permission to access bluetooth" 或其他。
只是尝试调试问题的一个侧面(尽管从您的代码看来一切都写得正确)。
首先,让我们看看您在初始化侦听器时是否遇到了错误。为此,让我们实现这些委托并查看您是否在此处遇到错误:
- (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 发射器和接收器。我已成功完成发射器部分,但接收器无法识别发射信号的另一部分。任何人都可以帮我确定我哪里出错了吗?我还需要在 .plist 中添加什么吗?我已经尝试了 Whosebug 的答案,但很抱歉告诉你没有任何效果。
#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
在之前的系统版本中,在使用定位服务时会自动通知用户授权。 iOS8,苹果更新了授权策略,需要调用函数请求用户授权。对应的SDK也提供了替代功能
1.requestAlwaysAuthorization 首先,通知内容是必需的。调用该函数时,如果he/she没有授权App使用该服务,系统会将这段文字推送给用户。您可能需要将以下键添加到 Info.plist:
NSLocationAlwaysUsageDescription 同时,应增加书面说明,否则调用该功能将无效。其次,调用授权函数。
[locationManger requestAlwaysAuthorization];
您需要请求使用蓝牙的权限。
使用 requestAlwaysAuthorization
(用于背景位置)或 requestWhenInUseAuthorization
(用于前景)。
您还需要 Info.plist 中的 NSLocationAlwaysUsageDescription
或 NSLocationWhenInUseUsageDescription
键以及要在提示中向用户显示的消息,例如 "I need your permission to access bluetooth" 或其他。
只是尝试调试问题的一个侧面(尽管从您的代码看来一切都写得正确)。
首先,让我们看看您在初始化侦听器时是否遇到了错误。为此,让我们实现这些委托并查看您是否在此处遇到错误:
- (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,在很多情况下都有效。
此外,我不记得从哪里得到的提示 :)。开始对您的信标进行测距和监控。有时这会产生更好的结果。