web-dev-qa-db-ja.com

継続的な場所更新の背景iOS 13

バックグラウンドでユーザーの位置と動き(CmmotionManagerを使用)を追跡したいので、私は現在、iOS 13のバックグラウンドロケーションモードをテストしています。したがって、私は自分の(シングルトン)クラスが位置追跡を処理します。次のように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> 
 _

My ViewControllerでは、StartLocationServicesを呼び出します。現在、ロケーションデータを「.Authorizedalways」に追跡するためのアプリの承認を設定しました。

場所は約60~130分後に停止します。

問題を解決するために、DidFinishLaunchingWithOptions-functionsを追加しました。これにより、ロケーションアップデートが再びトリガーされます。

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

12
mattll

コードに問題がない!私は同じ問題に直面し、研究後に私はそれを見つけました

WWDC19 jeynote Apple]では、Location PermissionsがIOS 13で機能する方法で2つの変更を発表しました。最初の変更により、ユーザーは自分の場所を一度だけ共有するオプションを提供します。これにより簡単になります。場所の特徴を試して、ユーザーが機密の場所データをプライベートに保つのに役立ちます。

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

そのため、ユーザーが付与する場合 INSOINUSEUSAGE PERCISION alwaysCLAuthorizationStatusを取得すると、Allow OnceCLAuthorizationStatusを選択した場合はnotDeterminedに戻ります。

この記事を確認するには、詳細情報についてチェックできます。 https://medium.com/q42-engineering/apple-location-permission-ios13-1e0e59002889

そしてここでビデオは https://developer.apple.com/videos/play/wwdc2019/705/

[〜#〜]編集[〜#〜]

ユーザーが許可されたユーザー権限がいつ常に許可されたときに許可を変更するためにいつかユーザーにユーザーを表示することができます。

だから今、私たちが以前にしているように即座に許可を常に許可するようにユーザーに直接依頼する方法はありません。

enter image description here

3

これはiOS 13のバグです。アプリのアクセス許可はiOSによってめちゃくちゃになります。設定で「常に」表示されている間、それは実際には「使用中に」のように振る舞います。 1つのアプリはバックグラウンドで眠るために置かれていますが、同じデバイス上の場所を取得し続けます(バックグラウンドで)。

それを解決するには、GOTO設定 - >問題 - >場所 - >常に常に戻って戻ってください。

残念ながら、これを修正するためにコードでできることは何もありません。

0
Amir Sagri