Метод в приложении AppdelegateWillTerminate не вызывается с использованием SwiftUI iOSIOS

Программируем под IOS
Ответить
Anonymous
 Метод в приложении AppdelegateWillTerminate не вызывается с использованием SwiftUI iOS

Сообщение Anonymous »

У меня есть приложение, которое настраивает VPN-соединение через соединение Wireguard. приложение использует жизненный цикл AppDelegate, даже если оно находится в SwiftUI.
Мне нужно разорвать VPN-соединение, запущенное через Wireguard, когда приложение закрывается (а не в фоновом режиме). Как этого добиться?
Я пробовал:
  • Центр уведомлений
  • семафоры
  • наблюдение за исчезновением ContentView (является основным представлением)
  • и установка приложения может быть немедленно завершено, когда пользователь завершает работу или выходит из системы НЕТ
в этом случае applicationWillTerminate вызывается ИНОГДА. но мой метод - нет.
мое приложение в настоящее время не поддерживает фоновую активность, но, возможно, в будущем это будет, я читал, что это может как-то мешать, но информация, которую я нашел, немного устарела
р>
@main
struct testWireGuardInstructions01SwiftUIApp: App {

//used to replicate old UIKit appDelegate 1/2
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(MyManager.shared)
}
}
}

//MARK: - section used to replicate UIKit app delegate behaviour

//used to replicate old UIKit appdelegate 2/2
class AppDelegate: UIResponder, UIApplicationDelegate {

let myManager = MyManager.shared
var bgTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 0);

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

Logger.info("loaded didFinishLaunchingWithOptions")

return true
}

func applicationWillTerminate(_ application: UIApplication) {
Logger.info("applicationWillTerminate")
myManager.turnOffTunnel()
}

}

метод, который мне нужно вызвать
func turnOffTunnel() {

NETunnelProviderManager.loadAllFromPreferences { tunnelManagersInSettings, error in
if let error = error {
NSLog("Error (loadAllFromPreferences): \(error)")
return
}
if let tunnelManager = tunnelManagersInSettings?.first {
guard let session = tunnelManager.connection as? NETunnelProviderSession else {
fatalError("tunnelManager.connection is invalid")
}
switch session.status {
case .connected, .connecting, .reasserting:
NSLog("Stopping the tunnel")
session.stopTunnel()
DispatchQueue.main.async {
self.isConnected = false
}
default:
break
}
}
}

}


Подробнее здесь: https://stackoverflow.com/questions/785 ... swiftui-io
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»