我对斯威夫特不熟悉,所以请容忍我。我正在尝试使用auth0的库a0simplekeychain存储用户的令牌:https://github.com/auth0/SimpleKeychain。我跟踪了他们的文档,发现了这个登录功能:

@IBAction func login(_ sender: UIButton) {
    let payload: Parameters = [
        "username": self.usernameTextField.text!,
        "password": self.passwordTextField.text!
    ]

    Alamofire.request("my/url", method: .post, parameters: payload, encoding: JSONEncoding.default).responseJSON { response in

        let json = JSON(response.result.value)
        let token = json["token"]

        let jwtToken = token.string!

        A0SimpleKeychain().setString(jwtToken, forKey:"user-jwt")

        let jwt = A0SimpleKeychain().string(forKey: "user-jwt")

        print(jwt)
    }
}

我的问题是print(jwt)应该打印令牌而不是nil。如果我打印出jwtToken的值,它就会打印出正确的值,所以我知道它不是零。我试着放一个“test”字符串,看看我的jwtToken是否有问题,因为我仍然在理解选项并解开它们,但它也只是返回了nil。
A0SimpleKeychain().setString("testString", forKey:"user-jwt")
我在OSX 10.11.6和Swift 3上运行

最佳答案

密码没问题。这是一个项目设置问题。钥匙链不存在于真空中;为了安全,它们只允许由代码签名应用程序指定的权利进行操作,并且由于代码签名,这些权限在生成时被密封。似乎xcode/ios 10中的一个bug,至少在模拟器中,不尊重或不设置默认的密钥链权利application-identifier,要激活它,您还必须启用keychain-access-groups权利。
[编辑]如果将生成目标更改为8.4并模拟8.4设备,您将看到它在不修改设置的情况下工作。
要在ios 10下工作,在目标的项目设置下,转到第二个选项卡Capabilities并启用“keychain sharing”。系统会提示您输入Apple ID密码,并询问您要将密钥链附加到哪个Apple ID。
你得到的错误代码是-34018。您确实需要检查setString的返回值,它可以是false
(编辑)
参考:
a0simplekeychain.m:151OSStatus status = SecItemAdd((__bridge CFDictionaryRef)newQuery, NULL);>-34018
SecItemAdd and SecItemCopyMatching returns error code -34018 (errSecMissingEntitlement)
https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html
“从高层次的角度来看,密钥链服务使用应用程序的代码签名及其嵌入的权限,以确保只有经过授权的应用程序才能访问特定的密钥链项。”

09-10 10:06