用Swift编写的iOS共享扩展如何捕获URL?

13

我正在尝试用Swift创建一个iOS分享扩展。当用户在Safari中打开分享扩展时,我想能够获取URL并在我的应用程序中使用它。我知道可以将下面的代码放入ShareViewController的didSelectPost()函数中,以获取用户在分享扩展中输入的文本,但是当用户点击分享扩展时,如何获取所在网页的URL?我对iOS扩展还比较新手,所以非常感谢任何帮助。

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

26

这是获取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)
                })
            }
        }
    }
}

完美运行!(为什么没有标记为正确答案?) - Sirab33
你好,感谢您的帮助,它在我的端上运行良好。 还有一个问题需要您的帮助,我需要使用我的扩展程序将用户名和密码注入到网页中,以实现自动填充功能。请问如何实现这个功能? - Anita Nagori
@Anita,感谢您的评论。请为注入问题开一个新的问题。它需要更多的细节,而评论不是这个问题的正确场所;-) - joern

17

这里有一个小改变。在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)
                })
            }
        }
    }
}

这正是我花了一整天学习的内容,而在我自己艰难地学习之后,我在几秒钟内就找到了你的帖子! - Nick
2
在上面的例子中,附件是否应该包含一个com.apple.property-list?我似乎无法弄清楚这个问题。使用上面的代码,我没有得到URL。completionHandler没有被执行,因为在com.apple.property-list中似乎没有"public.url"。 - boywithaxe
美丽的,非常美丽 - user5063151
如果您无法使完成块运行,请尝试将“loadItem”替换为“loadItemAsync”。 - Russ J
嗨,如果我需要处理图像和视频,那么我需要调用两次loadItemForTypeIdentifier吗? - famfamfam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接