【问题标题】:iBeacon: didRangeBeacons stops getting called, must reset device for it to work againiBeacon:didRangeBeacons 停止被调用,必须重置设备才能再次工作
【发布时间】:2014-05-21 16:18:40
【问题描述】:

我正在使用自定义 BeaconManager 委托,因此信标范围不是由视图控制器的生命周期决定的。一切正常,但每隔一段时间(1-2 天)信标测距将停止工作,并且 didRangeBeacons 永远不会被调用。解决此问题的唯一方法是重置我的 iPhone,一旦我这样做,它就可以完美运行。下面是我正在使用的代码。基本流程是,当我的 ViewController 调用 ViewDidLoad 时,它会向 AppDelegate 发送一个通知,告诉它开始对信标进行测距,但我从不告诉它停止,因为无论用户导航到哪里,我都希望它继续为信标测距在应用程序中。我想知道我的代码是否导致了这种情况,或者这只是蓝牙的一个错误。感谢您的帮助!

BeaconManager.m

#import "BeaconManager.h"
#import "AppDelegate.h"

@interface BeaconManager()<CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) CLBeaconRegion *beaconRegion;

@end

@implementation BeaconManager

+ (id)sharedManager
{
    static BeaconManager *sharedBeaconManager = nil;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        sharedBeaconManager = [[self alloc] init];
    });
    return sharedBeaconManager;
}

- (id)init
{
    self = [super init];
    if(self)
    {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
    }
    return self;
}

- (void)startBeaconMonitoring:(NSString*)forUUID
{
    NSUUID * uuid = [[NSUUID alloc] initWithUUIDString:forUUID];

    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.beacons.publicRegion"];
    [self.locationManager startMonitoringForRegion:self.beaconRegion];
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

- (void)stopBeaconMonitoring
{
    //Stop the region monitoring
    if(self.locationManager != nil && self.beaconRegion != nil) {
        [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
    }
}

#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
    self.beacons = beacons;
    if(self.delegate != nil) {
        [self.delegate beaconManager:self didRangeBeacons:self.beacons];
    }
}

@end

ViewController.m

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"startRanging" object:nil userInfo:nil];
}

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startRangingForZombies) name:@"startRanging" object: nil];

    return YES;
}

- (void)startRanging
{
    //Start the beacon region monitoring when the controller loads
    BeaconManager *beaconManager = [BeaconManager sharedManager];
    beaconManager.delegate = self;
    [beaconManager startBeaconMonitoring:@"1234-54324-34242-34242-43243"];
}

