“需要帮助整合”;iBeacon+;BLE外围扫描iOS背景模式“;特征

“需要帮助整合”;iBeacon+;BLE外围扫描iOS背景模式“;特征,ios,swift,ibeacon,Ios,Swift,Ibeacon,有一个要求,我需要允许iOS应用程序在应用程序被用户或操作系统(可能是也可能不是强制)杀死时与BLE硬件通信 该硬件同时作为iBeacon和BLE外设工作 我们所做的是: 应用程序首次启动-->然后请求AlwaysSage权限 仅使用UUID(UUIString:{Provided UUID}”)开始扫描iBeacon区域(次要值将不同) 当收到func locationManager(manager:CLLocationManager,didRangeBeacons beacons:[ClB

有一个要求,我需要允许iOS应用程序在应用程序被用户或操作系统(可能是也可能不是强制)杀死时与BLE硬件通信

该硬件同时作为iBeacon和BLE外设工作

我们所做的是:

  • 应用程序首次启动-->然后请求AlwaysSage权限
  • 仅使用UUID(UUIString:{Provided UUID}”)开始扫描iBeacon区域(次要值将不同)
  • 当收到
    func locationManager(manager:CLLocationManager,didRangeBeacons beacons:[ClBeacons],在区域:CLBeaconRegion]中)
    回调时,我们从检测到的信标中提取主要值和次要值,并基于此值准备服务UUID字符串,例如,如果主要值为:00,次要值为“11”,将其命名为“0011”,并将此最终命名值添加为设备服务UUID的前缀,例如“0011-12345-12345-123452”,以开始扫描BLE外围设备
所以我的BLECentralManager对象将开始扫描

self?.bleCentralManager.scanForPeripherals(withServices: "0011-12345-12345-123452", options: [CBCentralManagerScanOptionAllowDuplicatesKey: false])
一旦检测到外设,其余的BLE操作将在此外设上执行(即建立连接,向特定特征发送数据,最后断开连接)。这在前台模式下工作良好

现在,我需要在后台实现相同的机制(即应用程序未运行状态)。我怎样才能做到呢

注:

  • 对iBeacon区域的监视从未停止。因此,我可以唤醒我的应用程序,即使它没有启动
  • 但我的问题是,我如何开始为背景中检测到的信标准备主+次值字符串

iOS将在检测到信标后启动你的应用程序,你将得到一个
dienter(region:)
回调。此时,您可以立即使用
locationManager.startrangbeacons(…)
启动信标测距,您将获得
didRangeBacons(…)
回调几秒钟——足够长的时间来读取主/次标识符并完成所需的工作。

您不能在后台对信标进行测距,但可以监视信标区域的输入。当您进入该区域时,可以开始扫描BLE服务。如果用户终止你的应用程序,那么你可能不会收到任何进一步的区域通知。信标测距将不起作用。那是真的!但是,如果用户在“应用程序切换器>向上滑动”中被强制杀死,我可以让用户进入/退出信标范围(出于测试目的,我在用户进入/退出信标范围时发送本地通知)!好啊这就是您所需要的。@Paulw11我的问题是,当收到didEnterRegion回调时,如何检索主值和次值。现在我在func locationManager(uManager:CLLocationManager,didEnterRegion region:CLRegion)中打印区域的主要/次要值时可以看到“nil”,因此,我无法定义我的DeviceService UUID以开始扫描!你能告诉我我错过了什么吗?好的。我现在明白了。是的,你做不到。如果您的BLE设备只是宣传一项已知的服务,您可以扫描、连接和查询一项特征,看看它是否是您感兴趣的外围设备,这会简单得多。您能帮忙吗?我尝试在didEnter(region:)回调中定位信标。它不响应didRangeBeacons中的任何回调。func locationManager(manager:CLLocationManager,didEnterRegion区域:CLRegion){manager.StartRangBeacons(in:region as!CLBeaconRegion)sendLocalNotification(标题:“didEnterRegion..”,正文:“立即测距”)}func locationManager(manager:CLLocationManager,didRange beacons:[CLBeacon],满足beaconConstraint:CLBeaconIdentityConstraint){//也在此处发送本地通知。但未接收任何回调}确保(1)已设置locationManager.delegate(2)确保委托方法签名完全匹配(3)确保开始测距时的区域定义与要查找的信标的uuid匹配。(4) 尝试使用前景中的应用程序获取范围更新,以验证是否已正确连接。我尝试了建议的方法,并使用didEnterRegion回调-->在后台/终止状态获取回调,然后在didRangeBeacons中启动信标范围-->Gettin回调,我可以识别主要值和次要值。我尝试用BackgroundTask扩展扫描,但didRangeBeacon方法只调用了30到40秒,而不是3分钟。你能帮我吗?正如你提到的,我遵循了下面的链接!您所描述的是最新iOS版本中的预期行为。苹果将允许的背景时间从180秒减少到30秒。为了得到更长的时间,您必须在Info.plistAlready中声明位置为后台模式之一,启用BG模式用于-位置更新-外部附件通信-后台处理,但它最多会唤醒30秒。我可以每秒在didRangeBeacons中获取更新,但中央管理器的DidDiscoveryPeripheral无法发现指定的服务UUID这适用于前台模式!。1:启动特定UUID的信标监控2:在didRangeBeacons回调期间,从主要和次要开始扫描外围设备3:中央管理器在Backgrnd模式下响应DidDiscoveryPeripheral,第3步在30秒内未执行