2015-04-04 46 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