最近,项目中遇到了一个的问题,这里记录下来帮助遇到同样问题的同学。
项目背景:
写一个音乐的列表,点击下载音乐文件到沙盒,然后播放。可以收藏选中音乐。
为了收藏音乐,使用NSKeyedArchiver
将音乐的数据模型MusicModel
缓存到沙盒。MusicModel
结构如下:
@interface MusicModel : NSObject <NSCopying>
@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]
获取,然后拼接即可。
网友评论