【问题标题】:iOS YouTube Share Extension Not Providing URLiOS YouTube 分享扩展未提供 URL
【发布时间】:2017-10-12 18:38:25
【问题描述】:

我的共享扩展中有以下代码来获取共享的 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,它可以提供哪些类型的 URL?如果您向项目提供者询问它是registeredTypeIdentifiers,给出的是什么 UTI?
  • p itemProvider.registeredTypeIdentifiers[0] as! String (String) $R4 = "public.plain-text"
  • @ScottThompson Printing itemProvider.registeredTypeIdentifiers[0] as! String 返回"public.plain-text"
  • 好的。那是第一个。还有其他人吗?如果你真的要求纯文本它包含什么?
  • @ScottThompson item.attachments?.count 返回1。正在努力查看它现在包含的内容。

标签: ios swift youtube ios8-share-extension


【解决方案1】:

我的第一个建议是找出实际提供的类型 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) }

在这种情况下,根据您的 cmets,您可以获得纯文本或 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 if let shareURL = URL(string) {
  • 我对代码进行了几次调整。您可能需要URL(string: string)。我试图在 Playground 中尽可能接近,但没有要编译的完整代码集,因此您可能需要继续进行一些调整。
  • 好的,kUTTypePlainText as String 而不是 kUTTypePlainText?
  • UTTypes 是 CFStrings...但显然你必须对它们进行类型转换:-(
  • 非常感谢。通过一点点编辑和使用,我就可以开始工作了!
【解决方案2】:

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 

          })
        }
      }
    }
  }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多