在iOS设备上,Mail应用程序为附件提供"Open In ..."选项.列出的应用程序已在操作系统中注册了CFBundleDocumentTypes.我想知道的是我的应用程序如何允许用户在其他应用程序中打开我的应用程序生成的文件.Mail是唯一提供此功能的应用程序吗?
我的应用程序需要在其他应用程序中打开一些文件类型,如Dropbox应用程序,它可以列出已安装的应用程序,可以打开特定类型的文件.
如何获取应用列表?
我的应用程序创建一个名为log.txt的简单文件
此文件的URL(在xcode中查看)是file:// localhost/var/mobile/Applications/NUMBER OF THE APPLICATION /Documents/log.txt
所以我可以在finder中看到这个文件......
我想在我的应用程序中添加"打开"功能,以便用户共享此文件(通过邮件或imessage)或在另一个兼容的应用程序中打开此文件.
这是我做的:
-(void) openDocumentIn {
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:docFile]; //docFile is the path
//NSLog(@"%@",fileURL); // -> shows the URL in the xcode log window
UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:fileURL];
documentController.delegate = self;
documentController.UTI = @"public.text";
[documentController presentOpenInMenuFromRect:CGRectZero
inView:self.view
animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
然后调用这个函数:
-(IBAction)share:(id)sender {
[self openDocumentIn];
}
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,我点击这个"共享"按钮,但除了在日志窗口中显示URL的路径之外没有任何附加内容...
我错过了什么......
谢谢
编辑:最后,它适用于我真正的iPhone ...模拟器中没有文本查看器! - "
编辑2:它显示可用的应用程序(页面,碰撞......)但最终崩溃:(((见这里的崩溃图片
我正在开发我的存储提供程序并使用Apple的"NewBox"(它的链接已过期)示例代码作为主机应用程序.理想情况下,我希望看到我可以将文件从存储提供程序导入(复制)到NewBox的沙箱或导出/移动文件到其他应用程序.
在NewBox主机应用程序中,当我想导入文件时,我使用:
UIDocumentMenuViewController *vc = [[UIDocumentMenuViewController alloc] initWithDocumentTypes:@[(NSString *)kUTTypeRTF,(NSString *)kUTTypePNG,(NSString *)kUTTypeText,(NSString *)kUTTypePlainText,(NSString *)kUTTypePDF, (NSString *)kUTTypeImage] inMode:UIDocumentPickerModeImport];
Run Code Online (Sandbox Code Playgroud)
一旦我拿起一个文件,在我的UIDocumentPickerExtensionViewController中,我调用:
- (void)pickDocument:(NSURL *)documentURL {
[self dismissGrantingAccessToURL:documentURL];
}
Run Code Online (Sandbox Code Playgroud)
在调用dismissGrantingAccessToURL之后,选择器的视图将被解除并返回到主机应用程序,并且将调用主机应用程序的didPickDocumentAtURL.
但是,"didPickDocumentAtURL"会收到我选择的原始文件的URL,而不是系统复制到NewBox沙箱的新URL.这对出口和搬迁的情况也很熟悉.我是否误解了导入/导出/移动?我认为这个关于复制到主机应用程序的沙箱等文件的操作是由系统完成的,主机应用程序将获取要访问的文件的新URL.
我试过iOS8 beta4,这个问题依然存在.
谢谢!
我正在尝试从中下载文件
-documentPicker:didPickDocumentAtURL:
Run Code Online (Sandbox Code Playgroud)
方法.我试图使用该文件的数据
NSData *data = [NSData dataWithContentsOfURL:url];
Run Code Online (Sandbox Code Playgroud)
但它没有按预期工作,因为UIDocumentPicker会在下载文件之前触发-documentPicker:didPickDocumentAtURL:-method.
如何在下载文件时从文件中获取NSData?
在此先感谢Fabian.