Фоновая Bluetooth(BLE) передача и сканирование

Код прекрасно работает, когда приложение открыто (на переднем плане), но не работает в фоновом режиме. У меня все фоновые режимы включены. Я также добавил фоновые обновления местоположения, используя.allowsBackgroundLocationUpdates. Не уверен, куда идти отсюда. Код ниже:

 import UIKit
 import CoreLocation
 import CoreBluetooth

 class iDevice: UIViewController, CBPeripheralManagerDelegate, CLLocationManagerDelegate{

@IBOutlet weak var device: UILabel!

@IBOutlet weak var deviceImg: UIImageView!
@IBOutlet weak var distance: UILabel!

var beaconRegion : CLBeaconRegion!
var beaconPeripheralData : NSDictionary!
var peripheralManager : CBPeripheralManager!

var locationManager : CLLocationManager!

override func viewDidLoad() {
    super.viewDidLoad()
    initBeaconRegion()
    initTransmit()

    locationManager = CLLocationManager.init()
    locationManager.delegate = self
    locationManager.requestWhenInUseAuthorization()
    locationManager!.allowsBackgroundLocationUpdates = true
    locationManager!.pausesLocationUpdatesAutomatically = false

    startScanningForBeaconRegion(beaconRegion: getBeaconRegion())

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad) {
        self.device.text = "iPhone"
        self.deviceImg.image =  UIImage(named: "phone")!

    }

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone) {
        self.device.text = "iPad"
        self.deviceImg.image =  UIImage(named: "ipad")!
    }

}

func initTransmit(){
    beaconPeripheralData = beaconRegion .peripheralData(withMeasuredPower: nil)
    peripheralManager = CBPeripheralManager.init(delegate: self, queue: nil)
}
func initBeaconRegion() {
    beaconRegion = CLBeaconRegion.init(proximityUUID: UUID.init(uuidString: "E06F95E4-FCFC-42C6-B4F8-F6BAE87EA1A0")!,
                                       major: 1233,
                                       minor: 45,
                                       identifier: "com.peard.idevices")
}
   func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
    if (peripheral.state == .poweredOn) {
        peripheralManager .startAdvertising(beaconPeripheralData as? [String : Any])
        print("Powered On")

    } else {
        peripheralManager .stopAdvertising()
        print("Not Powered On, or some other error")
    }
}

func getBeaconRegion() -> CLBeaconRegion {
    let beaconRegion = CLBeaconRegion.init(proximityUUID: UUID.init(uuidString: "E06F95E4-FCFC-42C6-B4F8-F6BAE87EA1A0")!, identifier: "com.peard.idevices")
    return beaconRegion
}

func startScanningForBeaconRegion(beaconRegion: CLBeaconRegion) {
    print(beaconRegion)
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.startMonitoring(for: beaconRegion)

    locationManager.startRangingBeacons(in: beaconRegion)
}


func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
    let beacon = beacons.last

    if beacons.count > 0 {

        if beacon?.proximity == CLProximity.unknown {
            distance.text = "Unknown"

        } else if beacon?.proximity == CLProximity.immediate {
            distance.text = "within 3ft"

        } else if beacon?.proximity == CLProximity.near {
           distance.text = "within 5ft"

        } else if beacon?.proximity == CLProximity.far {
            distance.text = "within 20 ft"

        }

    } else {
        print("no")
    }

    print("Ranging")
}


override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent}
@IBAction func dismiss(_ sender: Any) { self.dismiss(animated: true, completion: nil)}

}

Заранее спасибо!!!

1 ответ

Ваше периферийное поведение рекламы отличается, когда оно находится в фоновом режиме:-

  1. Рекламный ключCBAdtactDataLocalNameKey игнорируется, а локальное имя периферийного устройства не объявляется.
  2. Все сервисные UUIDS, содержащиеся в значении рекламного ключа CBAdvertismentDataServiceUUIDS, размещаются в специальной области переполнения. Они могут быть обнаружены только устройством iOS, явно сканирующим их.
  3. Если все приложения являются рекламными, то частота рекламных пакетов уменьшается.

Я думаю, что у вас 2-ая проблема. Для получения более подробной информации см. Руководство по программированию Apple для фоновой обработки с ядром Bluetooth.

Другие вопросы по тегам