Swift 中的钥匙串引用在 NEVPNManager 中使用

Keychain references in Swift used in NEVPNManager

我正在尝试使用 Xcode 中的 Swift 连接到 VPN。我正在使用 KeychainSwift 来保存钥匙串引用。我的代码如下所示:

    private func connectVPN(completion: @escaping () -> Void) { 
        let keychain = KeychainSwift()
        keychain.set("<mypassword>", forKey: "passref")
        keychain.set("<sharedsecretpassword>", forKey: "secretref")

        NEVPNManager.shared().loadFromPreferences { error in
            let vpnhost = "<11.11.11.11>"
            let username = "<myusername>"

            let p = NEVPNProtocolIPSec()
            p.username = username
            p.localIdentifier = username
            p.serverAddress = vpnhost
            p.remoteIdentifier = vpnhost
            p.authenticationMethod = .sharedSecret
            p.disconnectOnSleep = false

            p.sharedSecretReference = keychain.getData("secretref")
            p.passwordReference = keychain.getData("passref")

            var rules = [NEOnDemandRule]()
            let rule = NEOnDemandRuleConnect()
            rule.interfaceTypeMatch = .any
            rules.append(rule)

            NEVPNManager.shared().localizedDescription = "My VPN"
            NEVPNManager.shared().protocolConfiguration = p
            NEVPNManager.shared().onDemandRules = rules
            NEVPNManager.shared().isOnDemandEnabled = true
            NEVPNManager.shared().isEnabled = true
            NEVPNManager.shared().saveToPreferences { error in
                if (error != nil) {
                    print(error!)
                } else {
                    do {
                        try NEVPNManager.shared().connection.startVPNTunnel()
                        completion()
                    } catch {
                        print("can't connect VPN'")
                    }
                }
            }
        }
    }

我正在使用 keychain.getData("secretref"),因为这个字段需要

A persistent keychain reference to a keychain item containing the IKE shared secret.

更重要的是,

The persistent keychain reference must refer to a keychain item of class kSecClassGenericPassword.

我不太确定我做的是否正确。我没有继承 kSecClassGenericPassword 或以任何方式使用它。

当我在代码中使用此功能时,window 显示信息,表明此 VPN 没有共享密钥。我认为这意味着这个钥匙串不能正常工作。

在 iPhone 设置中,它尝试连接,将开关移向绿色,然后开关立即返回 "off" 状态。当我手动输入与代码中相同的数据时,连接正常。

我做错了什么?我应该纠正什么?

好的,我有答案了。在 SecItemCopyMatching 的查询中,我不得不选择 kSecReturnPersistentRef 和 kCFBooleanTrue - 而不是 kSecReturnData。