两部 iPhone 的双向 iBeacon

Two-Way iBeacon with 2 iPhones

我一直在尝试在两个 iOS 设备之间设置“双向 iBeacon 通信”。我尝试使用 This Technique on PubNub, and I guess I have managed to start the emitter for transmitting. However, both phones do not match as showed in this video.

由于我经验不足,这个指南对我来说不是很清楚,请看一下我的代码。我没有收到任何错误,项目在两部 iPhone 上都工作正常,我可以看到 Emitter 正在正确传输,但它们不匹配。

对于发射器和接收器,我都导入了 CoreLocation 和 CoreBluetooth 框架,并通过单击“+”在 info.plist 中添加了 'NSLocationAlwaysUsageDescription' 和 'NSLocationWhenInUseUsageDescription' (未从源代码中编码)。

发射器代码:

class ViewController: UIViewController, CBPeripheralManagerDelegate {
var major = 9
var minor = 6
let uuid = NSUUID(UUIDString: "0CF052C2-97CA-407C-84F8-B62AAC4E9020")
var peripheralManager = CBPeripheralManager()
var advertisedData = NSDictionary()   
}

 override func viewDidLoad() {
    super.viewDidLoad()
let region = CLBeaconRegion(proximityUUID: uuid, major: 9, minor: 6, identifier: "com.yourcampany.example")
    self.advertisedData = region.peripheralDataWithMeasuredPower(nil)
    self.peripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil)

func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager!) {
    switch peripheral.state {
    case CBPeripheralManagerState.PoweredOn:
        self.peripheralManager.startAdvertising(advertisedData)
        self.powerON.text = "Power ON"
    default:
        break
    }
}

收件人代码:

class ViewController: UIViewController, CLLocationManagerDelegate {
   @IBOutlet var label: UILabel!

 var region = CLBeaconRegion()
var locationManager = CLLocationManager()
let uuid = NSUUID(UUIDString: "0CF052C2-97CA-407C-84F8-B62AAC4E9020")

override func viewDidLoad() {
    super.viewDidLoad()
 region = CLBeaconRegion(proximityUUID: uuid, identifier: "com.yourcampany.example")
    self.locationManager.delegate = self
    self.locationManager.requestAlwaysAuthorization()
    self.locationManager.startMonitoringForRegion(self.region)
 }

func locationManager(manager: CLLocationManager!, didRangeBeacons beacons: NSArray!, inRegion region: CLBeaconRegion!) {
    var beacon = beacons.lastObject as CLBeacon
    switch beacon.proximity {
    case CLProximity.Immediate:
       self.label.text = "Immediate"
    case CLProximity.Near:
        self.label.text = "Near"
    default:
       self.label.text = "AAA"
    }
}

我的 Main.storyboard 上的标签未设置为任何值 "Immediate"、"Near" 或 "AAA"。

此外,如果我想传输一个字符串(由 5-6 个字符组成),最合乎逻辑的方法是什么?我读过不可能发送大量数据,但是发送几个字符的字符串怎么样? [可能使用 CentralManagerPeripheralManager]

您确实需要做的一件事是更改您的回调代码以在主线程上操作 UI。您必须像这样包装您的 UI 更改:

dispatch_async(dispatch_get_main_queue(),{
    switch beacon.proximity {
    case CLProximity.Immediate:
       self.label.text = "Immediate"
    case CLProximity.Near:
        self.label.text = "Near"
    default:
       self.label.text = "AAA"
    }
});

您还没有打电话给 self.locationManager.startRangingBeaconsInRegion(self.region)。如果没有此调用,您将无法获得对 didRangeBeacons 委托方法的回调。您已调用 self.locationManager.startMonitoringForRegion(self.region) 但这将导致调用您的 didEnterRegiondidExitRegion 委托方法。

所以你应该 -

override func viewDidLoad() {
    super.viewDidLoad()
 region = CLBeaconRegion(proximityUUID: uuid, identifier: "com.yourcampany.example")
    self.locationManager.delegate = self
    self.locationManager.requestAlwaysAuthorization()
    self.locationManager.startRangingBeaconsInRegion(self.region)
 }