tri*_*ter 5 security unit-testing keychain ios ios-simulator
使用命令行工具执行目标并且iphone模拟器设置为硬件版本6.0(10A403)时,使用errSecNotAvailable调用Keychain服务失败.如果我将模拟器版本更改为其他先前版本(4.3,5.0,5.1)并使用相同的命令行脚本重新执行,则调用会成功.
我正在运行最新的XCode 4.5,并且从XCode中下载了命令行工具.
要重现此错误,请执行以下操作:
在XCode中执行OCUnit目标并查看iphone模拟器中设置的硬件版本的测试通过(只需在执行之间进行更改).
使用以下命令从命令行执行OCUnit目标:
xcodebuild -target TARGET_NAME_HERE -sdk iphonesimulator -configuration Release TEST_AFTER_BUILD=YES
Run Code Online (Sandbox Code Playgroud)
将iphone模拟器设置为硬件版本6.0,测试将失败.如果将iphone模拟器硬件版本更改为4.3,5.0或5.1并再次执行命令行脚本,则测试将成功.
这是一个命令行工具问题吗?一个iPhone模拟器的问题?从命令行问题运行的OCUnit目标?
谁喜欢只在彗星对齐时通过的单位测试?
有任何想法吗?
这是代码:
#define KEYCHAIN_ITEM_ATTRIBUTES (id)kSecClassGenericPassword, kSecClass, @"MyService", kSecAttrService, @"MyPassword", kSecAttrAccount
const NSString* MyPassword = @"blabla";
- (void)testExample
{
// remove previous keychain item
OSStatus status = SecItemDelete((CFTypeRef)[NSDictionary dictionaryWithObjectsAndKeys:KEYCHAIN_ITEM_ATTRIBUTES, nil]);
NSLog(@"SecItemDelete status:%ld",status);
NSParameterAssert(status == errSecSuccess || status == errSecItemNotFound);
// add keychain item with new value
NSData *data = [MyPassword dataUsingEncoding:NSUTF8StringEncoding];
status = SecItemAdd((CFTypeRef)[NSDictionary dictionaryWithObjectsAndKeys:KEYCHAIN_ITEM_ATTRIBUTES, data, kSecValueData, nil], NULL);
NSLog(@"SecItemAdd status:%ld",status);
NSParameterAssert(status == errSecSuccess);
// get password
status = SecItemCopyMatching((CFTypeRef)[NSDictionary dictionaryWithObjectsAndKeys:KEYCHAIN_ITEM_ATTRIBUTES,
kSecMatchLimitOne, kSecMatchLimit, kCFBooleanTrue, kSecReturnData, nil], (CFTypeRef *)&data);
NSLog(@"SecItemCopyMatching status:%ld",status);
NSParameterAssert(status == errSecSuccess);
if (status == errSecItemNotFound)
NSLog(@"SecItemCopyMatching status:%ld", status);
else
NSLog(@"SecItemCopyMatching result:%@",[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);
}
Run Code Online (Sandbox Code Playgroud)
关于未启动的securityd守护进程,我可以检查它是否正在启动,使用
launchctl list | grep securityd
Run Code Online (Sandbox Code Playgroud)
在模拟器启动后,并获得
- 0 com.apple.iPhoneSimulator:com.apple.securityd
Run Code Online (Sandbox Code Playgroud)
我也尝试停止这个安全守护进程并手动启动另一个......我看了GTM的RunIPhoneUnitTest.sh脚本,找到了一条我可以使用的简单线路,但是当我尝试这个时
launchctl submit -l ios6securityd -- /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/usr/libexec/securityd
Run Code Online (Sandbox Code Playgroud)
给我一个守护进程的-5状态代码.
我遇到这个问题是因为当我尝试从 Xcode 4.5.1 UI 运行单元测试时,无法获取钥匙串访问权限。幸运的是,我在大多数以前的 Xcode 版本的 CI 构建中都熟悉这种损坏,即模拟器的安全性未正确启动。
首先尝试启动 securityd,看看是否有帮助:
#!/bin/bash
simulator_root=`xcodebuild -version -sdk iphonesimulator Path`
"${simulator_root}/usr/libexec/securityd"
Run Code Online (Sandbox Code Playgroud)
这对我有用。