Sobes.tech
Junior

Ի՞նչն է տարբերությունը Keychain և User Defaults-ի միջև։

sobes.tech AI

Պատասխան AI-ից

UserDefaults օգտագործվում է փոքր, ոչ գաղտնի տվյալների պահպանման համար, ինչպիսիք են օգտատիրոջ կարգավորումները կամ ծրագրի վիճակը: Տվյալները պահվում են բանալի-արժեք զույգերի տեսքով .plist ֆայլում և հասանելի են ծրագրի բոլոր մասերին: UserDefaults տվյալները չի կոդավորում և չի հարմար այն պահելու համար, եթե տվյալներն շատ կարևոր են:

Keychain օգտագործվում է անվտանգ պահելու համար գաղտնի տվյալներ, ինչպիսիք են գաղտնաբառերը, սերտիֆիկատները, տոքենները և այլ զգայուն տեղեկություններ: Տվյալները կոդավորվում և պահվում են հատուկ պահեստում, որը հասանելի է միայն այն ծրագրին, որը դրանք գրել է: Keychain աջակցվում է օպերացիոն համակարգի մակարդակով և ապահովում է բարձր մակարդակի պաշտպանություն:

Հիմնական տարբերությունները՝

Գծագիր UserDefaults Keychain
Նպատակը Անվտանգ չհամարվող կարգավորումների պահպանում Գաղտնի տվյալների պահպանում (գաղտնաբառեր, տոքեններ)
Անվտանգություն Չի պարունակում ներսի կոդավորում Տվյալները կոդավորված են
Մուտք Հասանելի է բոլոր ծրագրի մասերին Հասանելի է միայն այն ծրագրին, որը դրանք գրել է
Տվյալների ծավալ Հարմար է փոքր ծավալների համար Հարմար է փոքր ծավալների գաղտնի տվյալների համար
Իրականացում Պարզ API, պահպանում .plist ֆայլում Ավելի բարդ API, պահպանում համակարգային պահեստում

Օրինակ՝ UserDefaults օգտագործումը՝

// Տվյալների պահպանում
UserDefaults.standard.set("dark", forKey: "theme")

// Տվյալների ստացում
let theme = UserDefaults.standard.string(forKey: "theme")

Օրինակ՝ Keychain օգտագործումը՝

// Գաղտնաբառի ավելացում (պարզեցված, պահանջում է սխալների մշակում)
let password = "mySecretPassword".data(using: .utf8)!
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "myAccount",
    kSecValueData as String: password
]

let statusAdd = SecItemAdd(query as CFDictionary, nil)
// Ստուգում վիճակը

// Գաղտնաբառի ստացում (պարզեցված, պահանջում է սխալների մշակում)
let queryGet: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "myAccount",
    kSecReturnData as String: kCFBooleanTrue!,
    kSecMatchLimit as String: kSecMatchLimitOne
]

var item: CFTypeRef?
let statusGet = SecItemCopyMatching(queryGet as CFDictionary, &item)

if statusGet == errSecSuccess {
    let retrievedData = item as! Data
    let retrievedPassword = String(data: retrievedData, encoding: .utf8)
    // Գաղտնաբառի օգտագործում
}