2014-11-03 10 views
9

Sto provando a testare la funzionalità di handoff per iOS 8.1 con NSUserActivity tra il mio iPhone e il mio iPad. Per questo, ho provato sia a implementare la mia soluzione, sia a utilizzare il progetto Apple PhotoHandoff. Tuttavia, non funziona.NSUserActivity handoff non funziona per dati personalizzati

Se fornisco un webpageURL, il passaggio di consegne funziona bene, ma quando provo ad usare userData o addUserInfoEntriesFromDictionary non funziona nulla, e non posso per la vita di me capire cosa il fermo è quello di rendere il lavoro dei dati.

codice di esempio:

NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"com.company.MyTestApp.activity"]; 
activity.title = @"My Activity"; 
activity.userInfo = @ {}; 
// activity.webpageURL = [NSURL URLWithString:@"http://google.com"]; 

self.userActivity = activity; 

[self.userActivity becomeCurrent]; 
[self.userActivity addUserInfoEntriesFromDictionary:@ { @"nanananan": @[ @"totoro", @"monsters" ] }]; 

(io sono anche in grado di farlo funzionare con un'applicazione per Mac con un corrispondente tipo di attività)

+0

Domanda pazzesca, ma l'hai provata senza l'NSArray annidato? Oppure, potresti provare a serializzarlo in NSData? E hai provato a impostare userInfo prima di chiamare 'self.userActivity = activity' e' becomeCurrent'? – brandonscript

+0

Ho lo stesso problema qui, non viene inviato nulla di speciale. Tutto è configurato in conformità con le guide di sviluppo di Apple. Titolo e tipo sono corretti, ma manca UserInfo. – GregoryM

risposta

2

Per aggiornare dizionario userInfo dell'oggetto di attività, è necessario configurare è delegato e imposta le sue proprietà Salva proprietà su SÌ ogni volta che l'utente deve aggiornare.

Questa procedura è descritta nello best practices section of the Adopting Handoff guide.

Ad esempio, con un semplice UITextView, è necessario specificare il tipo di attività ("com.company.app.edit") identificatore nel file elenco delle proprietà Info.plist nella matrice NSUserActivityTypes, quindi:

- (NSUserActivity *)customUserActivity 
{ 
    if (!_customUserActivity) { 
     _customUserActivity = [[NSUserActivity alloc] initWithActivityType:@"com.company.app.edit"]; 
     _customUserActivity.title = @"Editing in app"; 
     _customUserActivity.delegate = self; 
    } 

    return _customUserActivity; 
} 

- (void)textViewDidBeginEditing:(UITextView *)textView 
{ 
    [self.customUserActivity becomeCurrent]; 
} 

- (void)textViewDidChange:(UITextView *)textView 
{ 
    self.customUserActivity.needsSave = YES; 
} 

- (BOOL)textViewShouldEndEditing:(UITextView *)textView 
{ 
    [self.customUserActivity invalidate]; 

    return YES; 
} 

- (void)userActivityWillSave:(NSUserActivity *)userActivity 
{ 
    [userActivity addUserInfoEntriesFromDictionary:@{ @"editText" : self.textView.text }]; 
} 
+0

Tranne che non funziona. Anche con il campione di Apple. –

+0

Quindi dovrebbe essere qualcosa sul lato ricevente di un'altra app, l'esempio sopra funziona correttamente per me. Presumo che entrambi i dispositivi siano in prossimità fisica e firmati nello stesso account iCloud. Implementa l'applicazione: willContinueUserActivityWithType:? È un'applicazione: continueUserActivity: restorationHandler: chiamata? L'oggetto attività incluso il dizionario utente Info non è disponibile prima di quest'ultima chiamata. – HiDeo

4

Spero che tu abbia già trovato la soluzione, ma nel caso qualcuno si imbatta anche in questo problema, ecco una soluzione. (In realtà non è molto diversa dalla risposta precedente)

Creare attività degli utenti senza userInfo, verrà ignorato:

NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"..."]; 
activity.title = @"Test activity"; 
activity.delegate = self; 
activity.needsSave = YES; 

self.userActivity = activity; 
[self.userActivity becomeCurrent]; 

Implementare il delegato di reagire agli eventi needSave:

- (void)userActivityWillSave:(NSUserActivity *)userActivity { 
    userActivity.userInfo = @{ @"KEY" : @"VALUE" }; 
} 

Quando needsSave è impostato su SÌ, questo metodo verrà chiamato e userActivity verrà aggiornato.

Spero che questo aiuti.

+0

Confermo che funziona su iOS 8. Su iOS 9 l'hanno già risolto, quindi basta impostare '.userInfo' direttamente e' .needsSave' su YES. – Tricertops

+0

@Tricertops Non ero nemmeno in grado di farlo funzionare su iOS 9 come descrivi. L'unico modo per acquisire i dati era implementare 'userActivityWillSave:' e impostare 'userInfo' lì. – aapierce

1

FWIW, stavo avendo questo problema. Ho avuto la fortuna che uno dei miei tipi di attività ha lavorato e l'altro no:

Activity: Walking 
(UserInfo x1,y1) 
(UserInfo x2,y2) 
(UserInfo x3,y3) 
Activity: Standing 
(UserInfo x4,y4) 
Activity: Walking 
etc. 

ho avuto userInfo se l'handoff si è verificato quando in piedi, ma non camminare. Ho ottenuto altre proprietà come URL della pagina web in tutti i casi; solo userInfo è arrivato attraverso null.

La correzione per me è stato quello di invalidare & ricreare il NSUserActivity oggetto ogni volta (ad esempio quando si cammina per x2/y2 da x1/y1), anziché solo quando Tipo di attività è cambiato (per esempio dal camminare a piedi). Questo non è il modo in cui è scritto il documento, ma risolto il problema su iOS 9.

AGGIORNAMENTO: questa soluzione alternativa non funziona su iOS 8. È necessario implementarlo tramite il delegato userActivityWillSave, come specificato da gregoryM. Per Doc di Apple:

Per aggiornare dizionario userInfo dell'oggetto attività in modo efficiente, configurare il suo delegato e impostarne la proprietà needsSave su YES ogni volta l'userInfo necessita di un aggiornamento.In momenti appropriati, Handoff richiama userActivityWillSave del delegato : callback e il delegato può aggiornare lo stato di attività .

Questa non è una "best practice", è necessaria!

[Nota: problema si è verificato su dispositivi iOS 9 in esecuzione codice costruito su Xcode 6.x. Non ho ancora provato Xcode 7, e il problema potrebbe non verificarsi su iOS 8.]

Problemi correlati