【问题标题】:Using UIActivityViewController to share spreadsheets, videos, etc使用 UIActivityViewController 共享电子表格、视频等
【发布时间】:2014-08-20 23:56:14
【问题描述】:

我在使用 UIActivityViewController 共享电子表格和视频(可能还有其他文件类型)时遇到问题。问题是找不到正确的类型标识符。例如,当我尝试附加电子表格时,如下代码所示:

    let testFilePath = NSBundle.mainBundle().pathForResource("test_spreadsheet", ofType: "xlsx")
    let testData = NSData(contentsOfFile: testFilePath)
    let list = [testData]
    let activityViewController = UIActivityViewController(activityItems: list, applicationActivities: nil)
    navigationController.presentViewController(activityViewController, animated: true, completion: nil)

我收到以下日志消息:

2014-08-20 16:45:58.035 TestExtensionPoints[12608:194174] Discovered extensions: {(
    <NSExtension: 0x7fb7fca13680> {id = com.asperasoft.faspex-app.FaspexExtension}
)} for attributes: {
    NSExtensionActivationRule =     {
        extensionItems =         (
                        {
                attachments =                 (
                                        {
                        registeredTypeIdentifiers =                         (
                            "public.data"
                        );
                    }
                );
            }
        );
    };
    NSExtensionPointName =     (
        "com.apple.share-services",
        "com.apple.ui-services",
        "com.apple.services"
    );
}

注意注册的类型标识符是public.data,而不是public.spreadsheet。

这与我尝试附加 pdf 或 png 文件时不同。如果我只是将文件更改为 pdf,如下面的代码所示(仅第一行更改):

let testFilePath = NSBundle.mainBundle().pathForResource("test_pdf", ofType: "pdf")

我收到以下日志消息,它确实具有所需的类型标识符:

    2014-08-20 16:50:52.973 TestExtensionPoints[12652:196132] Discovered extensions: {(
    <NSExtension: 0x7ff2534285a0> {id = com.asperasoft.faspex-app.FaspexExtension}
)} for attributes: {
    NSExtensionActivationRule =     {
        extensionItems =         (
                        {
                attachments =                 (
                                        {
                        registeredTypeIdentifiers =                         (
                            "com.adobe.pdf"
                        );
                    }
                );
            }
        );
    };
    NSExtensionPointName =     (
        "com.apple.share-services",
        "com.apple.ui-services",
        "com.apple.services"
    );
}

有谁知道为什么会这样,有没有人有解决方法?我知道我可以只编写文件并附加 URL,但这并不是本练习的真正目的。

额外背景:我问这个主要是因为我正在做一个共享扩展,并且正在试验如何将数据传递给我。我已经介绍了它作为 URL 和 UIImage 传递的情况。除了我没有得到我需要的类型标识符这一事实之外,这些其他情况都可以。

【问题讨论】:

    标签: ios swift uiactivityviewcontroller ios-app-extension uti


    【解决方案1】:

    系统可能会嗅探熟悉的类型,例如 PNG 和 PDF,而不是深奥的类型。由于可以从起始字节识别 PNG 和 PDF,因此活动系统并不严格需要 UTI 来识别它们。但是,电子表格等深奥的类型可能并非如此。

    您需要实现UIActivityItemSource 或子类UIActivityItemProvider 并将这些实例提供给UIActivityViewController 而不是裸NSData。这允许您将数据的 UTI 显式提供给 UIActivityViewController。

    对于立即可用的数据,实现这些UIActivityItemSource 方法:

    • - activityViewControllerPlaceholderItem: 返回符合类型的最小数据项。你可以在这里传递一个空的NSData。

    • - activityViewController:itemForActivityType 返回实际数据项。

    • - activityViewController:dataTypeIdentifierForActivityType: 返回数据项的 UTI。

    对于可以在另一个线程中延迟生成的数据,实现这些UIActivityItemProvider 方法:

    • - item 返回实际数据项。这将在不同的线程中调用,因此您的生成必须是线程安全的。

    • - activityViewController:dataTypeIdentifierForActivityType: 返回数据项的 UTI。

    现在,如果 UTI 不是常见的 UTI,您还必须从 Info.plist 中导出它们。

    【讨论】:

    • 你知道如何从 -item 方法返回多个项目 URL(比如视频)吗?
    【解决方案2】:

    也许 .xlsx 文件没有 UTI?

    This question 似乎也有类似的问题。答案为 .xlsx 文件提供了答案,here 列出了更多 UTI,并附有实施说明here。

    【讨论】:

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