2014-07-22 14 views
6

Provare a utilizzare [self.extensionContext openURL:... completionHandler:...]; in un'estensione di condivisione iOS 8 per aprire l'app contenente non apre mai l'app e chiama sempre il gestore di completamento con successo = NO.openURL non funziona nell'estensione di condivisione

Here è lo stesso problema con le estensioni di azione, ma penso che sia più ragionevole per le estensioni di condivisione essere in grado di aprire l'app che contiene le estensioni di azione. Il punto di un'estensione di condivisione è caricare una parte potenzialmente grande di dati e l'unico modo per farlo senza aprire l'app è tramite NSURLSession, che può solo caricare HTTP (S). Ma un'app potrebbe voler condividere il contenuto attraverso un meccanismo diverso rispetto agli upload HTTP (S).

La documentazione Apple non specifica che openURL... non può essere utilizzato per alcun tipo particolare di interno. È difficile sapere se si tratta di un bug o di un comportamento previsto. Non ci sono informazioni ufficiali su questo.

+0

Questo dice un po 'per la situazione, http://stackoverflow.com/a/24709883/250190. Anche io sto cercando di farlo, proprio come la condivisione di YouTube su iOS 7, voglio fornire un 'UIAlertController' dando all'utente la possibilità di vedere ciò che hanno appena condiviso. È un'esperienza molto disconnessa così com'è. –

risposta

1

La documentazione indica che "il punto di estensione determina se supportare questo metodo" e in pratica solo coloro che utilizzano l'estensione di oggi sono in grado di avviare la propria app host utilizzando openUrl. Il provider di condivisione, azione, tastiera e documento non fa non funziona per chiunque (beta 5).

+0

"Il provider di condivisione, azione, tastiera e documento non funziona per nessuno (versione beta 5)." Giusto, ma questo non è documentato da nessuna parte. Potrebbe essere un bug. – user102008

+0

Forse, ma non sarei sorpreso se fosse intenzionalmente basato sulle intenzioni di Apple su quali estensioni dovrebbero essere e fare. Vedi anche questa discussione: http://stackoverflow.com/questions/24297273/openurl-not-work-in-action-extension/25189466#25189466 Forse stanno ancora decidendo anche ... – n8tr

7

Ecco alcune possibili soluzioni ... Communicating with/opening Containing app from Share extension

Quelli che funzionano davvero possono essere riassunti come:

  • Utilizzando un UIDocumentInteractionController e registrare la vostra applicazione contenitore con uno speciale tipo di estensione per aprire il tuo app contenitore dall'estensione
  • Utilizzo di un dummy NSURLSessionTask per ottenere il metodo application:handleEventsForBackgroundURLSession:completionHandler: della classe UIApplicationDelegate dell'app contenitore per essere chiamato. Quindi, con questo metodo, puoi chiamare [[UIApplication sharedApplication] openURL:url] per aprire quello che vuoi.

Nessuno di questi metodi è perfetto, ma funzionano (non sono sicuro se Apple li gradirebbe comunque). Per maggiori dettagli è possibile controllare il link. Spero che questo aiuti :)

Edit: È possibile anche utilizzare un UIWebView come descritto https://stackoverflow.com/a/24614589/3923882

0

sto usando questo metodo che non comporta alcuna attività in background:

  • utilizzare un UIViewController (invece di la sottoclasse predefinita SLComposeServiceViewController per l'estensione di condivisione per aggiungere layout personalizzato;
  • aggiungi un UIWebView e carica una stringa HTML con un collegamento che punta all'URL personalizzato della tua app;
  • attuare il metodo webView:shouldStartLoadWithRequest:navigationType: per intercettare il clic sul collegamento e prima di restituire SI utilizzare NSUserDefaults con initWithSuiteName: (fornendo il nome del gruppo di app) per salvare i dati nel contenitore condiviso dall'estensione e dall'app contenente.

Il clic sul collegamento Web avvia l'app, che può recuperare direttamente i dati in NSUserDefaults.

0

Questo è quello che uso dall'estensione della tastiera.Spero che aiuta anche qui:

UIWebView * webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; 
NSString *urlString = @"https://itunes.apple.com/us/app/watuu/id304697459"; 
NSString * content = [NSString stringWithFormat : @"<head><meta http-equiv='refresh' content='0; URL=%@'></head>", urlString]; 
[webView loadHTMLString:content baseURL:nil]; 
[self.view addSubview:webView]; 
[webView performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:2.0]; 

Si prega di notare che in questo caso sto un'istanza di questa chiamata dal UIInputViewController.

Questo metodo dovrebbe funzionare anche utilizzando lo schema URL dal app contenente

Problemi correlati