我正在尝试使用此api SecKeychainFindGenericPassword()获取Airport网络密码。 但我总是得到itemnotfound错误。我不确定在API中的帐户名称和服务名称中传递什么。我添加了代码片段来显示我在做什么。任何帮助,将不胜感激 。 谢谢
OSStatus status1 ;
SecKeychainRef kychain = nil;
SecKeychainCopyDefault(&kychain);
status1 = SecKeychainFindGenericPassword (
kychain, // default keychain
15, // length of service name
"AirPort Network", // service name
38, // length of account name
"com.apple.network.wlan.ssid.xxxxxxxx", // account name
passwordLength, // length of password
&passwordData, // pointer to password data
itemRef // the item reference
);
return (status1);
我正在使用osx 10.8
答案 0 :(得分:1)
您已交换服务和帐户。该服务应为SSID,帐户名称应为“AirPort”。
SecKeychainRef keychain;
OSStatus err = SecKeychainOpen("/Library/Keychains/System.keychain", &keychain);
#define kServiceName "com.apple.network.wlan.ssid.Rackus"
#define kAccountName "AirPort"
UInt32 passwordLength = 0;
char* passwordData = nil;
UInt32 serviceNameLength = strlen(kServiceName);
UInt32 accountNameLength = strlen(kAccountName);
SecKeychainItemRef itemRef;
err = SecKeychainFindGenericPassword(keychain, serviceNameLength, kServiceName, accountNameLength, kAccountName, &passwordLength, (void**)&passwordData, &itemRef);
答案 1 :(得分:0)
服务名称是您要获取密码的服务的名称,帐户名称是用户的帐户名称(您可以通过调用NSUserName()来获取它,但要注意,这将返回NSString *并且此API是用C语言编写的) ,所以它期望一个const char *)。
正如我所说,由于KeyChain API是用C语言编写的,我强烈建议你使用包装器库来完成这项工作,如果你不能使用普通的C.我建议你这样做: https://github.com/samsoffes/sskeychain