web-dev-qa-db-fra.com

Emplacement continu Mise à jour de l'arrière-plan iOS 13

Je teste actuellement le mode de position d'arrière-plan dans iOS 13, car je souhaite suivre l'emplacement et le mouvement de l'utilisateur (à l'aide du cmmotionManager) en arrière-plan. Par conséquent, j'ai ma propre classe (singleton) qui gère le suivi de l'emplacement. J'initialise le cllouerManager de la manière suivante:

    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
    }

Ensuite, je commence les services suivants:

   func startLocationServices() {
        // ...
        locationManager.startUpdatingLocation()
        locationManager.startMonitoringVisits()
        locationManager.startMonitoringSignificantLocationChanges()
        // ...
    }

De plus, j'ai mis en place les méthodes CllouerManagerDelegate-Méthodes (), DidupdatElocation ().

Dans l'info.Plist-Fichier J'ai ajouté les entrées suivantes:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array> 

Dans ma vue ViewController, j'appelle les startlocationervices. Actuellement, j'ai défini l'autorisation de l'application pour suivre les données de localisation sur ".authorizealways"

Les mises à jour de localisation s'arrêtent après environ 60 à 130 minutes.

Pour résoudre le problème, j'ai déjà ajouté la fonction DidfinishLaunchingWithOptions, qui déclenche à nouveau les mises à jour de l'emplacement:

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
} 

Lorsque l'application est réveillée en utilisant cette fonction, j'ai réussi à obtenir des données continues sur certains tests, mais parfois, l'application a été suspendue après quelques minutes.

Enfin, j'ai également essayé une minuterie qui redémarre le suivi de l'emplacement toutes les 5 minutes, mais cela ne semble pas affecter la durée de mise à jour du tout.

Donc, ma question est de savoir s'il existe une façon de recevoir continuellement les mises à jour de localisation en arrière-plan ou y a-t-il une option que je manque?

Merci d'avance.

Edit: J'ai testé l'application sur iOS 12 et obtient des mises à jour continues dans 5/5 tests. Donc, je suppose que le problème est lié à iOS 13.

12
mattll

Rien n'est faux avec le code !! , J'ai fait face au même problème et après la recherche, j'ai constaté que

Au WWDC19 KeyNote Apple a annoncé deux modifications de la manière dont les autorisations de localisation fonctionnera dans iOS 13. La première modification donne aux utilisateurs la possibilité de partager leur emplacement avec votre application une seule fois. Cela facilite la tâche de Essayez des fonctionnalités de localisation et aide les utilisateurs à garder les données de localisation sensibles privées.

Le premier changement notable est que même lorsque vous appelez requestAlwaysAuthorization, l'utilisateur obtiendra uniquement les options 'juste maintenant' et "lors de l'utilisation" dans la boîte de dialogue Autorisation. Si l'utilisateur vous accorde une autorisation "lors de l'utilisation" et que vous essayez de numériser pour l'emplacement en arrière-plan, alors que l'utilisateur sera présenté une boîte de dialogue pour accorder la permission d'arrière-plan.

Donc, lorsque l'utilisateur subve lorsque vous allez obtenir une autorisation vous obtiendrez always in CLAuthorizationStatus et si l'utilisateur choisit Allow OnceCLAuthorizationStatus _ sera reposé sur notDetermined une fois l'application lance à nouveau

Vous pouvez vérifier cet article pour des informations détaillées https://medium.com/q42-frineering/apple-location-permission-ios13-1e0e59002889

Et voici la vidéo https://developer.apple.com/videos/play/wwdc2019/705/

[~ # ~] Edit [~ # ~ #]

Une fois que dans la permission de l'utilisateur accordée par l'utilisateur, IOS affichera l'utilisateur un autre dialogue après quelques jours pour modifier l'autorisation de la permission d'être utilisée pour toujours permettre.

Donc, maintenant, il n'ya aucun moyen de demander directement à l'utilisateur de permettre toujours la permission comme nous l'aimons avant.

enter image description here

3