swift - 如何在 Mac 上的 Mac Catalyst 应用程序中使用钥匙串?
问题描述
我无法在 Mac 上的 Mac-Catalyst 应用程序中写入/读取钥匙串,它分别返回错误 34018 和 25300。有没有办法让 Keychain 在 Catalyst 应用程序中在 Mac 上工作?
Xcode:11.0,MacOS:10.15
这是一个示例代码,它适用于 iOS,但不适用于 Mac。代码打印出“My secretive bee”,表示我们已成功将此文本写入 Keychain,然后从中读取。
override func viewDidLoad() {
super.viewDidLoad()
let itemKey = "My key"
let itemValue = "My secretive bee "
deleteFromKeychain(itemKey: itemKey)
addToKeychain(itemKey: itemKey, itemValue: itemValue)
readFromKeychain(itemKey: itemKey)
}
func deleteFromKeychain(itemKey: String) {
let queryDelete: [String: AnyObject] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: itemKey as AnyObject,
]
let resultCodeDelete = SecItemDelete(queryDelete as CFDictionary)
if resultCodeDelete != noErr {
print("Error deleting from Keychain: \(resultCodeDelete)")
}
}
func addToKeychain(itemKey: String, itemValue: String) {
guard let valueData = itemValue.data(using: String.Encoding.utf8) else {
print("Error saving text to Keychain")
return
}
let queryAdd: [String: AnyObject] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: itemKey as AnyObject,
kSecValueData as String: valueData as AnyObject,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked,
]
let resultCode = SecItemAdd(queryAdd as CFDictionary, nil)
if resultCode != noErr {
print("Error saving to Keychain: \(resultCode)")
}
}
func readFromKeychain(itemKey: String) {
let queryLoad: [String: AnyObject] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: itemKey as AnyObject,
kSecReturnData as String: kCFBooleanTrue,
kSecMatchLimit as String: kSecMatchLimitOne,
]
var result: AnyObject?
let resultCodeLoad = withUnsafeMutablePointer(to: &result) {
SecItemCopyMatching(queryLoad as CFDictionary, UnsafeMutablePointer($0))
}
if resultCodeLoad == noErr {
if let result = result as? Data,
let keyValue = NSString(data: result,
encoding: String.Encoding.utf8.rawValue) as? String {
// Found successfully
print(keyValue)
}
} else {
print("Error loading from Keychain: \(resultCodeLoad)")
}
}
解决方案
我从 xcode 中的签名和功能部分启用了钥匙串共享,现在我可以将值存储在钥匙串中。
推荐阅读
- sql - 如何添加一个约束来停止具有两个相同值的列仅针对 Postgres 中的某些指定值?
- pandas - How to reformat Panda to_period('W-MON') and have correct date?
- python - 添加一个充满滚动计数、总和或平均值的系列
- python - 使用 pd.to_dict,获取具有在 Pandas 中具有重复索引的列键/值对的 dict 列表
- python - 无法从 aws 组织获取整个组织单位列表
- yaml - 无服务器错误:CloudFormation 模板无效:模板错误:Fn::GetAtt 实例引用未定义的资源名称角色
- php - WordPress中的页面特征图像问题
- python - 如何在不附加模块路径的情况下导入不同路径的模块?
- node.js - 如何创建旧版本的 Azure Web Bot?
- sql - 雪花视图 - 组语法编译错误