Получить данные для усложнения: ExtensionDelegate не вызывается

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

Я пытаюсь сделать действительно простую вещь: получить данные из моего приложения для iOS или из моего приложения Watch в мой Complication Controller.

Я оказался гораздо менее способным сделать это, чем я думал. Руководство по переходу watchOS 2 указывает, что я должен "[получить] необходимые данные из делегата расширения", используя следующий код:

ExtensionDelegate* myDelegate = [[WKExtension sharedExtension] delegate];  
NSDictionary* data = [myDelegate.myComplicationData objectForKey:ComplicationCurrentEntry];

Отлично. За исключением того, что я не смог понять, как заставить это работать на стороне расширения. Хотя еще важнее то, что я даже не могу заставить работать код делегата расширения при запуске контроллера сложности. Когда я запускаю усложнение, я получаю это сообщение: "Расширение получило запрос на пробуждение для поддержки усложнения". Однако ни один из кодов в любом из методов делегата расширения, кажется, не выполняется. Я также установил точки останова в каждом методе, и ни одна из этих точек останова не была достигнута.

Он также выглядит как "TransferCurrentComplicationUserInfo:" также предлагается использовать для обновлений усложнения, хотя неясно, как именно он используется. Насколько я понял, он используется для пробуждения расширения часов, чтобы ExtensionDelegate мог сохранять новые данные в следующий раз, когда запускается контроллер усложнения, но из-за предыдущей проблемы я не смог подтвердить.

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

Кстати, вот код, который у меня есть для "getCurrentTimelineEntryForComplication", если это вообще полезно.

- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler {  
    NSDate* entryDate = [NSDate date];  

    ExtensionDelegate* myDelegate = [[WKExtension sharedExtension] delegate];  
    NSString* data = [myDelegate.complicationData objectForKey:@"meow"];  
    NSLog(@"complication data: %@", data);  

    CLKComplicationTimelineEntry* entry = [self getTimelineEntry:@"2015-08-25 00:19:42" entryDate:entryDate complication:complication];  

    handler(entry);  
}

2 ответа

Я работаю с Осложнениями в WatchOS2 начиная с Xcode 7 Beta 4. Сейчас я работаю с последней версией Xcode Beta 6. У меня был ряд проблем, как в обеих бета-версиях, работающих на Watch, так и на iPhone. установка на Watch и запуск на симуляторе часто дают ложные негативы из-за того, что, как представляется, с ошибками API и выпуски ОС. Я был в состоянии получить данные, чтобы показать на осложнения следующим образом.

  • Убедитесь, что ваш основной контроллер интерфейса реализует протокол WCSessionDelegate.
  • Реализуйте оба метода didReceiveMessage и didReceiveApplicationContext в своем контроллере интерфейса.
  • В своем приложении для iPhone попытайтесь отправить сообщение с помощью WCSession в Watch.
  • Если сообщение не удается отправить из приложения iPhone, отправьте контекст приложения.
  • Вернувшись в контроллер интерфейса, когда вы получите сообщение или контекст, обновите значения в вашем делегате расширения.
  • Все еще в контроллере интерфейса и после получения сообщения или контекста, получите дескриптор к CLKComplicationServer, и для каждого усложнения в activeComplications вызовите reloadTimelineForComplication.
  • В getCurrentTimelineEntryForComplication вашего Complication Controller захватите данные, которые вы задали в Extension Delegate, и установите значения в CLKComplicationTimelineEntry.
  • Обычно это работает, когда приложение уже открыто на Watch, приложение все еще находится в памяти, но находится в фоновом режиме на Watch, или вы запускаете приложение, и его контекстное ожидание, которое оно использует.
  • Я не был в состоянии заставить исторические записи графика времени функционировать (или будущие). Также я не смог получить график обновления независимо от приложения Watch.

Если у вас возникли проблемы, вот несколько вещей, которые нужно попробовать отладить. Как я уже говорил выше, API и ОС выглядят очень глючно. Следующие шаги работают (иногда).

  • В симе используйте опцию "Сбросить все настройки" на iPhone и Watch sim.
  • На устройстве перезапустите часы. При необходимости отсоедините и отремонтируйте часы, хотя это займет очень много времени.
  • На iPhone удалите приложение (которое также удалит приложение Watch, если оно установлено) и переустановите.

Надеюсь, это поможет!

Джастин

Чтобы заставить ComplicationController реагировать на действия WCSession, необходимо настроить контроллер на соответствие WCSessionDelegate, а затем управлять didReceiveUserInfo из ComplicationController. ExtensionDelegate не просыпается для этих обновлений в фоновом режиме. Вы все еще можете обновить свой делегат от контроллера при необходимости.

Также, на данный момент, симулятор не отправляет TransferCurrentComplicationUserInfo на сим-часы, вы должны тестировать на устройствах.

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