現在、iOS 13でバックグラウンドロケーションモードをテストしています。ユーザーのロケーションとモーション(CMMotionManagerを使用)をバックグラウンドで追跡したいからです。そのため、位置追跡を処理する独自の(シングルトン)クラスがあります。CLLocationManagerを次のように初期化します。
func initializeLocationManager() -> CLLocationManager {
let manager = locationManager ?? CLLocationManager()
manager.delegate = self
manager.requestAlwaysAuthorization()
manager.allowsBackgroundLocationUpdates = true
manager.pausesLocationUpdatesAutomatically = false
manager.distanceFilter = kCLDistanceFilterNone
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.activityType = .other
return manager
}
次に、次のサービスを開始します。
func startLocationServices() {
// ...
locationManager.startUpdatingLocation()
locationManager.startMonitoringVisits()
locationManager.startMonitoringSignificantLocationChanges()
// ...
}
さらに、CLLocationManagerDelegate-methods didChangeAuthorization()、didUpdateLocation()を実装しました。
info.plist-fileに次のエントリを追加しました。
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
私のViewControllerで、startLocationServicesを呼び出します。現在、位置データを追跡するアプリの承認を「.authorizedAlways」に設定しています
位置情報の更新は、約60〜130分後に停止します。
この問題を解決するために、didFinishLaunchingWithOptions-functionを追加しました。これにより、位置情報の更新が再度トリガーされます。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let launchOptions = launchOptions,
let isLocationKey = launchOptions[UIApplication.LaunchOptionsKey.location] as? Bool,
isLocationKey {
restartServices()
}
return true
}
この機能を使用してアプリが覚醒すると、いくつかのテストで何とか継続的なデータを取得できましたが、数分後にアプリが再び一時停止されたことがあります。
最後に、位置追跡を5分ごとに再開するタイマーも試しましたが、これは更新期間にまったく影響を与えていないようです。
だから私の質問は、バックグラウンドで位置情報の更新を継続的に受信する方法があるのか、それとも私が見逃しているオプションがあるのか?
前もって感謝します。
編集:私はiOS 12でアプリケーションをテストし、5/5のテストで継続的な更新を取得しました。したがって、問題はiOS 13に関連していると思います。