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的主要内容,如果未能解决你的问题,请参考以下文章
Cordova:将浏览器 URL 共享到我的 iOS 应用程序(Clipper ios 共享扩展)
Swift 3 - 从共享扩展共享 URL 和标题到主应用程序?