使用UIActivityViewController共享电子表格,视频等

时间:2014-08-20 23:56:15

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

使用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和UIImage传递的情况。这些其他情况没问题,除了我没有得到我需要的类型标识符。

2 个答案:

答案 0 :(得分:2)

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

您需要的是实施UIActivityItemSource或子类UIActivityItemProvider并将这些实例提供给UIActivityViewController而不是裸NSData。这允许您明确地向UIActivityViewController提供数据的UTI。

对于可立即获得的数据,请实施以下UIActivityItemSource方法:

  • - activityViewControllerPlaceholderItem:返回符合该类型的最小数据项。您可以在此处传递空NSData

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

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

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

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

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

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

答案 1 :(得分:0)

也许没有.xlsx文件的UTI?

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