継続的な位置更新の背景iOS13


9

現在、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に関連していると思います。


1
ねえ、あなたはこれの解決策を手に入れましたか?
アビシェーク

2
さて、前回のコメントで述べたように、バックグラウンドで消費されるリソースを減らすことで、アプリケーションが中断状態に移行するまでの時間を大幅に増やすことができました。->アプリからモーションコレクションを完全に削除しました。->バックグラウンドにシフトするとき、精度を下げ、イベントの距離フィルターを増やしてイベントを減らし、UIを更新しているいくつかのタスクを停止し、他のデータソースのコレクションをダウンサンプリングし、バックグラウンドでデータをエクスポートしませんまたは他のワークロード。だから今私はバックグラウンドで約3000分を取得します。
mattll

いくつかのコードで私を助けてもらえますか?
Abhishek

1
AppDelegate.swiftで、func applicationDidEnterBackground(_ application:UIApplication)関数とfunc applicationDidEnterBackground(_ application:UIApplication)関数を実装します。これらの関数でCLLocationManagerにアクセスし、それに応じてプロパティdistanceFilter、desiredAccuracyを設定します。また、いくつかの使用状況情報(現在のバッテリーステータスなど)を書き込むために使用するタイマーをダウンサンプリングし、applicationDidBecomeActiveメソッドでメインビューを定期的に更新するために使用するタイマーを終了します。遊んだりテストしたりすることが重要だと思います。
mattll

回答:


1

コードに問題はありません!! 、私は同じ問題に直面し、研究の後にそれを発見しました

WWDC19の基調講演で、AppleはiOS 13で位置情報の権限が機能する方法に2つの変更を発表しました。最初の変更では、ユーザーは位置情報をアプリと一度だけ共有するオプションをユーザーに与えます。これにより、位置情報機能を簡単に試すことができ、ユーザーが機密性の高い位置情報データを非公開に保つことができます。

最初の注目すべき変更は、を呼び出した場合でもrequestAlwaysAuthorization、ユーザーは権限ダイアログで「今すぐ」と「使用中」のオプションのみを取得することです。ユーザーが「使用中」のアクセス許可を付与し、バックグラウンドで場所をスキャンしようとした場合のみ、バックグラウンドのアクセス許可を付与するダイアログがユーザーに表示されます。

したがって、ユーザーの助成金はいつWhenInUseUsage 許可あなたは取得しますalwaysCLAuthorizationStatus、ユーザーが選択した場合Allow Once CLAuthorizationStatusに休ませますnotDetermined再びアプリを起動し、一度

詳細については、この記事をチェックしてください https://medium.com/q42-engineering/apple-location-permission-ios13-1e0e59002889

そして、こちらがビデオですhttps://developer.apple.com/videos/play/wwdc2019/705/

編集

ユーザーがiOSで付与した後、数日後にユーザーに別のダイアログが表示され、使用中の権限を常に許可するように変更できます。

そのため、以前のように常に許可を即座にユーザーに直接要求する方法はありません。

ここに画像の説明を入力してください


1
それで問題は解決しましたか?->設定->プライバシー->位置情報サービスの認証レベルを常に手動で設定しましたが、問題は解決しませんでした。
mattll

1
しかし、常に許可フラグを設定した後でも、アプリケーションはある時点で終了します。その後、アプリは継続的に実行されますか?
mattll

1
更新していただきありがとうございます。私はすでにそのポップアップに遭遇し、iphoneプライバシー設定で常に通知を設定することもできますが、これでは上記の問題は解決しません。iOS 12では、継続的な位置追跡に関する問題はまだ発生していませんが、iOS 13では、しばらくするとアプリが一時停止します。
mattll

1
これは、しばらく問題を調査した後の私の観察です。つまり、バックグラウンドでの作業が少ないほど、中断するまで録音できる時間が長くなります。バックグラウンドで実行された機能のほとんどを無効にしたので、今のところ、場所/使用状況の情報のみを追跡し、コアデータを使用して保存しています。さらに、アプリケーションがバックグラウンドモードになると、ロケーションマネージャーのdistanceFilterとdesiredAccuracyを変更します。これで、停止することなく、約3000を追跡できます。
mattll

1
誰かがこの解決策を手に入れましたか?
Abhishek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.