iOS从自带“文件”选择文件上传

1.首先配置证书,检查对应App的Identifiers 是否含有iCloud的内容:


Identifiers

2.如果iCloud没有添加或者是打开,就添加打开iCloud,注册iCloud Container。

3.  重新生成描述文件(因为原来的描述文件不支持iCloud功能)

4.操作Xcode。首先要调用”文件“,我们需要对项目进行配置,就是配置iCould,其实很简单,点击【工程】 -> 选择【targets】 -> 选择【Signing&Capabilities】 -> 点击左上角+Capability

-> 选择【iCloud】 -> 勾选【iCould Documents】和刚才创建的Container, 搞定

2.要调用“文件”,其实很简单,就是一个类UIDocumentPickerViewController上代码:

func selectUploadFileFromICouldDrive()  {                                                                                let documentTypes = ["public.content",                             "public.text",                             "public.source-code",                             "public.image",                             "public.audiovisual-content",                             "com.adobe.pdf",                             "com.apple.keynote.key",                             "com.microsoft.word.doc",                             "com.microsoft.excel.xls",                             "com.microsoft.powerpoint.ppt",                             "public.archive"]         let document = UIDocumentPickerViewController.init(documentTypes: documentTypes, in: .open)         document.delegate = self  //UIDocumentPickerDelegate         self.present(document, animated:true, completion:nil)    }

就是这么简单,就这么我们就成功了访问了到了“文件”。

类型如果想自己加可以访问:https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html

接下来,我就需要对选择文件进行操作。

UIDocumentPickerDelegate有两个协议方法,如下:

func documentPicker(_ controller: UIDocumentPickerViewController,didPickDocumentAt url: URL)

func documentPickerWasCancelled(_controller:UIDocumentPickerViewController)

我们在第一个代理方法中,拿到我们选择的文件地址,进行处理:

func documentPicker(_controller:UIDocumentPickerViewController,didPickDocumentAt url:URL){letfileName=url.lastPathComponentifICouldManager.iCouldEnable(){ICouldManager.downloadFile(WithDocumentUrl:url){(fileData)in//fileData:就是我们选择的文件,这里你可以做你想要的操作,我这里是上传到服务self.uploadFile(WithFileName:fileName,fileData:fileData)}}controller.dismiss(animated:true,completion:nil)}

这里的ICouldManager是我自定义的类,以及ICouldManager类里面用到的SxsDocument类,这两个类我也是在网上找的源码,具体的含义我也就不做过多的解释了,可以自行百度下。特此说明下,UIDocument这个类,大家可以去看看官方文档的介绍,很有用。

源码如下:

classICouldManager{publicstaticfunciCouldEnable()->Bool{leturl=FileManager.default.url(forUbiquityContainerIdentifier:nil)return(url!=nil)}publicstaticfuncdownloadFile(WithDocumentUrlurl:URL,completion:((Data)->Void)?=nil){letdocument=SxsDocument.init(fileURL:url)document.open{(success)inifsuccess{document.close(completionHandler:nil)}ifletcallback=completion{callback(document.data)}}}}

classSxsDocument:UIDocument{publicvardata=Data.init()overridefuncload(fromContents contents:Any,ofType typeName:String?)throws{self.data=contentsas!Data}}

部分参考自:https://www.jianshu.com/p/a9fb7b7e5059

你可能感兴趣的:(iOS从自带“文件”选择文件上传)