Совместное использование модели данных между watchapp и его усложнением

Я пытаюсь научиться разрабатывать часовые приложения для Apple Watch, и мне кажется, что одна вещь немного сложна: как данные должны делиться между часовым приложением и контроллером сложности?

Большинство примеров, которые я вижу онлайн, следуют в следующем порядке:

1 - загрузить данные на ExtensionDelegate и использовать их на InterfaceController;

2 - получить ComplicationController для получения данных из ExtensionDelegate

3 - Добавьте фоновую задачу в ExtensionDelegate, чтобы он загружал обновленные данные, которые будут использоваться как InterfaceController, так и ComplicationController, обновляя оба.

Поэтому мои данные находятся в коллекции на ExtensionDelegate. Я думаю:

1 - Кто должен изначально получить мой ExtensionController для загрузки данных при запуске приложения? Мой ComplicationController или мой InterfaceController? Я спрашиваю об этом, потому что в xcode есть симулятор для каждого из них, поэтому иногда я не знаю, который вызывается первым при запуске приложения. Должна ли сложность начинать свой жизненный цикл только после того, как пользователь открывает приложение, вызывая тем самым первую загрузку данных, или он запускается после установки приложения? Или следует добавить флаг в ExtensionDelegate, чтобы пометить, если нет загруженных данных, есть загружаемые данные, есть доступные данные (т. Е. Коллекция не равна нулю), чтобы либо ComplicationController, либо InterfaceController могли инициировать первую загрузку данных?

2. Хотя мое задание фоновой загрузки работает, я чувствую, что через несколько часов мое приложение должно быть перезагружено при открытии, как если бы оно не было открыто ранее, что вызывает новую загрузку данных. Данные на нем отличаются от данных, уже загруженных и показанных ComplicationController. Какова хорошая стратегия для решения этой проблемы? Любые указатели на то, что я должен проверять?

1 ответ

Я не уверен, правильно ли я понял ваш вопрос. В любом случае, я передаю данные с iPhone на часы следующим образом:

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

Когда приложение iPhone запущено, оно сначала отправляет данные о сложностях на часы, используя transferCurrentComplicationUserInfo(_:), Итак, циферблат показывает данные об осложнениях.
Впоследствии iPhone отправляет сообщение, используя sendMessage(_:replyHandler:errorHandler:), Это сообщение сообщает расширению часов, что iPhone скоро отправит данные. Поскольку отправка данных может занять гораздо больше времени, исходное сообщение используется для отображения подсказки о загрузке данных с iPhone на часы.
Впоследствии я отправляю данные, используя updateApplicationContext(_:),

Второй сценарий заключается в том, что приложение для iPhone запущено, а расширение для часов пока нет.
Теперь, как только расширение часов запущено, InterfaceController использования sendMessage(_:replyHandler:errorHandler:) немедленно отправить на iPhone сообщение о том, что ему нужны данные. Когда это сообщение получено, выполняется та же последовательность, что и описанная выше: отправляются данные усложнения, отправляется сообщение о том, что передача данных скоро начнется, и начинается передача данных.

Это работает без проблем.

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

Другие вопросы по тегам