iOS知识收藏

iOS 从系统“文件”Files中选择文件

2021-10-12  本文已影响0人  帅聪哥

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下载即可。

注意点:当选择的是铃声文件的时候,返回的数据类型是:NSFileWrapper类型,具体的数据可以通过serializedRepresentation属性得到。

整个流程写完了,希望能帮到大家!!!

上一篇下一篇

猜你喜欢

热点阅读