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
回答1件
あなたの回答
tips
プレビュー