CoreBluetooth: тестирование сохранения и восстановления состояния

Я использую Xcode 7 и хотел бы понять, как протестировать «Сохранение и восстановление состояния» в iOS9 с использованием аксессуара BLE и платформы CoreBluetooth (пожалуйста, не то, что я уже нашел этот вопрос, но я чувствую необходимость разобраться в этом подробнее).

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

Я попытался разбить это на три сценария, отражающие различные варианты этого варианта использования, а именно сценарий A, сценарий B и сценарий C.

Может ли кто-нибудь объяснить мне основные шаги, необходимые для тестирования следующих сценариев?

Имеют ли смысл эти сценарии?

  • сценарий А:

    1 - приложение обнаруживает аксессуар и сохраняет информацию об аксессуаре

    2 - приложение / пользователь выходит из диапазона аксессуаров

    3 - приложение убито пользователем

    4 — пользователь повторно входит в диапазон аксессуаров, пока приложение не запущено.

    5 – Ожидаемое событие: я ожидаю активации восстановления состояния (метод willRestoreState вызывается в CentralManager, а также метод didFinishLaunchingWithOptions в AppDelegate.

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

    6 - Если я решил подключиться, я ожидаю, что приложение будет продолжать работать в фоновом режиме (поскольку фоновый режим был активирован).

Как я могу протестировать этот сценарий?


  • сценарий Б:

    1 - приложение обнаруживает аксессуар и сохраняет информацию об аксессуаре

    2 - приложение подключается к аксессуару и отправляет запрос на характеристику, чтобы начать передачу данных

    3 - приложение получает данные от аксессуара

    4 - приложение / пользователь выходит из диапазона аксессуаров

    5 - приложение переходит в фоновый режим

    6 — пользователь повторно входит в диапазон аксессуаров, пока приложение работает в фоновом режиме.

    5 – Ожидаемое событие: я ожидаю активации восстановления состояния (метод willRestoreState вызывается в CentralManager, а также метод didFinishLaunchingWithOptions в AppDelegate.

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

    6 - приложение должно продолжать трансляцию в фоновом режиме

Как я могу протестировать этот сценарий?


  • сценарий С:

    1 - приложение обнаруживает аксессуар и сохраняет информацию об аксессуаре

    2 - приложение подключается к аксессуару и отправляет запрос на характеристику, чтобы начать передачу данных

    3 - приложение получает данные от аксессуара

    4 - приложение / пользователь выходит из диапазона аксессуаров

    5 - приложение переходит в фоновый режим

    6 - пользователь убивает приложение

    7 — пользователь повторно входит в диапазон аксессуаров, пока приложение не запущено

    8 – Ожидаемое событие: активируется восстановление состояния (метод willRestoreState вызывается в CentralManager, а также метод didFinishLaunchingWithOptions в AppDelegate.

    Отсюда я должен получить список периферийных устройств, включая аксессуар, повторно подключиться к нему и повторно запросить передачу данных (возобновить ее, как для сценария B).

    9 — я ожидаю, что приложение будет продолжать работать в фоновом режиме (поскольку фоновый режим был активирован), и приложение должно продолжать потоковую передачу в фоновом режиме.

Как я могу протестировать этот сценарий?

Надеюсь, это не слишком запутанно.


person mm24    schedule 14.10.2015    source источник
comment
Хотел узнать, нашли ли вы ответы на свои вопросы. Меня интересует то же самое. From здесь, я думаю, это достижимо.   -  person Liangjun    schedule 06.06.2016


Ответы (1)


Для сценария А я сомневаюсь, что вы вообще можете что-то сделать. Если пользователь убивает ваше приложение, дважды щелкнув кнопку «Домой» и смахнув приложение вверх, приложение исчезнет и больше не будет участвовать во всех этих причудливых болтовнях по Bluetooth. То же самое относится и к приложению, которое никогда не запускалось — iOS ничего ему не скажет и/или не попытается разбудить.

В сценарии B вам, скорее всего, не придется иметь дело с willRestoreState, потому что современные смартфоны (5s, 6), похоже, не убивают ваше приостановленное приложение даже после запуска кучи тяжелых приложений поверх него. Приложение просто тихо отключится, когда вы покинете диапазон аксессуаров. Затем, если вы дадите ему указание немедленно снова начать поиск аксессуара (в didDisconnectPeripheral), он будет делать это целую вечность. Не слишком часто, но все же. Итак, когда вы снова войдете в диапазон аксессуаров, iPhone в конечном итоге подключится к нему и вызовет все необходимые обратные вызовы. willRestoreState кажется актуальным только для iPhone 4s, возможно, iPhone 5, но я не очень долго играл с этой функцией, чтобы быть абсолютно уверенным.

Если вам действительно нужно протестировать сценарий willRestoreState, вы можете: а) добавить локальные уведомления в didFinishLaunchingWithOptions и willRestoreState, чтобы убедиться, что они активированы, и б) запустить приложение в Xcode, а затем остановить его, нажав CMD+. или нажав квадратную кнопку в Xcode. Это приведет к завершению работы приложения так же, как система убьет его из-за проблем с памятью, поэтому вы должны увидеть свои уведомления. С этого момента вы можете писать код, добавлять операторы журнала и наблюдать за тем, что происходит в журнале устройства.

Еще один способ проверить восстановление состояния — вызвать kill(getpid(), SIGKILL); после нажатия кнопки.

Сценарий C - извините, та же история. Если пользователь умышленно убивает ваше приложение, вы облажались. Скажи ему не делать этого.

person Zmicier Zaleznicenka    schedule 09.02.2016