Отправлять обновления местоположения каждые 30 минут в Swift

У меня есть режим фонового режима для служб определения местоположения и направлен на отправку местоположения (широты и долготы) на сервер каждые 30 минут. На данный момент я печатаю то же самое в консоли. Кажется, это работает некоторое время, но мне интересно, как мне работать с NSTimer в этом случае. И откуда я должен его называть?

import UIKit import CoreLocation @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate { var window: UIWindow? var locationManager = CLLocationManager() func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. return true } func applicationWillResignActive(application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } func applicationDidEnterBackground(application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. self.locationManager.delegate = self self.locationManager.startUpdatingLocation() // I know i should be using signification location option here. this is just for testing now. } func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) { self.sendBackgroundLocationToServer(newLocation); } func sendBackgroundLocationToServer(location: CLLocation) { var bgTask = UIBackgroundTaskIdentifier() bgTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { () -> Void in UIApplication.sharedApplication().endBackgroundTask(bgTask) } println(location.coordinate.latitude) if (bgTask != UIBackgroundTaskInvalid) { UIApplication.sharedApplication().endBackgroundTask(bgTask); bgTask = UIBackgroundTaskInvalid; } } func applicationWillEnterForeground(application: UIApplication) { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. application.beginBackgroundTaskWithExpirationHandler{} } func applicationDidBecomeActive(application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. application.beginBackgroundTaskWithExpirationHandler{} } func applicationWillTerminate(application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. application.beginBackgroundTaskWithExpirationHandler{} } } 

Может быть, вызов application.beginBackgroundTaskWithExpirationHandler{} – плохая идея? Какие варианты я могу использовать здесь?

Идея beginBackgroundTask... заключается в том, чтобы запустить задачу с конечной длиной, так что, если пользователь покинет приложение, он будет продолжать работать в фоновом задании за короткий, конечный период времени (я полагаю, 3 минуты). И до того, как закончится время, вам нужно вызвать endBackgroundTask иначе приложение будет прекращено.

К сожалению, механизм фоновой задачи не подходит для вашего желаемого намерения. Тем не менее, существует узкий набор специальных фоновых режимов, предназначенных для продолжения фоновой работы за пределами узкого набора функций (VOIP, аудио и т. Д.). Для получения дополнительной информации см. Раздел « Реализация долгосрочных задач » Руководства по программированию приложений для iOS: Выполнение фона .

Теперь один из этих фоновых режимов предназначен для службы «местоположения». Итак, если это центральная функция вашего приложения, важная для правильной функции, то вы можете зарегистрироваться в режиме фонового изображения, и ваше приложение будет продолжать работать в фоновом режиме. Оттуда вы можете отслеживать обновления местоположения, и если прошло достаточное количество времени, активируйте некоторый процесс. Но если этот режим фонового местоположения не является существенной особенностью вашего приложения, Apple, скорее всего, отклонит ваше приложение для запроса фонового режима, который ему не нужен.


Кстати, вы должны знать, что запуск стандартных служб определения местоположения может привести к утечке аккумулятора устройства. Вы можете подумать о том, чтобы использовать услугу определения местоположения с существенным изменением заряда батареи. Это также имеет преимущество автоматического пробуждения вашего приложения каждый раз, когда пользователь перемещает некоторое значительное расстояние (например, измеряется в км, я считаю, что это вызвано переходом на другую ячейку).

Пара примечаний, так как мы боролись с проблемами местоположения и боремся с фоновыми приложениями, которые, похоже, не разбудили нас.

  1. NSTimer работает только до тех пор, пока ваше приложение не будет приостановлено. Конечно, он находится в фоновом режиме, но только потому, что он способен получать уведомления от iOS (APN, location, …). В конце концов, ваш таймер прекратит стрельбу во время работы в BG. Таким образом, вы полагаетесь на один из режимов BG, чтобы пинать вас.

  2. Если вы используете CLLocationManager.startUpdatingLocation, вы заметите, что после этого вы перестали получать их. Особенно, когда телефон расслабляется и пытается спать. Это происходит из-за плохо документированной функции, называемой CLLocationManager.pausesLocationUpdatesAutomatically … которая решает прекратить отправку тех, когда установлено значение «true» (параметр DEFAULT). Вы можете установить это значение «false», и вы продолжите получать обновления своей позиции. Который в значительной степени убедится, что ваше приложение делает то, что вы хотите.

  3. Как отмечалось выше, вы должны убедиться, что когда вы получите обратный вызов locationManager.didUpdateLocations, что вы начинаете backgroundTask, чтобы поддерживать работу вашего приложения во время обработки этой информации и отправки сетевых данных. Но вы, кажется, это понимаете.

  4. Просто проснуться достаточно долго, чтобы «записать» обновление местоположения не так уж плохо. Просто убедитесь, что вы не порождаете свой сетевой код, если вы явно не нажмете на свое 30-минутное ожидание.

попробуй это:

  • Сделайте синглтон для службы местоположения. Зарегистрировал его с помощью NSNotification
  • В AppDelegate willEnterBackGround вы отправляете уведомление через NSNotificationCenter

то ваш синглтон начнет updatingLocation местоположения и отправит его на сервер при получении данных местоположения.

  • Свернуть карту: error: не может вызывать «карту» с списком аргументов типа «((_) -> _)»
  • Зачем мне когда-либо использовать незадействованное я?
  • Проблема с повторяющимися сообщениями При переходе на ViewController
  • .xcconfig? Как установить переменные среды
  • Избегайте обнаружения навигации по конечной точке
  • Как получить данные из файла на Icloud Swift
  • iOS Webkit не работает на устройстве, но работает на симуляторе при быстром
  • как я могу получить доступ к IBOutlet в другом классе? в быстрой
  • iCloud & Core Data - «Путь находится за пределами любого контейнера CloudDocs, никогда не синхронизируется»
  • как установить дату выбора даты с одним месяцем назад с сегодняшнего дня
  • Получать уведомление, когда UITableView закончил запрашивать данные?
  • Interesting Posts

    Создание сети NAT64

    Файл UIKit / UIKit.h не найден – XCode 4.6.1 – Objective-C

    Отображаемый размер файла: 1000b = 1kb или 1024b = 1kb?

    Приложение Facebook iOS не перенаправляет на мобильный Safari после fbauth //

    В песочнице App Purchase – Недействительный адрес

    как я могу оживить UIImageView, когда пользователь перетаскивает MKMapView?

    Должен ли я звонить setMinimumBackgroundFetchInterval каждый раз, когда приложение перезагружается?

    Отправка URL-адреса вместе с текстом с использованием схемы URL-адреса WhatsApp

    Ошибка сопоставления одного объекта JSON в Restkit

    Почему UIGestureRecognizer вызывается на мою кнопку очистки текстового поля?

    Как обнаружить краны на прозрачной части UITableView?

    Проект Xcode 4, извлеченный из удаленного хранилища, не загружается

    Как удалить токен доступа из uber API во время выхода из системы?

    При загрузке в App Store не удается нажать «Всегда разрешать» в диалоговом окне «Кодировка»

    Swift segue не работает?

    Давайте будем гением компьютера.