我在iOS应用程序中有一个非常奇怪的行为.
我从iOS 6切换到iOS 7.在iOS 6中,一切都很完美.
我从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
那么内部的包代码不使用钥匙串.可能这是某种安全逻辑?有什么线索吗?