2015-06-13 12 views
8

Sto provando a creare un'estensione di condivisione iOS in swift. Quando l'utente è in Safari e apre l'estensione di condivisione, voglio essere in grado di prendere l'URL e usarlo nella mia app. So che posso inserire il codice qui sotto nella funzione didSelectPost() in ShareViewController per ottenere il testo che l'utente inserisce nell'estensione di condivisione, ma come faccio a ottenere l'URL della pagina web in cui si trova l'utente quando fa clic sulla condivisione estensione? Sono abbastanza nuovo per le estensioni iOS, quindi qualsiasi aiuto sarebbe molto apprezzato.URL di estensione di condivisione iOS in Swift

let shareDefaults = NSUserDefaults(suiteName: "groupName") 
shareDefaults?.setObject(self.contentText, forKey: "stringKey") 
shareDefaults?.synchronize() 

risposta

13

in questo modo si ottiene l'URL:

- (void)didSelectPost { 
    NSExtensionItem *item = self.extensionContext.inputItems.firstObject; 
    NSItemProvider *itemProvider = item.attachments.firstObject; 
    if ([itemProvider hasItemConformingToTypeIdentifier:@"public.url"]) { 
     [itemProvider loadItemForTypeIdentifier:@"public.url" 
             options:nil 
           completionHandler:^(NSURL *url, NSError *error) { 
            NSString *urlString = url.absoluteString; 
            // send url to server to share the link 
            [self.extensionContext completeRequestReturningItems:@[]   
                    completionHandler:nil]; 
           }]; 
    } 
} 

O a Swift:

override func didSelectPost() { 
    if let item = extensionContext?.inputItems.first as? NSExtensionItem { 
     if let itemProvider = item.attachments?.first as? NSItemProvider { 
      if itemProvider.hasItemConformingToTypeIdentifier("public.url") { 
       itemProvider.loadItemForTypeIdentifier("public.url", options: nil, completionHandler: { (url, error) -> Void in 
        if let shareURL = url as? NSURL { 
         // send url to server to share the link 
        } 
        self.extensionContext?.completeRequestReturningItems([], completionHandler:nil) 
       }) 
      } 
     } 
    } 
} 
+0

Funziona perfettamente! (perché non è stata contrassegnata come la risposta giusta?) – Sirab33

+0

Ciao Grazie per questo, funziona al mio fianco. Un altro aiuto puoi fare per me, ho bisogno di inserire nome utente e password nella pagina web usando la mia estensione, come posso iniettare quelli per la funzionalità di riempimento automatico? – Anita

+0

@Anita Grazie per il tuo commento. Si prega di aprire una nuova domanda per il problema di iniezione. Ha bisogno di maggiori dettagli e i commenti non sono il posto giusto per questo ;-) – joern

10

C'è un piccolo cambiamento a questo. In Chrome, public.url si trova nell'elemento 1, non nell'elemento 0 degli allegati. Fare un salto per scoprirlo è meglio e funzionerà sia su Chrome che su Safari.

if let item = extensionContext?.inputItems.first as? NSExtensionItem { 
    if let attachments = item.attachments as? [NSItemProvider] { 
     for attachment: NSItemProvider in attachments { 
      if attachment.hasItemConformingToTypeIdentifier("public.url") { 
       attachment.loadItemForTypeIdentifier("public.url", options: nil, completionHandler: { (url, error) in 
        if let shareURL = url as? NSURL { 
         // Do stuff with your URL now. 
        } 
        self.extensionContext?.completeRequestReturningItems([], completionHandler:nil) 
       }) 
      } 
     } 
    } 
} 
+0

Questo è ESATTAMENTE quello che ho passato un giorno ad imparare e ho trovato il tuo post in pochi secondi di apprendimento da solo, nel modo più duro! – Nick

+0

Se l'allegato nell'esempio precedente contiene una lista com.apple.property? Non riesco a capire questo. Usando il codice sopra non sto ottenendo l'URL. Il completamentoHandler non viene eseguito perché non sembra essere un "public.url" nella lista com.apple.property – boywithaxe

+0

Questa dovrebbe essere la risposta corretta! Grazie – mikemike396

Problemi correlati