@@ -47,6 +47,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
4747 options _: [ String : NSObject ] ? , completionHandler: @escaping ( Error ? ) -> Void
4848 ) {
4949 logger. info ( " startTunnel called " )
50+ start ( completionHandler)
51+ }
52+
53+ // called by `startTunnel` and on `wake`
54+ func start( _ completionHandler: @escaping ( Error ? ) -> Void ) {
5055 guard manager == nil else {
5156 logger. error ( " startTunnel called with non-nil Manager " )
5257 completionHandler ( makeNSError ( suffix: " PTP " , desc: " Already running " ) )
@@ -95,8 +100,13 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
95100 with _: NEProviderStopReason , completionHandler: @escaping ( ) -> Void
96101 ) {
97102 logger. debug ( " stopTunnel called " )
103+ teardown ( completionHandler)
104+ }
105+
106+ // called by `stopTunnel` and `sleep`
107+ func teardown( _ completionHandler: @escaping ( ) -> Void ) {
98108 guard let manager else {
99- logger. error ( " stopTunnel called with nil Manager" )
109+ logger. error ( " teardown called with nil Manager" )
100110 completionHandler ( )
101111 return
102112 }
@@ -121,15 +131,25 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
121131 }
122132 }
123133
134+ // sleep and wake reference: https://developer.apple.com/forums/thread/95988
124135 override func sleep( completionHandler: @escaping ( ) -> Void ) {
125- // Add code here to get ready to sleep.
126136 logger. debug ( " sleep called " )
127- completionHandler ( )
137+ teardown ( completionHandler )
128138 }
129139
130140 override func wake( ) {
131- // Add code here to wake up.
132141 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+ }
133153 }
134154
135155 // Wrapper around `setTunnelNetworkSettings` that supports merging updates
0 commit comments