Timerを利用したバックグラウンドでの位置情報の取得
【Tips】iOSで位置情報を取得する方法(Swift 3.0対応)
http://blog.koogawa.com/entry/2016/03/26/181906
バックグラウンドでの定期的な処理について
https://ja.stackoverflow.com/a/8513/18443
上記2サイトの処理をくっつけて「Timerを利用して、バックグラウンドでも位置情報を1秒ごとにprint出力するアプリ」をつくりたいのですが、アプリをバックグラウンドにすると、5秒ほどしてからprint出力がストップしてしまいます。
どこでミスが生じているのか、教えてください。
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var latTextField: UITextField!
@IBOutlet weak var lngTextField: UITextField!
var locationManager: CLLocationManager!
var backgroundTaskIdentifier: UIBackgroundTaskIdentifier?
override func viewDidLoad() {
super.viewDidLoad()
if CLLocationManager.locationServicesEnabled() {
locationManager = CLLocationManager()
locationManager.delegate = self
backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: {
UIApplication.shared.endBackgroundTask(self.backgroundTaskIdentifier!)
})
var timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: "update", userInfo: nil, repeats: true)
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if CLLocationManager.locationServicesEnabled() {
locationManager.stopUpdatingLocation()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - CLLocationManager delegate
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
case .notDetermined:
locationManager.requestWhenInUseAuthorization()
case .restricted, .denied:
break
case .authorizedAlways, .authorizedWhenInUse:
break
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let newLocation = locations.last,
CLLocationCoordinate2DIsValid(newLocation.coordinate) else {
self.latTextField.text = "Error"
self.lngTextField.text = "Error"
return
}
print("".appendingFormat("%.4f", newLocation.coordinate.latitude))
self.latTextField.text = "".appendingFormat("%.4f", newLocation.coordinate.latitude)
self.lngTextField.text = "".appendingFormat("%.4f", newLocation.coordinate.longitude)
}
func update(){
locationManager.startUpdatingLocation()
}
}