This repository has been archived by the owner on Jul 28, 2020. It is now read-only.
/
ViewController.swift
132 lines (113 loc) · 4.34 KB
/
ViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//
// ViewController.swift
// NEPacketTunnelVPNDemo
//
// Created by lxd on 12/8/16.
// Copyright © 2016 lxd. All rights reserved.
//
import UIKit
import NetworkExtension
class ViewController: UIViewController {
var vpnManager: NETunnelProviderManager = NETunnelProviderManager()
@IBOutlet var connectButton: UIButton!
// Hard code VPN configurations
let tunnelBundleId = "ne.packet.tunnel.vpn.demo.tunnel"
let serverAddress = "<server-ip>"
let serverPort = "54345"
let mtu = "1400"
let ip = "10.8.0.2"
let subnet = "255.255.255.0"
let dns = "8.8.8.8,8.4.4.4"
private func initVPNTunnelProviderManager() {
NETunnelProviderManager.loadAllFromPreferences { (savedManagers: [NETunnelProviderManager]?, error: Error?) in
if let error = error {
print(error)
}
if let savedManagers = savedManagers {
if savedManagers.count > 0 {
self.vpnManager = savedManagers[0]
}
}
self.vpnManager.loadFromPreferences(completionHandler: { (error:Error?) in
if let error = error {
print(error)
}
let providerProtocol = NETunnelProviderProtocol()
providerProtocol.providerBundleIdentifier = self.tunnelBundleId
providerProtocol.providerConfiguration = ["port": self.serverPort,
"server": self.serverAddress,
"ip": self.ip,
"subnet": self.subnet,
"mtu": self.mtu,
"dns": self.dns
]
providerProtocol.serverAddress = self.serverAddress
self.vpnManager.protocolConfiguration = providerProtocol
self.vpnManager.localizedDescription = "NEPacketTunnelVPNDemoConfig"
self.vpnManager.isEnabled = true
self.vpnManager.saveToPreferences(completionHandler: { (error:Error?) in
if let error = error {
print(error)
} else {
print("Save successfully")
}
})
self.VPNStatusDidChange(nil)
})
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
initVPNTunnelProviderManager()
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.VPNStatusDidChange(_:)), name: NSNotification.Name.NEVPNStatusDidChange, object: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func VPNStatusDidChange(_ notification: Notification?) {
print("VPN Status changed:")
let status = self.vpnManager.connection.status
switch status {
case .connecting:
print("Connecting...")
connectButton.setTitle("Disconnect", for: .normal)
break
case .connected:
print("Connected...")
connectButton.setTitle("Disconnect", for: .normal)
break
case .disconnecting:
print("Disconnecting...")
break
case .disconnected:
print("Disconnected...")
connectButton.setTitle("Connect", for: .normal)
break
case .invalid:
print("Invliad")
break
case .reasserting:
print("Reasserting...")
break
}
}
@IBAction func go(_ sender: UIButton, forEvent event: UIEvent) {
print("Go!")
self.vpnManager.loadFromPreferences { (error:Error?) in
if let error = error {
print(error)
}
if (sender.title(for: .normal) == "Connect") {
do {
try self.vpnManager.connection.startVPNTunnel()
} catch {
print(error)
}
} else {
self.vpnManager.connection.stopVPNTunnel()
}
}
}
}