@@ -47,6 +47,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
47
47
options _: [ String : NSObject ] ? , completionHandler: @escaping ( Error ? ) -> Void
48
48
) {
49
49
logger. info ( " startTunnel called " )
50
+ start ( completionHandler)
51
+ }
52
+
53
+ // called by `startTunnel` and on `wake`
54
+ func start( _ completionHandler: @escaping ( Error ? ) -> Void ) {
50
55
guard manager == nil else {
51
56
logger. error ( " startTunnel called with non-nil Manager " )
52
57
completionHandler ( makeNSError ( suffix: " PTP " , desc: " Already running " ) )
@@ -95,8 +100,13 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
95
100
with _: NEProviderStopReason , completionHandler: @escaping ( ) -> Void
96
101
) {
97
102
logger. debug ( " stopTunnel called " )
103
+ teardown ( completionHandler)
104
+ }
105
+
106
+ // called by `stopTunnel` and `sleep`
107
+ func teardown( _ completionHandler: @escaping ( ) -> Void ) {
98
108
guard let manager else {
99
- logger. error ( " stopTunnel called with nil Manager" )
109
+ logger. error ( " teardown called with nil Manager" )
100
110
completionHandler ( )
101
111
return
102
112
}
@@ -121,15 +131,25 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
121
131
}
122
132
}
123
133
134
+ // sleep and wake reference: https://developer.apple.com/forums/thread/95988
124
135
override func sleep( completionHandler: @escaping ( ) -> Void ) {
125
- // Add code here to get ready to sleep.
126
136
logger. debug ( " sleep called " )
127
- completionHandler ( )
137
+ teardown ( completionHandler )
128
138
}
129
139
130
140
override func wake( ) {
131
- // Add code here to wake up.
132
141
logger. debug ( " wake called " )
142
+ self . reasserting = true
143
+ self . currentSettings = . init( tunnelRemoteAddress: " 127.0.0.1 " )
144
+ self . setTunnelNetworkSettings ( nil )
145
+ start { error in
146
+ if let error {
147
+ self . logger. error ( " error starting tunnel after wake: \( error. localizedDescription) " )
148
+ self . cancelTunnelWithError ( error)
149
+ } else {
150
+ self . reasserting = false
151
+ }
152
+ }
133
153
}
134
154
135
155
// Wrapper around `setTunnelNetworkSettings` that supports merging updates
0 commit comments