要实现在其他应用中文件的打开方式列表中显示需要以下两个步骤(测试的时候需要真机条件):
->首先要向iOS系统注册App能够打开的文件类型,这样其他应用程序在使用 Document Interaction 向系统询问有哪些程序可以打开文档
时,系统才会将你的应用显示在“打开方式”的列表中。
->完成注册步骤后我们需求的功能就已经完成一大半了,现在进行真机测试比如在邮件里的附件(必须是刚刚注册过的文件类型)使
用“打开方式”就可以看到我们的应用程序出现在了列表中。但这样仅仅是通过打开方式启动了我们的App,而我们的App并不能直接接
收到传过来的文档,我们都知道在 iOS 中每个应用都是装在一个独立的沙盒中的,应用中的文件并不能直接跨越沙盒传输,这时候使
用的便是 Document Interaction ,原理就是对文档生成一个URL路径,通过 UIDocumentInteractionController 返回一个URL路径,然
后在我们的App中截取URL,通过URL来获取我们需要的文档。
1、向iOS系统申明App能够打开某种类型的文档。
-> 情景一:直接使用系统提供的UTI (UTI与文件后缀对照
表:https://developer.apple.com/library/mac/#documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html)
在info.plist中添加以下字段
Icon File Name ( “打开方式”列表中应用显示的图标,可不设 )
Document Type Name ( 指定文档名称 )
Document Content Type UTIs ( 数组,包含多个 UTI 类型的字符串。UTI 类型是本文档类型(组)所包含的文件类型。 )
Handler rank ( 表示应用程序是“拥有”还是仅仅是“打开”这种类型而已 )
-> 情景二:使用程序提供的UTI
先在info.plist中添加以下字段
首先还是Document types:
CFBundleTypeIconFiles ( 数组,“打开方式”列表中应用显示的图标 )
Document Content Type UTIs ( 程序定义UTI也需在此声明,命名规则:App ID + .后缀名 )
Role ( 程序的职责,“观看”、“编辑”等 )
其它字段参考情景一
完成Document types 字段后需给自定义的UTI一个说明——即在plist中添加如下字段
Exported Type UTIs:
Conforms to UTIs ( 参考情景一中给出的参照表 )
Description ( 描述,可不填 )
Identifier ( 唯一标识,跟Document Content Type UTIs 中自定义的UTIs 保持一致 )
Equivalent Types ( 包含两个字段,public.filename-extension:和什么后缀的文件相关联,public-mime-type: mime 类型 )
2、截取其他App发过来的资源文件
在Xcode中我们的App,并在 AppDelegate 中加入如下代码
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if (url != nil) {
NSString *path = [url absoluteString];
NSMutableString *string = [[NSMutableString alloc] initWithString:path];
if ([path hasPrefix:@"file://"]) {
[string replaceOccurrencesOfString:@"file://" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, path.length)];
}
}
return YES;
}
OK,这样就大功告成了,接下来我们就成功获取到了文档的URL了,接下来就根据自己的需求来操作文档吧~
(注:我们获取到的URL路径中如果包含中文的话有可能不能成功获取到文件,这时候需要一次对URL的转码方法是利用NSString 的 [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding])