iOS 在前台无法再次找到 iBeacon

Posted

技术标签:

【中文标题】iOS 在前台无法再次找到 iBeacon【英文标题】:iOS Can not find the iBeacon again in fore ground 【发布时间】:2015-01-15 10:41:12 【问题描述】:

嗨~我正在学习使用 CLLocationManager 来检测 iBeacon。我读了这篇文章: http://developer.radiusnetworks.com/2013/11/13/ibeacon-monitoring-in-the-background-and-foreground.html 它说 startRangingBeaconsInRegion 将使系统每秒扫描一次信标。我测试,它是正确的。

但是如果程序只执行 startMonitoringForRegion 而没有 startRangingBeaconsInRegion,就会出现问题。

我的程序可以在我第一次启动信标硬件时找到信标,并且在我停止信标后调用函数 didExitRegion。但是在我第二次启动信标后,程序根本找不到它(执行 didEnterRegion)。我已经等了 1 个小时了。

我用于测试的硬件是带有 ios 8.1.2 和 radBeacon USB 的 iPhone 5s。 这是我的代码。

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>
@property (retain, nonatomic) IBOutlet UITextView *textView;
@property (strong, nonatomic) NSMutableString *myLog;
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLBeaconRegion *beaconRegion;
@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    [self startBeaconMonitoring];


- (void)startBeaconMonitoring 
    _locationManager = [[CLLocationManager alloc] init];
    _locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    _locationManager.delegate = self;

    [_locationManager performSelector:@selector(requestAlwaysAuthorization)];

    [self userGeofencingPreferencesWereUpdatedWithNotification:nil];

    [self updateLogWithString:@"start the app"];


- (void) userGeofencingPreferencesWereUpdatedWithNotification: (NSNotification *) notification

    if (1) 
        NSUUID *proximityUUID = [[NSUUID UUID] initWithUUIDString:@"EEF45689-BBE5-4FB6-9E80-41B78F6578E2"];
        _beaconRegion = [[CLBeaconRegion alloc]
                         initWithProximityUUID:proximityUUID
                         identifier:@"1"];
        _beaconRegion.notifyEntryStateOnDisplay = YES;
        [_locationManager startMonitoringForRegion:_beaconRegion];
        //[_locationManager startRangingBeaconsInRegion:beaconRegion];
        //[_locationManager stopUpdatingLocation];
    


- (void) locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region

    [self updateLogWithString:@"enter"];
    NSLog(@"enter");


- (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region

    [self updateLogWithString:@"exit"];
    NSLog(@"exit");


- (void)locationManager:(CLLocationManager *)manager
        didRangeBeacons:(NSArray *)beacons
               inRegion:(CLBeaconRegion *)region 
    //NSLog(@"range");


- (void)dealloc 
    [_textView release];
    [_myLog release];
    [_locationManager release];
    [_beaconRegion release];
    [super dealloc];


- (NSMutableString *)myLog 
    if (!_myLog) 
        _myLog = [[NSMutableString alloc] init];
    
    return _myLog;


- (void) updateLogWithString:(NSString*)newLog 
    NSDate *now = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"hh:mm:ss";
    [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    NSString * logWithTime = [NSString stringWithFormat:@"%@---%@\n",[dateFormatter stringFromDate:now], newLog];
    [self.myLog appendString:logWithTime];
    self.textView.text = self.myLog;
    [dateFormatter release];

@end

【问题讨论】:

在您引用的文章中,我的测试表明,您描述的场景导致在带有 iOS 6 或 iOS 7 的 iPhone 4S 上以 1 Hz -10 的频率传输信标的最大检测延迟为 15 分钟赫兹。您在什么移动设备类型和操作系统版本上看到了这个?您使用了什么类型的信标,它的传输频率是多少? 你能发布你的代码吗?这可能是由退出区域时执行的逻辑引起的。 感谢您的回复。我编辑我的问题。 我不太确定radBeacon USB的频率,据我观察,我认为它比10Hz快。 我会向 support@radiusnetworks.com 发送一封便条,并附上此问题的链接,并记下您的 RadBeacon USB 固件版本(在 Radbeacon 配置应用程序中可见)。提及您的设备可能存在问题,并且是 davidgyoung 发送给您的。 【参考方案1】:

我偶然发现了一些东西,这解决了我的问题。当我使用一个名为 Broadcaster 的 iOS APP 模拟 iBeacon 时,它会非常快速地触发 iBeacon 检测 APP,该应用程序在另一个 iOS 设备上运行,无论是前台、后台还是屏幕关闭。 当我使用 Rad Beacon USB 时,仍然失败。我测试了我所有的 4 个 Rad Beacon USB,同样的事情发生了。 看来Rad Beacon USB发送的BLE消息与iOS模拟的有点不同(我刚刚尝试了APP Broadcaster)。而iOS8对待它们 在某些情况下会有所不同。

我的 Rad Beacon USB 是 2.0 版。

【讨论】:

以上是关于iOS 在前台无法再次找到 iBeacon的主要内容,如果未能解决你的问题,请参考以下文章

反应本机ios目标c,无法在前台接收推送通知

react native [IOS] 的前台工作

在 iOS 10 下使用 FCM 在前台单击推送通知后无法导航到特定的 viewController

React-native-agora 音频仅在后台模式下无法在前台模式下工作(iOS)

iOS如何判断应用程序是在前台运行还是后台运行?

如何挂钩 ios 连接更改