OSStatus 错误:[-34018] 设备上不存在所需权利时的内部错误

Chr*_*s S 3 keychain entitlements ios

我正在尝试使用 KeyChainAccess 实现钥匙串共享。我已经构建了两个非常基本的应用程序:应用程序一将字符串写入共享钥匙串,应用程序二从共享钥匙串读取数据并显示它。

我的应用程序一代码:

    override func viewDidLoad() {
    super.viewDidLoad()

    //save item to keychain
    let keychain = Keychain(service: "app.test", accessGroup: "xxxxx.xxxxx.xxxxx.Keychain-Sharing")

    do {
        try keychain.set("Some Data Set in app one", key: "sharedData")
        print("Success")
        label.text = "Success"
    }
    catch let error {
        print("Keychain write failed: \(error)")
        label.text = "Keychain write failed: \(error)"
    }

}
Run Code Online (Sandbox Code Playgroud)

我的应用程序二代码从共享钥匙串读取和显示:

override func viewDidLoad() {
    super.viewDidLoad()

    //load item from keychain
    let keychain = Keychain(service: "app.test", accessGroup: "xxxxx.xxxxx.xxxxx.Keychain-Sharing")

    let data = try? keychain.get("sharedData")

    print("Data from Keychain: \(data ?? "nil")")

    label.text = "Data from Keychain: \(data ?? "nil")"
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常基本的示例,只是为了尝试这个概念,但是我发现当我在 Mac 上使用 Xcode 的模拟器运行它时,它的行为符合预期,我运行第一个应用程序 - 它成功了,然后我运行第二个应用程序和显示正确的字符串。

当我然后尝试在设备上运行它时(通过将我的设备插入我的 Mac 并更改运行位置,我在尝试从共享钥匙串写入和读取时收到以下错误:

   OSStatus error:[-34018] Internal error when a required entitlement isn't present, client has neither application-identifier nor keychain-access-groups entitlements.
Run Code Online (Sandbox Code Playgroud)

我检查了我的权利文件,我可以看到它们都包含在两个应用程序中:

在此处输入图片说明

并且在构建设置中正确引用了权利文件: 在此处输入图片说明

此外,当我将鼠标悬停在我的配置文件上时,它告诉我它们已包含在内:

在此处输入图片说明

这是让它在 Xcode 模拟器中成功运行的原因吗?我还缺少什么才能让它在手机上运行?我认为这与我的证书/配置文件有关,但我对此很陌生,所以我不确定我到底需要/缺少什么或要检查什么?

任何人都可以帮助或指出我正确的方向吗?

小智 8

我遇到过同样的问题。解决方案非常简单。再次检查钥匙串初始化程序中的 accessGroup 参数。例如,您在功能中添加名为“com.myCompany.app”的钥匙串组。但它不是accessGroup的全名。要解决此问题,只需在钥匙串组名称前添加“App ID 前缀”即可。您可以在 App ID 配置中的 Apple 开发者帐户中找到此前缀。完整的访问组名称将为“XXXXXXXXXX.com.myCompany.app”,其中 XXXXXXXXXX 是您的 App ID 前缀。