美文网首页iOS知识收藏
iOS 从系统“文件”Files中选择文件

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

作者: 帅聪哥 | 来源:发表于2021-10-12 17:39 被阅读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属性得到。

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

    相关文章

      网友评论

        本文标题:iOS 从系统“文件”Files中选择文件

        本文链接:https://www.haomeiwen.com/subject/cqfjoltx.html