IOS - Запуск фоновой задачи для обновления местоположения пользователя с помощью swift

Я здесь новый пользователь, но я много раз использовал stackru:)... я разработчик для Android, но сейчас я работаю в приложении для ios, используя swift. Я совершенно новичок в использовании xcode, может быть, мой вопрос очень прост для многих... Отлично, мне действительно нужна помощь. Я пытаюсь реализовать задание Backgroud, которое обновляет местоположение пользователя каждые десять минут. Мне нужно получить последние и длинные данные и после отправки этой информации в веб-сервис API. Я просматривал документы Backgroud, всю документацию и всю документацию об услугах определения местоположения пользователей. Существует много информации, довольно информации, но, может быть, я очень заинтересован в информации для Android, с большим количеством информации, но много простых примеров также очень легко для меня. и предыдущий вопрос о переполнении стека может быть очень полезным.

Я понимаю много концепций, и я сконфигурировал свой info.plist так, как написано в документации, но... как я могу запустить фоновую задачу для определения местоположения пользователя? Где я должен написать код фоновой задачи? Какое начало? У меня есть проект с тремя различными контроллерами представления, и мне нужно запустить службу с помощью кнопки... Большое спасибо, мне действительно нужно понять начальную точку всего этого.

1 ответ

Решение

В настоящее время я делаю то же самое, что и мой первый iOS-проект - мне помогло следующее: периодические обновления фона iOS

И оттуда я нашел Swift-порт https://github.com/voyage11/Location: https://github.com/silento/Location. В проекте voyage11 также есть ссылка на блог, в котором немного разъясняется, что происходит, и ссылка на вторую, в которой рассказывается, как перезапустить службы определения местоположения с помощью "значительных изменений местоположения". В настоящее время я пытаюсь реализовать это с помощью "мониторинга местоположения региона", но не уверен, что это будет работать.

О, и я переместил код, который запускает новую фоновую задачу, из части didUpdateLocation в часть restartLocationUpdates - так что вы можете быть уверены, что ваша задача перезапускается, даже если вы не получили местоположение вовремя.

Он не работал с самого начала, но когда я добавил код из /questions/31647508/periodicheskie-obnovleniya-fona-ios/31647529#31647529 в качестве замены stopUpdatingLocation() и startUpdatingLocation() - parts.

Это действительно сложнее, чем должно быть, и то, что я использую от Android - но так оно и есть. Если вы разрабатываете для Iphone5+, вы также можете рассмотреть этот пост (я не мог проверить его прямо сейчас, поскольку у меня есть только iPhone 4S, и эта функция не поддерживается в симуляторе): /questions/31647508/periodicheskie-obnovleniya-fona-ios/31647530#31647530.

Я надеюсь, что у вас есть некоторые отправные точки, я в настоящее время все еще тестирую свое решение, но, похоже, оно работает, насколько я вижу сейчас;)

PS: Я где-то читал что-то об отмене фоновых задач, спящих более 5 минут - так как я жду только 30 секунд, у меня нет этой проблемы, но у вас может быть. Но, возможно, поддержание работы служб определения местоположения на очень большом расстоянии препятствует этому.

PPS: Поскольку Swift является новым, вы должны привыкнуть читать Objective C-Code и пытаться перевести его на Swift. Часто это единственный способ найти хорошие учебники.

Еще одна вещь - для iOS8 вам нужно что-то вроде:

if (self.locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
            // on iOS8+, we need to request the location authorization ourselves -.-

            self.locationManager.requestAlwaysAuthorization()
        }

И не забудьте добавить "NSLocationAlwaysUsageDescription" в свой Info.plist, а также разрешить фоновые обновления местоположения в возможностях вашего проекта. Извините за этот беспорядок текста, но это действительно сложная тема;)

edit: Относительно вашего первого комментария: Вы должны создать проект Swift, например, с одним окном и в Main. раскадровка добавить переключатель. Затем следует реализовать событие ToggleActionChanged, включающее или отключающее прослушиватели, в зависимости от нового состояния коммутатора. Я не могу объяснить все основы, вы должны посмотреть базовый учебник, мне нравится https://www.youtube.com/playlist?list=PL_4rJ_acBNMHa_RGZigG2nQI3aL1kTa4r и я использовал, в частности, 7-е видео в качестве примера того, как создать базовое приложение. Единственное, что можно сделать проще, чем показано на рисунке, - это использовать перетаскивание правой кнопкой мыши от раскадровки к представлению кода вместо реализации некоторых методов вручную. Есть удобный помощник.

Для слушателей событий вашего местоположения вы можете добавить новый класс swift и назвать его, например LocationDelegate.swift. Это делает его немного более чистым. Я использую шаблон Singleton для этого, вы можете посмотреть, как это сделать. Или вы можете использовать структуру github-проекта, который я разместил выше. Я не могу предоставить полный источник, так как вам нужно изменить его, чтобы он соответствовал вашим индивидуальным потребностям;)

Да, и еще одна вещь: чтобы помнить, если ваш переключатель включен между запусками приложений, вы можете использовать что-то вроде этого:

   @IBAction func toggleTrackingChanged(sender: UISwitch) {


      // This is your method for when the switch changed... put your location activation/deactivation here



      let userDefaults = NSUserDefaults.standardUserDefaults()

      userDefaults.setBool(sender.on, forKey: "ODLTrackingActive")
    }

 }

и в вашем viewDidLoad-метод:

let userDefaults = NSUserDefaults.standardUserDefaults()

    var trackingActive = userDefaults.boolForKey("ODLTrackingActive")

    toggleTrackingSwitch.setOn(trackingActive, animated: false)

    // reactivate location tracking if necessary

Удачи!

Другие вопросы по тегам