我有一個iBeacons應用程序能夠在後臺運行或不運行時爲信號範圍。我實施了UILocalNotifications
,它們工作正常,這意味着當我達到信標範圍時我會收到通知。iBeacons在後臺有時會延遲
不具有真實的信標我創建一個應用程序(用於另一個裝置,比方說一個ipad公司下一個場景),其作用就像2點不同的信標,這意味着它可以播放兩種不同的信號,同樣UUID
但不同Major/Minor
值(稱這個燈塔A和B),顯然是一次一個。我的問題是這樣的情景:
- 有我的iPhone(帶iBeacons應用程序關閉)在鎖屏
- 激活我的的iPad應用,廣播信標的
- 我的iPhone嚴正顯示我的通知
- 我停止iPad應用程序從廣播信標的,等待1秒,開始廣播臺B
- 我的iPhone DOES NOT反應
- 我停下來的iPad廣播
- 幾分鐘後(約2)我的iPhone顯示我臺B的通知現在
什麼,我不明白的是這種延遲,第一次我的iPhone立即作出反應,第二次大概需要2分鐘才能通知我燈塔。
如果在信標B通知後,我重新開始廣播信標(A或B),我的iPhone會立即作出反應,然後下一次它總是等待2分鐘。
這是怎麼發生的?我讀過一些文章說,這是因爲當應用程序處於後臺時,藍牙會每2-4分鐘喚醒一次,所以我可以得到的信息不會比這次更快。但我沒有看到太多的意義,因爲每當我得到的第二通知廣播的信標(B在我的情況)已經停止,這意味着,如果藍牙在那一刻醒來沒有烽火臺在空中!但是我收到了通知,所以這意味着在我停止廣播之前,我的iPhone在某種程度上發現了它。
這是一個可以解決的問題嗎?
編輯一些代碼
這裏是我的viewDidLoad
- (void)viewDidLoad
{
[super viewDidLoad];
// Initialize location manager and set ourselves as the delegate and beacons dictionary
_beacons = [[NSMutableDictionary alloc] init];
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Create a NSUUID with the same UUID as the broadcasting beacon
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"6C1AA496-1653-403D-BD1E-7F630AA6F254"];
// Setup a new region with that UUID and same identifier as the broadcasting beacon
self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
identifier:@"testregion"];
NSLog(@"startMonitoring");
// Tell location manager to start monitoring for the beacon region
[self.locationManager startMonitoringForRegion:self.myBeaconRegion];
[self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion];
_myBeaconRegion.notifyEntryStateOnDisplay = YES;
// Check if beacon monitoring is available for this device
if (![CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Monitoring not available" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; [alert show]; return;
}
}
現在,每當我一盞明燈我發送通知,我只是想嘗試它是如何工作的,所以我沒有實現的但是隻發送1個通知的方式,這意味着我得到了大約9個通知,每秒1個,這是代碼在後臺運行時的活動時間(1秒輸入區域,9個範圍的信標)
-(void)locationManager:(CLLocationManager*)manager
didRangeBeacons:(NSArray*)beacons
inRegion:(CLBeaconRegion*)region
{
if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground){
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Found Beacon";
notification.soundName = @"Default";
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}
}
實際上,如果我完全關閉我的應用程序從多任務視圖,或只是讓它在後臺,只要我開始播放燈塔我得到通知** S **(1秒延遲) 。然後停止廣播並重新播放延遲將變成分鐘。
現在對於一個真實的場景,我應該在同一個地方有多個信標,只要我得到通知時我可能已經遠離信標本身,這個延遲就可能是一個問題。
我的代碼有問題嗎?我閱讀了這些文章,但我從來沒有發現延遲15分鐘。 davidgyoung建議
我修改了代碼後
EDIT2照你說的用信標A和B 2個不同地區的延遲總是空。我還記錄了你給出的一段代碼,並且我發現了這一點。
- 廣播
Region_1
- 裝置的信標顯示我
Region_1
- 停止的廣播的
Region_1
- 信標日誌說,我仍然在該地區,只有經過幾分鐘的通知我得到日誌「OUTSIDE
Region_1
」,剛纔我可以重新播放廣播以獲得Region_1
的另一個通知。
所以我很好奇這和我閱讀和文章http://beekn.net/2014/03/apple-ios-7-1-launches-major-ibeacon-improvement/
撰文人說,從的iOS 7.1退出區域的響應是即時的,其實我跑7.1,但我也有一對夫婦分鐘延遲。爲什麼這個?你在測試中發現了同樣的問題嗎?
現在,我讀了一個設備可以偵聽不超過20個區域嗎?這意味着如果我有100個信標,我可以只設置20個區域,並將這100個分成20個組,並且不超過20個通知(假設這100個在同一個地方,都在我的設備範圍內)?這可能是一個問題,因爲會迫使用戶在前臺運行應用程序以獲取所有信息(假設100個信標中的每一個都具有特定和單位角色),對嗎?
如果您跳過第6步。是否發生過7次? – danh
是的,我在幾分鐘後得到通知 – r4id4
即使使用iOS7.1,背景檢測也不是即時的,可能需要幾分鐘的時間。我甚至發佈了一個證明! (請參閱我的第一個答案鏈接。)。是的,iOS將您限制在20個監控區域,因此您必須謹慎地設置它們。如果可以的話,請確定您將傳輸重疊的信標id,併爲這些信號使用單獨的區域。 (或者只是將多個信標的侷限性視爲單個區域) – davidgyoung