iOSアプリで、アプリがバックグラウンド状態でも緯度・経度を取得するコードを実装しようとしています。
フォアグラウンド状態での緯度・経度取得は問題なくできましたが、バックグラウンド状態になると、取得がうまく動いていないようです。
フォアグラウンド状態だと、
locationManager: didUpdateLocation
latitude: 31.4259205549388
longitude: 133.819347974119
みたいなログが定期的に吐き出されますが、
バックグラウンドになると、ログが何も出てこなくなります。
ちなみに、実機上での動作をおこなっており、
フォアグラウンド状態だと、iPhoneの通知バーにGPSマーク(矢印マーク)が表示されていますが、バックグラウンド状態にするとそのマークが消えています。
また、
・CapabilityesのBackground ModesでLocation updatesをチェック
・info.plistに
NSLocationAlwaysUsageDescriptionの設定
Required background modes -> Item 0 でApp registers for location updatesを設定
・CoreLocation.frameworkをインポート
といったことは済んでいます。
以下にソースコードを貼り付けます。
何がいけないのか、どなたかアドバイスいただけますか?
import UIKit import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate { @IBOutlet weak var latitudeLabel: UILabel! @IBOutlet weak var longitudeLabel: UILabel! @IBOutlet weak var stopButton: UIButton! @IBOutlet weak var startButton: UIButton! var locationManager : CLLocationManager? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let status = CLLocationManager.authorizationStatus() if status == CLAuthorizationStatus.restricted || status == CLAuthorizationStatus.denied { print("Location Auth error!") } locationManager = CLLocationManager() locationManager?.delegate = self if CLLocationManager.authorizationStatus() != CLAuthorizationStatus.authorizedAlways { locationManager?.requestAlwaysAuthorization() // 位置情報サービスを開始するか、ユーザーに尋ねるダイアログを表示する。 } if !CLLocationManager.locationServicesEnabled() { return } // 測地制度を設定 locationManager?.desiredAccuracy = kCLLocationAccuracyBest locationManager?.distanceFilter = 0.01 locationManager?.pausesLocationUpdatesAutomatically = true } @IBAction func onClickStartButton (_ sender: AnyObject) { // 位置情報更新を開始。 print("onClickStartButton") locationManager?.startUpdatingLocation() } @IBAction func onClickStopButton(_ sender: AnyObject) { // 位置情報更新を停止。 print("onClickStopButton") locationManager?.stopUpdatingLocation() latitudeLabel.text = "-" longitudeLabel.text = "-" } // Delegate Method func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { print("locationManager: didUpdateLocation") let lastLocation = locations.last if let last = lastLocation { let eventDate = last.timestamp if abs(eventDate.timeIntervalSinceNow) < 15.0 { // 15秒以内に取得された位置情報のみを扱う。 // 古すぎるデータがイベントとしてキックされてきたときは破棄。 if let location = manager.location { latitudeLabel.text = "\(location.coordinate.latitude)" longitudeLabel.text = "\(location.coordinate.longitude)" print("latitude: " + latitudeLabel.text!) print("longitude: " + longitudeLabel.text!) } } } } func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) { print("位置情報更新停止") } func locationManagerDidResumeLocationUpdates(_ manager: CLLocationManager) { print("位置情報更新再開") } }
回答2件
あなたの回答
tips
プレビュー