簡體   English   中英

應用程序未運行時的iBeacon通知

[英]iBeacon Notification when the app is not running

我設法制作了一個iBeacon,當該信標在范圍內時,它會在我的iPhone上觸發本地推送通知。 當應用程序處於后台模式時,它可以完美運行。

我的問題是:即使應用未運行,甚至不在后台,我都可以觸發通知嗎?

我以為這是可能的,但我不確定。 如果是這樣,我該怎么做?

謝謝!

是的,這是可能的,應該是自動的。

創建CLBeaconRegion並開始對其進行監視之后,即使您的應用程序未運行,Location Services也會跟蹤您的手機在該區域內還是不在該區域之外。 如果您的應用程序在過渡期間沒有運行,iOS將在后台啟動您的應用程序幾秒鍾,以調用適當的CLLocationManagerDelegate方法。

我通過試驗自己的應用程序發現了上述行為,但還通過Apple的AirLocate示例程序進行了見證。 使用AirLocate,如果您設置了監視區域,然后重新啟動電話,則AirLocate仍會在電話進入該區域后立即發出本地通知。

測試時要小心,因為有時在打開/關閉iBeacon之后最多需要4分鍾才能使iOS識別區域狀態轉換。 編輯 :從iPhone 5開始,應用程序通常會在幾秒鍾內使用硬件加速來檢測信標,如果硬件加速不可用,則可能最多需要15分鍾。

編輯3:在iOS 13上,您必須確保用戶實際上授予了后台權限,而不是“僅一次”或“使用時”權限,這些權限由操作系統在向用戶顯示的對話框中大量推送。 有關詳細信息,請參見此處

編輯2:從iOS 8開始,您需要確保已調用並成功獲取locationManager.requestAlwaysAuthorization()作為locationManager.requestWhenInUseAuthorization()僅允許在前台檢測信標。

我在此博客文章中發布了有關這一切如何工作的詳細討論

好的,我已經使它能夠正常工作並對其進行了實驗,因此這就是答案。 這是在終止應用程序后越過信標區域邊界時要使應用程序被調用所需的操作(假設您的應用程序在前景中運行正常):

  1. 您必須AppDelegate.m模塊內實現CLLocation委托。 此委托是由iOS調用的,因此,如果您在AppDelegate.m沒有CLLocation委托代碼,則您的應用終止后將無法響應iOS。 這就是Apple的AirLocate示例應用程序所做的。

因此,在AppDelegate.m您需要執行以下操作(還需要在CoreLocation.h進行鏈接):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.

// This location manager will be used to notify the user of region state transitions when the app has been previously terminated.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
return YES;
}
  1. AppDelegate.m內部,您需要實現locationManager didDetermineState方法,如下所示:

     -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{ UILocalNotification *notification = [[UILocalNotification alloc] init]; if(state == CLRegionStateInside) { notification.alertBody = [NSString stringWithFormat:@"You are inside region %@", region.identifier]; } else if(state == CLRegionStateOutside) { notification.alertBody = [NSString stringWithFormat:@"You are outside region %@", region.identifier]; } else { return; } [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; } 

->因此,如果您的應用已終止(必須至少運行一次),則當設備跨您監視的信標邊界轉換時,iOS將調用您的應用並在AppDelegate.m中調用locationManager:didDetermineState方法模塊。 然后,可以在此方法內設置並調用presentLocalNotificationNow。 如果發生這種情況時您的應用程序不在前台,則iOS將在屏幕上顯示通知,即使該通知已被鎖定。 然后,用戶將不得不調用該應用程序以獲取更多信息。

我很確定內存壓力與此無關。 另外,設置notifyEntryStateOnDisplay也沒有與此問題相關的內容。 設置notifyEntryStateOnDisplay僅在用戶打開iOS設備顯示屏(即,單擊“主頁”或左上角按鈕)時使用。 如果用戶執行此操作,並且notifyEntryStateOnDisplayTRUE ,並且設備位於要監視的信標區域內,則此時您將在顯示屏上收到通知。 如果將此屬性設置為FALSE ,則不會。

當然,您需要運行iOS 7.1才能正常工作。

有關更多詳細信息,請訪問Apple的文檔。

您需要為CLBeaconRegion切換notifyEntryStateOnDisplay = YES,以使系統為iBeacon進入/退出事件喚醒您的應用程序。

但是有一個棘手的部分。 如果您的應用程序未在運行, 那么如果您的應用程序先前由於系統內存不足而終止,則系統只會喚醒您的應用程序以進行信標進入/退出處理 如果用戶通過在任務視圖中向上滑動來殺死應用程序,則系統將不會喚醒您的應用程序。 要驗證此行為,請啟動您的應用程序,將其置於后台,然后連續啟動多個消耗內存的應用程序。 在我的應用由於內存壓力而被系統終止之前,我啟動了一些3D游戲。

只需將您的iOS版本升級到7.1並設置“ notifyEntryStateOnDisplay = YES”,即使您的應用未運行,它也應該像超級按鈕一樣工作。 我之前有這個問題,但是一旦完成升級,它就可以解決! 請享用..

我能夠進行這項工作的唯一方法是監視似乎可以解決問題的主要位置更改。 請注意,我尚未針對所有設備或用例場景對此進行測試。

是的,我們可以按照殺死狀態或后台狀態顯示本地通知,只需按照以下步驟操作,

1)使用CLLocationManager類啟動位置管理器。

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy=kCLLocationAccuracyBest;
locationManager.distanceFilter=kCLDistanceFilterNone;

2)創建CLBeaconRegion,

CLBeaconRegion *beacon_Region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:mjorVa minor:minorVa identifier:identifier];
beacon_Region.notifyEntryStateOnDisplay = YES;
beacon_Region.notifyOnEntry=YES;
beacon_Region.notifyOnExit=YES;

3)實現兩個位置管理器委托方法,

-didEnterRegion
-didExitRegion

即使您的應用被殺死或在后台運行,上述兩個位置管理器方法也可以使用。 系統將跟蹤您的信標,當其超出范圍時,系統將觸發didExitRegion方法,而當其進入系統時將觸發didEnterRegion方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM