我正在开发一款严重依赖iBceaons的应用程序。
我设法创建了一个信标区域,在进入该区域时会在后台唤醒应用程序进程10秒钟。
下一步是让手机在后台进入该区域时自我宣传
目前,当应用程序处于打开状态时,它会保持测距并在区域中作为信标传输 当应用程序在后台时,它的范围为10秒,但在进入某个区域时不会作为信标传输
有没有办法允许手机在进入某个地区时在后台作为信标进行传输?
我已经看过Apple's background Bluetooth,其中提到广告包在后台传输时有所不同。我也查看了This Solution,但此解决方案不使用核心位置,因此在进入区域时无法唤醒应用程序
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()
}
}
}
我在功能的后台模式中选择了BLE附件,并在播放列表中添加了隐私 - 蓝牙外设使用说明
答案 0 :(得分:2)
抱歉,iOS不会让您的应用在后台播放符合iBeacon规范的BLE数据包。正如您在问题中提到的,Apple会改变背景中发布的背景广告的外观,因此,它们不会触发CoreLocation输入事件以唤醒在后台接收应用程序。
有一些不完美的选择:
您可以在后台使用其他信标广告并唤醒您的应用。这不会像iBeacon一样快,但它会在几分钟内唤醒你的应用程序。这是一个设置:https://github.com/Decemberlabs/AltBeacon
只要应用程序位于前台,您就可以宣传iBeacon,并尝试让用户通过本地通知将应用程序带到前台。
如果附近有应用程序的其他前景副本(基于后台信标检测),您可以使用Web服务在应用程序在后台运行的10秒内通知他们您的状态。此通知可以告诉他们代表您开始投放广告。