Проверка NEVPNManager подключается после перезапуска приложения?

Я пишу инструмент VPN, используя структуру NetworkExtension. Я могу подключиться к IPSec через NEVPNManager.sharedManager и получить уведомление, когда статус подключения VPN изменится. Но когда я закрываю приложение и снова открываю его, NEVPNManager.Connect.Status всегда ноль, что означает, что он не может отображать правильное состояние подключения. Как это решить?


person William Sterling    schedule 20.08.2016    source источник
comment
После закрытия приложения вы все еще видите индикатор [VPN] в строке состояния?   -  person hungri-yeti    schedule 21.08.2016
comment
да, VPN все еще подключается.   -  person William Sterling    schedule 21.08.2016


Ответы (2)


Попробуй это:

func viewDidLoad() {
    // Register to be notified of changes in the status. These notifications only work when app is in foreground.
    notificationObserver = NSNotificationCenter.defaultCenter().addObserverForName(NEVPNStatusDidChangeNotification, object: nil , queue: nil) {
       notification in

       print("received NEVPNStatusDidChangeNotification")

       let nevpnconn = notification.object as! NEVPNConnection
       let status = nevpnconn.status
       self.checkNEStatus(status)
    }
}



func checkNEStatus( status:NEVPNStatus ) {
    switch status {
    case NEVPNStatus.Invalid:
      print("NEVPNConnection: Invalid")
    case NEVPNStatus.Disconnected:
      print("NEVPNConnection: Disconnected")
    case NEVPNStatus.Connecting:
      print("NEVPNConnection: Connecting")
    case NEVPNStatus.Connected:
      print("NEVPNConnection: Connected")
    case NEVPNStatus.Reasserting:
      print("NEVPNConnection: Reasserting")
    case NEVPNStatus.Disconnecting:
      print("NEVPNConnection: Disconnecting")
  }
}

Приведенный выше код должен генерировать следующие сообщения при запуске приложения с уже подключенным VPN:

checkNEStatus:  NEVPNConnection: Invalid  
viewDidLoad:    received NEVPNStatusDidChangeNotification  
checkNEStatus:  NEVPNConnection: Connected
person hungri-yeti    schedule 21.08.2016
comment
Я сделал это. В моем viewController код is[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(VPNStatusChanged:) name:NEVPNStatusDidChangeNotification object:nil]; // the status always NEVPNStatusInvalid ... NSLog(@"vpn status is %ld", [NEVPNManager sharedManager].connection.status);, и я могу наблюдать за состоянием. но если убить приложение и снова открыть, состояние всегда недействительно. - person William Sterling; 21.08.2016
comment
понятно ! должен загрузить конфигурацию vpn перед уведомлением, и тогда NEVPNStatusDidChangeNotification сработал! большое спасибо. - person William Sterling; 21.08.2016
comment
Вы сохраняете NSObjectProtocol, возвращенный из addObserver? Мой предыдущий фрагмент этого не показывает, но у меня есть: var notificationObserver:NSObjectProtocol? как переменная класса в контроллере представления - person hungri-yeti; 21.08.2016
comment
только что увидел ваш комментарий, рад помочь. - person hungri-yeti; 21.08.2016
comment
У меня неправильная сортировка уведомлений... последнее уведомление не отражает текущий статус VPN. Является ли это возможным? - person Lubbo; 01.10.2019

Комментарий Уильяма Стерлинга действительно имеет смысл, и он работает для меня,

Перед добавлением наблюдателя для NEVPNStatusDidChange настроек загрузки для объекта VPN Manager, как показано ниже,

override func viewDidLoad() {

        super.viewDidLoad()

        self.vpnManager.loadFromPreferences { (error) in
            if error != nil {
                print(error.debugDescription)
            }
            else{
                print("No error from loading VPN viewDidLoad")
            }
        }

        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.VPNStatusDidChange(_:)), name: NSNotification.Name.NEVPNStatusDidChange, object: nil)

     }
person Mukesh    schedule 07.12.2017