2015-09-28 67 views
5

此問題可能以前以不同的形式提出過,但我試圖稍微深入地瞭解共享擴展,因此此問題比以前問這個問題的版本。在iOS的共享擴展中爲Safari獲取URL在SLComposeServiceViewController中

當編寫一個共享擴展,我們可以根據蘋果的文檔繼承SLComposeServiceViewController並獲得viewDidLoad中()和didSelectPost()等事件,但在VC的屬性只有contentText和TextView的和佔位性

https://developer.apple.com/library/prerelease/ios/documentation/Social/Reference/SLComposeServiceViewController_Class/

鑑於這種情況,什麼是執行以下操作的最佳方式:

首先,填充,隨着網站的URL顯示在VC

其次,訪問URL傳遞給sharedDefaults如下

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

,以便能夠保存它從應用程序稍後訪問。

任何有關獲取URL的幫助將不勝感激。

回答

8

您可以訪問這樣的網址:

- (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) { 
            // Do what you want to do with url 
            [self.extensionContext completeRequestReturningItems:@[]   
                    completionHandler:nil]; 
           }]; 
    } 
} 

這裏是斯威夫特一樣的:

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 { 
          // do what you want to do with shareURL 
         } 
         self.extensionContext?.completeRequestReturningItems([], completionHandler:nil) 
        }) 
       } 
      } 
     } 
    } 
+3

「public.url」可以用'kUTTypeURL'更換所以你不使用硬編碼的字符串。 ''kUTTypeURL作爲字符串'和'在Swift中導入MobileCoreServices'。 – timgcarlson