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

我正在开发一个严重依赖iBceaons的应用程序。

我设法创建了一个信标区域,当进入该区域时,它会在后台唤醒应用程序进程10秒钟。

下一步是当手机在后台进入该区域时,将手机自拍广告

目前,当应用程序处于打开状态时,它会保持测距并在区域内作为信标传输
当应用程序在后台时,它的范围为10秒,但在进入某个区域时不会作为信标传输

那么有什么方法可以让手机在进入某个区域时在后台传输时作为信标传输?

我已经看过Apple的背景蓝牙 ,它提到广告包在后台传输时有所不同。 我也查看了此解决方案,但此解决方案不使用核心位置,因此在进入区域时无法唤醒应用程序

import UIKit import CoreLocation import CoreBluetooth class ViewController: UIViewController,CLLocationManagerDelegate,CBPeripheralManagerDelegate { var locationManager: CLLocationManager! var localBeacon: CLBeaconRegion! var beaconPeripheralData: NSDictionary! var peripheralManager: CBPeripheralManager! let myCustomServiceUUID = CBUUID(string:"5A4BCFCE-174E-4BAC-A814-092E77F6B7E5") override func viewDidLoad() { super.viewDidLoad() locationManager = CLLocationManager() locationManager.delegate = self locationManager.requestAlwaysAuthorization() } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { if status == .authorizedAlways { if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) { if CLLocationManager.isRangingAvailable() { startScanning() } } } } func startScanning() { let uuid = UUID(uuidString: "48de4980-968d-11e4-b4a9-0800200c9a66")! let beaconRegion = CLBeaconRegion(proximityUUID: uuid, major: 1, minor: 1, identifier: "region1") beaconRegion.notifyEntryStateOnDisplay=true; locationManager.startMonitoring(for: beaconRegion) locationManager.startRangingBeacons(in: beaconRegion) } func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) { if(beacons.count > 0) { let nearestBeacon:CLBeacon = beacons[0] as CLBeacon NSLog("RSSI value is %ld", nearestBeacon.rssi); initLocalBeacon() // Here I'm transmitting as a beacon along with ranging when entering or within a region which works fine the app is open but not transmitting while in background } } func locationManager(_ manager: CLLocationManager,didDetermineState state: CLRegionState,for region: CLRegion) { switch state { case .inside: NSLog("locationManager didDetermineState INSIDE %@", region.identifier); case .outside: NSLog("locationManager didDetermineState OUTSIDE %@", region.identifier); case .unknown: NSLog("locationManager didDetermineState OTHER %@", region.identifier); } } func initLocalBeacon() { if localBeacon != nil { stopLocalBeacon() } let localBeaconUUID = "5A4BCFCE-174E-4BAC-A814-092E77F6B7E5" let localBeaconMajor: CLBeaconMajorValue = 2 let localBeaconMinor: CLBeaconMinorValue = 1 let uuid = UUID(uuidString: localBeaconUUID)! localBeacon = CLBeaconRegion(proximityUUID: uuid, major: localBeaconMajor, minor: localBeaconMinor, identifier: "identifer here") beaconPeripheralData = localBeacon.peripheralData(withMeasuredPower: -59) peripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil) } func stopLocalBeacon() { peripheralManager.stopAdvertising() peripheralManager = nil beaconPeripheralData = nil localBeacon = nil } func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) { if peripheral.state == .poweredOn { peripheralManager.startAdvertising(beaconPeripheralData as! [String: AnyObject]!) } else if peripheral.state == .poweredOff { //peripheralManager.stopAdvertising() } } } 

我在function的后台模式中选择了BLE附件,并在播放列表中添加了隐私 – 蓝牙外围设备使用说明

抱歉,iOS不会让您的应用在后台播放符合iBeacon规范的BLE数据包。 正如您在问题中提到的,Apple改变了背景中发布的背景广告的外观,因此,它们不会触发CoreLocation输入事件以唤醒在后台接收应用程序。

有一些不完美的选择:

  1. 您可以在后台使用其他信标广告并唤醒您的应用。 这不会像iBeacon一样快,但它会在几分钟内唤醒你的应用程序。 这是一个设置: https : //github.com/Decemberlabs/AltBeacon

  2. 只要应用程序位于前台,您就可以通知iBeacon,并尝试让用户通过本地通知将应用程序带到前台。

  3. 如果您的应用程序在附近有其他前景副本(基于后台信标检测),您可以使用Web服务在应用程序在后台运行的10秒内通知他们您的存在。 此通知可以告诉他们代表您开始投放广告。