在 iOS 模拟器中使用 MPMediaPickerController 时出现运行时错误
Posted
技术标签:
【中文标题】在 iOS 模拟器中使用 MPMediaPickerController 时出现运行时错误【英文标题】:Runtime error when using MPMediaPickerController in iOS Simulator 【发布时间】:2012-05-29 02:30:23 【问题描述】:当我尝试在 ios 模拟器上使用 MPMediaPickerController
运行应用程序时,会发生以下情况。
2012-05-28 22:26:42.416 My App[48426:11f03] Could not load source: 3
2012-05-28 22:26:42.418 My App[48426:11f03] *** Assertion failure in -[MPMediaPickerController loadView], /SourceCache/MediaPlayer_Sim/MobileMusicPlayer-1391.72/SDK/MPMediaPickerController.m:86
2012-05-28 22:26:42.419 My App[48426:11f03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to load iPodUI.framework'
这是我的 App/Xcode/iOS 模拟器中的问题,还是 iOS 模拟器根本不支持 MPMediaPickerController
?如果没有,除了在物理设备上运行之外,还有其他选择吗?
【问题讨论】:
现在可以实现了,详情请参阅下面的回答。 【参考方案1】:MPMediaPickerController 在模拟器中不起作用。 Apple 在“Hello Music Player”下的“iPod Library Access Programming Guide”中注明了这一点。注释说:
注意:要执行这些步骤,您需要配置设备,因为 模拟器无法访问设备的 iPod 库。
为了防止断言,您可以随时检查您是否可以在代码中访问执行此操作(下面的代码使用 ARC 和 iOS SDK 5.0)。
MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeAnyAudio];
[picker setDelegate:self];
[picker setAllowsPickingMultipleItems:YES];
[picker setPrompt:NSLocalizedString(@"Add songs to play","Prompt in media item picker")];
@try
[picker loadView]; // Will throw an exception in iOS simulator
[self presentViewController:picker animated:YES completion:nil];
@catch (NSException *exception)
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Oops!",@"Error title")
message:NSLocalizedString(@"The music library is not available.",@"Error message when MPMediaPickerController fails to load")
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil] show];
【讨论】:
我想知道添加try catch代码是否是应用成功添加到应用商店的要求?如果不是必需的,我不打算添加此代码。 虽然当时是正确的,但当前的 iOS 模拟器允许基本支持访问音乐库;详情见我的回答。【参考方案2】:另外(如果使用故事板)你可以试试:
- (IBAction)showPicker:(id)sender
#if TARGET_IPHONE_SIMULATOR
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"playerTest"
message:@"Media picker didn't work in simulator, please run this app on device"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
#else
[self performSegueWithIdentifier:@"ShowPickerViewSegue" sender:self];
#endif
【讨论】:
【参考方案3】:MPMediaPickerController
现在可以在 iOS 模拟器中运行,无需任何额外的代码更改(至少从 iOS 8 开始,可能更早)。这是一个可以演示的项目:GVMusicPlayerController.
您必须通过从实际设备复制必要的文件来准备模拟器中的音乐库,最重要的是 MediaLibrary.sqlitedb
数据库文件。如果您想播放文件并查看图稿,您还必须复制iTunes_Control/Music
、Purchases
和Artwork
文件夹(位于/var/mobile/Media/
)。有关详细信息,请参阅此问题:Can i access iPod Library on simulator?。
【讨论】:
以上是关于在 iOS 模拟器中使用 MPMediaPickerController 时出现运行时错误的主要内容,如果未能解决你的问题,请参考以下文章
XCode 在模拟器选择中使用 GUID 而不是 iOS 版本号