2011-03-01 34 views
0

我編寫了一些代碼來測試將項目添加到鑰匙串。我正在測試iPad 4.2.1(越獄)。我在iPad上與ldid -S prog簽署了二進制文件。iOS錯誤errSecInteractionNotAllowed或SecItemAdd上的-25308

代碼:

#import <Security/Security.h> 
#import <Security/SecItem.h> 
#import <Foundation/NSDictionary.h> 
#import <Foundation/NSString.h> 
#import <Foundation/NSObject.h> 
#import <CoreFoundation/CoreFoundation.h> 
#import <Foundation/NSAutoreleasePool.h> 
#import <Foundation/NSKeyValueCoding.h> 

int main(int argc, char *argv[]) 
    { 
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
     NSDictionary *attributesToStore = [NSDictionary dictionaryWithObjectsAndKeys: 
     [@"testuser01" dataUsingEncoding:NSUTF8StringEncoding],kSecAttrAccount, 
     [@"test123" dataUsingEncoding:NSUTF8StringEncoding],kSecValueData, 
     kSecClassInternetPassword,kSecClass, 
     [@"www.example.com" dataUsingEncoding:NSUTF8StringEncoding],kSecAttrServer, 
     kCFBooleanTrue, kSecReturnPersistentRef, 
     [@"Sample password" dataUsingEncoding:NSUTF8StringEncoding], kSecAttrDescription, 
     [@"password label" dataUsingEncoding:NSUTF8StringEncoding],kSecAttrLabel, nil]; 
     NSData *persistentRef = nil; 
     OSStatus result = SecItemAdd((CFDictionaryRef)attributesToStore, (CFTypeRef *)&persistentRef); 
     if (noErr == result) 
       { 
       NSLog(@"Added item to Keychain"); 
       } 
     else { 
       NSLog(@"Item add failed"); 
       NSLog(@"Result code: %d",result); 
      }  
     [pool release]; 
     return 0; 
    } 

代碼編譯,沒有任何噪音或警告的鏈接。但在iPad上執行會引發錯誤-25308

如何解決此錯誤?

回答

0

我很肯定你需要設置kSecClass鍵,這樣鑰匙串就知道你想要添加什麼樣的項目。

作爲一個方面說明,我發現後,我重寫了init方法的GenericKeychain示例代碼是有用的,如我的回答概括了我的問題here.

+0

感謝您的迴應,西蒙。我正在查看您的代碼,但上面的代碼確實將「kSecClass」設置爲kSecClassInternetPassword,kSecClass, sandflow

0

與示例代碼的主要問題是,許多項目編碼作爲應使用NSString對象的NSData對象(kSecAttrAccount,kSecAttrLabel,kSecAttrDescription和kSecAttrServer)。我很驚訝這個問題不會導致異常,儘管iOS上的行爲可能與Lion不同(我在這裏看到的)。

也可能是指定kSecReturnRef而不是kSecReturnPersistentRef可能更合適(從文檔中,使用kSecReturnPersistentRef發佈「持久引用可能存儲在磁盤上或在進程之間傳遞」)。這是一種指定鑰匙串項目以便與SecItemUpdate,SecItemDelete或SecItemCopyMatching一起使用的方法,它使用kSecMatchItemList,它具有會話間持久性(例如使用NSUserDefaults)或傳遞給其他進程的優點。如果該項目僅在應用程序的生命週期內使用,或者更適合使用其他屬性,那麼使用kSecReturnRef的項目引用可能更合適。