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


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

9 72

9 ответов:

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

а) хоп на поезде : -)

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

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

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

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

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

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

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

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

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

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

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

}

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

шоссе диск

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.