最后更新
我正在使用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)。 我打开了Keychain Sharing功能,我有权利。但它不会起作用。
更新: 更明确的实际问题是我通过saveUser函数保存用户,并说它成功保存(错误代码0)但是当我检索它时,它返回nil,错误代码为“-25300”,我相信根据文件,它代表“未找到物品”
我根据裴勇俊做了修改但它仍然不起作用(链接现在有更新的代码)
第二次更新 我只是将相同的代码GeneraFire放在一个空白项目中,它工作正常。所以我的项目是如何导致问题的。
答案 0 :(得分:1)
我相信这个问题是由String引起的!强行解开。 GeneraFire中的所有字符串都由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
当您不确定向下转换是否成功时,请使用类型转换运算符的条件形式(作为?)。这种形式的运算符将始终返回一个可选值,如果无法进行向下转换,则该值将为nil。这使您可以检查成功的向下转发。
如果让状态=结果["状态"]为?串
由于结果[" status"]返回一个可选值,"为?"表示该值可以为nil并且转换为" String"
如果投射结果"结果["状态"]为?字符串"有一个可选值,解包并为状态赋值。
Keychain Sharing功能与此问题无关。由于钥匙串绑定到设备而不是应用程序,如果您需要在设备中的应用程序之间共享钥匙串值,那么您可以启用"钥匙串共享功能"