ios - segundo - ubicacion ipad
El seguimiento de la ubicación se detiene después de un tiempo cuando la aplicación está en segundo plano (6)
Reducir la exactitud
Establecer la propiedad desiredAccuracy
del objeto administrador de ubicación
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
Puede utilizar una de las constantes CLLocationAccuracy
IMPORTANTE
De forma predeterminada, las actualizaciones de ubicación estándar en dispositivos iOS se ejecutan con un nivel de precisión óptimo. Cambie estos ajustes para que coincidan con los requisitos de su aplicación. De lo contrario, su aplicación perderá energía innecesariamente.
Pausa Automática
Establezca la propiedad pausesLocationUpdatesAutomatically
del objeto administrador de ubicación en true
self.locationManager.pausesLocationUpdatesAutomatically = true
IMPORTANTE
Para las aplicaciones que tienen autorización en uso, una pausa en las actualizaciones de ubicación finaliza el acceso a los cambios de ubicación hasta que la aplicación se inicie nuevamente y sea capaz de reiniciar esas actualizaciones. Si no desea que las actualizaciones de ubicación se detengan por completo, considere desactivar esta propiedad y cambiar la precisión de la ubicación a
kCLLocationAccuracyThreeKilometers
cuando su aplicación se mueva al fondo. Si lo hace, le permite continuar recibiendo actualizaciones de ubicación de una manera eficiente.
Permitir actualizaciones de fondo
Establezca la propiedad allowsBackgroundLocationUpdates
del objeto del administrador de ubicación en true
self.locationManager.allowsBackgroundLocationUpdates = true
Las aplicaciones que desean recibir actualizaciones de ubicación cuando se suspenden deben incluir la clave UIBackgroundModes (con el valor de ubicación) en el archivo Info.plist de su aplicación y establecer el valor de esta propiedad en verdadero. La presencia de la clave UIBackgroundModes con el valor de ubicación es necesaria para las actualizaciones en segundo plano
Especifique un tipo de actividad
Establezca la propiedad activityType
para que Core Location sepa qué tipo de actividad de ubicación está realizando su aplicación en un momento dado
self.locationManager.activityType = .automotiveNavigation
Puedes usar uno de los casos CLActivityType
Aplazar actualización de ubicación
En los dispositivos compatibles con hardware GPS, puede permitir que el administrador de ubicación aplace la entrega de actualizaciones de ubicación cuando la aplicación está en segundo plano. Por ejemplo, una aplicación de acondicionamiento físico que rastrea la ubicación del usuario en una ruta de senderismo puede diferir las actualizaciones hasta que el usuario se haya movido una cierta distancia o haya transcurrido un cierto período de tiempo.
He creado una aplicación simple que rastrea la ubicación del usuario y crea una notificación local para cada vez que se actualiza la ubicación.
He habilitado los modos de fondo a continuación,
let locationManager = CLLocationManager()
open override func viewDidLoad() {
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = 10
locationManager.allowsBackgroundLocationUpdates = true
locationManager.startUpdatingLocation()
}
open func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let notification = UILocalNotification()
notification.alertBody = "location updated"
notification.fireDate = Date()
UIApplication.shared.scheduleLocalNotification(notification)
}
Configuré la cadena para NSLocationAlwaysUsageDescription
y pido permiso. Permiso de concesión de usuario para uso siempre cuando la aplicación se carga por primera vez.
Funciona bien cuando la aplicación está en primer plano, cuando pasa a segundo plano, sigue funcionando al menos en un rango de tiempo de 5 a 40 minutos que se puede cambiar con la batería u otras aplicaciones abiertas.
El problema es por qué deja de funcionar, ¿no se espera que siga funcionando?
Nunca he visto un límite de tiempo en Apple docs.
Cambie a actualizaciones de ubicación significativas cuando la aplicación pase al fondo. iOS descargará la aplicación si se mantiene viva en segundo plano de forma indefinida.
locationManager.pausesLocationUpdatesAutomatically = false
Debe hacer algunos cambios en la clase AppDelegate, método de lanzamiento, applicationDidEnterBackground y applicationDidBecomeActive.
Crear una instancia compartida para el administrador de ubicación.
Para su información, visite este http://mobileoop.com/getting-location-updates-for-ios-7-and-8-when-the-app-is-killedterminatedsuspended
Te puede ayudar. Revisa los comentarios también.
Después de buscar referencias (hablando de cualquier limitación), ¡asumo que la sesión de video de Apple Core Location Best Practices podría ser útil! a las 06:53
hablando de ubicación estándar en el fondo:
Además, Core Location no realizará ninguna acción para garantizar que su aplicación continúe ejecutándose, por lo que si tiene una ejecución en segundo plano por alguna razón y decide iniciar una sesión de ubicación, es posible que reciba algunas actualizaciones, pero también podría suspenderse antes de recibir Toda la información que esperas recibir ...
En realidad, enfrenté este problema antes, como una solución alternativa, la ubicación central se usó para hacer un seguimiento de la ubicación del usuario para hacer una funcionalidad no relacionada con su ubicación, que es la carga de archivos, pero esta solución no funcionó desde iOS 9 ha sido liberado; Incluso publiqué una question referente a este tema.
Sin embargo, parece que su caso no es idéntico al que enfrenté, si tiene la intención de:
... crea una notificación local para cada vez que se actualiza la ubicación.
entonces es posible que deba seguir el enfoque de integración con el Marco de Notificación de Usuario - UNLocationNotificationTrigger :
La ubicación geográfica que el usuario debe alcanzar para permitir la entrega de una notificación local.
También se menciona en la sesión de video ( 08:59
).
Probablemente, esto podría no ser lo que está buscando, pero como no tenemos ninguna garantía de que la ejecución en segundo plano continuará ejecutándose, puede, de alguna manera, encontrar una manera de integrarlo en su aplicación para lograr la funcionalidad deseada.
Actualización para iOS 11:
Es posible que deba verificar esta respuesta para ver la forma correcta de solicitar el acceso a la ubicación.
Por el sonido de la misma, la aplicación está siendo eliminada debido a limitaciones de memoria. Sin embargo, debe reiniciarse cuando una nueva ubicación esté disponible, como se describe aquí: https://developer.apple.com/documentation/uikit/uiapplicationlaunchoptionskey/1623101-location
Debería ver la application(_:didFinishLaunchingWithOptions:)
siendo llamada, y la tecla ''ubicación'' debería estar presente en las opciones de inicio. Luego podrás volver a crear lo que sea que esté consumiendo las ubicaciones y continuar grabando.
Si no se está reiniciando, podría tener demasiada memoria. Verifique el consumo de memoria de la aplicación y vea si se está llamando applicationDidReceiveMemoryWarning(_:)
.
Supongo que no has implementado la tarea de fondo. Puedes leer here .
En el enlace anterior, en la sección "Implementación de tareas de larga duración", punto no. 3 es su situación, por lo que es válido que puede usar la actualización de la ubicación en segundo plano en su proyecto y para la misma necesidad de implementar una tarea en segundo plano también.
Hay tres formas de rastrear la ubicación del usuario (según el enlace anterior en la sección "Rastreo de la ubicación del usuario" ):
- Servicios de ubicación de primer plano (que funcionan en su caso)
- El servicio de ubicación de cambio significativo ( Recomendado ), pero creo que no es utilizable en su caso, ya que desea actualizar la ubicación del usuario cada 10 metros y funciona por ~ 500 metros. Para obtener más información, consulte here
- Los servicios de ubicación en segundo plano (creo que estás intentando esto) y la solución es agregar una tarea en segundo plano.
A continuación se muestra un ejemplo de tarea en segundo plano y puede modificarlo según sus necesidades, funciona para mí desde las últimas 2 horas y mi aplicación aún se actualiza en segundo plano.
.
En su clase de AppDelegate, actualice la siguiente función y luego ejecute la aplicación en segundo plano.
func applicationDidEnterBackground(_ application: UIApplication) {
application.beginBackgroundTask(withName: "") {}
}
Y a continuación es mi clase ViewController
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self;
locationManager.requestAlwaysAuthorization()
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.allowsBackgroundLocationUpdates = true
locationManager.distanceFilter = kCLDistanceFilterNone
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in
self.locationManager.startUpdatingLocation()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("didUpdateLocations /(Date())")
self.locationManager.stopUpdatingLocation()
}
}