Отслеживание местоположения перестает через некоторое время, когда приложение находится в фоновом режиме
Я создал простое приложение, которое отслеживает местоположение пользователя и создает локальное уведомление для каждого обновления местоположения.
Я включил режимы фона ниже,
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)
}
Я поставил строку NSLocationAlwaysUsageDescription
и попросить разрешения. Пользователь предоставляет разрешение на использование всегда, когда приложение загружается в первый раз.
он работает хорошо, когда приложение находится на переднем плане, когда он идет фон еще работа по крайней мере в диапазоне 5-40 минут времени, которое изменчиво от батареи или других открытых приложений.
проблема в том, почему он перестает работать, разве он не должен продолжать работать?
Я никогда не видел ограничения по времени в документах Apple.
6 ответов
переключитесь на значительные обновления местоположения, когда приложение перейдет в фоновый режим. iOS выгрузит приложение, если оно будет жить в фоновом режиме бесконечно.
locationManager.pausesLocationUpdatesAutomatically = false
после поиска ссылок (речь идет о любом ограничении), я предполагаю, что Apple Основные Местоположения Лучшие Практики видеосессия может быть полезна! at 06:53
говоря о стандартном местоположении в фоновом режиме:
кроме того, Core Location не будет предпринимать никаких действий для обеспечения вашего приложения продолжает работать, так что если у вас есть корни, почему и вы решаете начать сеанс местоположения, вы можете получить некоторые обновления, но вы также можете получить приостановлено до получения всей информации, вы надеетесь получить...
На самом деле, я столкнулся с этой проблемой раньше,- в качестве обходного пути - основное местоположение использовалось для отслеживания местоположения пользователя, чтобы сделать несвязанную функциональность с его местоположением-которое загружает файлы -, но это обходное решение не работало с момента выхода iOS 9; я даже опубликовал вопрос ссылаясь на этот вопрос.
однако, похоже, ваш случай не идентичен тому, что Я столкнулся, если вы стремитесь:
... создает локальное уведомление для каждого обновления местоположения.
тогда вам может потребоваться следовать подходу интеграции с Рамки Уведомлений Пользователя - UNLocationNotificationTrigger:
географическое положение, которое пользователь должен достичь, чтобы доставка локального уведомления.
это также упоминается в видео сеанс (08:59
).
вероятно, это может быть не то, что вы ищете, но поскольку у нас нет гарантии, что фоновое выполнение будет продолжаться, вы можете-как - то-найти способ интегрировать его в свое приложение для достижения желаемой функциональности.
обновление для iOS 11:
возможно, вам придется проверить ответ для правильного способа запроса доступа к местоположению.
по звуку это приложение убивается из-за ограничений памяти. Однако он должен быть повторно запущен, когда новое местоположение станет доступным, как описано здесь: https://developer.apple.com/documentation/uikit/uiapplicationlaunchoptionskey/1623101-location
вы должны увидеть application(_:didFinishLaunchingWithOptions:)
вызывается, и ключ "местоположение" должен присутствовать в параметрах запуска. Затем вы сможете воссоздать все, что потребляет местоположения, и продолжить запись.
если он не запускается повторно, он может быть слишком голоден памяти. Проверьте потребление памяти приложения и посмотреть, если applicationDidReceiveMemoryWarning(_:)
вызывается.
Уменьшить Точность
установить desiredAccuracy
свойство объекта диспетчера местоположения
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
вы можете использовать CLLocationAccuracy
константы
важно
по умолчанию стандартные обновления местоположения на устройствах iOS выполняются с лучшим уровнем точности. Измените эти параметры в соответствии требования вашего приложения. В противном случае ваше приложение будет ненужно тратить энергия.
Авто-Пауза
установить pausesLocationUpdatesAutomatically
свойство объекта location manager to true
self.locationManager.pausesLocationUpdatesAutomatically = true
важно
для приложений, которые имеют авторизацию в использовании, пауза для обновления местоположения завершает доступ к изменениям местоположения, пока приложение не будет запущено снова и возможность перезапуска этих обновлений. Если вы не хотите обновления местоположения остановите полностью, рассмотрите возможность отключения этого свойства и изменение местоположения точность
kCLLocationAccuracyThreeKilometers
когда приложение перемещается на задний план. Это позволяет продолжить прием местоположения обновления в дружественной к власти манере.
разрешить фоновые обновления
установить allowsBackgroundLocationUpdates
свойство объекта location manager to true
self.locationManager.allowsBackgroundLocationUpdates = true
приложения, которые хотят получать обновления местоположения при приостановке должны включать этот Ключ UIBackgroundModes (со значением местоположения) в их приложении Информация.plist файл и установить значение этого свойства true. Этот наличие ключа UIBackgroundModes со значением местоположения требуется для фоновых обновлений
укажите тип действия
установить activityType
свойство, чтобы Core Location знал, какой тип активности местоположения ваше приложение выполняет в данный момент времени
self.locationManager.activityType = .automotiveNavigation
вы можете использовать один из CLActivityType
делам
Отложить Обновление Местоположения
на поддерживаемых устройствах с оборудованием GPS вы можете позволить местоположению менеджер откладывает доставку обновлений местоположения, когда ваше приложение находится в фон. Например, фитнес-приложение, отслеживающее местоположение пользователя на пешеходной тропе можно отложить обновления, пока пользователь не переместил определенный расстояние или определенный период времени истекший.
Я предполагаю, что вы не реализовали фоновую задачу. Вы можете читать здесь.
В приведенной выше ссылке в раздел "Реализация Долгосрочных Задач" пункт нет. 3-это ваша ситуация, поэтому вы можете использовать обновление фонового местоположения в своем проекте, и для этого Вам также нужно реализовать фоновую задачу.
есть три способа отслеживать местоположение пользователя(согласно приведенной выше ссылке в разделе "отслеживание пользователя Местоположение" ) :-
- передний план-только услуги определения местоположения (который работает в вашем случае)
- служба значительного изменения местоположения (рекомендовано), но я думаю, что он не может использоваться в вашем случае, поскольку вы хотите обновить местоположение пользователя на 10 метров, и он работает на ~500 метров, Подробнее см. здесь
- фоновые службы определения местоположения (я думаю, вы пытаетесь это сделать), и решение заключается в добавлении фона задача.
Ниже приведен пример фоновой задачи, и вы можете изменить в соответствии с вашим требованием, он работает для меня с последних 2 часов, и мое приложение все еще обновляет местоположение в фоновом режиме.
.
в вашем классе AppDelegate обновите функцию ниже, а затем запустите приложение в фоновом режиме.
func applicationDidEnterBackground(_ application: UIApplication) {
application.beginBackgroundTask(withName: "") {}
}
и ниже мой класс 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()
}
}
вам нужно внести некоторые изменения в класс AppDelegate, метод запуска, applicationDidEnterBackground и методы applicationDidBecomeActive.
создайте sharedInstance для диспетчера местоположений.
FYI пожалуйста, пройдите через это http://mobileoop.com/getting-location-updates-for-ios-7-and-8-when-the-app-is-killedterminatedsuspended
Это может помочь вам.Проверьте комментарии, а также.