2011-03-01 3 views
0

키 체인에 항목을 추가하는 코드를 작성했습니다. iPad 4.2.1 (jailbroken)에서 테스트 중입니다. 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

응답 해 주셔서 감사합니다. Simon. 귀하의 코드를보고 있지만 위의 코드는 "kSecClass"를 kSecClassInternetPassword,kSecClass,으로 설정합니다. – sandflow

0

예제 코드와 함께 가장 큰 문제는 많은 항목이 인코딩 된 점이다 NSString 객체가 사용되어야하는 NSData 객체 (kSecAttrAccount, kSecAttrLabel, kSecAttrDescription 및 kSecAttrServer). iOS의 동작이 Lion과 다를 수 있지만 (이 부분을 살펴 보았지만)이 문제로 인해 예외가 발생하지 않는다는 것에 놀랐습니다.

그것은 대신 kSecReturnPersistentRef의 kSecReturnRef를 지정하면 (kSecReturnPersistentRef의 vends을 사용하여 문서로부터의 "영구 참조를 디스크에 저장 될 수 있거나 또는 프로세스간에 전달") 더 적합 할 수있을 수있다. SecItemUpdate, SecItemDelete 또는 SecItemCopyMatching과 함께 사용할 키 체인 항목을 지정하는 방법으로 세션 간 지속성 (NSUserDefaults 사용) 또는 다른 프로세스로 전달하는 이점이있는 kSecMatchItemList를 사용합니다. 항목이 응용 프로그램의 수명 내에서만 사용되거나 다른 속성을 사용하여 찾기가 더 적합한 경우 kSecReturnRef를 사용하는 항목 참조가 더 적합 할 수 있습니다.