Xcode / iOS simulator: вызвать значительное изменение местоположения вручную

есть ли способ вручную сообщить устройству отправить уведомление о значительном изменении местоположения, которое разбудит любые приложения, зарегистрированные для этого уведомления? Это только для тестирования, и я понимаю, что этот частный вызов API будет отклонен при отправке в app store.

9 ответов


Итак, два ответа:

а) запрыгнуть на поезд: -)

B) используйте симулятор. В iOS 5.X simulator, есть меню отладки, которое имеет подменю местоположения. Выберите freeway drive. Это запустит симулятор в воображаемое путешествие по живописному 280 в Северной Калифорнии. Это дает вам все, кроме вида: ваше приложение получит значительные обновления изменения местоположения и запущен в фоновом режиме если он был приостановлен.

чтобы убедиться, что вы действительно двигаетесь, запустите safari в симуляторе и перейдите к maps.google.com и нажмите маленькую кнопку Отслеживать мое местоположение. Тебе пора двигаться.

потрясающе! Теперь, как отладить проблему жизненного цикла, запускаемую системой? Полегче! Попросите xCode дождаться запуска вашего приложения, чтобы начать отладку. В меню схема выберите изменить схему. В схеме запуска и на вкладке Информация для параметра" запуск " выберите:"ждать моего.приложение для запуска".

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

но на самом деле, поездка на поезде гораздо веселее.


Ну, я обнаружил, что могу сделать это, включив и выключив режим полета и/или WiFi. Возможно, запустите приложение с устройством в режиме полета, затем закройте приложение и выключите режим полета. Это включит GPS и заставит обновление местоположения быть отправленным.


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

Я запустил свое приложение в симуляторе. Затем убил его из многозадачной панели. Затем я установил местоположение симулятора iOS в пользовательское местоположение. Я вышел из симулятора и начал все сначала. Мое приложение получило значительное место обновите и покажите локальное уведомление.


Я боролся с той же проблемой, как протестировать "startMonitoringSignificantLocationchanges" и проверить, получает ли мое приложение обновления местоположения при приостановке.

Мне не удалось поймать выполнение на точке останова, но мне удалось увидеть результаты моей реализации, отправив новые данные о местоположении на сервер.

весь этот поток: - Реализовано с помощью "startMonitoringSignificantLocationchanges" и вызова API на мой сервер для обновления расположение широта и долгота - Установите возможность фонового режима обновления местоположения в true - Запустите приложение, чтобы менеджер местоположения инициируется, и приложение прослушивает изменения местоположения - Принудительно закрыть приложение - Установите debug - >местоположение на симуляторе на freeway drive - Открытые карты, чтобы увидеть, если местоположение меняется - Ждал на сервере, чтобы увидеть обновления местоположения и получал новые результаты каждые около 3 минут

однако я все еще не уверен, что это достаточно хорошо на реальном устройство.

Я работаю над версией Xcode 6.0.1 (6A317); протестирован на симуляторе iPhone 5s (8.0).


в зависимости от вашего сценария я бы предложил два решения:

  1. используйте таймер или LocalNotification, который периодически вызывает stopMonitoringSignificantLocationchanges с последующим startMonitoringSignificantLocationchanges, которые должны инициировать новое местоположение для отправки в код (может быть то же место, что и раньше).

  2. создайте свой собственный симулятор GPS, который вы запускаете в отладочных сборках, и который вызовет те же методы делегата, что и Метод CLLocationManager будет делать.


одна вещь, которую я заметил в iOS 7 и Xcode 5.1.1 - если вы ожидаете, что события SLC запустят ваше приложение в фоновый режим, оно может или не может попасть в точки останова, которые вы установили. Для меня иногда сообщение NSLog даже не отображается.

Если это так, вы можете просмотреть выходные данные NSLog из системного журнала. Вы можете открыть системный журнал из меню отладки iOS Simulator.


в iOS 4 Вы можете зарегистрироваться для значительных изменений местоположения. Из документов Apple: с помощью этой службы обновления местоположения генерируются только тогда, когда местоположение пользователя значительно изменяется; таким образом, он идеально подходит для социальных приложений или приложений, которые предоставляют пользователю некритическую информацию о местоположении. Если приложение приостанавливается при обновлении, система будит его в фоновом режиме для обработки обновления. Если приложение запускает эту службу и затем завершается, система автоматически перезапускает приложение, когда новое местоположение становится доступным. Эта услуга доступна в iOS 4 и более поздних версиях, только на устройствах, содержащих сотовое радио.

посмотреть документы Apple здесь и здесь.

вот пример кода для регистрации обновлений местоположения сигнификации:

- (void)startSignificantChangeUpdates {

// Create the location manager if it doesn't exist
if (nil == locationManager)
    locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];

}

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


Freeway drive

enter image description here

// MARK: - MKMapViewDelegate

  func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
    guard let location = userLocation.location else { return }

    print(location.speed)
  }

Ну, это невозможно, поскольку область применения ограничена собственным пространством, и такое уведомление не может быть создано с помощью Apple Documented APIs list. Конечно.. если используется какой-либо недокументированный API, приложение получит отказ от apple из-за использования недокументированного/частного API.