iOS fileExistsAtPath:函数返回结果错误

最近,项目中遇到了一个的问题,这里记录下来帮助遇到同样问题的同学。

项目背景:

写一个音乐的列表,点击下载音乐文件到沙盒,然后播放。可以收藏选中音乐。
为了收藏音乐,使用NSKeyedArchiver将音乐的数据模型MusicModel缓存到沙盒。MusicModel结构如下:


@interface MusicModel : NSObject 

@property (nonatomic ,strong) NSString       *musicID; //音乐id
@property (nonatomic ,strong) NSString       *title; //音乐标题
@property (nonatomic ,strong) NSString       *remoteUrl; //音乐文件下载地址
@property (nonatomic ,strong) NSURL          *resourceUrl; //下载音乐的沙盒目录地址

/* 
resourceUrl 大概样子如下:
file:///var/mobile/Containers/Data/Application/D186A9B5-FE94-424E-AFCF-6D79AEA71F3B/
Library/Application Support/VideoBackgroundMusic/5be3e94edb926.mp3
*/ 
@end

点击音乐的时候,使用[resourceUrl checkResourceIsReachableAndReturnError:nil]判断本地音乐是否已经下载,执行对应的逻辑。

遇到的问题:

这里我收藏了一首已经下载的歌曲,然后应用kill掉,重启app,点击收藏的歌曲,发现[resourceUrl checkResourceIsReachableAndReturnError:nil]返回的是NO,使用[[NSFileManager defaultManager] fileExistsAtPath: resourceUrl.path]一样返回NO。这里我明明已经下载成功了这首音乐,而且作者打开对应的沙盒目录,也发现了对应的文件,可是结果却一直是NO。怎么尝试都不行,一度怀疑人生...

答案:

这里错误的原因是,沙盒目录的前半段地址:file:///var/mobile/Containers/Data/Application/D186A9B5-FE94-424E-AFCF-6D79AEA71F3B/,是一个虚拟地址,每次启动的app的时候这个地址是会变化的(D186A9B5-FE94-424E-AFCF-6D79AEA71F3B)。

解决办法:

缓存resourceUrl时不能存储全部地址,而应该只是缓存后半部地址(VideoBackgroundMusic/5be3e94edb926.mp3),前面部分的地址,使用[NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) objectAtIndex:0]获取,然后拼接即可。

你可能感兴趣的:(iOS fileExistsAtPath:函数返回结果错误)