2016-10-14 2 views
5

Как все делают с iBeacons на iOS 10.0.2? Надеюсь, лучше меня! :-)iBeacons Broken in iOS 10.0.2?

Обновление: Оборудование, используемое для тестирования, было двумя iPhone. IPhone 5S (A1533) и iPhone 7 (A1778)

Быстрая версия 2.x приведенного ниже кода может быть использована на iPhone для рекламы простого iBeacon на iOS версии 9.x; сегодня тот же самый код, обновленный для быстрой версии 3 и работающий на iOS 10.0.2, вообще не появляется.

Я сократил код до очень простого вспомогательного класса и viewcontroller, который, как я думаю, должен адекватно продемонстрировать проблему. Обратите внимание, что в раскадровке есть только одна кнопка, связанная с запуском/остановкой рекламы iBeacon.

Я запустил приложение на iPhone 5 и iPhone 7 с iOS 10.0.2. Чтобы протестировать, я создал собственный сканер (обнюхивание для конкретного UUID близости), а когда это не сработало, я попробовал более общий iBeacon для обнаружения приложений, таких как Estimote и LightBlue.

Вздох - ничто не видит iBeacon.

Мысли? На форумах разработчиков в Apple упоминаются проблемы, о которых сообщается в iBeacons в 10.x, но ничто так просто, как это, насколько я могу судить.

Благодаря кучу ...

- - - iBeaconConfiguration.swift - - - - - - 

import Foundation 

class iBeaconConfiguration 
{ 
    static let uuid = UUID(uuidString: "F34A1A1F-500F-48FB-AFAA-9584D641D7B1")! 

    private init() {} 
} 

- - - ViewController.swift - - - - - - 

import UIKit 
import CoreLocation 
import CoreBluetooth 

class ViewController: UIViewController, CBPeripheralManagerDelegate 
{ 

    @IBOutlet weak var btnAction: UIButton! 

    let UUID: UUID = iBeaconConfiguration.uuid 

    var beaconRegion: CLBeaconRegion! 

    var dataDictionary = NSDictionary() 

    var bluetoothPeripheralManager: CBPeripheralManager! 

    var isBroadcasting = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     bluetoothPeripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil) 
    } 


    @IBAction func switchBroadcastingState(_ sender: AnyObject) 
    { 

    if !isBroadcasting { 
     if bluetoothPeripheralManager.state == CBManagerState.poweredOn { 

      let major: CLBeaconMajorValue = 123 
      let minor: CLBeaconMinorValue = 456 

      beaconRegion = CLBeaconRegion(proximityUUID: UUID, major: major, minor: minor, identifier: "com.rdz.bcast") 

      dataDictionary = beaconRegion.peripheralData(withMeasuredPower: nil) 

      bluetoothPeripheralManager.startAdvertising(dataDictionary as? [String : Any]) 

      btnAction.setTitle("Stop", for: UIControlState.normal) 

      isBroadcasting = true 
     } 
    } 
    else { 
     bluetoothPeripheralManager.stopAdvertising() 

     btnAction.setTitle("Start", for: UIControlState.normal) 

     isBroadcasting = false 
    } 
} 

func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) { 

    print ("peripheralManagerDidStartAdvertising()") 

    if error != nil 
    { 
     print(error) 
    } 
} 

func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) { 
    print ("peripheralManager(...didReceiveRead)") 
} 

func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) { 
    var statusMessage = "" 

    switch peripheral.state { 
    case CBManagerState.poweredOn: 
     statusMessage = "Bluetooth Status: Turned On" 

    case CBManagerState.poweredOff: 
     if isBroadcasting { 
      switchBroadcastingState(self) 
     } 
     statusMessage = "Bluetooth Status: Turned Off" 

    case CBManagerState.resetting: 
     statusMessage = "Bluetooth Status: Resetting" 

    case CBManagerState.unauthorized: 
     statusMessage = "Bluetooth Status: Not Authorized" 

    case CBManagerState.unsupported: 
     statusMessage = "Bluetooth Status: Not Supported" 

    default: 
     statusMessage = "Bluetooth Status: Unknown" 
    } 

     print("Bluetooth Status: \(statusMessage)") 
    } 
} 
- - - END - - - - - 

