我也有這個問題,我花了永遠找出
有一個版本「KeychainWrapper」的左右浮動已是SecItemUpdate的NSAssert內(除其他事項外)。
無論誰做這個事情都是一個蠢事,當爲發佈/發佈構建時,每個NSAssert都是無效的,這意味着代碼甚至無法運行。
例如:
NSAssert(SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck), @"Couldn't update the Keychain Item.");
需求,成爲實際SecItemUpdate是
OSStatus status = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck);
NSAssert(status == noErr, @"Couldn't update the Keychain Item.");
注意如何移動NSAssert外面,而不是結果檢查
重要提示: 嘗試更新kSecValueData的值,而不指定kSecAttrAccount的值,也會導致斷言失敗。所以,如果你的目的是存儲敏感數據(如信用卡號碼的列表)的一個字符串,一定要保存一些「帳戶名」文本在kSecAttrAccount屬性,就像這樣:
static NSString* kCardListXML = @"cardListXML";
static NSString* cardListAccountName = @"cardListAccount";
-(void)setCardListXML:(NSString*)xml {
KeychainItemWrapper* wrapper =
[[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil];
[wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)];
[wrapper setObject:xml forKey:(id)CFBridgingRelease(kSecValueData)];
}
-(NSString*)getCardListXML {
KeychainItemWrapper* wrapper =
[[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil];
[wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)];
return [wrapper objectForKey:CFBridgingRelease(kSecValueData)];
}
我已經想通了,這本質上是問題所在。謝謝。 – iHorse
KeychainWrapper的v1.2中似乎已經修復,可以從Xcode獲取示例代碼 – Olaf