【iOS】 iCloud 的使用和问题
最近公司项目要求在IM会话页面添加发送文件的功能,然后就研究了下。
IM一般的SDK都会有发送文件的功能,但是在选择文件的时候就遇到了问题
文件从哪里来?
1.由于iOS 系统沙盒的限制,你是不能像安卓手机那样直接查看手机所有文件的,也就是说,你只能操作当前应用内部的文件。
iOS文件管理参考1
iOS文件管理参考2
2.像微信那样从iCloud中拿,也可以理解为苹果的原生应用Files里拿的,这些都是互通的
我参考了这个
iCloud初步了解(应该很片面)
苹果在iOS11之后感觉是打开了文件管理这方面的限制,但其实还是没有做到,因为你还是不能跨应用访问。通过iCloud 访问也只不多时苹果为了推广他的云同步罢了。
即使在iCloud 里能访问到A应用里的文件,那也要A应用打开iCloud,并做了写入文件到iCloud目录下这件事
重点来了,据我目前不全面的了解,国内还是很少有人用iCloud的,首先一个Apple ID就5G的云存储空间,要想真的用起来,就要花钱买(6块钱一个月50G),毕竟现在随便存点东西就5G了吧。
云上贵州提供
如果你仅仅只有一个iPhone的话,iCloud其实没啥用,就存手机里就好了;但是你要是有多个Apple 设备,或者是苹果全家桶的话,其实还是很有用的,毕竟一个账号就能让你所有的设备都有这相同的配置和使用习惯,还是很方便的。
一个AppleID多个设备.png
发送文件
知道这些之后,我就开始着手发送文件了
1.UIDocumentPickerViewController
见名知意
2.实现代理
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
BOOL fileUrlAuthozied = [url startAccessingSecurityScopedResource];
if (fileUrlAuthozied && [self iCloudEnable]) {
//通过文件协调工具来得到新的文件地址,以此得到文件保护功能
NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] init];
NSError *error;
[fileCoordinator coordinateReadingItemAtURL:url options:0 error:&error byAccessor:^(NSURL *newURL) {
//读取文件
NSString *fileName = [newURL lastPathComponent];
fileName = [fileName stringByRemovingPercentEncoding];
[self downloadWithDocumentURL:newURL callBack:^(id obj) {
NSData *data = obj;
if (data) {
NSString *path = [GDSandboxFile getDirectoryForDocuments:[NSString stringWithFormat:@"SendFiles"]];
NSString *pathStr = [path stringByAppendingPathComponent:fileName];
if (![[NSFileManager defaultManager] fileExistsAtPath:pathStr]) {
[data writeToFile:pathStr atomically:YES];
}
//上传
RCFileMessage *content = [RCFileMessage messageWithFile:pathStr];
[self sendMessage:content pushContent:LS(@"文件")];
}
}];
[self dismissViewControllerAnimated:YES completion:NULL];
}];
[url stopAccessingSecurityScopedResource];
}
}
其中downloadWithDocumentURL
方法是和同事一起讨论后得出的解决办法,因为得到的这个NSURL *newURL
在我发送文件的时候就是个无效的路径,后来就想到在路劲可用的时候存到自己的沙盒下,然后在拿来用。这样其他地方也能用这个文件了,不用每次都去iCloud下面取。
UIDocument *iCloudDoc = [[UIDocument alloc]initWithFileURL:url];
[iCloudDoc openWithCompletionHandler:^(BOOL success) {
if (success) {
[iCloudDoc closeWithCompletionHandler:^(BOOL success) {
NSLog(@"关闭成功");
}];
if (block) {
block(iCloudDoc.data);
}
}
}];
}
这样就达到了我们想要的效果