iOS YouTube分享扩展未提供URL

4
我在我的共享扩展中有以下代码,用于获取分享的URL。
    if let item = extensionContext?.inputItems.first as? NSExtensionItem {
        for (index, _) in (item.attachments?.enumerated())! {
            if let itemProvider = item.attachments?[index] as? NSItemProvider {
                if itemProvider.hasItemConformingToTypeIdentifier("public.url") {
                    itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) -> Void in
                        if let shareURL = url as? NSURL {
                            // send url to server to share the link
                            print (shareURL.absoluteString!)

由于某种原因,iOS的YouTube应用程序在itemProvider.hasItemConformingToTypeIdentifier("public.url")中返回false。

以下是我的共享扩展的 Info.plist 文件。

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <string>
            SUBQUERY (
                extensionItems,
                $extensionItem,
                SUBQUERY (
                    $extensionItem.attachments,
                    $attachment,
                    ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url"
                ).@count == 1
            ).@count == 1
        </string>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.share-services</string>
</dict>

我如何在分享扩展中获取共享的YouTube视频的URL?



如果 ItemProvider 无法提供 URL,它可以提供哪些类型?如果您向项目提供程序请求其 registeredTypeIdentifiers,会给出什么 UTI? - Scott Thompson
p itemProvider.registeredTypeIdentifiers[0] as! String (String) $R4 = "public.plain-text" - Charlie Fish
@ScottThompson item.attachments?.count 返回 1。正在查看它包含的内容。 - Charlie Fish
@ScottThompson 噢,它返回 https://www.youtube.com/watch?v=VIDEOIDHERE&feature=share。有没有最好的方法来调整我的代码,以获取纯文本,如果它是在URL形式下?我不想得到一些随机文本。我只想在它是一个URL时获取它。 - Charlie Fish
@ScottThompson 就像 if let myURL = URL.init?(string: text) { 这样子? - Charlie Fish
显示剩余4条评论
2个回答

4

我的第一个建议是了解itemProvider实际提供的类型:

if let item = extensionContext?.inputItems.first as? NSExtensionItem {
    for (index, _) in (item.attachments?.enumerated())! {
        if let itemProvider = item.attachments?[index] as? NSItemProvider {

            // print out the registered type identifiers so we can see what's there
            itemProvider.registeredTypeIdentifiers.forEach { print String(describing: $0) }

在这种情况下,根据您的评论,您可以获取纯文本或kUTTypePlainText,而该文本包含一个URL,因此:
if let item = extensionContext?.inputItems.first as? NSExtensionItem {
for (index, _) in (item.attachments?.enumerated())! {
    if let itemProvider = item.attachments?[index] as? NSItemProvider {
        if itemProvider.hasItemConformingToTypeIdentifier(kUTTypePlainText) {
            itemProvider.loadItem(forTypeIdentifier: kUTTypePlainText, options: nil, completionHandler: { (string, error) -> Void in
                if let string = (string as? String), let shareURL = URL(string) {
                    // send url to server to share the link
                    print (shareURL.absoluteString!)

我第二个建议是始终使用kUTType常量而不是原始字符串。 :-)


Argument labels '(_:)' do not match any available overloads on if let shareURL = URL(string) { - Charlie Fish
我调整了代码几次。你可能需要使用URL(string: string)。我尝试在Playground中尽可能接近实际编译的代码,但你可能还需要进行一些微调。 - Scott Thompson
好的,使用kUTTypePlainText as String代替kUTTypePlainText - Charlie Fish
UTTypes是CFStrings...但显然你需要进行类型转换 :-( - Scott Thompson
非常感谢。稍微编辑和调整一下,我就让它正常工作了! - Charlie Fish

1
Youtube将提供一个kUTTypePlainText。 要获取URL,您需要将NSSecureCoding转换为String,然后使用该字符串构建URL。
func getUrl() {
  if let content = extensionContext!.inputItems[0] as? NSExtensionItem {

    let contentTypePlain = kUTTypePlainText as String

    if let contents = content.attachments {
      for attachment in contents {
        if attachment.hasItemConformingToTypeIdentifier(contentTypePlain) {
          attachment.loadItem(forTypeIdentifier: contentTypePlain, options: nil, completionHandler: { data, error in
            let urlString = data as! String
            let url = URL(string: urlString)!

            // USE URL 

          })
        }
      }
    }
  }
} 

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