2015-04-04 42 views
1

我一直试图在两个iOS设备之间设置'双向iBeacon通信'。我试图使用This Technique on PubNub,我想我已经设法启动发射器。但是,这两款手机都不匹配,如video所示。带有2个iPhone的双向iBeacon

由于我缺乏经验,本指南对我来说不是很清楚,请查看我的代码。我没有收到任何错误,并且两个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标签不设置任何一个值 “立竿见影” 的,“近“或”AAA“。

另外,如果我想传输一个字符串(由5-6个字符组成),最合乎逻辑的方法是什么。我已经读过不可能发送大量数据,但是如何处理一些字符串? [也许使用CentralManagerPeripheralManager]你需要确保做

+0

你得到提示接收器上的位置,使用情况如何?如果没有,您可能没有正确设置权限。 – davidgyoung 2015-04-04 21:26:41

+0

你似乎没有调用'startRangingBeaconsInRegion:' – Paulw11 2015-04-04 21:54:37

+0

@davidyoung:通过说出提示,你的意思是控制台?我没有得到任何提示在控制台接收器(而我在控制台的发射器)。 此外,我非常确定发射器工作正常,因为当蓝牙关闭时,我有一个文本标签,说加载,但是当我打开蓝牙,它说“开机”。 @ Paulw11:我应该在哪里放置'startRangingBeaconsInRegion:'?我很困扰。 – senty 2015-04-04 21:58:18

回答

1

您还没有拨打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) 
} 
+0

我已经将行改为'self.locationManager.startRangingBeaconsInRegion(self。 (self.region)'',我开始得到_fatal错误:意外地发现nil(如你所说的并且增加了'dispatch_async(dispatch_get_main_queue(),'),但仍然没有改变。同时展开一个可选值_ – senty 2015-04-04 22:28:08

+0

您需要查看哪个值是零和在哪一行 – Paulw11 2015-04-04 22:30:34

+0

它不会在al国家统计局。当我在成功运行模拟器后按下“退出模拟器”时,它会在控制台中得到提示,并且“在手机上安装成功时”。 – senty 2015-04-04 22:45:49

0

一件事是改变你的回调代码来处理在主线程的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" 
    } 
}); 
+0

相关我只有'dispatch_async( dispatch_get_main_queue()'在'var beacon'的右下方的'func locationManager()'的顶部,就像你显示的那样,但是不幸的是,没有什么改变。 – senty 2015-04-04 22:04:30