iOS11系统推出后,系统桌面多了一个“文件”app,里面可以上传一些文件,任何类型的文件都可以,类似于android的文件目录。
最近项目需要从手机中选择各种文件上传到服务器,网上找了很多,很多写得乱七八糟,各种平台文章都是转来转去,真没意思。现在开始进入正题:
首先,你得有访问这个“文件”app的权限
通过Xcode->+Capability->iCloud
注意,如果你的调试证书不是系统自动生成的,需要重新生成一个调试证书,否则会因为证书不匹配无法运行,这个不再多说。
第二步,创建一个iCloud管理类
个人的参考:
.h文件
typedef void(^downloadBlock)(NSData* data,BOOL success);
@interface BDICloudManager : NSObject
+ (instancetype)manager;
+ (BOOL)iCloudEnable;
- (void)downloadWithDocumentURL:(NSURL*)url callBack:(downloadBlock)block;
@end
.m文件
///document数据类
@interface BDDGDocument :UIDocument
@property (nonatomic,strong)NSData *data;
@end
@implementation BDDGDocument
- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError {
self.data = contents;
return YES;
}
@end
@interface BDICloudManager ()
@end
@implementation BDICloudManager
+ (instancetype)manager
{
static BDICloudManager *manager = nil;
if(manager == nil){
manager = [[BDICloudManager alloc]init];
}
return manager;
}
//iCloud是否可用,只有在capability的iCloud勾选了Containers才有效果
///没有Containers创建即可,development后台会同步更新
+ (BOOL)iCloudEnable {
NSFileManager *manager = [NSFileManager defaultManager];
NSURL *url = [manager URLForUbiquityContainerIdentifier:nil];
if (url != nil) {
return YES;
}
NSLog(@"iCloud 不可用");
return NO;
}
///从iCloud中下载文件
- (void)downloadWithDocumentURL:(NSURL*)url callBack:(downloadBlock)block{
BDDGDocument *iCloudDoc = [[BDDGDocument alloc]initWithFileURL:url];
[iCloudDoc openWithCompletionHandler:^(BOOL success) {
if (success) {
[iCloudDoc closeWithCompletionHandler:^(BOOL success) {
KFLog(@"关闭iCloud成功");
}];
if (block) {
block(iCloudDoc.data,true);
}
}else{
if (block) {
block(nil,false);
}
}
}];
}
///上传文件到iCloud
///具体可以上传什么文件,大家可以自己测试一下
- (void)uploadWithWithDocumentURL:(NSURL*)url data:(NSData*)data callBack:(downloadBlock)block;
{
if(url == nil || data == nil)return;
BDDGDocument *iCloudDoc = [[BDDGDocument alloc]initWithFileURL:url];
iCloudDoc.data = data;
[iCloudDoc saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
}];
}
以上只是iCloudManager的简单操作,有兴趣的同学可以深入学习,多看看苹果文档。
开始从“文件app”中选择文件
因为iOS11及以上才有这个功能,所以需要先判断是否可用
BOOL isEnable = [BDICloudManager iCloudEnable];
if(isEnable == false){
iCloud不支持
return;
}
NSArray *documentTypes = @[@"public.text",@"public.source-code",@"com.microsoft.word.doc",
@"com.microsoft.excel.xls",@"public.content",@"public.image",@"public.audiovisual-content",
@"com.adobe.pdf",@"com.apple.keynote.key",@"com.microsoft.powerpoint.ppt"];
UIDocumentPickerViewController *documentPickerViewController = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:documentTypes inMode:UIDocumentPickerModeImport];
documentPickerViewController.delegate = self;
documentPickerViewController.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:documentPickerViewController animated:YES completion:nil];
友情提示,这个documentTypes
我这边实际操作过程中传com.microsoft.word.doc",@"com.microsoft.excel.xls",@"public.content 效果是一样的,希望你们能发现问题后能告诉我一下。
还有这个UIDocumentPickerMode
UIDocumentPickerModeImport 和UIDocumentPickerModeOpen->本app直接present 效果和present控制器是一样的,其他两个不常用吧,而且我这边用了之后会报错。大家自行研究
至此,已经可以跳转到系统文件并且选择文件了。。。
文件点击选中后 通过回调,在通过[BDICloudManager manager] downloadWithDocumentUR下载即可。