Swift 中的 iOS 共享扩展抓取 URL

Posted

技术标签:

【中文标题】Swift 中的 iOS 共享扩展抓取 URL【英文标题】:iOS Share Extension Grabbing URL in Swift 【发布时间】:2015-06-13 23:16:15 【问题描述】:

我正在尝试快速创建一个 ios 共享扩展。当用户在 safari 中并打开共享扩展时,我希望能够获取 URL 并在我的应用程序中使用它。我知道我可以将下面的代码放在 ShareViewController 的 didSelectPost() 函数中,以获取用户在共享扩展中输入的文本,但是如何获取用户单击共享时所在网页的 URL延期?我对 iOS 扩展还很陌生,因此非常感谢任何帮助。

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

【问题讨论】:

【参考方案1】:

这是获取 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];
                              ];
    

或者在 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)
                )
            
        
    

【讨论】:

完美运行! (为什么没有标记为正确答案?) 嗨谢谢你,它在我身边有效。你可以为我做更多的帮助,我需要使用我的扩展将用户名和密码注入网页,我怎样才能注入这些以实现自动填充功能? @Anita 感谢您的评论。请为注入问题打开一个新问题。它需要更多细节,而 cmets 不适合这样做 ;-)【参考方案2】:

对此有一个小改动。在 Chrome 中,public.url 在第 1 项中,而不是在附件的第 0 项中。循环查找它会更好,并且适用于 chrome 和 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)
                )
            
        
    

【讨论】:

这正是我花了一天时间学习的内容,并且在自己学习的几秒钟内就找到了你的帖子,很难! 上例中的附件是否应该包含com.apple.property-list?我似乎无法弄清楚这一点。使用上面的代码我没有得到 URL。 completionHandler 没有被执行,因为 com.apple.property-list 中似乎没有“public.url” 美丽,只是美丽 如果您在运行完成块时遇到问题,请尝试将“loadItem”替换为“loadItemAsync” 你好,如果我需要处理图像和视频,我是否调用了两次 loadItemForTypeIdentifier?

以上是关于Swift 中的 iOS 共享扩展抓取 URL的主要内容,如果未能解决你的问题,请参考以下文章

branch.io swift中的共享表选项

IOS8 beta 中的共享扩展

Cordova:将浏览器 URL 共享到我的 iOS 应用程序(Clipper ios 共享扩展)

Swift 3 - 从共享扩展共享 URL 和标题到主应用程序?

在 Swift 中的主 App 和 Today 小部件/扩展之间共享 UI 元素

swift swift中的“NSURL == String url”扩展名