#import "KeychainHelper.h" NS_ASSUME_NONNULL_BEGIN @implementation KeychainHelper + (NSString *)authenticationKey { const char *service = [kKeychainService UTF8String]; const char *account = [kAuthenticationKeyKeychainKey UTF8String]; UInt32 authenticationKeyLength = 0; void *authenticationKeyData = NULL; OSStatus status = SecKeychainFindGenericPassword( NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account, &authenticationKeyLength, &authenticationKeyData, NULL); if (status == errSecSuccess && authenticationKeyData != NULL) { NSString *authenticationKey = [[NSString alloc] initWithBytes:authenticationKeyData length:authenticationKeyLength encoding:NSUTF8StringEncoding]; SecKeychainItemFreeContent(NULL, authenticationKeyData); return authenticationKey; } return nil; } + (OSStatus)setAuthenticationKey:(NSString *)authenticationKey { const char *service = [kKeychainService UTF8String]; const char *account = [kAuthenticationKeyKeychainKey UTF8String]; const char *authenticationKeyCString = [authenticationKey UTF8String]; // First try to find existing item SecKeychainItemRef item = NULL; OSStatus findStatus = SecKeychainFindGenericPassword( NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account, NULL, NULL, &item); OSStatus status; if (findStatus == errSecSuccess) { // Update existing item status = SecKeychainItemModifyAttributesAndData( item, NULL, (UInt32)strlen(authenticationKeyCString), authenticationKeyCString); CFRelease(item); } else { // Create new item status = SecKeychainAddGenericPassword( NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account, (UInt32)strlen(authenticationKeyCString), authenticationKeyCString, NULL); } return status; } + (OSStatus) deleteAuthenticationKey { const char *service = [kKeychainService UTF8String]; const char *account = [kAuthenticationKeyKeychainKey UTF8String]; SecKeychainItemRef item = NULL; OSStatus findStatus = SecKeychainFindGenericPassword( NULL, (UInt32)strlen(service), service, (UInt32)strlen(account), account, NULL, NULL, &item); if (findStatus == errSecSuccess) { OSStatus deleteStatus = SecKeychainItemDelete(item); CFRelease(item); return deleteStatus; } return findStatus; } @end NS_ASSUME_NONNULL_END