[swift] Swift에서 키체인을 사용하여 앱 업데이트 관리하기

앱을 업데이트 할 때마다 사용자의 데이터를 안전하게 유지하는 것은 매우 중요합니다. Swift에서는 키체인(Keychain)을 사용하여 사용자의 개인 데이터를 보호하는 방법을 제공합니다. 키체인은 iOS나 macOS 앱에서 중요한 정보를 안전하게 저장하는 데 사용되며, 앱이 업데이트되어도 정보가 유지됩니다.

키체인에 데이터 저장하기

먼저, Swift에서 키체인에 데이터를 저장하는 방법을 알아보겠습니다. 아래의 코드는 키체인에 문자열 값을 저장하는 예시입니다.

import Security

func saveToKeychain(value: String, forKey key: String) -> Bool {
    if let data = value.data(using: .utf8) {
        let query: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword as String,
            kSecAttrAccount as String: key,
            kSecValueData as String: data,
            kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked as String
        ]

        let status = SecItemAdd(query as CFDictionary, nil)
        return status == errSecSuccess
    }
    return false
}

위의 함수는 valuekey 매개변수를 받아서 키체인에 데이터를 저장하는 역할을 합니다. value 문자열은 데이터로 변환되어 키체인에 저장되며, key는 해당 데이터를 식별하는 용도로 사용됩니다. 저장할 때의 kSecAttrAccessible 속성을 kSecAttrAccessibleWhenUnlocked로 설정하여 잠금해제 상태에서만 접근할 수 있도록 지정합니다.

키체인에서 데이터 가져오기

이제 저장된 데이터를 키체인에서 가져오는 방법을 알아보겠습니다. 아래의 코드는 키체인에서 문자열 값을 가져오는 예시입니다.

import Security

func getValueFromKeychain(forKey key: String) -> String? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword as String,
        kSecAttrAccount as String: key,
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]

    var result: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &result)
    
    if status == errSecSuccess, let data = result as? Data {
        return String(data: data, encoding: .utf8)
    }
    return nil
}

위의 함수는 key 값을 이용하여 키체인에서 데이터를 찾습니다. 찾으면 result에 해당 데이터를 반환하는데, 이 데이터는 Data 타입으로 반환됩니다. 따라서, 이 데이터를 원하는 타입으로 변환하여 사용해야 합니다. 위의 예시에서는 문자열로 변환하여 반환하도록 처리하였습니다.

앱 업데이트 관리하기

키체인을 사용하여 앱 업데이트 관리를 구현하는 방법은 다양하지만, 일반적으로 앱의 버전 정보를 키체인에 저장하여 이를 이용하여 업데이트 여부를 판단하는 방식을 사용합니다.

let currentVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let storedVersion = getValueFromKeychain(forKey: "appVersion")

if storedVersion == nil {
    // 최초 실행 시
    saveToKeychain(value: currentVersion, forKey: "appVersion")
} else if currentVersion != storedVersion {
    // 업데이트가 필요한 경우
    saveToKeychain(value: currentVersion, forKey: "appVersion")
    // 필요한 업데이트 작업 수행
} else {
    // 업데이트가 필요하지 않은 경우
}

위의 코드는 앱의 현재 버전을 currentVersion으로 가져온 후, 키체인에서 저장된 버전을 storedVersion으로 가져옵니다. 만약 처음 실행하는 경우라면 현재 버전을 키체인에 저장하고, 버전이 다르면 업데이트가 필요하므로 버전을 업데이트하고 필요한 업데이트 작업을 수행하면 됩니다. 만약 버전이 같다면 업데이트가 필요하지 않으므로 그냥 넘어가면 됩니다.

결론

Swift에서 키체인을 사용하여 앱 업데이트 관리는 사용자의 데이터를 안전하게 유지하는 데 도움이 됩니다. 키체인에 데이터를 저장하고 가져오는 방법에 대해 알아보았으며, 앱 버전을 이용하여 업데이트 여부를 판단하는 방법도 알아보았습니다. 이러한 방법을 활용하여 안정적인 앱을 개발하는데 도움이 되길 바랍니다.

참고 자료