两部 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 个字符组成),最合乎逻辑的方法是什么?我读过不可能发送大量数据,但是发送几个字符的字符串怎么样? [可能使用 CentralManager 和 PeripheralManager]
您确实需要做的一件事是更改您的回调代码以在主线程上操作 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)
但这将导致调用您的 didEnterRegion
和 didExitRegion
委托方法。
所以你应该 -
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)
}
我一直在尝试在两个 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 个字符组成),最合乎逻辑的方法是什么?我读过不可能发送大量数据,但是发送几个字符的字符串怎么样? [可能使用 CentralManager 和 PeripheralManager]
您确实需要做的一件事是更改您的回调代码以在主线程上操作 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)
但这将导致调用您的 didEnterRegion
和 didExitRegion
委托方法。
所以你应该 -
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)
}