微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在新安装的应用程序上在 iPhone 主屏幕上添加小部件后,无法从钥匙串和 UserDefaults 中获取保存的值

如何解决在新安装的应用程序上在 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 举报,一经查实,本站将立刻删除。