iOS YouTube 分享扩展不提供 URL

标签 ios swift youtube ios8-share-extension

我的共享扩展中有以下代码来获取共享的 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:

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 常量而不是原始字符串:-)

关于iOS YouTube 分享扩展不提供 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43954725/

相关文章:

iphone - unix 时间戳到几小时前

ios - swift : Enum constant with type and value

ios - 在 Swift iOS 中未调用 Google Places 回调

swift - 如何查询 iTunes API 以查找特定类型的电影

ios - 如何在 Swift 中编写编译时代码?

iphone - 在开发者设备上安装以前版本的 iOS(目前是 5.0 -> 需要 4.3.5)

javascript - Youtube 嵌入 API 和外部 JS

javascript - 仅在嵌入的 YouTube 视频上保留进度条和控件?

iphone - Xcode 4.3 和在 iOS 3.x 设备上调试

iframe - 将 YouTube iframe 添加到 iOS 上的 Cordova 应用程序