如何解决在新安装的应用程序上在 iPhone 主屏幕上添加小部件后,无法从钥匙串和 UserDefaults 中获取保存的值
在 iPhone 主屏幕上添加后,我遇到了获取保存在 iPhone 钥匙串和 UserDefaults 中的值的问题,但是这些值会出现在在 iPhone 主屏幕上添加小部件之前的小部件预览屏幕中。仅当我在 iPhone 设备中安装新应用程序时才会出现此问题。杀死应用程序实例并再次打开后,它开始工作。如果有人有任何解决方案,请告诉我。
这是用于从钥匙串保存和检索值的代码:
func saveUserToKeychain(withUserName username: String?,andPassword password: String?,isCredentialChanged: Bool?,loggedInStatus: Bool?) {
// Saving user credentials into keychain
if let name = username,!name.isEmpty,let pass = password,!pass.isEmpty,let isChangedCredentials = isCredentialChanged,let isLoggedInStatus = loggedInStatus {
do {
// Setting new data
let keychain = KeychainItemWrapper(identifier: "LoginCredentials",accessGroup: "group.com.test.widgetpoc")
let iv = try AES256.randomInputVector()
let secretPwdKey = "SecretKey"
let digest = pass.data(using: .utf8) ?? Data()
let salt = try AES256.randomSalt()
let key = try AES256.createKey(password: (secretPwdKey.data(using: .utf8) ?? Data()),salt: salt)
let aes = try AES256(key: key,iv: iv)
let encryptedPwd = try aes.encrypt(digest)
keychain[kSecAttrService as String] = key.hexByteArray as AnyObject
keychain[kSecAttrGeneric as String] = iv.hexByteArray as AnyObject
keychain[kSecAttrAccount as String] = name as AnyObject
keychain[kSecValueData as String] = encryptedPwd.hexByteArray as AnyObject
keychain[kSecAttrIsInvisible as String] = isChangedCredentials as Bool as AnyObject
keychain[kSecAttrAccessible as String] = isLoggedInStatus as Bool as AnyObject
} catch {
Log.info("Failed - \(error)")
}
}
}
func retrieveUserFromKeychain() -> ((String,String,Bool),Bool) {
do {
// Fetching saved data
let keychain = KeychainItemWrapper(identifier: "LoginCredentials",accessGroup: "group.com.test.widgetpoc")
let savedUserName = keychain[kSecAttrAccount as String] as? String
if let savedPwd = keychain[kSecValueData as String] as? [UInt8],!savedPwd.isEmpty,let savediv = keychain[kSecAttrGeneric as String] as? [UInt8],!savediv.isEmpty,let savedKey = keychain[kSecAttrService as String] as? [UInt8],!savedKey.isEmpty {
let bytes: [UInt8] = savedKey
let savedKeyData = NSData(bytes: bytes,length: savedKey.count) as Data
let ivBytes: [UInt8] = savediv
let savedivData = NSData(bytes: ivBytes,length: savediv.count) as Data
let savedPwdBytes: [UInt8] = savedPwd
let savedPwdData = NSData(bytes: savedPwdBytes,length: savedPwd.count) as Data
let aesEncrypt = try AES256(key: savedKeyData,iv: savedivData)
let decryptedPwd = try aesEncrypt.decrypt(savedPwdData)
let isCredChanged = keychain[kSecAttrIsInvisible as String] as? Bool
let isUserLoggedIn = keychain[kSecAttrAccessible as String] as? Bool
if let name = savedUserName,let pass = String(bytes: decryptedPwd,encoding: .utf8),let isCredentialChanged = isCredChanged,let userLoggedInStatus = isUserLoggedIn {
return ((name,pass,isCredentialChanged),userLoggedInStatus)
} else {
self.deleteUserFromKeychain()
}
} else {
self.deleteUserFromKeychain()
}
} catch {
self.deleteUserFromKeychain()
}
return (("","",false),false)
}
以下是从 UserDefault 中保存和检索值的代码:
static func getLoggedInStatus() -> Bool {
guard let userDefaults = UserDefaults(suiteName: "group.com.test.widgetpoc"),let loggedInStatus = userDefaults.value(forKey: UserDefaultKeys.userLogInStatusKey) else {
return false
}
return loggedInStatus as? Bool ?? false
}
static func setLoggedInStatus(isLoggedIn: Bool) {
if let userDefaults = UserDefaults(suiteName: "group.com.test.widgetpoc") {
userDefaults.set(isLoggedIn,forKey: UserDefaultKeys.userLogInStatusKey)
userDefaults.synchronize()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。