ionic-打包成iOS系统Camera插件获取视频路径之后访问无权限

文章目录

            • 一、Camera获取视频路径之后访问无权限

一、Camera获取视频路径之后访问无权限

报错信息:

Error Domain=NSCocoaErrorDomain Code=257 "未能打开文件“trim.9E5D65DB-BC4C-4A0E-991D-6923A160A9A0.MOV”,因为您没有查看它的权限。" UserInfo={NSFilePath=/private/var/mobile/Containers/Data/PluginKitPlugin/C6291088-43CC-49E7-844F-3155B8D21DAD/tmp/trim.9E5D65DB-BC4C-4A0E-991D-6923A160A9A0.MOV, NSUnderlyingError=0x28248d440 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

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

file:///private/var/mobile/Containers/Data/PluginKitPlugin/0849234B-837C-43ED-BEDD-DE4F79E7CE96/tmp/trim.B8AB021D-F4B6-4E50-A93C-8B7F7FB40A1C.MOV

iOS13以下:

file:///private/var/mobile/Containers/Data/Application/5AE52A95-6A2F-49A5-8210-D70E022E9A05/tmp/5A8D81B5-FC42-4228-9514-CD998A4E7FA9.MOV

可以看到一个是PluginKitPlugin,一个是Application,这就有很大区别了,根据iOS系统的沙盒原理,前者除了本应用其他肯定是无法访问的。既然发现了问题,那就得着手解决。查阅github版本库,发现bug已修复但是暂未合并发出新版,坑!
参考版本库:https://github.com/apache/cordova-plugin-camera/pulls
可以看到:修复时间是2019年11月29日
ionic-打包成iOS系统Camera插件获取视频路径之后访问无权限_第1张图片
最新版为:2019年6月28日
ionic-打包成iOS系统Camera插件获取视频路径之后访问无权限_第2张图片剩下的唯一解决方案:改造源码
会iOS开发的小伙伴,自己改改,不会的小伙伴呢,只能看看有没有好心人了。
方案一:改造iOS源码

in CDVCamera.m change THIS:

(CDVPluginResult*)resultForVideo:(NSDictionary*)info
{
NSString* moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] absoluteString];
return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:filePath];
}
to THIS:

(CDVPluginResult*)resultForVideo:(NSDictionary*)info
{
NSString* moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] path];

NSArray* spliteArray = [moviePath componentsSeparatedByString: @"/"];
NSString* lastString = [spliteArray lastObject];
NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:lastString];
[fileManager copyItemAtPath:moviePath toPath:filePath error:&error];

return [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:filePath];
}

具体操作:

  • 方案一:直接在xcode里改造,缺点:每次都要改
    ionic-打包成iOS系统Camera插件获取视频路径之后访问无权限_第3张图片
  • 方案二:在ionic项目对应平台下插件里改造,同时将下载到项目中的源码也一起改造下,保持代码版本的同步。缺点:每次重新安装插件需要改。
    ionic-打包成iOS系统Camera插件获取视频路径之后访问无权限_第4张图片
  • 方案三:将线上插件版本变成本地版本,每次安装本地即可。缺点:线上版本升级新功能或者优化,你每次都得自己添加或者再次改造。

你可能感兴趣的:(ionic,ios,android,web,app,xcode)