(Извиняюсь за ошибки форматирования кода.)

ответ

3

Многие люди сообщают проблемы с Bluetooth на прошивкой 10, но проблема не является универсальным.

Тестирование с 10.0.2 (14A456) на IPod Touch с шестым поколением модели mkh22ll/а, я могу успешно сканировать маяки и передавать IBeacon с помощью Locate app for iOS. Это написано в Objective C, но использует те же API, что и вы. Вы можете попробовать это же приложение на проблемном устройстве и посмотреть, есть ли у вас проблемы.

Тестирование другого приложения, написанного в Swift 3 на том же устройстве (приложение передает и принимает пакеты iBeacon), я проверил, что он успешно принимает пакеты iBeacon и отправляет их тоже.

Суть в том, что Передача и обнаружение iBeacon на iOS 10 отлично работает на некоторых устройствах.

Я подозреваю, что проблемы с Bluetooth в iOS 10 происходят только с некоторыми аппаратными моделями iPhone (и, возможно, только на определенных устройствах этих моделей), которые имеют несколько разные аппаратные чипсеты Bluetooth.

Несколько вещей, которые могут помочь: Устранение неполадок

  1. Включите Bluetooth и снова включите его.
  2. Перезагрузите устройство. (Lame suggestion, я знаю.)
  3. Попробуйте супер простые операции, такие как сканирование других подключаемых устройств Bluetooth в настройках и посмотрите, сможете ли вы видеть другие устройства, такие как динамики Mac или Bluetooth. Если эта простая задача Bluetooth не работает, iBeacon не будет работать.
  4. Испытание с использованием Locate app, описанным выше. Это может устранить проблему с кодированием.

Пожалуйста, обновите вопрос на своем аппаратном устройстве.

+1

Привет, Дэвид, я ценю быстрый ответ и нижнюю строку: вы решили мою проблему. –

+1

Запуск Locate App на двух устройствах: A1533 и A1778. A1533 отсканировал и нашел рекламный маячок A1778, без проблем. Переключение активности, A1778 не смог найти A1533 во время рекламы. (Я пытался рекламировать различные маяки, перезапускать приложения, перезагружать bluetooth и т. Д.). Перезагрузка обоих телефонов, похоже, очистила все проблемы, которые я испытывал. Еще раз спасибо! Майкл –

+0

Рад, что перезагрузка решила проблему, но это всегда разочаровывает, когда это исправление. Любая идея о том, почему bluetooth, возможно, был в плохом состоянии перед перезагрузкой? Что-нибудь подозрительное происходит между предыдущей перезагрузкой и когда Bluetooth перестает работать? Возможно, это было сразу после обновления до iOS 10.0.2 или какого-то другого события, которое могло бы привести Bluetooth в плохое состояние? – davidgyoung

0

Я также пробовал мониторинг iBeacon Region с помощью iPhone 7 (A1778) и iPhone 6S (A1688). я также опыт, что didEnterRegion и didExitRegion никогда не выполняются на iPhone 7. Причина этого может быть, что компании Apple упала IBeacon микро расположения на iPhone 7.

Согласно техническим характеристикам «IBeacon Mиkpo-okpyжeниe» больше не включена в список iPhone 7. Вот технические спецификации на iPhone 7: https://support.apple.com/kb/SP743?locale=en_US Вот одни из iPhone 6S: https://support.apple.com/kb/SP726?locale=en_US

я попытался перезагрузки и на самом деле это помогает позволить ему работать в то время как приложение работает на переднем плане. Региональный мониторинг на заднем плане вообще не работает. Он также не работает, если вы вернетесь на передний план после того, как приложение было в фоновом режиме.

Смежные вопросы