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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

711閲覧

Swift4.0 位置情報 iPhone(実機)で起動した時、バックグラウンドで動かない

TakayukiNakajo

総合スコア23

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

2クリップ

投稿2018/04/02 02:21

編集2018/04/02 06:05

Swift4.0で、位置情報を活用したiOSアプリを作っています。バックグラウンドでも、位置情報を取得しようと思っています。

以下二つは、実装済みです。
・Info.plistのInformation background modesにRequired background modesを追加
・Capabilitiesタブ->Background ModesのLocation updatesをチェック
・Info.plistのNSLocationAlwaysAndWhenInUseUsageDescriptionも追加

iPhone(実機)で起動した時、バックグラウンドで動かない

現在地を取得して、特定の位置から離れたらアラートを表示するという機能を実装したのですが、シュミレーターではバックグラウンドで動いているにも関わらず、実機に落とすと数百メートル歩いても動きません。(アプリを開いてホーム画面に戻った状態で、データが更新されません。locationManager.distanceFilter = 50を入れておりますので、50メートルごとにバックグラウンドでも更新するように記載もしています。)

こちら、記述しているコードを載せておきます。

ViewController.swift

1import UIKit 2import MapKit 3import CoreLocation 4 5// 目的地からの距離を計算する関数(緯度) 6func calc(latitude:Double, currentLatitude:Double) -> Int{ 7 let latitudeDistance = (latitude - currentLatitude) 8 // 330mより離れていたら (0.001 度ではおよそ 110.9m) 1を返す 9 if (latitudeDistance < -0.001 || 0.001 < latitudeDistance) { 10 return 1 11 } 12 return 0 13} 14 15// 目的地からの距離を計算する関数(経度) 16func calc(longitude:Double, currentLongitude:Double) -> Int{ 17 let longitudeDistance = longitude - currentLongitude 18 // 330mより離れていたら (0.001 度ではおよそ 110.9m) 1を返す 19 if (longitudeDistance < -0.001 || 0.001 < longitudeDistance){ 20 return 1 21 } 22 return 0 23} 24 25 26// 現在地を取得して自動退席 27class ViewController: UIViewController, CLLocationManagerDelegate { 28 29 @IBOutlet weak var label: UILabel! 30 @IBOutlet weak var Map: MKMapView! 31 @IBOutlet weak var latitudeDebug: UILabel! 32 @IBOutlet weak var longitudeDebug: UILabel! 33 34 // NSUserDefaults のインスタンス 35 let userDefaults = UserDefaults.standard 36 37 // locationManagers 38 let locationManager = CLLocationManager() 39 40 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 41 42 let location = locations[0] 43 44 if let newLocation = locations.last{ 45 print("((newLocation.coordinate.latitude), (newLocation.coordinate.latitude))") 46 } 47 48 // 住所 (緯度、経度) 49 let lati:Double = 37.33186, longi:Double = -122.030248 50 let currentLatitude = location.coordinate.latitude // 現在の緯度(中央値) 51 let currentLongitude = location.coordinate.longitude // 現在の経度(中央値) 52 let span:MKCoordinateSpan = MKCoordinateSpanMake(0.016, 0.016) // 表示している範囲 (0.001で約110.9m) 53 let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(currentLatitude, currentLongitude) 54 let latitudeDistance = calc(latitude:lati, currentLatitude:currentLatitude) // 緯度が指定の範囲を超えたら1を返す。 55 let longitudeDistance = calc(longitude:longi, currentLongitude:currentLongitude) // 経度が指定の範囲を超えたら1を返す。 56 57 if (0 != (latitudeDistance + longitudeDistance)){ 58 // 処理 59 } 60 61 let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span) 62 Map.setRegion(region, animated: true) 63 64 print(location.altitude) 65 print(location.speed) 66 67 self.Map.showsUserLocation = true 68 } 69 70 override func viewDidLoad() { 71 super.viewDidLoad() 72 73 // Keyを指定して読み込み 74 let rec: String = userDefaults.object(forKey: "Record") as! String 75 76 label.text = rec 77 print(rec) 78 79 locationManager.delegate = self 80 locationManager.distanceFilter = 50 // 50m離れたら通知 81 locationManager.requestAlwaysAuthorization() // 常に許可 82 locationManager.startUpdatingLocation() //位置情報を更新 83 84 } 85 86 override func didReceiveMemoryWarning() { 87 super.didReceiveMemoryWarning() 88 } 89 90} 91

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

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

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

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

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

