如何持久化MPMediaItemCollection对象?(从iPod中选择)

6

我正在制作一个应用程序,用户可以在设置选项卡中选择一首歌曲,并在需要时在不同的视图中播放。如果用户关闭应用程序并重新打开它,我希望这个项目可以被保存。

我已经成功让用户使用以下代码选择和存储歌曲:

-(IBAction)showMediaPicker:(id)sender{

    MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeAny];

    mediaPicker.delegate = self;

    mediaPicker.allowsPickingMultipleItems = NO;

    mediaPicker.prompt = @"Select Alarm Sound";

    [self presentModalViewController:mediaPicker animated:YES];

}


- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection {

    [self dismissModalViewControllerAnimated: YES];

    settingsData.selectedSong = mediaItemCollection;//Object of type MPMediaItemCollection

但我希望用户每次使用应用程序时都需要这样做。

我尝试使用NSUserDefaults:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:settingsData.selectedSong forKey:@"alarmSoundKey"];
[defaults synchronize];

但是收到以下错误:

* -[NSUserDefaults setObject:forKey:]: 尝试插入类为 'MPMediaItemCollection' 的非属性值 ''。请注意,属性列表中的字典和数组也必须仅包含属性值。

请问我的选择有哪些?不太确定该怎么解决这个问题...

解决方案 -

我还不能回答自己的问题,所以我把它放在这里:

我已经找到了解决方案:

首先将 MPMediaItemCollection 转换/编码为 NSData 对象,然后使用 NSUserDefaults 存储它,使用以下代码:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mediaItemCollection];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"someKey"];
[defaults synchronize];

从那里,您可以对其进行解码并在应用程序的任何其他地方使用....
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"someKey"];
MPMediaItemCollection *mediaItemCollection = [NSKeyedUnarchiver unarchiveObjectWithData:data]

希望这能对某些人有所帮助。请传播这个消息,这方面的报道还不够多。我已经花了大约4个小时来解决这个问题...

2个回答

4

2

您也可以使用MPMediaItemPropertyPersistentID属性。当您的应用程序下次启动时,您可以形成一个查询来从iPod库中检索该项目,并优雅地处理诸如用户决定从其库中删除歌曲之类的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接