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 中的 NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription 键,并在提示中向用户显示一条消息,例如“我需要您的权限才能访问蓝牙”或其他任何内容。

【讨论】:

非常感谢#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 接收器无法识别传输的信号的主要内容,如果未能解决你的问题,请参考以下文章

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

ActiveMQ 无法识别 Stomp:传输方案无法识别:[stomp+ssl]

Qt:子类中无法识别继承的信号

iOS 应用无法识别我的信标

如何监控多个 iBeacon 并根据每个信标更改 UILabel?

iBeacon:稳定信号