[Swift] 65 メモアプリ製作 その17 データ暗号化 クロスデバイス対応 / iCloudキーチェーン

[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
    }
}