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 中的 NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription 键以及要在提示中向用户显示的消息,例如 "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

接下来,如果您收到上述回电,那么您的听众似乎一切正常。现在尝试几件事:

  1. 你的主播真的在播吗?
  2. 如果是,它广播的 UUID 是否与您的听众所期望的相同。
  3. 如果是,请尝试关闭监听器和广播器。重新启动设备,然后打开广播器,然后打开监听器。

我有过经验,位置管理不能即时工作。例如,一旦您检测到区域进入,如果您离开该区域,您可能不会立即收到回拨,然后如果您再次进入同一区域而没有收到退出呼叫,您将不会收到进入呼叫。我见过 #3,在很多情况下都有效。

此外,我不记得从哪里得到的提示 :)。开始对您的信标进行测距和监控。有时这会产生更好的结果。