【问题讨论】:

    标签: ios objective-c bluetooth delegates ibeacon


    【解决方案1】:

    我们在 Radius Networks 收到了许多关于手机停止检测 iBeacons 并需要重新启动或关闭蓝牙并重新打开以解决问题的报告。人们已经在 iPhone 4S、iPhone 5s、iPhone 5c 和 iPad 上报告了这一点。

    我没有任何确凿的证据表明这是在 iOS 7.1 中出现的问题,但自发布以来报告频率已经大幅上升。因此,间接证据非常有力。

    当此手机进入此状态时,手机can still scan for bluetooth devices 仍然可以作为 iBeacon 传输。因此,这不是蓝牙的硬件问题。根据现有证据,这很可能是 CoreLocation 中新引入的错误。

    【讨论】:

    • 大卫,由于没有调用didRangeBeacons,这个问题是否会调用方法rangingBeaconsDidFailForRegion,我很难测试这个,因为它只是偶尔发生,但我只是好奇你是否知道这个问题是否会触发那个方法,谢谢!
    • 不,我不相信这个方法会被调用。我对这个问题的理解是,除了 CoreLocation 检测到 iBeacons 之外,所有蓝牙功能都可以正常工作。与其说是失败,不如说是 iOS 没有进行必要的蓝牙扫描来寻找信标。
    • 系统
    • 上周我在 WWDC 上与 Core Location 团队成员进行了交谈,他们说他们已经意识到这个问题,并将在今年晚些时候的 iOS 7.1 更新中修复。还有 iOS 8。虽然没有关于确切时间表的详细信息。
    • 完全仍然看到这个,这是很多事情的征兆。我以前在 Android 上经常看到它,直到我得到了 gud,但现在我在 swift 上看到了很多(这是将近 3 年后)
    【解决方案2】:

    实际上,这是 iOS 7.1 中的一个已知错误。这严格来说是最新版本 iOS 的蓝牙堆栈的软件问题。蓝牙设备检测有时会停止工作 - 不幸的是,所有 iOS 7.1 兼容设备都是这种情况。该错误已报告给 Apple,但只要他们不对此进行修复,最好的解决方案就是重新启动设备。

    如果重新启动没有帮助,SmartRobotic 提供了有关如何解决问题的便捷指南:http://www.smartbotics.com/#!4-Tips-to-Fix-Bluetooth-Problems-After-iOS-71-Upgrade/c118r/031A86F6-C8E8-4768-B4FD-E6F83D9E4317

    如果您在升级到 iOS 7.1 后遇到蓝牙连接问题,请尝试以下 4 个提示。

    1. 关闭并重新启动 - 有人报告说,这就是在 iOS 7.1 升级后修复设备所需的全部内容。
    2. 关闭并重新打开蓝牙 - 向上滑动以访问控制中心并点击蓝牙图标,等待至少 30 秒,然后重新打开。这通常可以修复遇到连接问题的设备。
    3. 杀死(强制退出)有问题的应用程序 - 首先双击主页以启动多任务卡片界面。触摸并按住应用程序的卡片,然后将其扔掉。这将强制应用退出,并在下次打开应用时完全重新加载。
    4. 清除并重置您的蓝牙设备配对 - 转到设置>蓝牙,然后点击违规设备的 (i) 图标。点击忘记此设备。现在您应该能够重新添加蓝牙硬件并将其重新配对到您的设备。要清除所有已配对的设备,请转至设置 > 常规 > 重置 > 重置网络设置,然后重新设置蓝牙配对。

    希望这些建议能解决您的蓝牙连接问题。

    干杯。

    【讨论】:

    • 好吧,我很高兴这是一个已知问题,与我的代码格式无关。
    【解决方案3】:

    Apple 在 7.1 中对蓝牙 LE 进行了重要更改,但也破坏了内部的一些东西。

    根据我的实验:

    • iPhone 4S 7.x - iBeacons 的工作就像一个魅力

    • 2 x iPhone 4S 7.1、2 x iPhone 5 7.1 - 工作正常,但需要不时重启(不确定)。

    看起来像系统问题 - 一个大问题。 我已经联系了 Estimote - 他们知道这件事。

    有趣的事实:你找不到信标——即使是 estimote 演示应用也找不到,委托方法不会被调用,但你可以将(损坏的)设备变成信标,它会被其他设备发现。

    【讨论】:

    • 那么我的代码就没有问题了吗?这是最新更新中的已知错误?
    • Kamil,由于没有调用didRangeBeacons,这个问题是否会调用方法rangingBeaconsDidFailForRegion,我很难对此进行测试,因为它只是偶尔发生,但我只是好奇你是否知道这个问题是否会触发那个方法,谢谢!
    【解决方案4】:

    免责声明:我目前在 sensorberg 工作,我们正在销售信标和 SDK。

    我们也收到了大量关于此错误的报告。我们要求所有客户向 Apple 提交错误报告。这是您可以使用的模板:https://gist.github.com/anonymous/5283b6941e1f7d4e4461

    我个人有两次行为,一旦我能够记录它:https://www.youtube.com/watch?v=6a6IJzaxxJg 只有重新启动设备才有帮助。

    继续提交 Apple rdar 错误报告!

    【讨论】:

    • 好吧,好消息是很多人都在经历它,所以希望 Apple 能尽快修复它。感谢您的洞察力!
    【解决方案5】:

    我遇到了类似的问题,但经过一段时间的调查后,我意识到将 startMonitoringForRegion(region) 和 startRangingBeaconsInRegion(region) 依次调用是错误的。这就是你(帕特里克)所做的:

    - (void)startBeaconMonitoring:(NSString*)forUUID {
         NSUUID * uuid = [[NSUUID alloc] initWithUUIDString:forUUID];
    
         self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.beacons.publicRegion"];
         [self.locationManager startMonitoringForRegion:self.beaconRegion];
         [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
    }
    

    相反,应该在 locationManagerDelegate 方法 locationManager(manager: CLLocationManager!, didDetermineState state: CLRegionState, forRegion region: CLRegion!) 中调用 startRangingBeaconsInRegion(region)(在本例中为 Swift 代码)。这是我的解决方案。

    这是有道理的,因为第一步是找到该区域内的任何信标,第二步是从已经监视的信标中获取特定信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      相关资源
      最近更新 更多