Симулятор Xcode / iOS: вручну спрацьовувати значну зміну місця розташування


77

Чи є спосіб вручну сказати пристрою надіслати значне сповіщення про зміну місцезнаходження, яке викликає будь-які програми, зареєстровані для цього сповіщення? Це лише для тестування, і я розумію, що цей приватний виклик API буде відхилений після надсилання до магазину програм.


1
Я перекопав заголовки приватних фреймворків і не зміг знайти нічого, що могло б нагадувати це. Це не зручно лише тестувати це, сідаючи в машину і їздити з ноутбуком.
Нік

1
Якщо ви використовуєте CLLocationManager didUpdateToLocation: fromLocation: delegate, тоді ви можете використовувати startUpdatingLocation замість startMonitoringSignificantLocationChanges для цілей тесту. Якщо в CLLocationManager не встановлений фільтр, він викликає didUpdateToLocation майже щосекунди, якщо у вас є середньо хороший gps-прийом. Для тестових цілей це може допомогти.
Томас

1
Насправді справа не в тестуванні результатів роботи CLLocationManager стільки, скільки в життєвому циклі програми, коли її «прокинуло» суттєва зміна місцезнаходження.
Нік

Якщо у вас є обліковий запис Apple Dev, ви можете поглянути на iOS5 UIAutomation. Врешті-решт це може надати вам рішення. Єдиною перешкодою є не знаю, чи можна перевести програму у фоновий режим за допомогою UIAutomation.
Barney Mattox

FWIW Xcode не дозволяє призупинити роботу ваших програм належним чином, і ви можете отримати несподівані результати. Це на звичайному пристрої, він фактично припинить роботу, але оскільки ви працюєте через Xcode, він просто залишатиметься у фоновому режимі для налагодження ...
Мед,

Відповіді:


193

Отже, дві відповіді:

А) Зайдіть в поїзд :-)

Б) Використовуйте тренажер. У симуляторі iOS 5.x існує меню налагодження, яке має підменю розташування. Виберіть автостраду. Це почне симулятор у уявній подорожі мальовничим 280 в Північній Каліфорнії. Він надає вам усе, крім перегляду: ваш додаток отримуватиме значні оновлення щодо зміни місцезнаходження , а також буде запущений у фоновому режимі, якщо його було призупинено.

Щоб перевірити, що ви насправді переїжджаєте, запустіть сафарі в симуляторі та перейдіть на сторінку maps.google.com та натисніть кнопку відстеження мого місцезнаходження. Ви повинні рухатися.

Чудово! Тепер, як вирішити проблему життєвого циклу запуску системою? Легко! Нехай xCode дочекається запуску програми, щоб розпочати налагодження. У меню Схема виберіть редагувати схему. На схемі запуску та вкладці Інформація для параметра "Запуск" виберіть: " Зачекайте, поки My.app запуститься ".

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

Але насправді, поїздка на поїзді веселіша.


2
Хтось пробував на симуляторі iOS 6.X? Не вдалося змусити його працювати.
Сегєв

2
Мені теж не пощастило з iOS 6.1 sim та XCode 4.6.
Stephen Petschulat

1
занадто довго чекати, див. рішення
@Chris

3
Оновлення iOS9.3 + xCode 7.3: Цей метод працює як шарм !! (ПРИМІТКА: обов’язково правильно обробляйте requestAlwaysAuthorization () + відповідні ключі info.plst). Плюс, встановлення distanceFilter = 500 змусило мене отримувати оновлення про місцезнаходження кожні 30-40 секунд (іноді навіть ~ 15 секунд);)
Vexy

1
5 років вниз по смузі. Це все ще працює з XCode 9? Я зробив саме все, як було згадано вище. Чекав приблизно 5 хвилин. Нічого.
Дібзманія

18

Ну, я виявив, що можу зробити це, увімкнувши та вимкнувши режим польоту та / або Wi-Fi. Можливо, запустіть програму на пристрої в режимі польоту, а потім закрийте програму та вимкніть режим польоту. Це ввімкне GPS і змусить надсилати оновлення місцезнаходження.


