小编tri*_*ter的帖子

在iphonesimulator 6.0中,Keychain Services API失败并出现errSecNotAvailable

使用命令行工具执行目标并且iphone模拟器设置为硬件版本6.0(10A403)时,使用errSecNotAvailable调用Keychain服务失败.如果我将模拟器版本更改为其他先前版本(4.3,5.0,5.1)并使用相同的命令行脚本重新执行,则调用会成功.

我正在运行最新的XCode 4.5,并且从XCode中下载了命令行工具.

要重现此错误,请执行以下操作:

  1. 使用OCUnit目标设置ios库项目
  2. 将Base SDK设置为6.0
  3. 将iOS部署目标设置为4.3
  4. 将帖子末尾的代码复制并粘贴到测试项目中(它只会尝试存储密码并检索它)
  5. 将Security.framework添加到OCUnit目标

在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 …
Run Code Online (Sandbox Code Playgroud)

security unit-testing keychain ios ios-simulator

5
推荐指数
1
解决办法
1665
查看次数

标签 统计

ios ×1

ios-simulator ×1

keychain ×1

security ×1

unit-testing ×1