无法识别iOS OSStatus代码
我在iOS应用程序中有一个非常奇怪的行为。 我从iOS 6切换到iOS 7.在iOS 6中,一切都很完美。
- (NSMutableDictionary *)newSearchDictionary:(NSString *)identifier { NSMutableDictionary *searchDictionary = [[NSMutableDictionary alloc] init]; [searchDictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; NSData *encodedIdentifier = [identifier dataUsingEncoding:NSUTF8StringEncoding]; [searchDictionary setObject:encodedIdentifier forKey:(__bridge id)kSecAttrGeneric]; [searchDictionary setObject:encodedIdentifier forKey:(__bridge id)kSecAttrAccount]; [searchDictionary setObject:serviceName forKey:(__bridge id)kSecAttrService]; return searchDictionary; } - (NSData *)searchKeychainCopyMatching:(NSString *)identifier { NSMutableDictionary *searchDictionary = [self newSearchDictionary:identifier]; [searchDictionary setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; [searchDictionary setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; CFDataRef dataRef; OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, (CFTypeRef *)&dataRef); if (status != errSecSuccess) { #ifdef DEBUG NSLog(@"%s - No OSStatus errSecSuccess. Caused by SecItemCopyMatching", __PRETTY_FUNCTION__); #endif return nil; } NSData *result = (__bridge_transfer NSData *)dataRef; return result; }
当应用程序启动时– (NSData *)searchKeychainCopyMatching:(NSString *)标识符函数从keychain加载值。 一切都运行良好一段时间。 但在大约15次成功的价值请求后,我收到了一个错误。
OSStatus代码-34018
SecItemCopyMatching函数返回该错误代码。 文件说
@result一个结果代码。 请参阅“安全错误代码”(SecBase.h)。
但是在SecBase.h中查看只指定了这些OSStatus代码。
enum { errSecSuccess = 0, /* No error. */ errSecUnimplemented = -4, /* Function or operation not implemented. */ errSecIO = -36, /*I/O error (bummers)*/ errSecOpWr = -49, /*file already open with with write permission*/ errSecParam = -50, /* One or more parameters passed to a function where not valid. */ errSecAllocate = -108, /* Failed to allocate memory. */ errSecUserCanceled = -128, /* User canceled the operation. */ errSecBadReq = -909, /* Bad parameter or invalid state for operation. */ errSecInternalComponent = -2070, errSecNotAvailable = -25291, /* No keychain is available. You may need to restart your computer. */ errSecDuplicateItem = -25299, /* The specified item already exists in the keychain. */ errSecItemNotFound = -25300, /* The specified item could not be found in the keychain. */ errSecInteractionNotAllowed = -25308, /* User interaction is not allowed. */ errSecDecode = -26275, /* Unable to decode the provided data. */ errSecAuthFailed = -25293, /* The user name or passphrase you entered is not correct. */ };
已经检查过的值不会被覆盖。
最后但并非最不重要的搜索词典:
编辑 – 新信息
我整天都在调试,我发现了一些消息。 我正在下载包含可执行Bundle的Zip文件。 这是一个内部应用程序,因此不必担心审查指南中的第2.7和2.8点。 成功加载捆绑包后,将显示权利错误。
NSBundle *bundle = nil; NSError *error = nil; bundle = [[NSBundle alloc] initWithPath:bundlePath]; if (!bundle) { return nil; } // Here i can access the keychain as usually [bundle loadAndReturnError:&error]; // Well here it suddenly doesn't work anymore // error is also nil
那么内部的包代码不使用钥匙串。 可能这是某种安全逻辑? 有什么线索吗?
此错误表示您的应用的权利存在问题。 发现:原因通常是应用程序权利中的应用程序标识符前缀与配置文件中的应用程序标识符前缀不匹配。
要进行validation,请使用codesign工具查看应用的权利:
codesign -d --entitlements - MyApp.app/
然后,将应用程序标识符前缀与配置文件中的应用程序标识符前缀进行比较:
cat MyApp.app/embedded.mobileprovision