2014-01-18 117 views
3

當iBeacon(使用Kontakt Beacon)以背景模式進入區域時,我設法得到本地通知。同時我監視3個具有特定&唯一標識符(每個具有相同的UUID但唯一的主要和次要組合)的信標區域。在鎖屏模式下,我的應用程序可以通知這些信標出現的時間,但我不知道爲什麼即使信標和我的應用程序仍然幾乎彼此相鄰,代表DidExitRegion仍然被調用,請查看我的日誌。iBeacon每隔1分鐘不斷地進入和退出區域

2014年1月18日11:56:49.828 sunlandbeacon [1385:60B]輸入無效模式

2014年1月18日11:56:49.848 sunlandbeacon [1385:60B] EnterBackgroundMode 與徽章0

2014年1月18日11:57:28.629 sunlandbeacon [1385:60B]退出信標範圍

2014年1月18日11:57:29.305 sunlandbeacon [1385:60B]本地通知 與徽章會發生1

2014年1月18日11:57:29.307 sunlandbeacon [1385:60B]:58:15.173 sunlandbeacon與 flagvalue 1

2014年1月18日11輸入區域1 [1385:60B]退出信標範圍

2014年1月18日11:58:15.176 sunlandbeacon [1385:60B]退出信標範圍

2014年1月18日11:58:15.178 sunlandbeacon [1385:60B]退出信標範圍

2014-01-18 11:58:15.880 sunlandbeacon [1385:60b]本地通知 發生徽章2

11 2014年1月18日:58:15.886 sunlandbeacon [1385:60B]:58:16.175 sunlandbeacon與 flagvalue 1

2014年1月18日11輸入區域1 [1385:60B]本地通知 會發生與徽章3

2014年1月18日11:58:16.184 sunlandbeacon [1385:60B]:59:02.784 sunlandbeacon與 flagvalue 2

2014年1月18日11輸入區域2 [1385:60B]退出信標範圍

2014-01-18 11:59:01 2.787 sunlandbeacon [1385:60B]退出信標範圍

2014年1月18日11:59:02.790 sunlandbeacon [1385:60B]退出信標範圍

2014年1月18日11:59:03.491 sunlandbeacon [1385:60B]本地通知 與徽章4偏偏

2014年1月18日11:59:03.493 sunlandbeacon [1385:60B]與 flagvalue 1

2014年1月18日11輸入區域1: 59:03.792 sunlandbeacon [1385:60b]本地通知 帶徽章5

2014-01-18 11:59:03。796 sunlandbeacon [1385:60B]與 flagvalue 2

回答

10

的情況並不少見,請輸入區域2 CoreLocation定期有「毛刺」,然後給你一個通知說你退出的範圍,然後一秒鐘後說你進入同一地區。

在沒有看到您的代碼的情況下,很難確定這是發生了什麼,但如果是這樣,您可以通過在退出程序中添加軟件過濾器並輸入事件來輕鬆修復此問題。如果在前幾秒內發生同一區域的進入事件,則基本上可以忽略退出事件。同樣,如果在前幾秒內發生同一區域的退出事件,則會忽略輸入事件。

爲了做到這一點,您需要保留兩個表格,一個表格包含按地區鍵入的最新條目事件,另一個表格包含按地區鍵入的最新退出事件。

這裏是代碼的例子把在didEnterRegion回調方法,它使用一類級別的NSMutableDictionary稱爲_enteredTimes作爲查找表來完成這個頂部:

NSDate *now = [[NSDate alloc] init]; 
CLBeaconRegion *beaconRegion = (CLBeaconRegion *) region; 
NSString *regionKey = [NSString stringWithFormat: @"%@_%@_%@", beaconRegion.proximityUUID, beaconRegion.major, beaconRegion.minor]; 
NSDate *lastEntered = [_enteredTimes valueForKey:regionKey]; 
[_enteredTimes setValue: now forKey: regionKey]; 
if (lastEntered != Nil && [now timeIntervalSinceDate:lastEntered] < 10) { // last 10 secs 
    // ignore this event 
    return; 
} 

你必須把相當的代碼您的didExitRegion回調。

+0

謝謝你的快速回答並節省我的一天。這正是我需要的。 –

2

已知CoreLocation在監視區域和測距信標時通知相當不穩定。我們必須在我們的示例應用程序中實現類似的範圍通知過濾器,源代碼爲https://github.com/BlueSenseNetworks/iOS

基本上,應用程序會保留一個循環緩衝區,並顯示最新的10次事件,並根據類型大部分目擊。

+0

謝謝,我沒有足夠的聲望投票給你。我想知道爲什麼蘋果文檔根本沒有提到這個故障 –

+1

這不是真的一個小問題,CoreLocation似乎只提供了一個裸機實現的iBeacon測距/監測,並且它遭受RSSI指標的不穩定。 BLE RSSI無意提供可靠的距離測量,即使藍牙規格警告也不要將其用於此類:) –