3

キーチェーンの保存と読み取りに問題があります。最初に、アカウント名のメソッド SecKeychainFindInternetPassword でこの「account_name」のような文字を使用して保存しようとしましたが、これが実行されます。しかし今、変数を内部に保存したいと思います。しかし、このコードを実行すると、Programm はキーチェーン アイテムを見つけることができません。私を助けてください。(下手な英語でごめんなさい、私はドイツの学生です)

-(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

2 つの提案.. null を itemRef (最後の引数) に渡さないでください。次に、変更するキーチェーンへのポインターが表示されます。

また、エラー コードを実際にチェックして、add 関数が機能したかどうかを確認する必要があります。

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 に答える