尝试检索文件的操作扩展
我正在尝试在iOS 8中创建一个Action Extension。从一个新项目开始,我创建了一个单独的视图应用程序,并为Action Extension添加了一个新目标。 默认的“操作扩展”模板配置为显示图像。 当我从照片中分享时,图像显示在视图控制器上以进行扩展,因此基本管道全部正常工作。
真正的用例是我想将Dropbox(或Air Sharing等)的文本文件共享给应用程序并让应用程序处理该文件。
首先我更改了info.plist:
NSExtension NSExtensionAttributes NSExtensionActivationRule NSExtensionActivationSupportsFileWithMaxCount 1 NSExtensionActivationSupportsText 1 NSExtensionMainStoryboard MainInterface NSExtensionPointIdentifier com.apple.ui-services
我将testfile.text
添加到Dropbox,当我在Dropbox应用程序中导航到它并点击共享按钮时,我的扩展名出现,因此激活规则似乎正常。
当我记录扩展上下文时,这是我获得的self.extensionContext.inputItems
:
self.extensionContext.inputItems= ( " - userInfo: {\nNSExtensionItemAttachmentsKey = (\n \" {types = (\\n \\\"public.url\\\"\\n)}\"\n );\n}")
有一个项目提供者,其类型为public.url
。 所以我修改了viewDidLoad中的模板代码,以查找类型kUTTypeURL
:
for (NSExtensionItem *item in self.extensionContext.inputItems) { for (NSItemProvider *itemProvider in item.attachments) { if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeURL]) { __weak UITextView *textView = self.textView; [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeURL options:nil completionHandler:^(NSURL *url, NSError *error) { if(url) { NSString *text = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; // just using this to test [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [textView setText:text]; }];
url
是这样的(我在中间更改了id字符串):
https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=0
在initWithContentsOfURL
之后,我得到了文字,但这不是我想要的。 测试文件大约是300个字节。 回来的是大约70,000字节的元数据。
我如何获取文件? 我使用了错误的类型标识符吗?
注意:如果我将文件共享到Evernote或TapForms,它就会直接进入,因此它与文件无关。
您要获取的URL类型用于与人共享,因此它返回一个预览页面,用户可以选择下载该文件等。如果您需要以编程方式下载原始文件内容,您将会需要先修改链接的参数。 例如,您的假设示例:
https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=0
可以改为:
https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=1
这样您就可以下载文件内容,只要您的代码遵循URL返回的重定向即可。
有关此内容的更多信息,请参阅此帮助文章: