gpt4 book ai didi

ios - iBeacon:didRangeBeacons 停止被调用,必须重置设备才能再次工作

转载 作者:技术小花猫 更新时间:2023-10-29 10:20:12 38 4
gpt4 key购买 nike

我正在使用自定义 BeaconManager 委托(delegate),因此信标范围不由 View Controller 的生命周期决定。一切都很好,但每隔一段时间(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"];
}

最佳答案

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

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

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

关于ios - iBeacon:didRangeBeacons 停止被调用,必须重置设备才能再次工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22946022/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com