在 OS10 中使用返回 nil 的 A0SimpleKeychain 检索钥匙串值

Retrieving keychain value with A0SimpleKeychain returning nil in OS10

我是 swift 的新手,请多多包涵。我正在尝试使用 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 中的一个错误,至少在模拟器中,没有遵守或没有设置默认钥匙串权利 application-identifier 并且要激活它,您还必须启用 keychain-access-groups 权利。

[编辑] 如果您将构建目标更改为 8.4 并模拟 8.4 设备,您将看到它在不修改设置的情况下工作。

要在 iOS 10 下工作,在目标的项目设置下,转到第二个选项卡 Capabilities 并启用 "Keychain Sharing"。系统将提示您输入 Apple ID 密码,并询问要将钥匙串附加到哪个 Apple ID。

您深入了解的错误代码是-34018。您确实需要检查 setString 的 return 值,可以是 false.

(编辑) 参考: A0SimpleKeyChain.m:151 OSStatus 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

"From a high level perspective, Keychain Services uses an app’s code signature with its embedded entitlements to ensure that only an authorized app can access a particular keychain item."