Могу ли я превратить свой новый AppleTV 4-го поколения в iBeacon?


Я читал, что вы можете писать приложения для нового AppleTV. Я читал, что он работает под управлением версии iOS. Я тоже читал, что у него есть возможности bluetooth.

Вопрос очень простой: могу ли я превратить свой AppleTV в iBeacon, хотя и очень дорогой? :)

3 4

3 ответа:

Способ трансляции устройства iOS заключается в том, что вы создаете объект CLBeaconRegion С UUID, major и minor, который вы хотите транслировать, называете его peripheralDataWithMeasuredPower метод, и передайте словарь, который вы получите этим способом в CBPeripheralManager ' s startAdvertising метод.

Теперь tvOS не имеет класса CLBeaconRegion, но имеет CBPeripheralManager в комплекте с методом startAdvertising. Это означает, что вы должны иметь возможность сгенерировать словарь для передачи в startAdvertising на устройстве iOS, взять добычу на его содержание и скопировать его в свой tvOS апп.

На самом деле, люди уже делали это с OS X Mavericks в прошлом (я думаю, что Apple заблокировала это в Yosemite): http://www.blendedcocoa.com/blog/2013/11/02/mavericks-as-an-ibeacon/

Примечание: Я сам не пробовал этот метод. Вполне возможно, что Apple заблокировала этот трюк на tvOS просто так, как они сделали на OS X.

Видя, как люди "побег из тюрьмы" (или откровенного установить Linux) телевизоры Apple, вы можете устанавливать практически любые. Поскольку iBeacon является стандартным открытым Apple (и для которого существует открытый исходный код), я бы сказал, что ответ "да".

Хорошо, я наконец-то собрался проверить это, с результатом хорошо, некоторое обещание. Вот подробности, tvOS не имеет CLRegion, не будет компилироваться, поэтому официальный маршрут для iBeacon не работает.

Тем не менее получил его, чтобы увидеть iBeacon с этим кодом; так что есть надежда... может быть, не с iBeacons, но с Bluetooth...

Это код BLE, который я использовал...

import Foundation
import CoreBluetooth

class BLEManager  {
var centralManager : CBCentralManager!
var bleHandler : BLEHandler // delegate
required init() {
    self.bleHandler = BLEHandler()
    self.centralManager = CBCentralManager(delegate: self.bleHandler, queue: dispatch_get_main_queue())
}
}

class BLEHandler : NSObject, CBCentralManagerDelegate {
override init() {
    super.init()
}

func centralManagerDidUpdateState(central: CBCentralManager) {
    switch (central.state)
    {
    case .Unsupported:
        print("BLE is unsupported")
    case .Unauthorized:
        print("BLE is unauthorized")
    case .Unknown:
        print("BLE is unknown")
    case .Resetting:
        print("BLE is reseting")
    case .PoweredOff:
        print("BLE is powered off")
    case .PoweredOn:
        print("BLE is powered on")
        central.scanForPeripheralsWithServices(nil, options: nil)
    default:
        print("BLE default")
    }
    print("centralManagerDidUpdateState")
}

func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
    print("didConnectPeripheral")
}

func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
    print("\(peripheral.name) : \(RSSI) dBm")
}

func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) {
}

func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) {
    print("didDiscoverServices")
}

func peripheral(peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError?) {
    print("didDiscoverCharacteristicsForService")
}

func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) {
    print("didUpdateValueForCharacteristic")
}

func peripheral(peripheral: CBPeripheral, didUpdateNotificationStateForCharacteristic characteristic: CBCharacteristic, error: NSError?) {
    print("didUpdateNotificationStateForCharacteristic")
}

func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) {
    print("didDisconnectPeripheral")
}

}

С этими строками в viewontroller

 var bleManager: BLEManager!

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    bleManager = BLEManager()

Нужно сказать отдельное спасибо ритмик-фистману, который помог мне с кодом!