【问题标题】:Keychain returns nil钥匙串返回零
【发布时间】:2017-10-28 23:47:01
【问题描述】:

最后更新

我正在使用 pod 'KeychainSwift',每次我尝试从 Keychain 中获取一些东西时它都会返回 nil,这是我设置值的函数:

    private func saveUser(email:String!, password:String!)->Bool{
        if keychain.set(email, forKey: "email", withAccess: .accessibleAfterFirstUnlock) {
            if keychain.set(password, forKey: "password") {
                print("User saved succesfully")
                return true
            } else {
                return false
            }
        } else {
            return false
        }
    }

    func setToken(token:String!){
        if keychain.set(token!, forKey: "token", withAccess: .accessibleAfterFirstUnlock) {
            print("Success...")
        } else {
            print("Error: Line 36 GeneraFire")
            print(keychain.lastResultCode)
        }
    }

当我尝试使用此函数检索值时:

func getToken()-> String!{
    return keychain.get("token")
}

它返回 nil(getEmail 和 getPassword 也返回 nil)。 我已经打开了钥匙串共享功能并且我有权利。但它就是行不通。

更新: 更清楚的实际问题是我通过 saveUser 函数保存了用户,它说它保存成功(错误代码 0)但是当我检索它时,它返回 nil,错误代码为“-25300”,我相信根据文档,它代表“找不到项目”

我按照 Yongjoon 做了修改,还是不行,(链接有更新的代码了)

第二次更新 我只是将相同的代码 GeneraFire 放在一个空白项目中,它工作正常。所以我的项目是如何导致问题的。

【问题讨论】:

  • 顺便说一句,您不会将函数的参数声明为隐式展开的可选类型。只需使用String;然后暗示了非可选性。

标签: ios swift keychain


【解决方案1】:

我相信这个问题是由String引起的!强行解开。 GeneraFire 中的所有 String 都由 String! 声明。

func getToken()-> String?{
        return keychain.get("token")
 }

 func getEmail()-> String?{
        return keychain.get("email")
 }

 if let status = result["status"] as? String! 
 >>  if let status = result["status"] as? String

当您不确定向下转换是否会成功时,请使用类型转换运算符(as?)的条件形式。这种形式的运算符将始终返回一个可选值,如果向下转换是不可能的,则该值将为 nil。这使您能够检查是否成功向下转换。

如果让状态 = 结果[“状态”] 为?字符串

  1. 结果[“状态”]为?字符串

因为 result["status"] 返回一个可选值,"as?"表示该值可以为 nil 并强制转换为“String”

  1. 如果让状态

如果转换结果 "result["status"] as?String" 有一个可选值,解包并赋值给状态。

钥匙串共享功能与此问题无关。由于 keychain 是绑定到设备而不是 App,如果您需要在设备中的 App 之间共享 keychain 值,那么您可以启用“Keychain Sharingabilities”

【讨论】:

  • 感谢您的帮助和提示,但遗憾的是我只是修改了它,这不是问题,每次我保存用户时它都会继续给我 nil
  • 还有什么想法吗?
  • 1.首先,确保所有 setter 和 getter 都在不使用 Alamofire 的情况下工作。只是对值进行硬编码,对我来说它是有效的。
  • 已经完成了,我将 func 更改为 { let email = keychain.获取... } 然后我在之后设置了一个断点,并且 email 为 nil,因此问题出在 keychain.get(“email”)
  • func login(email:String!, password:String!, completed: @escaping DownloadComplete){ if(self.saveUser(email: email, password: password))
猜你喜欢
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多