1
Це не спрацювало для мене, щоб перезапустити припинену програму, яка використовує значний моніторинг зміни місцезнаходження.
aslisabanci

1
Так ! Це була дуже гарна ідея! Моєю проблемою було змусити систему запустити мою програму, коли пристрій заблоковано, і це рішення "Режим польоту" спрацювало як шарм на iOS 9! Дуже дякую !
Nverinaud

4

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

Я запустив свою програму в тренажері. Потім вбив його з панелі багатозадачності. Потім я встановив розташування симулятора iOS на власне місце. Я кинув тренажер і запустив його знову. Мій додаток отримав значне оновлення місцезнаходження та показав локальне сповіщення.


3

Я стикався з тією ж проблемою, як протестувати "startMonitoringSignificantLocationChanges" і перевірити, чи отримує мій додаток оновлення місцезнаходження після призупинення.

Мені не вдалося вловити виконання на точці зупинки, але мені вдалося побачити результати моєї реалізації, надіславши нові дані про місцезнаходження на сервер.

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

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

Я працюю над версією Xcode 6.0.1 (6A317); протестовано на Simulator iPhone 5s (8.0).


2

Додавши відповідь MagicSeth, якщо вам потрібно протестувати це на реальному пристрої, а не на симуляторі, ви можете запустити фоновий запуск за допомогою UIApplication.LaunchOptionsKey.locationключа, вимкнувши та повторно ввімкнувши Служби локації в загальному> Екран конфіденційності в додатку Налаштування.


Це був би кращий коментар, ніж відповідь
Йодаст,

Мені не вдалося отримати рішення з тренажером для роботи, але це працювало чудово на iOS 12.
duncanc4

1

Залежно від вашого сценарію, я б запропонував два рішення:

  1. Використовуйте таймер або LocalNotification, які періодично викликають stopMonitoringSignificantLocationChanges, а потім startMonitoringSignificantLocationChanges, що має ініціювати надсилання нового місця до вашого коду (може бути таким самим, як і раніше).

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


Існує життєвий цикл програми, який є суттю питання.
Нік

Існує життєвий цикл програми, який є суттю питання. Додаток припиняється та запускається завдяки значній зміні місцеположення у фоновому режимі. Нам потрібно перевірити поведінку програми після її запуску у фоновому режимі, включаючи тривалість життя та мережевий зв’язок. Ми вирішили свої проблеми, фактично взявши день і їздивши по місту з ноутбуком, контролюючи консоль для реєстрації активності.
Нік

1

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

Якщо це саме для вас, ви можете переглянути вихідні дані NSLog із системного журналу. Ви можете відкрити системний журнал у меню налагодження iOS Simulator.


0

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

}

У документації сказано: якщо ви залишаєте цю службу запущеною, а вашу заявку згодом призупинено або припинено, служба автоматично активує вашу програму, коли надходять нові дані про місцезнаходження. Під час пробудження ваша програма переходить у фоновий режим і надається невелика кількість часу для обробки даних про місцезнаходження. Оскільки ваша програма знаходиться у фоновому режимі, вона повинна виконувати мінімальну роботу та уникати будь-яких завдань (таких як запит мережі), які можуть перешкодити її поверненню до закінчення призначеного часу. Якщо цього не сталося, ваша заявка може бути припинена.


Дякую ... Я розумію, як це працює, і використовую його вже деякий час. Питання в тому, як протестувати його, не їздивши в машині, примусивши пристрій спрацьовувати.
Nick

Ах, вибачте. Чи можу я видалити свою відповідь?
Jane Sales

-1

Автострада

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

// MARK: - MKMapViewDelegate

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

    print(location.speed)
  }

-4

Ну, це неможливо, оскільки область застосування обмежена власним простором, і такий тип сповіщення не може бути створений за допомогою списку документалізованих API Apple. Звичайно .. якщо використовується будь-який недокументований API, програма отримає відмову від apple через використання недокументованого / приватного API.


Очевидно ... Будь ласка, прочитайте питання перед тим, як відповісти. "Це призначено лише для тестування, і я розумію, що цей приватний виклик API буде відхилений після надсилання до магазину програм."
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.