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);