3

我在存储和读取钥匙串时遇到问题。首先,我尝试在方法 SecKeychainFindInternetPassword 中为 accountname 存储使用类似“account_name”的字符,然后运行。但现在我想在里面存储一个变量。但是,如果我运行此代码,程序将找不到钥匙串项。请帮我。(对不起我的英语不好,我是德国学生)

-(void)StorePasswordKeychain:(void*)password :(UInt32)passwordLength
{
char *userString;

userString = (char *)[_username UTF8String];
SecKeychainAddInternetPassword(
                               NULL,
                               StrLength("myserver.com"),
                               "myserver.com",
                               0,
                               NULL,
                               StrLength(userString),
                               userString,
                               0,
                               nil,
                               0,
                               kSecProtocolTypeHTTPS,
                               kSecAuthenticationTypeHTMLForm,
                               passwordLength,
                               password,
                               NULL
                               );
}

-(OSStatus)GetPasswordKeychain:(void *)passwordData :(UInt32 *)passwordLength
{
OSStatus status;
char *userString;

userString = (char *)[_username UTF8String];
status = SecKeychainFindInternetPassword(
                                NULL,
                                StrLength("myserver.com"),
                                "myserver.com",
                                0,
                                NULL,
                                StrLength(userString),
                                userString,
                                0,
                                nil,
                                0,
                                kSecProtocolTypeHTTPS,
                                kSecAuthenticationTypeHTMLForm,
                                passwordLength,
                                passwordData,
                                NULL
                                );
return status;
}
4

1 回答 1

2

两个建议.. 不要将 null 传递给 itemRef (最后一个参数)。然后你会有一个指向你想要修改的钥匙串的指针。

此外,您应该真正检查错误代码以查看您的添加功能是否有效。

OSStatus result = SecKeychainAddInternetPassword(
                           NULL,
                           StrLength("myserver.com"),
                           "myserver.com",
                           0,
                           NULL,
                           StrLength(userString),
                           userString,
                           0,
                           nil,
                           0,
                           kSecProtocolTypeHTTPS,
                           kSecAuthenticationTypeHTMLForm,
                           passwordLength,
                           password,
                           NULL
                           );
if(result != noErr){
    NSLog(@"Error AddPassword result=:%d", result );
}

这是我的示例程序,其代码与您提供的代码相同,并且运行良好。

int main(int argc, const char * argv[])
{

@autoreleasepool {

    char *inputpassword = "topsecret";
    UInt32 inputpassLength = strlen(inputpassword);
    OSStatus status;
    NSString *_username = @"account_name";

    char *userString;

    userString = (char *)[_username UTF8String];
    status = SecKeychainAddInternetPassword(
                                   NULL,
                                   StrLength("myserver.com"),
                                   "myserver.com",
                                   0,
                                   NULL,
                                   StrLength(userString),
                                   userString,
                                   0,
                                   nil,
                                   0,
                                   kSecProtocolTypeHTTPS,
                                   kSecAuthenticationTypeHTMLForm,
                                   inputpassLength,
                                   inputpassword,
                                   NULL
                                   );


    NSLog(@"Adding Status:%d", status);



    UInt32 returnpasswordLength = 0;
    char *passwordData;

    status = SecKeychainFindInternetPassword(
                                             NULL,
                                             StrLength("myserver.com"),
                                             "myserver.com",
                                             0,
                                             NULL,
                                             StrLength(userString),
                                             userString,
                                             0,
                                             nil,
                                             0,
                                             kSecProtocolTypeHTTPS,
                                             kSecAuthenticationTypeHTMLForm,
                                             &returnpasswordLength,
                                             (void *)&passwordData,
                                             NULL
                                             );

    NSLog(@"Retrieving status:%d", status);

    NSLog(@"Password:%@", [[NSString alloc] initWithBytes:passwordData
                                                   length:returnpasswordLength
                                                 encoding:NSUTF8StringEncoding]);


}
return 0;
}
于 2012-11-23T16:02:23.593 回答