实时从 iBeacon 切换到 BLE?

Posted

技术标签:

【中文标题】实时从 iBeacon 切换到 BLE?【英文标题】:Switching from iBeacon to BLE in real time? 【发布时间】:2014-11-24 13:15:20 【问题描述】:

我们的信标硬件被编程为 iBeacon + 可写 BLE。 所以我可以用 iBeacon 发现它,也可以通过 BLE 连接到它。

我想扫描 iBeacon,当我进入该区域时(应用程序在后台),并且正在调用代理,他将切换到 BLE 并使用 BLE 连接到设备:

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region 
    // here connect as usual via bluetooth

所以,正如我所说,我可以单独编写/发现硬件,但是当我尝试通过 BLE 从委托连接到模块时(当应用程序在后台时,我进入该区域,委托开启,而不是在后台尝试连接 BLE, 它不工作,虽然我可以在一个区域内在后台做其他事情,例如,连接到服务器。)

我能做些什么来实现它吗?我也试图停止信标区域监控,但即便如此,他也无法从后台连接到 BLE。

【问题讨论】:

你有没有在info.plist中设置了后台模式键 是的,所有这些。似乎问题是应用程序只唤醒了 10 秒,而 BLE 没有足够的时间进行连接。你能从系统中获得更多时间吗? 【参考方案1】:

要在 bg 中做一些事情,你需要从操作系统请求时间。然后你会得到一个标识符。

//identifier
@property(nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskIdentifier;

通过调用请求它:

if(!self.backgroundTaskIdentifier) 
    self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^
        NSLog(@"expired, fail, throw!!!");
        @throw [NSException exceptionWithName:@"BeaconServiceKilled" reason:@"Expired in bg" userInfo:nil];
    ];

完成后释放它

if(self.backgroundTaskIdentifier) 
    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
    self.backgroundTaskIdentifier = 0;

【讨论】:

谢谢,我不明白如何使用它.. 这段代码的去向,以及我连接到 BLE 的位置? 启动BLE连接时,该属性进入界面和请求。当你完成所有事情时……也许当你离开这个地区时? 非常感谢,有几件事,首先,我是把BLE连接放在你写的块之前,还是里面?第二,这是苹果允许的吗?这需要一些用户权限吗?你能得到多少时间?苹果允许这样做似乎很奇怪,因为我可以让它永远做事.. 好吧,谢谢它的工作,它给了你更多的时间,但是 BLE 不会在后台连接,只能在前台.. 不能设置它来做到这一点..

以上是关于实时从 iBeacon 切换到 BLE?的主要内容,如果未能解决你的问题,请参考以下文章

iBeacon,是不是可以获得 BLE 设备列表?

在IOS 的开发中iBeacon和BLE的区别

ESP32学习笔记(29)——BLE iBeacon广播

Android BLE iBeacon 广告包大于预期

OBJ-C 操作方法:在同一设备中使用 BLE 连接和 iBeacon 的应用程序

iBeacon 非静态 UUID