ios获取视频文件路径报错NSPOSIXErrorDomain

背景

更新iOS13后发现视频上传无法正常获取,图片能正常获取, 经过调试发现在获取视频路径的时候提示权限不足,无法正常访问

bash 复制代码
2023-09-27 15:14:16.533951+0800 renhxy erp[55862:4313416] Error opening file /private/var/mobile/Containers/Data/PluginKitPlugin/xxx/tmp/txxx.MOV: Error Domain=NSCocoaErrorDomain Code=257 "未能打开文件"xxx.MOV",因为你没有查看它的权限。"

经过多方面的查看和研究发现

存在这个问题是因为iOS系统13版本系统和13以下的版本系统存在获取视频文件路径差异:

IOS13以后的获取路径

bash 复制代码
file:///private/var/mobile/Containers/Data/PluginKitPlugin/xxx/tmp/xx.MOV

IOS12及以下的获取路径

bash 复制代码
file:///private/var/mobile/Containers/Data/Application/xxx/tmp/xxx.MOV

可以看到一个是PluginKitPlugin,一个是Application,这就有很大区别了,根据iOS系统的沙盒原理,前者除了本应用其他肯定是无法访问的。所以导致开发的应用无法访问图片应用里面的视频文件

这里提供一个最简单有效的解决方案:获取文件前将文件拷贝复制到开发应用到目录下,这样就能识别获取文件了

bash 复制代码
直接上代码
1.调试排查找到获取文件返回前端的代码位置
2.将下方的代码复制拷贝获取,对于参数修改下
//2023-09-27 ios13后的路径不同,可能会导致文件路径有问题,因此在这里将文件复制成临时文件,在做上传处理
            NSString* moviePath = [videoUrl.path mutableCopy];  //这里有个需要划重点的地方 不能使用绝对路径videoUrl.absoluteString,需要使用 videoUrl.path
            NSArray* spliteArray = [moviePath componentsSeparatedByString:@"/"]; //将文件路径使用"/"分割成字符串数组
            NSString* lastString = [spliteArray lastObject];  //获取文件名称
            NSError *error;
            NSFileManager *fileManage = [NSFileManager defaultManager];   //定义一个文件生成器
            //获取当前应用的Documents文件夹路径
            NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
            //判断文件夹是否存在,不存在则新建
            if( ![fileManage fileExistsAtPath:documentsDirectory]){
                NSLog(@"文件夹不存在");
                //创建文件夹
                [fileManage createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:&error];
            }
            //将前面获取到的文件和文件夹拼接成一个文件路径,后面需要复制的路径
            NSString *filePath = [documentsDirectory stringByAppendingPathComponent:lastString];
            //通过文件管理器将视频文件拷贝一份到当前应用到Documents目录下,这样获取就不会出现权限不足的情况
            BOOL flagsuccess = [fileManage copyItemAtPath:moviePath toPath:filePath error:&error];
            // 视频选择后,将图片路径传回给页面
            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:filePath];
   

正常情况下时能正常访问了

备注:写的不对或者不好的地方,欢迎指正

相关推荐
NGBQ121383 小时前
Royal TSX 6.0.2.1000 .dmg 全解析:Mac 端企业级远程连接管理工具深度指南
macos
CHQIUU6 小时前
解决 npm 全局安装 EACCES 权限问题(macOS 篇)
前端·macos·npm
Jason_WangYing7 小时前
mac M2运行brew时报错unknown or unsupported macOS version: “26.3“ (MacOSVersionError)
macos
CocoaKier8 小时前
苹果谷歌纷纷调低官方抽成,苹果谷歌全球抽成比例汇总
ios·google·apple
前端Hardy9 小时前
用 uni-app x 重构我们的 App:一套代码跑通 iOS、Android、鸿蒙!人力成本直降 60%
前端·ios·uni-app
ITKEY_10 小时前
flutter 在iPad mini7上真机运行实战(踩坑)
flutter·ios·ipad
软件资深者10 小时前
macOS Tahoe 26.3.1 ISO 虚拟机专用镜像:win系统/ESXi 服务器装苹果系统,改个后缀就能用
运维·服务器·macos·镜像·虚拟机
东方鲤鱼13 小时前
MAC部署openClaw 实现自动化助手实战
运维·macos·自动化
kishu_iOS&AI15 小时前
OpenClaw 版本升级 自动更新指令文档
macos·openclaw
毛骗导演17 小时前
万字解析 OpenClaw 源码架构-跨平台应用之 iOS 应用
前端·ios·架构