この質問に関連するアプリは、GPS座標と加速度計の読み取り値を含む高度な精度でユーザーの位置を追跡しますユーザーがスリープ・ボタンを押した場合でも、30分の時間が必要です。アプリでバックグラウンドでGPSを有効にしたり、フォアグラウンドまたはバックグラウンドでアプリを使用して位置を読み取ることはできません
この目的のために、plistファイルとapp機能の設定は、常にナビゲーションアクセスの理由を反映し、ロケーションベースのサービスの提供のためのバックグラウンドプロセスを有効にするように変更されました。
実行時にアプリケーションにGPSアクセス権があるかどうかを確認し、許可されている場合は、このビューコントローラ(次のコードを含むビューコントローラ)をアクティブにするとGPS /ナビゲーションアイコンが表示されますiPhone。
問題は、以下に示す4つの「印刷」コマンドのいずれも印刷メッセージを生成しないため、「newLocation」および「myLocation」変数はどちらもデータを生成しません。このコードが、最初の文で概説された目的を果たすことに遠隔に近い場合は、「どのように修正できますか?」という質問があります。これがゴールを達成するための悪い方法である場合、より良い答えは、これがどのように行われるべきかを説明するだろう。
import UIKit
import CoreMotion
import MapKit
import CoreLocation
class ActiveSession: UIViewController, CLLocationManagerDelegate {
lazy var locationManager: CLLocationManager! = {
let manager = CLLocationManager()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.delegate = self
return manager
}()
func locationManager(_manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
let myLocation:CLLocationCoordinate2D=CLLocationCoordinate2DMake(oldLocation.coordinate.latitude, oldLocation.coordinate.longitude)
print(myLocation)
if UIApplication.shared.applicationState == .active {
print("at least it's active at all")
} else {
print(newLocation)
print("it's active when the app isn't")
}
}
func getPermission() {
locationManager = CLLocationManager()
switch CLLocationManager.authorizationStatus() {
case .denied, .restricted:
return
case .notDetermined:
locationManager!.requestAlwaysAuthorization()
break
case .authorizedAlways, .authorizedWhenInUse:
break
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.getPermission()
locationManager = CLLocationManager()
locationManager!.desiredAccuracy = kCLLocationAccuracyBest
locationManager?.startUpdatingLocation()
}
}
ロケーションマネージャの「allowsBackgroundLocationUpdates」プロパティを忘れないでください。 – ohr
私は、ビューコントローラから位置マネージャを移動して、AppDelegateまたはそれ自身のオブジェクトにシングルトンまたはAppDelegateで保持されている参照を持つオブジェクトのいずれかを配置することをお勧めします。また、 'getPermission'コードを単純化することができます。単に' requestAlwaysAuthorization'を呼び出します。もしパーミッションがまだ与えられていない、または拒否されていなければ、パーミッションを要求します。ダイアログにすでに回答があった場合は何も表示されません。 – Paulw11