2015-06-13 11 views
8

Próbuję utworzyć rozszerzenie udziału iOS w szybkim tempie. Gdy użytkownik jest w safari i otwiera rozszerzenie udziału, chcę mieć możliwość pobrania adresu URL i użycia go w mojej aplikacji. Wiem, mogę umieścić poniższy kod w funkcji didSelectPost() w ShareViewController, aby uzyskać tekst wprowadzany przez użytkownika w rozszerzeniu udziału, ale jak uzyskać adres URL strony internetowej, na której użytkownik jest włączony po kliknięciu udziału rozbudowa? Jestem całkiem nowym użytkownikiem rozszerzeń iOS, więc każda pomoc będzie bardzo doceniana.Rozszerzenie udostępniania iOS Udostępnij adres URL w Swift

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

Odpowiedz

13

W ten sposób można uzyskać 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]; 
           }]; 
    } 
} 

Albo w 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

Działa idealnie! (dlaczego nie było to zaznaczone jako właściwa odpowiedź?) – Sirab33

+0

Cześć Dziękuję za to, że działa po mojej stronie. Jeszcze jedna pomoc dla mnie, muszę wstrzyknąć nazwę użytkownika i hasło na stronę internetową za pomocą mojego rozszerzenia, jak mogę wprowadzić te funkcje do autouzupełniania? – Anita

+0

@Anita Dzięki za komentarz. Otwórz nowe pytanie dotyczące problemu z wstrzyknięciem. Potrzebuje więcej szczegółów, a komentarze nie są właściwym miejscem ;-) – joern

10

Jest jedna mała zmiana do tego. W Chrome plik public.url znajduje się w pozycji 1, a nie w elemencie 0 załączników. Zapętlenie w celu znalezienia go jest lepsze i będzie działało zarówno na chromie, jak i 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

To jest dokładnie to, czego nauczyłem się przez cały dzień i znalazłem twój wpis w ciągu kilku sekund od samodzielnego uczenia się, na własnej skórze! – Nick

+0

Czy załącznik w powyższym przykładzie zawiera com.apple.property-list? Nie mogę chyba wymyślić tego. Korzystając z powyższego kodu, nie otrzymuję adresu URL. Polecenie completeHandler nie zostanie wykonane, ponieważ nie ma tam "public.url" w com.apple.property-list – boywithaxe

+0

To powinna być poprawna odpowiedź! Dzięki – mikemike396