2016-12-08 1 views
1

Я хочу передать маяковый сигнал с помощью iPhone. На данный момент он будет реализован в Objective C, но есть план по его преобразованию в Swift позже, поэтому я также заинтересован в поиске любых важных различий, с которыми я могу столкнуться на этом этапе.Имитировать маяк с iPhone с использованием выделенного класса

В некоторых исследований я был в состоянии найти некоторые ограничения при моделировании Beacon

Can I make iPhone/iPad broadcast as Eddystone Beacon?

, а также информацию о некоторых проблемах при использовании класса, отличного зрения контроллера, по крайней мере, в скор

Using iPhone as iBeacon Transmitter

В этой последней ссылке я нашел ссылку на учебник Swift для моделирования iBeacon с iPhone - код размещен в View Controller, и он работает в этом месте.

https://www.hackingwithswift.com/example-code/location/how-to-make-an-iphone-transmit-an-ibeacon

Но с помощью сердечника Bluetooth от View Controller является серьезным ограничением, если я хочу приложение, чтобы сделать некоторые другие вещи, чем просто передача BLE сигнала. И этот другой материал требует отклонения моего контроллера.

Вскоре я попытаюсь создать рабочий код для Objective C и позже для Swift для испускания сигнала BLE и изменения видимых контроллеров View. Но, возможно, кто-то сделал что-то подобное и сможет сказать, были ли какие-либо проблемы, как упоминалось ранее.

+0

Не должно быть проблем с тем, что он не является подклассом ViewController. Использование singleton должно работать. – Larme

ответ

2

Да, вы можете абсолютно настроить передачу маяка на iOS за пределами ViewController. Ниже приведен простой класс Swift, который я использовал для ряда проектов.

Обратите внимание, однако, что, хотя вы можете использовать такой класс для рекламы, независимо от того, какой вид ViewController находится на переднем плане, реклама остановится, если все ваше приложение находится в фоновом режиме. Это ограничение Apple iOS. См. here для получения дополнительной информации.

import Foundation 
    import CoreBluetooth 
    import CoreLocation 
    import UIKit 

    class BeaconTransmitter: NSObject, CBPeripheralManagerDelegate { 
    var region: CLBeaconRegion? 
    var on = false 
    var _peripheralManager: CBPeripheralManager? 
    var peripheralManager: CBPeripheralManager { 
     if _peripheralManager == nil { 
     _peripheralManager = CBPeripheralManager(delegate: self, queue: nil) 
     } 
     return _peripheralManager! 
    } 
    override init() { 
     super.init() 
    } 

    func stop() { 
     on = false 
     peripheralManager.stopAdvertising() 
    } 

    func start(region: CLBeaconRegion) { 
     on = true 
     self.region = region 
     startTransmitting() 
    } 

    func startTransmitting() { 
     if let region = region { 
     let peripheralData = region.peripheralData(withMeasuredPower: -59) as Dictionary 
     peripheralManager.stopAdvertising() 
     peripheralManager.startAdvertising(peripheralData as? [String : AnyObject]) 
     } 
    } 

    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) { 
     if(peripheral.state == .poweredOn) { 
     if on { 
      startTransmitting() 
     } 
     } 
     else if(peripheral.state == .poweredOff) { 
     NSLog("Bluetooth is off") 
     } 
     else if(peripheral.state == .unsupported) { 
     NSLog("Bluetooth not supported") 
     } 
    } 
    } 
+0

Спасибо. Рабочий код в Swift достаточно, чтобы доказать, что проблем не будет. Кажется, что в связанном вопросе что-то не так (возможно, не вызывающий метод или не сохраняющий экземпляр класса ... Из-за любопытства - настройка мощности для периферии была необходима или это был просто свободный выбор силы сигнала «iBeacon»? –

+0

Ну, вы * имеете *, чтобы установить значение мощности, потому что так работает API. Если вы его не предоставите, вы получите ошибку компилятора. Тем не менее, вы можете поместить любую ценность там, где хотите. будет неправильной оценкой расстояния на принимающей стороне. Значение мощности предназначено, чтобы сообщить получателю, насколько сильный сигнал должен быть в дБМ, когда он находится на расстоянии одного метра. – davidgyoung

+0

Я понимаю. Тем временем я нашел [здесь] (https: // github.com/AltBeacon/altbeacon-transmitter-android), что это значение эквивалентно неконфигурируемой мощности передатчика iPhone. Так что теперь я счастлив и осведомлен. Спасибо :) –

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