[swift] Swift에서 키체인을 사용하여 사용자 알림 설정 동기화하기

많은 앱에서, 사용자 알림 설정을 저장하고 동기화하는 것은 중요한 작업입니다. 이를 위해 Swift에서는 키체인(Keychain)을 사용할 수 있습니다. 키체인은 보안에 민감한 정보를 안전하게 저장할 수 있는 기능을 제공합니다.

키체인에 알림 설정 저장하기

import UIKit
import Security

let service = "com.example.app"
let userDefaultsKey = "notificationEnabled"

func saveNotificationSetting(enabled: Bool) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: userDefaultsKey
    ]
    
    let value = enabled ? kSecAttrSynchronizableAny : kSecAttrSynchronizableNone
    
    let status = SecItemCopyMatching(query as CFDictionary, nil)
    
    switch status {
    case errSecSuccess:
        // 이미 값이 저장되어 있는 경우 값을 업데이트합니다.
        let updateQuery: [String: Any] = [
            kSecValueData as String: value
        ]
        let updateStatus = SecItemUpdate(query as CFDictionary, updateQuery as CFDictionary)
        if updateStatus != errSecSuccess {
            print("키체인 값 업데이트 실패")
        }
        
    case errSecItemNotFound:
        // 값이 저장되어 있지 않은 경우 신규로 저장합니다.
        let item: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrService as String: service,
            kSecAttrAccount as String: userDefaultsKey,
            kSecValueData as String: value
        ]
        let status = SecItemAdd(item as CFDictionary, nil)
        if status != errSecSuccess {
            print("키체인 값 저장 실패")
        }
        
    default:
        print("키체인 값 확인 실패")
    }
}

위의 코드는 saveNotificationSetting(enabled: Bool)이라는 함수를 정의합니다. 이 함수는 알림 설정을 저장하기 위해 키체인을 사용합니다. 함수 내부에서는 키체인에 해당 설정이 이미 저장되어 있는지 확인하고, 값이 저장되어 있지 않은 경우에는 신규로 저장합니다. 값이 이미 저장되어 있는 경우에는 값을 업데이트합니다.

키체인에 저장할 정보는 serviceuserDefaultsKey 변수를 이용해 지정합니다. service 변수에는 앱의 고유한 식별자를 사용하고, userDefaultsKey 변수에는 알림 설정을 저장할 키를 지정합니다.

키체인에서 알림 설정 불러오기

func loadNotificationSetting() -> Bool? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: userDefaultsKey,
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    
    var result: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &result)
    
    guard status != errSecItemNotFound,
          let data = result as? Data,
          let value = String(data: data, encoding: .utf8) else {
        return nil
    }
    
    return value == kSecAttrSynchronizableAny
}

위의 코드는 loadNotificationSetting()라는 함수를 정의합니다. 이 함수는 키체인에서 알림 설정을 불러와서 반환합니다. 함수 내부에서는 키체인에서 값을 불러오고, 값이 없는 경우에는 nil을 반환합니다.

키체인에서 알림 설정 삭제하기

func deleteNotificationSetting() {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: userDefaultsKey
    ]
    
    let status = SecItemDelete(query as CFDictionary)
    
    if status != errSecSuccess {
        print("키체인 값 삭제 실패")
    }
}

위의 코드는 deleteNotificationSetting()이라는 함수를 정의합니다. 이 함수는 키체인에서 알림 설정을 삭제합니다.

사용자 알림 설정 동기화하기

이제 앱에서 사용자 알림 설정을 저장하고 불러오는 방법을 알았습니다. 이를 사용하여 사용자의 다른 기기에서도 동일한 알림 설정을 사용할 수 있도록 설정을 동기화할 수 있습니다.

예를 들어, 알림 설정이 변경될 때마다 저장된 알림 설정을 키체인에 저장하고, 알림 설정을 불러와서 앱에 적용합니다. 또한 앱이 시작될 때 키체인에서 저장된 알림 설정을 불러와서 적용할 수 있습니다.

이를 통해 사용자는 동일한 알림 설정을 사용하면서 여러 기기에서 이를 동기화할 수 있습니다.

결론

Swift에서는 키체인을 사용하여 사용자 알림 설정을 안전하게 저장하고 동기화할 수 있습니다. 앱에서 알림 설정을 저장하고 불러오는 방법을 알아보았으며, 이를 활용하여 사용자의 알림 설정을 동기화하는 방법을 알아보았습니다. 이를 사용하여 사용자가 여러 기기에서 동일한 알림 설정을 사용할 수 있도록 할 수 있습니다.

참고 문서: