使用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传递的情况。除了我没有获得所需的类型标识符外,其他情况也可以。
最佳答案
该系统可能会嗅探诸如PNG和PDF之类的熟悉类型,而不嗅探深奥的类型。由于可以从起始字节中识别出PNG和PDF,因此 Activity 系统并不严格需要UTI来识别它们。但是,对于像电子表格这样的深奥类型可能并非如此。
您需要实现UIActivityItemSource
或UIActivityItemProvider
子类,并将这些实例提供给UIActivityViewController
而不是裸NSData
。这使您可以将数据的UTI显式提供给UIActivityViewController
。
对于立即可用的数据,请实现以下UIActivityItemSource
方法:
- activityViewControllerPlaceholderItem:
返回符合该类型的最小数据项。您可能可以在此处传递一个空的NSData
。 - activityViewController:itemForActivityType
返回实际数据项。 - activityViewController:dataTypeIdentifierForActivityType:
返回数据项的UTI。 对于可以在另一个线程中延迟生成的数据,请实现以下
UIActivityItemProvider
方法:- item
返回实际数据项。这将在不同的线程中调用,因此您的这一代必须是线程安全的。 - activityViewController:dataTypeIdentifierForActivityType:
返回数据项的UTI。 现在,如果UTI不是常见的UTI,则还必须从Info.plist导出它们。
关于ios - 使用UIActivityViewController共享电子表格,视频等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25416302/