iOS从自带“文件”选择文件上传
1.首先配置证书,检查对应App的Identifiers 是否含有iCloud的内容:
Identifiers2.如果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