我正在尝试使用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)"
}
}
我的应用二的代码从共享钥匙串读取并显示:
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")"
}
这是一个非常基本的示例,只是为了尝试该概念,但是我发现,当我在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.
我已经检查了我的权利文件,可以看到它们都包含在两个应用程序中:
此外,当我将鼠标悬停在我的配置文件上时,它告诉我它们已包含在其中:
这是什么使它可以在Xcode模拟器中成功运行吗?我想让它在手机上运行还缺少什么?我认为这与我的证书/配置文件有关,但是我对此还很陌生,因此我不确定我到底需要什么/缺少什么或要检查什么?
任何人都可以帮助或指出正确的方向吗?
我有同样的问题。解决方案非常简单。再次检查钥匙串初始化程序中的accessGroup参数。例如,您在“功能”中添加名称为“ com.myCompany.app”的钥匙串组。但这不是accessGroup的全名。要解决此问题,只需在钥匙串组名称前添加“ App ID前缀”。您可以在App ID配置中的Apple开发人员帐户中找到此前缀。完整的accessGroup名称将为“ XXXXXXXXXX.com.myCompany.app”,其中XXXXXXXXXX是您的应用ID前缀。