[Mac M2 Pro 12CPU, Ventura 13.6.1, iOS 17.1.2, Xcode 15.0]
前回の記事は暗号化キーを通常のキーチェーンに保管するという内容でした。
このアプリではiPadOS版やwatchOS版とも共有するため、iCloudキーチェーンに保管するようにしました。
Xcodeのプロジェクト設定でCapabilityとしてKeychain Sharingを追加し、アプリのBundle Identifierを登録する必要があります。
コードではKeychainManagerクラスにkSecAttrSynchronizableを追加します。
class KeychainManager {
static func save(key: String, data: Data) -> OSStatus {
let query = [
kSecClass as String : kSecClassGenericPassword as String,
kSecAttrAccount as String : key,
kSecValueData as String : data,
kSecAttrSynchronizable as String: kCFBooleanTrue! ] as [String : Any] // この行を追加
SecItemDelete(query as CFDictionary)
return SecItemAdd(query as CFDictionary, nil)
}
static func load(key: String) -> Data? {
let query = [
kSecClass as String : kSecClassGenericPassword,
kSecAttrAccount as String : key,
kSecReturnData as String : kCFBooleanTrue!,
kSecMatchLimit as String : kSecMatchLimitOne,
kSecAttrSynchronizable as String: kCFBooleanTrue! ] as [String : Any] // この行を追加
var item: CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item)
if status == noErr {
return item as? Data
}
return nil
}
}