Mise à jour des complications WatchKit quand l'application ne tourne pas
Bonjour !
J'ai récemment développé une extension WatchKit pour mon application, qui fonctionne très bien jusque là .
En revanche, j'ai un problème avec les complications que j'ai mises en place, puisque je n'arrive pas à les actualiser lorsque l'extension ne tourne pas sur l'Apple Watch...
En temps normal, l'extension WatchKit met à jour ses complications lorsque elle reçoit un nouveau contexte depuis l'application iOS :
- (void) session: (WCSession *)session didReceiveApplicationContext: (NSDictionary *)context
{
// Update the application context
_currentBalance = context[KHWAContextCurrentBalance];
_currentEarnings = context[KHWAContextCurrentEarnings];
[...]
// Update the user defaults
[[NSUserDefaults standardUserDefaults] setValue:_currentBalance forKey:KHWAContextCurrentBalance];
[[NSUserDefaults standardUserDefaults] setValue:_currentEarnings forKey:KHWAContextCurrentEarnings];
[...]
[[NSUserDefaults standardUserDefaults] setValue:_currentBalance forKey:KHWAComplicationTotalBalance];
[[NSUserDefaults standardUserDefaults] synchronize];
// Post a notification to refresh interface
[[NSNotificationCenter defaultCenter] postNotificationName:KHWAContextDidChangeNotification object:context];
// Refresh the complications
CLKComplicationServer *complicationServer = [CLKComplicationServer sharedInstance];
for (CLKComplication *complication in complicationServer.activeComplications) {
[complicationServer reloadTimelineForComplication:complication];
}
}
Et lorsque l'extension n'est pas lancée, l'application iOS envoie directement les données des complications à l'Apple Watch, grâce au code suivant :
[[WCSession defaultSession] transferCurrentComplicationUserInfo:@{
KHWASessionTransferUserInfoType : KHWASessionTransferUserInfoTypeComplicationData,
KHWASessionTransferUserInfoContents : @{ KHWAComplicationTotalBalance : _totalBalance }}];
Du côté de l'extension WatchKit, j'ai implémenté la méthode qui est censée recevoir ces données (même quand l'application ne tourne pas) :
- (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];
}
}
}
Seulement ça ne fonctionne pas lorsque l'extension n'est pas lancée... L'Apple Watch reçoit bien le message de l'application iOS, mais ne parvient pas à réveiller l'extension pour lui transmettre :
Oct 18 18:08:11 pc16 WatchApp Extension[26615]: Extension received request to wake up for complication support.
Oct 18 18:08:11 pc16 assertiond[26585]: assertion failed: 15A284 13S343: assertiond + 15398 [B48FCADB-A071-3A46-878B-538DC0AFF60B]: 0x1
Je suis coincé depuis hier sur ce problème dont je ne trouve pas la solution...
Si quelqu'un a une idée, ça m'aiderait beaucoup !
Merci
Thomas
PS : pour information j'utilise le simulateur pour tester l'application WatchKit, et pour "fermer" l'appli je redémarre simplement le simulateur (menu Hardware > Reboot).
Réponses
J'ai résolu mon problème !!
En fait j'avais placé le code d'initialisation de la WCSession au mauvais endroit (dans le bloc applicationDidFinishLaunching).
Sauf que cette méthode n'est pas appelée lorsque l'Apple Watch réveille l'extension pour transmettre les informations reçues, et donc les méthodes du delegate de la WCSession non plus.
Du coup j'ai déplacé ce code dans le bloc init de mon ExtensionDelegate :
- (id) init
{
if (self = [super init]) {
// Setup the WatchConnectivity session
WCSession *session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
}
return self;
}
Et pour l'instant tout fonctionne correctement...
J'aurais bien galéré, pour le coup la documentation d'Apple n'aide pas beaucoup sur le sujet...
Merci pour ton retour !