如何在 iOS 后台模式下获取信标广告数据

Posted

技术标签:

【中文标题】如何在 iOS 后台模式下获取信标广告数据【英文标题】:How to get a beacons advertisement data in iOS background mode 【发布时间】:2019-01-21 18:29:13 【问题描述】:

我正在尝试实现一个应用程序,它只检测信标并在应用程序处于后台模式时显示通知。

我最初实现了 CBCentralManager 并在 didDiscoverPeripheral 中接收了事件,效果很好,但一旦进入后台模式,它就会停止接收事件。

由于需要后台模式,因此我实现了 CLLocationManager。我在 info.plist 中将 location、background-central 和 background-peripheral 标记为背景模式。我还在 info.plist 中添加了 NSLocationAlwaysUsageDescription、NSLocationAlwaysAndWhenInUseUsageDescription 和 NSLocationWhenInUsageDescription。

相关代码如下:

locMgr = new CLLocationManager();
locMgr.PauseLocationUpdatesAutomatically= false;
locMgr.RequestAlwaysAuthorization();
locMgr.AllowsBackgroundLocationUpdates = true;

var nsuuid = new NSUuid(uuid.ToString());
var nsidentifier = new NSString(identifier);

CLBeaconRegion region = new CLBeaconRegion(nsuuid, nsidentifier);
region.NotifyOnExit = truel
region.NotifyOnEntry = true;
region.NotifyEntryStateOnDisplay = true;

locMgr.StartMonitoring(region);


public void OnRegionEntered(object sender, CLRegionEventARgs e)

    is there anyway to get advertising info (instance id) of beacon in here?
    anything to identify the beacon besides the proximity id which is the same for multiple beacons?

我有一个后端服务器,其中包含有关我想调用以获取名称/消息的信标的附加信息。但这是在信标的实例 ID 上键入的。

有人知道在后台模式下获取信标信息的方法吗?我可以连接到外围设备或在 OnRegionEntered 或任何其他方式中设置 cblcentralmanager 吗?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您可以在 ios 中设置静默推送通知。您必须在其中创建一个 Web 服务,该服务将在一定时间后从应用程序获取纬度和经度,并返回可用信标列表,该信标包含该纬度和经度的特定区域。

然后,你必须在你的应用委托类中实现这个方法:

func 应用程序(_ 应用程序:UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)

当您的应用从服务器收到任何推送通知时,将调用此方法。您必须根据获得的列表更新您的应用。

【讨论】:

这是一个有趣的方法。谢谢。但它要求服务器事先知道每个信标的位置。【参考方案2】:

您可以在启动信标监测的同时简单地启动信标测距。所以除此之外:

locMgr.StartMonitoring(region)

这样做:

locMgr.StartRangingBeacons(in: region)

如果您这样做,那么在您第一次检测到信标区域后的大约 10 秒内(即使在后台),您将以每秒一次的速率收到对以下委托方法的回调:

didRange(beacons: beacons, region: region)

上述参数 beacons 将包含与该区域匹配的所有信标作为CLBeacon 对象的数组,每个信标都将包含完整标识符:proximityUUID、major、minor

【讨论】:

因此,即使在检测到信标后,您也可以获得代理 uuid,主要和次要,但没有其他信息,例如广告数据(instanceid)。在 iOS 中似乎是一个很大的限制。感谢您的回复和帮助 我不确定您所说的“instanceid”是什么意思?确实,iOS 会阻止您访问蓝牙 MAC,即使使用 CoreBluetooth 也是如此。不过,使用 CoreBluetooth,它确实为您提供了一个设备标识符,该标识符是映射到隐藏蓝牙 MAC 的 GUID。但即便如此,对于完全相同的设备,它也会周期性地旋转。

以上是关于如何在 iOS 后台模式下获取信标广告数据的主要内容,如果未能解决你的问题,请参考以下文章

进入信标区域时如何在后台作为信标做广告

iBeacons 在 iOS 中以后台模式扫描?

iOS 在后台模式下从广告中省略制造商数据

BLE广告和信标

在后台 iOS Xcode 中获取信标通知

应用程序处于后台模式时如何在 iOS5 上获取用户位置?