【问题标题】:How can I use Keychain in Mac Catalyst app on Mac?如何在 Mac 上的 Mac Catalyst 应用程序中使用钥匙串?
【发布时间】:2020-02-25 04:37:06
【问题描述】:

我无法在 Mac 上的 Mac-Catalyst 应用程序中写入/读取 Keychain,它分别返回错误 34018 和 25300。有没有办法让 Keychain 在 Mac 上的 Catalyst 应用程序中工作?

Xcode:11.0,MacOS:10.15

这是一个示例代码,它适用于 iOS,但不适用于 Mac。代码打印“我的秘密蜜蜂????”表示我们已成功将此文本写入 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)")
  }
}

【问题讨论】:

    标签: swift macos xcode11 mac-catalyst


    【解决方案1】:

    我在 xcode 中启用了来自签名和功能部分的钥匙串共享,现在我可以将值存储在钥匙串中。

    【讨论】:

    • 非常感谢你。我更改了代码和代码,现在只需添加这些功能,它就可以正常工作了。谢谢,你拯救了我的一天!
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    相关资源
    最近更新 更多