Iphone iOS错误errSecInteractionNotAllowed或SecItemAdd上的–25308
我编写了一些代码来测试向钥匙链添加项目。我正在测试iPad4.2.1越狱。我在iPad上用ldid-S prog签署了二进制文件 代码: 代码编译和链接时没有任何噪音或警告。但是在iPad上执行会抛出一个错误——25308Iphone 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
如何排除此错误?我非常确定您需要设置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;
}