2016-08-22 36 views
14

我試圖在用戶接近站點時獲取一些公交車到達時間,我已經過測試以確保通過發送基本本地通知來正確觸發區域,並且我還測試了我的網絡服務電話,以確保它正常工作。基於動態位置的本地通知Swift iOS

但是,我很難獲取信息,然後發送通知。

這裏是我的代碼:

var bgTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier() 

    bgTask = UIApplication.shared().beginBackgroundTask { 

     self.webService?.getStopEstimates(routeStopIds: stopRouteIdSet, routeNameDict: routeNameDict, completion: { (result) in 

      if result == "error" { 
       return 
      } 

      let notification = UILocalNotification() 
      notification.fireDate = Date(timeIntervalSinceNow: 1) 
      notification.alertTitle = region.identifier + " Stop Details" 
      notification.alertBody = result 
      notification.soundName = UILocalNotificationDefaultSoundName 
      UIApplication.shared().scheduleLocalNotification(notification) 
     }) 

     UIApplication.shared().endBackgroundTask(bgTask) 
    } 

任何一個明白爲什麼它可能尚未發送?我已啓用後臺提取和位置服務。這是didEnterRegion

+1

既然你'使用Swift 3知道有一個新的UserNotifications框架。 – tktsubota

+0

難道你確實忘記了在基金申請中註冊通知(_申請:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)。註冊碼:let notificationSettings = UIUserNotificationSettings(類型:.alert,類別:無) application.registerUserNotificationSettings(notificationSettings) – Ramis

+0

您如何測試?在Xcode中?添加一些日誌記錄來檢查請求是否被髮送/接收。任何錯誤? – Wain

回答

3

檢查this example on GitHub因爲我認爲你的問題在這裏是你如何處理後臺任務。如果Web服務調用時間過長,後臺任務將失效。我不知道你如何知道ObjC,但在上面的例子中,你會發現一個BackgroundTaskManager類爲你處理。

事情你應該確保的是:

  1. 背景在目標設置(背景模式部分)取的 ON。
  2. 您已經詢問並獲得「始終」授權(在plist中)
  3. 目標設置(背景模式)部分中的位置更新爲ON。
  4. 在應用程序委託中的appDidFinishLaunching中爲用戶通知註冊。
  5. 如果服務時間過長,請更新過期的後臺任務。

在呼籲startUpdatingLocation,而你的應用程序在後臺運行的情況下,CoreLocation仍然開始爲你的應用程序的位置更新響應,但系統將不再持有斷言你,和你的應用程序將被暫停一旦在後臺允許的時間被使用。這次(現在)是10秒。但實際上,您的應用現在已被暫停,並且不能再收到更新。有一種方法可以通過僱用beginBackgroundTaskWithExpirationHandler:read more about it in Apple's CoreLocation Documentation

將此持續時間延長至(當前)達3分鐘。此延長時間是否足夠取決於您的應用程序。

對於您的使用案例,重要位置更改服務非常有效。 當您的應用處於前臺時,您可以開始位置更新,並在應用處於後臺時推遲位置更新。你可以also read Apple's documentation about Significant Location Change

5

我做了同樣的事情(當用戶接近有折扣的商店時,他/她將被通知)。

首先,我會建議你下載所有的數據,並保存在覈心數據或SQLite,如果這是一個選項。

第二個看看重要的位置變化here。如果您正在移動,它將在每500米的後臺更新您的位置,它將節省大量電池而不是didUpdateLocation。

第三次使用SLC後,在每次調用時,從您的核心數據或SQLite中提取當前位置的20個最近位置並添加它們進行監視(使用Haversine計算距離當前位置的所有點距離, 20最近)。每次調用SCL時,都會更新您監控的區域(如果不希望離線保存數據,我建議您在此處發送請求到您的web服務。理想的情況是,您將把您的位置發送到您的web服務,並且它會回覆然後添加它們以進行監視)

當didEnterRegion調用時,請確保您已下載數據,然後創建本地通知。

讓我知道,如果你需要更多的細節

PS。請記住,如果系統消耗大量資源,系統可能會終止(在後臺)。在這種情況下,你必須重新初始化你需要的拉動和顯示數據所需的一切(網絡請求,位置管理等),您可以檢測到應用程序重新啓動,因爲在AppDelegate中的didFinisingLaunchingWithOptions定位事件的:

if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {}