Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NEVPNManager中使用的Swift中的钥匙链引用_Swift_Vpn_Keychain - Fatal编程技术网

NEVPNManager中使用的Swift中的钥匙链引用

NEVPNManager中使用的Swift中的钥匙链引用,swift,vpn,keychain,Swift,Vpn,Keychain,我正在尝试使用Xcode中的Swift连接到VPN。我正在使用KeychainSwift来保存钥匙链引用。我的代码如下所示: private func connectVPN(completion: @escaping () -> Void) { let keychain = KeychainSwift() keychain.set("<mypassword>", forKey: "passref") keychain.s

我正在尝试使用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'")
                    }
                }
            }
        }
    }
private func connectVPN(完成:@escaping()->Void){
设keychain=KeychainSwift()
keychain.set(“,forKey:“passref”)
keychain.set(“,forKey:“secretref”)
NEVPNManager.shared().loadFromPreferences{中出现错误
让vpnhost=“”
让username=“”
设p=nevpnpprotocolipsec()
p、 用户名=用户名
p、 localIdentifier=用户名
p、 serverAddress=vpnhost
p、 remoteIdentifier=vpnhost
p、 authenticationMethod=.sharedSecret
p、 disconnectOnSleep=false
p、 sharedSecretReference=keychain.getData(“secretref”)
p、 passwordReference=keychain.getData(“passref”)
变量规则=[NEOnDemandRule]()
let rule=NEOnDemandRuleConnect()
rule.interfaceTypeMatch=.any
规则。追加(规则)
NEVPNManager.shared().localizedDescription=“我的VPN”
NEVPNManager.shared().protocolConfiguration=p
NEVPNManager.shared().onDemandRules=规则
NEVPNManager.shared().isOnDemandEnabled=true
NEVPNManager.shared().isEnabled=true
NEVPNManager.shared().saveToPreferences{中出现错误
如果(错误!=nil){
打印(错误!)
}否则{
做{
请尝试NEVPNManager.shared().connection.startVPNTunnel()
完成()
}抓住{
打印(“无法连接VPN”)
}
}
}
}
}
我使用的是
keychain.getData(“secretref”)
,因为这个字段需要

对包含IKE的密钥链项的持久密钥链引用 共同的秘密

更重要的是

持久密钥链引用必须引用 类kSecClassGenericPassword

我不确定我是否做对了。我没有将kSecClassGenericPassword子类化,也没有以任何方式使用它

当我在代码中使用此函数时,一个窗口显示信息,表明此VPN没有共享机密。我想这意味着这个钥匙链不能正常工作

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


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

好的,我有答案。在SecItemCopyMatching的查询中,我必须使用kCFBooleanTrue选择kSecReturnPersistentRef,而不是kSecReturnData。

put log:print(keychain.set(“”,forKey:“secretref”)),我查看了SwiftKeychain库,发现它保存在kSecClassGenericPassword中,并从控制台提供更多信息,请。如果keychain.lastResultCode!=noErr{/*报告错误*/}是的,这里的人就是这么说的:我已经试过了。lastResultCode为0,没有错误。