fuzzball

2018/04/02 02:44 編集

「動きません」では分かりません。状況を具体的に書いて下さい。
TakayukiNakajo

2018/04/02 04:24

失礼しました。「動きません」というのは、バックグラウンドの状態(アプリを開いてホーム画面に戻った状態)で、データが更新されていないということです。
fuzzball

2018/04/02 04:43

端末の位置情報取得は許可されているでしょうか?locationManager(_:didUpdateLocations:)は呼ばれているでしょうか?
TakayukiNakajo

2018/04/02 05:03 編集

端末の設定より、位置情報は"常に許可"になっております。locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])と記述もしております。
TakayukiNakajo

2018/04/02 05:42 編集

記載しているコードを、質問内容に記載しました。
fuzzball

2018/04/02 05:21

コードは質問内に追記して下さい。
TakayukiNakajo

2018/04/02 05:34 編集

追記しました。こうなると知らず、削除リクエストを送ったのですが、反映に時間がかかるようです。
fuzzball

2018/04/02 05:40

編集できますので、中身消すだけでいいと思いますが。
fuzzball

2018/04/02 05:47

で、locationManager(_:didUpdateLocations:)は呼ばれているでしょうか?(記述しているかどうかを聞いているのではありません)実際に何十メートルか歩いてみたのでしょうか?
TakayukiNakajo

2018/04/02 05:58

Simulatorでは問題なくアプリを開いていても、バックグラウンドでも動くので、呼ばれていると思います。実機では、アプリを開いていれば更新されているのを確認していますが、バックグラウンドにしたら呼ばれていません。再度アプリを開くと、呼ばれます。何十メートルではなく、何百メートル、何千メートル歩いてテストも行なっていますが、Simulatorと同じように動いてくれません。
fuzzball

2018/04/02 06:05

「思います」ではなく、キチンと確認して下さい。あと、「データが更新されていない」というのは、何を以て「更新されていない」と判断したのでしょうか?具体的に書いて下さい。
TakayukiNakajo

2018/04/02 06:10

Simulatorではキチンと呼ばれており、実機のバックグラウンドの時のみキチンと呼ばれていません。APIを取得する処理を書いてテストを行なっていたのですが、実機のバックグランドの時のみAPIの処理が作動しませんでした。
fuzzball

2018/04/02 06:15 編集

え?呼ばれていないのを確認したんですか?どうやって確認したんですか?(そんなすぐに確認できるのなら、なぜ最初に聞いたときに確認しなかったのですか?)
TakayukiNakajo

2018/04/02 06:18

えっと、問題なのは、Simulatorでは全部正常に動くのに、実機のバックグラウンドの時に違う動作がしている、という内容です。fuzzballさんがご指摘していることは、全て先週には確認済みです。
fuzzball

2018/04/02 06:23 編集

Simulatorで動くことに何の意味もないですよ。正しく動いていない実機での挙動について、書かれていないことを聞いているだけです。「実機でもlocationManager(_:didUpdateLocations:)は呼ばれています」と書かれていれば質問などしません。
TakayukiNakajo

2018/04/02 06:26

Simulatorで動くことに何の意味もないですか!?それはショックです。つまり、locationManager(_:didUpdateLocations:)に問題があるということですね。Swift初めてまだ2週間くらいなので、色々とイライラさせて申し訳ないです。locationManager(_:didUpdateLocations:)の書く場所は、ここで合っていますか?
fuzzball

2018/04/02 06:27 編集

だから‥問題があるかどうか今調べているんですよ。なんで呼ばれているかどうか確認しないのですか?
TakayukiNakajo

2018/04/02 06:29

完全に、Simulatorを信頼していたので、Simulatorと実機の違いに原因があると思っていたからです。
fuzzball

2018/04/02 06:36 編集

ちなみに、実機とシミュレータの端末種類とOSバージョンは同じにしているでしょうか?(何なのか教えて下さい)
guest

回答1

0

ベストアンサー

allowsBackgroundLocationUpdates は true にしていますか?

参考:【iOS 9対応:Core Location】知っておきたい位置情報周りの変更点

投稿2018/04/02 07:02

koogawa

総合スコア494

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

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

TakayukiNakajo

2018/04/02 07:53

ありがとうございます、 override func viewDidLoad()の中に locationManager.allowsBackgroundLocationUpdates = true を入れたら動きました!!!!ありがとうございます!!!!!!
koogawa

2018/04/02 08:10

いぇーい
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問