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


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

    
    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”,因为你没有查看它的权限。"
    
    • 1
    • 2

    经过多方面的查看和研究发现
    存在这个问题是因为iOS系统13版本系统和13以下的版本系统存在获取视频文件路径差异:
    IOS13以后的获取路径

    file:///private/var/mobile/Containers/Data/PluginKitPlugin/xxx/tmp/xx.MOV
    
    • 1

    IOS12及以下的获取路径

    file:///private/var/mobile/Containers/Data/Application/xxx/tmp/xxx.MOV
    
    • 1

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

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

    直接上代码
    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];
       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

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

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

  • 相关阅读:
    机器学习,数学统计常用数学符号
    webpack:css代码提取插件extract-text-webpack-plugin和mini-css-extract-plugin
    软件开发项目文档系列之十如何撰写测试用例
    Java EE 用户信息查询与插入页面
    如何选择合适的工业相机
    SpringCloud 学习笔记(2 / 3)
    python中的logging的使用
    前端网页项目-学成在线案例
    【从0实现React18】 (一) 项目初始化
    leetCode 21.合并两个有序链表
  • 原文地址:https://blog.csdn.net/qq_37669681/article/details/133352357