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

标签 ios objective-c swift xcode7

这个问题之前可能以不同的形式被问过,但我正在尝试更深入地理解共享扩展,因此,这个问题比之前问过的这个问题的版本更详细。

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

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

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

首先,用网站的URL填充出现的VC

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

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

以便能够保存它以供以后从应用程序访问。

如能提供有关获取 URL 的任何帮助,我们将不胜感激。

最佳答案

您可以像这样访问 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) {
                                  // 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)
                    })
                }
            }
        }
    }

针对 Swift 5 更新:

override func didSelectPost() {
    if let item = extensionContext?.inputItems.first as? NSExtensionItem {
        if let itemProvider = item.attachments?.first {
            if itemProvider.hasItemConformingToTypeIdentifier("public.url") {
                itemProvider.loadItem(forTypeIdentifier: "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?.completeRequest(returningItems: [], completionHandler:nil)
                })
            }
        }
    }
}

关于ios - 在 iOS 上的 Safari 共享扩展中获取 SLComposeServiceViewController 中的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32818832/

相关文章:

ios - 如何从旋转木马中拖动 View

iOS 10 XCode 8 - 安全文本字段,错误?

objective-c - UIApplication openURL : doesn't work with relative URLs

ios - UIImageView 无法正确调整大小

ios - 如何快速访问 UITabbarController 上的 viewControllers?

ios - iOS 11 上的向上移动键盘问题 iPhone 6 是较早的型号

ios - 有没有可能在 Xcode 8 中运行我的 swift 2 项目?

ios - Web 服务调用返回 SIGABRT

ios - 如何编写一个单元测试来检查我的属性是否在 iOS 上的 dealloc 中释放?

ios - 使用自定义类以编程方式创建 UIView (Swift 4)