在iOS上的Safari的共享扩展中获取SLComposeServiceViewController中的URL

时间:2015-09-28 08:38:52

标签: ios objective-c swift xcode7

此问题之前可能已经以不同的形式提出,但我正在尝试稍微深入了解共享扩展,因此,此问题比此问题的先前版本更详细。

在编写Share扩展时,我们可以继承SLComposeServiceViewController并获取viewDidLoad()和didSelectPost()等事件,但VC上的唯一属性是contentText和textView以及根据Apple文档的占位符属性

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

鉴于这种情况,执行以下操作的最佳方式是什么:

首先,填充随网站网址显示的VC

其次,访问URL以传递给sharedDefaults,如下所示

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

以便能够将其保存以便以后从应用程序访问。

有关获取网址的任何帮助都将非常感谢。

1 个答案:

答案 0 :(得分:12)

您可以访问以下网址:

- (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];
                              }];
    }
}

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