2013-11-21 37 views
7

我正在使用air定位示例並僅通過uuid監視iBeacons。當我得到輸入的區域事件時,如果我只是在尋找uuid,我似乎無法從觸發該事件的信標/區域獲得主要和次要信息(如果我正在監視uuid,指定主要和次要) - 有沒有人知道一種方法來做到這一點/我錯過了什麼?iBeacon:獲取主要和次要 - 僅查找uuid

我並不真的要開始爲 - 似乎並不像我應該需要..

(用例是說很多商店都用相同的UUID的包,然後發出有關該商店的相關信息)

這裏基本上我做什麼(通過查詢主要和次要獲得)OS通知:

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
identifier:@"blah"]; 
region.notifyOnEntry = YES; 
region.notifyOnExit = YES; 
region.notifyEntryStateOnDisplay = YES; 

[self.locationManager startMonitoringForRegion:region]; 
在應用程序委託

然後:

- (void) locationManager:(CLocationManager*)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion*)region { 

    // assume for now its the iBeacon 
    CLBeaconRegion *beaconRegion = (CLBeaconRegion*) region; 

    beaconRegion.major // hasn't been set... 

} 

非常感謝!

回答

19

你沒有做錯什麼。令人驚訝的是,監控API並沒有爲您提供觸發區域更改的特定信標。

主要不在CLBeaconRegion對象上設置的原因是因爲它與您用於開始監視的對象完全相同,並且您將該字段設置爲零(或者根本沒有設置它,而不會將其設置爲零) 。你正在尋找的是另外一組CLBeacon對象。正如你所建議的那樣,這只是在Ranging API上纔有的。

開始測距實在不是什麼大不了的事。只需將它設置在完全相同的時間,因爲你開始監視:

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid 
identifier:@"blah"]; 
region.notifyOnEntry = YES; 
region.notifyOnExit = YES; 
region.notifyEntryStateOnDisplay = YES; 

[self.locationManager startMonitoringForRegion:region]; 
[self.locationManager startRangingBeaconsInRegion:region]; 

如果你只關心第一測距通話時,您可以使用一個標誌,忽略進一步的更新:

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { 
    if (!_firstOneSeen) { 
     // Do something with beacons array here 
    } 
} 

而且當你離開該地區

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
    _firstOneSeen = NO; 
} 

作爲獎勵重置標誌,這也將讓您的監控響應時間更快,當你的應用程序是在前臺。請參閱:http://developer.radiusnetworks.com/2013/11/13/ibeacon-monitoring-in-the-background-and-foreground.html

+0

非常感謝David,這真的很有幫助。同樣感謝您的其他SO回答,這些回答非常寶貴。 – Matthew

+3

好帖子。然而,一個小修正。您在didEnterRegion/didExitRegion調用中獲得的region對象與您用於註冊的CLBeaconRegion對象不同 - 它是一個副本。我知道這是因爲一開始我嘗試使用表單的代碼if(region == regionImTracking)並且比較失敗。我登錄了兩個地區,他們的地址不同,而他們的所有設置都匹配。 –

+0

啊,重要的是要知道,謝謝! – davidgyoung

4

不幸的是,如果您僅受UUID監控,則確定主要和次要只能在iBeacon測距API中使用,而不能在iBeacon監控API中使用。此外,

1)當您的應用程序在後臺時,iBeacon範圍不起作用。這意味着如果您的應用程序位於後臺(這是大多數這類應用程序的時間),則無法確定iBeacon的主要和次要內容,除非您基於UUID(主要和次要)進行監視。

2)您最多隻能同時監視20個iBeacons。這意味着如果你使用UUID進行監控,主要和次要(爲了解決後臺問題),你將僅限於20個iBeacons(在大多數實際案例中是一個很大的限制)。

3)爲獲得最大可伸縮性(因爲您只能同時監視20個iBeacons),最好僅通過UUID進行監視,並在檢測到該UUID的iBeacon時通知用戶,並在用戶通知用戶可以確認應用程序進入前臺。一旦應用程序在前臺進行測距,就可以確定iBeacon的主要和次要區域。

所有這些讓我想知道爲什麼Apple沒有在監控API中引入觸發入口/出口的iBeacons數組。我留給蘋果發表評論。以下後進入非常詳細的關於這些iBeacon顯示行爲/限制 - iBeacon in the background - Use cases

+0

您可能想要查看關於您鏈接問題後臺測試的評論。 –

0
  • CLBeaconRegion是過濾器標準找到信標。所以你傳入的是你在「didEnterRegion」委託觸發時要返回的內容。那裏沒有驚喜。

  • CLBeacon是必須符合過濾標準來觸發didEnterRegion委託的單個信標。所以這裏是你會發現主要的次要價值的地方。要獲得激發的信標,您需要調用測距API startRangingBeaconsInRegion並在停止測距之前給它一個數爲5的計數。在得到didEnterRegion回調後執行此操作。當您不想啓動您的應用程序時,這是針對信標的後臺監控。但是當用戶通過信號燈在服務器上構建智能以獲得更有針對性的廣告系列時,只需記下它們。

有時可能範圍內找不到任何標,在這種情況下使用回調beaconRegion爲startRangingBeaconsInRegion記下,有人進入了一個燈塔地區。