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

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

Ответ 1

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

A) Хоп в поезде: -)

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Я работаю над Xcode Version 6.0.1 (6A317); тестируется на Simulator iPhone 5s (8.0).

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

}

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

Ответ 8

Привод Freeway

введите описание изображения здесь

// MARK: - MKMapViewDelegate

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

    print(location.speed)
  }

Ответ 9

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

Ответ 10

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