Симулятор Xcode / iOS: вызвать существенное изменение местоположения вручную - PullRequest
75 голосов
/ 28 мая 2011

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

Ответы [ 10 ]

189 голосов
/ 10 апреля 2012

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

A) Садитесь в поезд: -)

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

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

Отлично!Теперь, как отладить проблему жизненного цикла запуска системы?Легко!Пусть xCode дождется запуска вашего приложения, чтобы начать отладку.В меню «Схема» выберите «Изменить схему».В схеме запуска и на вкладке «Информация» для параметра «Запуск» выберите: « Подождите, пока My.app запустит ».

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

Но на самом деле поездка на поезде веселее.

17 голосов
/ 11 февраля 2012

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

4 голосов
/ 12 сентября 2012

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

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

3 голосов
/ 20 октября 2014

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

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

Весь поток: - Реализован с помощью 'startMonitoringSignificantLocationChanges' и вызова API на моем сервере для обновления широты и долготы расположения - Установитеместоположение обновляет возможность фонового режима до значения true - Запустите приложение, чтобы менеджер местоположений был запущен, и приложение прослушивало изменения местоположения - Принудительно закрыло приложение - Установите для отладки-> местоположение на симуляторе на автостраду - Открытые карты, чтобы увидетьместоположение меняется - ожидал на сервере обновления местоположения и получал новые результаты каждые 3 минуты

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

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

1 голос
/ 09 апреля 2019

В дополнение к ответу MagicSeth, если вам нужно проверить это на реальном устройстве, а не на симуляторе, вы можете запустить фоновый запуск с помощью клавиши UIApplication.LaunchOptionsKey.location, отключив и повторно включив Location Services в разделе General> Privacy в настройках приложение.

1 голос
/ 21 мая 2014

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

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

1 голос
/ 02 июня 2011

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

  1. Используйте Timer или LocalNotification, который периодически вызывает stopMonitoringSignificantLocationChanges, а затем startMonitoringSignificantLocationChanges, который должен инициировать отправку нового местоположения в ваш код (может быть таким же, как и раньше).

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

0 голосов
/ 31 января 2017

Автострада

enter image description here

// MARK: - MKMapViewDelegate

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

    print(location.speed)
  }
0 голосов
/ 27 сентября 2011

В 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];

}

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

0 голосов
/ 24 июня 2011

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

...