Ios +;[AVURLAsset isPlayableExtendedMIMEType:]在单元测试时表现不同

Ios +;[AVURLAsset isPlayableExtendedMIMEType:]在单元测试时表现不同,ios,unit-testing,avfoundation,Ios,Unit Testing,Avfoundation,在我的应用程序中,调用[AVURLAsset isPlayableExtendedMIMEType:@“视频/mp4;编解码器=\”avc1.64001F,mp4a.40.2\”]返回是,这是预期的结果 如果我在单元测试中运行完全相同的代码,那么它将返回NO 应用程序和单元测试都是在运行iOS 7.0的iPhone视网膜(4英寸)模拟器上使用Xcode 5.0.2运行的 -(void)testPlayableExtendedMIMEType { xctasertrue([AVURLAsset类别

在我的应用程序中,调用
[AVURLAsset isPlayableExtendedMIMEType:@“视频/mp4;编解码器=\”avc1.64001F,mp4a.40.2\”]
返回
,这是预期的结果

如果我在单元测试中运行完全相同的代码,那么它将返回
NO

应用程序和单元测试都是在运行iOS 7.0的iPhone视网膜(4英寸)模拟器上使用Xcode 5.0.2运行的

-(void)testPlayableExtendedMIMEType
{
xctasertrue([AVURLAsset类别],@“);
XCTAssertTrue([AVURLAsset isPlayableExtendedMIMEType:@“视频/mp4;编解码器=\”avc1.64001F,mp4a.40.2\”,@“);
}
第一个断言通过,但第二个断言失败


为什么这种行为在单元测试和应用程序中会有所不同?

在逆向工程如何实现
+[avurlaste isPlayableExtendedMIMEType:
之后,我找到了问题的原因

下面是它正在执行的堆栈跟踪:

frame#0:0x01b2861e CoreMedia`CelestialGetModelSpecificName
帧#1:0x01b2885a CoreMedia`CeleStialCfcCreatePropertyListFromBundleIdentifier+11
帧#2:0x00050039 AVFoundation`\uuuuu33+[AVURLAsset\uAVFvalidationplist]\uBlock\uInvoke\u0+39
帧#3:0x02e99014 libdispatch.dylib`\u dispatch\u client\u callout+14
帧4:0x02e8b09f libdispatch.dylib`dispatch#u once_f+57
帧#5:0x02e8b061 libdispatch.dylib`dispatch#u once+31
帧#6:0x00050006 AVFoundation`+[avurlast\u avfValidationPlist]+49
帧#7:0x00050664 AVFoundation`+[avurlaste isPlayableExtendedMIMEType:+64
CelestialCFCreatePropertyListFromBundleIdentifier
函数尝试读取
MediaValidator.plist
框架内的
MediaToolbox
文件。plist文件的位置取决于设备型号名称。以下是iOS 7模拟器的不同
MediaValidator.plist
文件

MediaToolbox.framework
|--J1
|`--MediaValidator.plist
|--K93
|`--MediaValidator.plist
|--N41
|`--MediaValidator.plist
`--N94
`--MediaValidator.plist
运行应用程序时,
celestialgetmodelsspecificname
函数返回
N41
,。
运行单元测试时,
celestialgetmodelsspecificname
函数返回
N88
,即iPhone 3GS。如您所见,MediaToolbox框架中没有
N88
目录,这就是
+[AVURLAsset isPlayableExtendedMIMEType:
最终失败的原因

仔细查看
celestialgetmodelsspecificname
函数可以发现解决方案。模拟器读取
IPHONE\u simulator\u CLASS
环境变量,以了解正在模拟的设备。如果未设置
IPHONE\u SIMULATOR\u CLASS
环境变量,则默认为硬编码的
N88

因此,为了让测试通过,我们只需要手动将
IPHONE\u SIMULATOR\u CLASS
环境变量设置为
N41
,因为单元测试运行程序不会自动设置它

setenv("IPHONE_SIMULATOR_CLASS", "N41", 0);