Ի՞նչն է տարբերությունը 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)
// Գաղտնաբառի օգտագործում
}