2015-10-18 7 views
3

Я работаю над расширением WatchKit своего приложения и имею некоторые проблемы с осложнениями.Сохранение моих осложнений WatchKit в актуальном состоянии, когда не работает

У меня есть сложность, которая отображает заданную общую сумму, которая зависит от того, что пользователь делает в приложении iOS. Когда приложение WatchKit Extension запущено, приложение iOS обновляет контекст приложения часов, используя метод -[WCSession updateApplicationContext:]. Он отлично работает, а затем в приложении ExtensionDelegate моего наблюдения я вручную обновляю сложность с новыми данными.

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

Итак, я отредактировал свой код, чтобы отправить данные о осложнениях непосредственно в Watch, когда пользователь изменил что-то в приложении iOS, используя метод -[WCSession transferCurrentComplicationUserInfo:] (он написан в документации, которую ExtensionDelegate следует разбудить, чтобы получить информацию о пользователе в задний план).

Я применил метод ExtensionDelegate -session:didReceiveUserInfo:, чтобы обновить сложность при получении данных из приложения iOS, но он не работает, когда расширение не работает ... (и я не знаю, если он когда-либо получает информацию о пользователе, так как я не могу его зарегистрировать)

Как мне сделать, чтобы мои осложнения обновлялись, даже когда расширение не работает?

Благодаря

PS: Я использую Watch Simulator, и «закрыть» расширение Я просто Перезапустите часы (из меню Hardware)

Редактировать: Мне удалось выйти заявления, когда приложение не работает (путем открытия системного журнала Watch Simulator), и я получаю эти строки, когда IOS отправить новые пользовательские данные осложнением для расширения часов:

окт 18 18:08:11 pc16 Расширение WatchApp [26615]: полученное расширение запрос просыпаться для поддержки осложнений.

18 октября 18:08:11 pc16 assertiond [26585]: утверждение не удалось: 15A284 13S343: assertiond + 15398 [B48FCADB-A071-3A46-878B-538DC0AFF60B]: 0x1

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

Edit 2: здесь это часть коды в ExtensionDelegate, который должен получать информацию пользователя осложнения (но не вызываются, когда приложение не работает):

- (void) session: (WCSession *)session didReceiveUserInfo: (NSDictionary *)userInfo 
{ 
    NSLog(@"session:didReceiveUserInfo: %@", userInfo); 

    NSString *userInfoType = userInfo[KHWASessionTransferUserInfoType]; 
    NSDictionary *userInfoContents = userInfo[KHWASessionTransferUserInfoContents]; 

    // Complication Data 
    if ([userInfoType isEqualToString:KHWASessionTransferUserInfoTypeComplicationData]) { 

     // Store the complication data into user defaults 
     [[NSUserDefaults standardUserDefaults] setValue:userInfoContents[KHWAComplicationTotalBalance] forKey:KHWAComplicationTotalBalance]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 

     // And refresh the complications 
     CLKComplicationServer *complicationServer = [CLKComplicationServer sharedInstance]; 
     for (CLKComplication *complication in complicationServer.activeComplications) { 
      [complicationServer reloadTimelineForComplication:complication]; 
     } 
    } 
} 

Edit 3: WCSession устанавливается в расширение делегата applicationDidFinishLaunching метода:

- (void) applicationDidFinishLaunching 
{ 
    // Setup the WatchConnectivity session 
    WCSession *session = [WCSession defaultSession]; 
    session.delegate = self; 
    [session activateSession]; 

    [...] 
} 
+0

Где именно у вас реализованы '-session: didReceiveUserInfo: 'в вашем WatchExtension? – joern

+0

в файле ExtensionDelegate.m (определяется как: '@interface ExtensionDelegate: NSObject ') –

+0

Пожалуйста, добавьте соответствующий код из вашего ExtensionDelegate к вашему вопросу. – joern

ответ

4

Ничего себе, я, наконец, решен вопрос!

Похоже, что даже если я не видел его в файлах журналов (см. Мой последний комментарий), метод WCExtensionDelegate хорошо известен при пробуждении приложения.

Так что я просто должен был переместить настройки WCSession блока в init метод:

- (id) init 
{ 
    if (self = [super init]) { 

     // Setup the WatchConnectivity session 
     WCSession *session = [WCSession defaultSession]; 
     session.delegate = self; 
     [session activateSession]; 
    } 

    return self; 
} 

И в то время как он работает отлично ...

+0

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