你没有分享你的问题的代码,所以我猜你的问题不是钥匙串功能失调,而是一些编码错误。
这是一个常见的陷阱:由于 KeyChain API 是“C”,并且它们只接受 C 样式的空终止字符串缓冲区,因此您通常需要将 CFString/NSString 对象转换为 C 缓冲区,然后再将它们交给 API。
许多使用的东西,如:
const char *usernameCStr = [username UTF8String];
对于 NSString 或其 CFString 伴侣...
const char *CFStringGetCStringPtr(CFStringRef theString, CFStringEncoding encoding); /* May return NULL at any time; be prepared for NULL */
忽略这些 API 可能返回 NULL 的事实。要么是因为 CF/NSString 的内部缓冲区不连续,要么不是您要求的编码,或者不是 c 兼容的。
此类问题在运行时的行为可能与您所描述的完全一样。
在这种情况下,您应该发现问题并使用不同的 API 将 CF/NS 字符串复制到 C 缓冲区中:
Boolean CFStringGetCString(CFStringRef theString, char *buffer, CFIndex bufferSize, CFStringEncoding encoding);
或者
- (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding;