6

(Sembra che questo problema è stato riscontrato da altri nelle settimane precedenti, ma non ci sono stati eventuali soluzioni che ho trovato.)su Dati per complicazione: ExtensionDelegate non Chiamato

sto cercando di fai una cosa molto semplice: Ottieni dati dalla mia app iOS o dalla mia app Watch sul mio controller di complicazione.

Mi sto rivelando molto meno capace di ottenere questo risultato di quanto pensassi. watchos 2 Guida transizione indica che avrei dovuto "[prendere] i dati necessari dal delegato estensione" utilizzando il seguente codice:

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

Grande. Tranne, non sono stato in grado di capire come farlo funzionare sul lato dell'estensione. Anche se ancora più importante, non riesco nemmeno a ottenere che il codice delegato dell'estensione venga eseguito da un avvio di un controller complicato. Quando eseguo la complicazione, ricevo questo messaggio: "L'estensione ha ricevuto la richiesta di svegliarsi per il supporto delle complicazioni". Tuttavia, nessuno dei codici all'interno dei metodi del delegato di un'estensione sembra essere eseguito. Ho anche impostato i punti di interruzione all'interno di ogni metodo e nessuno di questi punti di interruzione viene colpito.

Sembra anche "transferCurrentComplicationUserInfo:" è consigliato anche per gli aggiornamenti di complicazioni, anche se non è chiaro con precisione come viene utilizzato. Per quanto ne ho ricavato, è abituato a risvegliare l'estensione dell'orologio in modo che ExtensionDelegate possa memorizzare i nuovi dati per la prossima volta che viene eseguito il controller di complicanze, ma a causa del problema precedente non sono stato in grado di confermare.

Ho una soluzione alternativa (eseguire il ping del server dal controller di complicazione e sperare che le variabili di sessione persistano in modo da poter inviare dati rilevanti), ma ci sono tutte le possibilità che se non riesco a ottenere questo ha funzionato il mio lavoro di complicazione sarà hosed. Qualsiasi aiuto qui sarebbe tremendo.

A proposito, ecco il codice che ho per "getCurrentTimelineEntryForComplication", se questo è utile a tutti.

- (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); 
} 
+0

dove nell'estensione WatchKit attivi la WCSession? Quale oggetto hai impostato come delegato? – ccjensen

+0

@ccjensen che ha lo stesso identico problema, avete mai immaginato qualcosa? – SRMR

+0

Non ho mai avuto risposta alle mie domande quindi non penso che questo sia mai stato capito – ccjensen

risposta

8

Ho lavorato con complicanze a WatchOS2 dal Xcode 7 Beta 4. Sono ora in poi l'ultima, Xcode Beta 6. Ho avuto una serie di questioni, come in entrambe le versioni beta in esecuzione sul Guarda, esegui su iPhone, quindi esegui l'installazione su Watch, e il funzionamento sul simulatore spesso genera falsi negativi a causa di ciò che sembra essere bacato da API e versioni del sistema operativo. Sono stato in grado di ottenere dati da mostrare sulle complicazioni nel modo seguente.

  • Verificare che il controller di interfaccia primario implementa il protocollo WCSessionDelegate.
  • Implementare entrambi i metodi didReceiveMessage e didReceiveApplicationContext nel controller di interfaccia.
  • Nell'app per iPhone, tentare di inviare un messaggio utilizzando WCSession all'orologio.
  • Se il messaggio non riesce a inviare dall'app iPhone, inviare il contesto dell'applicazione.
  • Indietro nel controller di interfaccia, quando si riceve un messaggio, oppure un contesto, aggiornare i valori nel proprio delegato dell'interno.
  • Ancora nel controller di interfaccia e ancora dopo aver ricevuto un messaggio -oppure-, ottenere un handle su CLKComplicationServer e per ogni complicazione nella chiamata activeComplications reloadTimelineForComplication.
  • In GetCurrentTimelineEntryForComplication del controller di Complicazione, acquisire i dati impostati nel Delegato dell'interno e impostare i valori in CLKComplicationTimelineEntry.
  • Questo funzionerà di solito quando l'App è già aperta sull'Osservatore, l'app è ancora residente in memoria, ma in background sul Watch, o si avvia l'app e il loro è contesto in attesa che consuma.
  • Non sono riuscito a far funzionare le voci della cronologia storica (o quelle future). Né, sono stato in grado di aggiornare la sequenza temporale indipendentemente dall'app Watch.

Se si verificano problemi, qui ci sono alcune cose di debug da provare. Come ho detto sopra, l'API e il sistema operativo sembrano essere molto bacati. I passaggi di seguito do funzionano (a volte).

  • Nella simulazione, utilizzare l'opzione Ripristina tutte le impostazioni su entrambi i sim iPhone e Guarda.
  • Sul dispositivo, riavviare l'orologio. Se necessario, disaccoppia e ripara l'orologio, sebbene ciò richieda molto tempo.
  • Sull'iPhone, eliminare l'app (che eliminerà anche l'app Watch se installata) e reinstallarla.

Spero che questo aiuti!

Justin

+0

Hai mai incontrato un problema sul lato 'ComplicationController' dove non riesci a ottenere i dati che hai impostato in' ExtensionDelegate' tramite 'WCSession:' da estrarre? – SRMR

+0

Sì, mi sono imbattuto in questo quando non ero riuscito a rispondere correttamente a getTimelineEntriesForComplication (beforeDate e afterDate). Inizialmente, non capivo a cosa servissero questi metodi e stavo riempiendo tutte le voci della timeline richieste con gli stessi dati. Ciò ha impedito al Complication Controller di ottenere nuovi dati per l'intervallo di tempo coperto da queste voci della timeline. Per risolvere questo problema, assicurati di rispondere a getTimelineEntriesForComplication con il set noto di buone voci della timeline e di call call (zero) una volta terminato. Spero che aiuti! –

+0

Ahhh, penso che abbia senso. Che cosa ha fatto clic per te? Ti sei imbattuto in un articolo/tutorial/doc che ti ha reso più chiaro? – SRMR

-1

Al fine di rendere il ComplicationController rispondere all'attività WCSession è necessario effettuare il controller conforme alle WCSessionDelegate, quindi gestire didReceiveUserInfo dall'interno del ComplicationController. ExtensionDelegate non viene riattivato per questi aggiornamenti quando è in background. È comunque possibile aggiornare il delegato dal controller, se necessario.

Inoltre, al momento, il simulatore non invia transferCurrentComplicationUserInfo alla simulazione di orologio, è necessario eseguire il test sui dispositivi.

+0

Non ho mai riscontrato un problema con 'getTimelineEntriesForComplication' sul simulatore; supporta il viaggio nel tempo. Il tuo approccio dovrebbe essere evitato per questi motivi: 'ComplicationController' è una fonte * di dati * che viene istanziata su richiesta dal server di complicazione. Non è pensato per ricevere dati o essere un repository per i dati. Apple consiglia di separare le responsabilità di fetch e data manager in moduli distinti. Ciò è particolarmente significativo quando [consideri le complicazioni dal punto di vista di un'attività di background watchOS 3] (http://stackoverflow.com/a/37867082/4151918). –

+0

il problema è che transferCurrentComplicationUserInfo non sta raggiungendo ComplicationController poiché la funzione WCsession è attivata da ExtensionDelegate (e può esserci solo un delegato WCSession). La soluzione migliore è gestire l'attività di sessione con un singleton che può essere condiviso attraverso l'app dell'orologio – markdrayton

+0

natasha descrive la tecnica qui https://www.natashatherobot.com/watchconnectivity-say-hello-to-wcsession/ – markdrayton

Problemi correlati