iOS8沙盒路径的坑

1.背景描述:

最近项目中在做下载网络视频到本地的功能,下载完成后App存储下载好的视频路径。我是通过保存完整的路径,就发现个很奇怪的现象:每次刚下载完成后,可以播放视频,但是当重新Run之后,无论模拟器还是真机运行播放上次下载好的视频,总会播放失败,提示No such File。刚开始以为是下载类中做了路径处理的功能,导致在下载完成后更换了新的路径。经过多次的碰壁,最近发现每次Run之后,之前保存的路径已经不存在,所以造成视频播放失败的原因。

那到底是什么原因呢?该怎样获取到上次保存的路径呢?

2.那到底是什么原因造成路径更换呢?

通过网上的搜索,参考该作者的回答,表示感谢该作者,以及自己的测试。在iOS 8之前,我们获取到的沙盒中的Document、cache、tmp等路径,再次运行后通过上次获取的绝对路径还能找到。但是在iOS 8之后,由于苹果考虑到安全因素,沙盒路径都是在动态改变。

3.该怎样获取上次保存的文件路径呢?

虽然每次Run的路径不同,但是文件会从上一次的路径中自动转移到新的路径中。比如上一次存储了一个名为av.mp4的视频文件,其路径为/Users/XXX/Library/Developer/CoreSimulator/Devices/2B080463-1234-33BE-AB23-B87634765473/Library/Documents/av.mp4,则再次运行后文件会转存到新的路径/Users/XXX/Library/Developer/CoreSimulator/Devices/34DC0863-1334-67EC-AB23-B87634765473/Library/Documents/av.mp4。因此我们不能通过绝对路径来获取,而是通过文件名来获取文件所在的动态路径。

代码如下:

+(NSString*)getDynamicFilePath:(NSString*)fileName{

NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString*documents=[pathsobjectAtIndex:0];

NSString*filePath=[NSStringstringWithFormat:@"%@%@",documents,fileName];

returnfilePath;

}

这样就能保证每次都能获取到文件的路径啦!

推荐阅读更多精彩内容