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

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

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

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

Swift

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

Q&A

解決済

2回答

10803閲覧

iOSアプリ終了後も位置情報を取得し続けたい

hiroky115

総合スコア8

iOS

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

Swift

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

0グッド

3クリップ

投稿2020/01/24 05:49

編集2020/01/24 08:32

前提・実現したいこと

iOSアプリで位置情報を取得し保存するアプリケーションを作っています。
アプリを終了した後も位置情報を取得し続ける機能を実装しようとしているのですが、
うまく動きません。

該当のソースコード

swift

1class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate { 2 var locationManager: CLLocationManager! 3 4 func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: 5 [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { 6 locationManager = CLLocationManager() 7 locationManager.delegate = self 8 locationManager.requestAlwaysAuthorization() 9 locationManager.startUpdatingLocation() 10 } 11 12 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 13 /* ここで位置情報を取得、保存する */ 14 } 15}

試したこと

  • 該当のソースコードを実装し
  • アプリの「位置情報の利用を許可:常に」を設定
  • アプリ起動 → バックグラウンドへ移動 → アプリをキル(別アプリを開くのではなくタスクマネージャーから消す)

補足情報(FW/ツールのバージョンなど)

XCode 11.3.1
iOS 13

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

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

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

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

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

guest

回答2

0

自己解決

解決しましたので、実装方法を記載します。

試したアプリの流れ

  1. アプリ起動
  2. 起動と同時に位置情報取得開始
  3. アプリ終了(バックグラウンドからも消す)

実装方法

  1. アプリ起動

1-1. applicationWillEnterForeground()が実行されるので、以下を実行
1-2. CLLocationManager.startMonitoringSignificantLocationChanges()を実行
1-3. CLLocationManager.startUpdatingLocation()を実行
1-4. 位置情報の計測開始
2. アプリ終了
2-1. applicationDidEnterBackground()が実行されるので、以下を実行
2-2. CLLocationManager.stopUpdatingLocation()を実行
2-3. CLLocationManager.startMonitoringSignificantLocationChanges()を実行
3. 位置情報が変更される(移動する)
3-1. applicationのwillFinishLaunchingWithOptions()が実行されるので、以下を実行
3-2. CLLocationManager.stopUpdatingLocation()を実行
3-3. CLLocationManager.startMonitoringSignificantLocationChanges()を実行

気を付ける点

  • 位置情報が変化するごとにlocationManager()が呼び出される(時間ごとではない)
  • 位置情報を「常に許可」を選択してもらう必要がある
  • 位置情報が変化した時、application()のwillFinishLaunchingWithOptionsに値が渡される。その時LocationManagerの初期化すること

投稿2020/01/27 05:57

hiroky115

総合スコア8

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

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

0

終了後→バックグラウンド時 と読み替えて回答しますが、以下のサイトが参考になると思います。

https://program-life.com/191

投稿2020/01/24 07:39

takabosoft

総合スコア8356

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

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

hiroky115

2020/01/24 08:31

バックグラウンド時ではなく、バックグラウンドから消した後の話になります。 Google Maps のタイムラインのように、アプリを起動していない(バックグラウンドにもいない)状態で位置情報を取得したいと考えています。
takabosoft

2020/01/24 08:44

iOSのGoogle Maps のタイムラインはタスクキルしても、記録され続けるのでしょうか? (一緒にandoroid端末とか持ち歩いて位置データが共有されているというわけではないですよね)
hiroky115

2020/01/24 09:30

Google Mapsがバックグラウンドに存在しなくても日々の移動履歴が記録されているように思います。 Android端末は持っていません。
takabosoft

2020/01/27 00:23

Google Maps以外にgoogle製のアプリを使っていて、そちらから検出している可能性はないですかね? 基本的にはアプリが起動していないとGPS情報は取れないと思いますが、自分の知識も古いので新しいやり方があるのかもしれません。
hiroky115

2020/01/27 03:17

google系のアプリをバックグランド起動してなくても取得されているようです。 解決をすることができました。 コメントありがとうございました。
hiroky115

2020/02/01 11:38 編集

アプリが再起動されるたびに位置情報取得するインスタンスを初期化してあげると位置情報が変わったタイミングで取得するのを繰り返すようです(タイミングは精度によるはず)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問