【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);
            }
        }
    }];
}

这样就达到了我们想要的效果

你可能感兴趣的:(【iOS】 iCloud 的使用和问题)