是的,你可以這樣做。訣竅是你需要同時結合和測距和監測。需要進行監控才能將您的應用程序啓動到後臺。需要測距才能獲得您所看到的信標的特定ID。
設置它是這樣的:
CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"blah"];
region.notifyOnEntry = YES;
[self.locationManager startMonitoringForRegion:region];
[self.locationManager startRangingBeaconsInRegion:region];
一旦發生這種情況,應用程序進入前回去睡覺了,這方法會每秒調用一次,你會得到範圍約五秒鐘回調:謹慎的
-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
if (!_firstOneSeen) {
_firstOneSeen = true;
// Do something with beacons array here. read out the major/minor and get the
// notification message from your XML web service
}
}
有兩點需要注意:
監測iBeacon顯示背景中的區域可能有點棘手,並且可能需要比您想象的回調時間更長的時間。看到這個detailed discussion.
從應用程序被喚醒直到它重新進入睡眠狀態,您只有五秒鐘時間,因此您的網站會更快地做出響應。一個可以跨網絡丟失工作的更安全的想法是預先獲取XML並將其緩存到應用程序中,以便即使存在網絡丟失也可以繼續使用。
我公司,方圓網絡使圖書館和網絡服務,稱爲ProximityKit做這個工作的前期,你可以使用Web瀏覽器配置特定的信標鍵/值對的緩存。這樣,您就不必親自編寫Web服務。
大衛,我想知道的一件事:你可以監視信標,然後在你的didEnterRegion方法開始測距?當didEnterRegion在後臺被觸發時,你仍然可以接聽電話嗎?我沒有嘗試過,並想知道它是否會起作用。 –
我還沒有嘗試過,但我的猜測是它會起作用。這種方法的缺點是你會丟失一秒鐘的後臺處理時間。此外,它會從剛開始測距起到類似的效果,因爲在四秒鐘內,您的應用將會在背景中放入睡眠狀態。從一開始就沒有理由不啓用Ranging - 它不會在後臺更頻繁地發生掃描,所以它不會對電池產生影響。 – davidgyoung
這很棒。感謝大衛對你的幫助! – causerie