質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

6982閲覧

バックグラウンドでの位置情報取得が動かない

sont

総合スコア35

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/09/17 07:03

編集2016/09/19 13:28

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("位置情報更新再開") } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2016/09/20 02:48

バックグラウンド後は一度も取得出来ないのでしょうか?それとも一定時間後から取得出来なくなるのでしょうか?
sont

2016/09/20 10:11

バックグラウンドに行った後は、一度も取得できません。 正確には、フォアグラウンド時には出ていた、 locationManager: didUpdateLocation latitude: 31.4259205549388 longitude: 133.819347974119 といったログが何も出てきません。
guest

回答2

0

自己解決

自己解決する結果となりました。
https://teratail.com/questions/46572
こちらの回答のベストアンサーにあるように、
locationManager?.allowsBackgroundLocationUpdates = true
を追加してやったところ、期待通りに動作するようになりました!
ありがとうございました。

投稿2016/09/27 10:07

sont

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

swift

1locationManager?.pausesLocationUpdatesAutomatically = true

これだと一定時間後に停止してしまう場合がありますが、その停止条件に当てはまっていないでしょうか?
無条件に停止させたくない場合はfalseにして下さい。

投稿2016/09/20 02:46

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sont

2016/09/20 10:13

ご指摘の部分をfalseにして再度試してみましたが、結果は同じでした。 また、pauseした際は、 func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) { print("位置情報更新停止") } これが呼ばれると思っていたのですが正しいでしょうか? これも呼ばれている様子はありませんでした。 ところで、初歩的な質問かもしれませんが、バックグラウンド状態でコードが正しく動いていた場合、ログは表示されるものなのでしょうか?
fuzzball

2016/09/21 04:57 編集

実際には試していませんがpauseは15分後にかかるらしいです。 ログはバックグラウンド時にも表示されます。 こちらでは、iPhone5+iOS8でバックグラウンドでも正しく動作していますが、問題を切り分けたいので、Simulatorで試していただけるでしょうか?Simulatorで起動後、[Debug]-[Location]の[City Bicycle Ride]以降を選べば勝手に動き回ります。(こちらでは、Simulator iPhone5s+iOS9.3で正常動作を確認しました) 一つ確認ですが、Xcode8を使っているでしょうか?(質問のコードそのままだと一部エラーが出ましたので)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問