2017-06-30 4 views
2

バックグラウンドで場所が変更されると、サーバーの場所を更新したいと思います。私は、重要なロケーションの変更を受け取るたびに、バックグラウンドでロケーションを更新する安全な方法を望んでいます。ネットワーク通話を行うにはどうすればいいですか?アプリケーションがバックグラウンド状態にある場合は、取得ロケーションを取得したらバックグラウンドネットワークコールを行うにはどうすればよいですか?

func endBackgroundUpdateTask() { 
     UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask) 
     self.backgroundUpdateTask = UIBackgroundTaskInvalid 
    } 


    func scheduledLocationManager(_ manager: APScheduledLocationManager, didUpdateLocations locations: [CLLocation]) { 
     print(locations.last?.description ?? "no location") 
     self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: { 
      Alamofire.request("https://testomkar.herokuapp.com/log", method: .post, parameters: ["log":locations.last?.description ?? "no location"]).validate().responseJSON(completionHandler: { (responce) in 
       self.endBackgroundUpdateTask() 
      }) 
     }) 


    } 

答えて

2

UIBackgroundTaskIdentifier

func scheduledLocationManager(_ manager: APScheduledLocationManager, didUpdateLocations locations: [CLLocation]) { 

    print(locations.last?.description ?? "no location") 

    // Get the background identifier if the app is in background mode 
    if UIApplication.shared.applicationState == .background { 
     backgroundUpdateTask = UIApplication.shared.beginBackgroundTask { [weak self] in 
      if let strongSelf = self { 
       UIApplication.shared.endBackgroundTask(strongSelf.backgroundUpdateTask) 
       self.backgroundUpdateTask = UIBackgroundTaskInvalid 
      } 
     } 
    } 

    // Call the api to update the location to your server 
    Alamofire.request("https://testomkar.herokuapp.com/log", method: .post, parameters: ["log":locations.last?.description ?? "no location"]).validate().responseJSON(completionHandler: { (responce) in 

      //API completion block invalidate the identifier if it is not invalid already. 
      if self.backgroundUpdateTask != nil && self.backgroundUpdateTask != UIBackgroundTaskInvalid { 
       UIApplication.shared.endBackgroundTask(backgroundUpdateTask) 
       self.backgroundUpdateTask = UIBackgroundTaskInvalid 
      } 
    }) 
} 
関連する問題