Iphone iOS错误errSecInteractionNotAllowed或SecItemAdd上的–25308

Iphone iOS错误errSecInteractionNotAllowed或SecItemAdd上的–25308,iphone,objective-c,xcode,ios,jailbreak,Iphone,Objective C,Xcode,Ios,Jailbreak,我编写了一些代码来测试向钥匙链添加项目。我正在测试iPad4.2.1越狱。我在iPad上用ldid-S prog签署了二进制文件 代码: 代码编译和链接时没有任何噪音或警告。但是在iPad上执行会抛出一个错误——25308 如何排除此错误?我非常确定您需要设置kSecClass密钥,以便钥匙链知道您尝试添加的项目类型 作为旁注,在我重写了问题回答中概述的init方法后,我发现示例代码很有用。示例代码的主要问题是,许多项被编码为NSData对象,其中NSString对象应使用kSecAttrAcc

我编写了一些代码来测试向钥匙链添加项目。我正在测试iPad4.2.1越狱。我在iPad上用ldid-S prog签署了二进制文件

代码:

代码编译和链接时没有任何噪音或警告。但是在iPad上执行会抛出一个错误——25308


如何排除此错误?

我非常确定您需要设置kSecClass密钥,以便钥匙链知道您尝试添加的项目类型


作为旁注,在我重写了问题回答中概述的init方法后,我发现示例代码很有用。示例代码的主要问题是,许多项被编码为NSData对象,其中NSString对象应使用kSecAttrAccount、kSecAttrLabel、kSecAttrDescription和kSecAttrServer。我很惊讶这个问题不会导致异常,尽管iOS上的行为可能与我所看到的Lion不同


从文档中可以看出,指定kSecReturnRef而不是kSecReturnPersistentRef可能更合适,使用kSecReturnPersistentRef vends可以将持久引用存储在磁盘上或在进程之间传递。这是一种指定密钥链项以用于SecItemUpdate、SecItemDelete或SecItemCopyMatching的方法,将其与具有会话间持久性优势的kSecMatchItemList一起使用,例如使用NSUserDefaults或传递到另一个进程。如果项目仅在应用程序的生命周期内使用,或者更适合使用其他属性查找,那么使用kSecReturnRef的项目引用可能更合适。

感谢您的回复,Simon。我正在查看您的代码,但上面的代码确实将kSecClass设置为kSecClassInternetPassword,kSecClass,
#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;
     }