NEVPNManager在重新启动应用后如何检查是否已连接?

10

我正在编写一个使用NetworkExtension框架的VPN工具。我可以通过NEVPNManager.sharedManager连接IPSec,并且可以在VPN连接状态改变时获取通知。但是当我关闭应用程序并重新打开它时,NEVPNManager.Connect.Status始终为零,这意味着无法显示正确的连接状态。如何解决这个问题?


你关闭应用后,状态栏中是否仍然看到[VPN]指示器? - hungri-yeti
是的,VPN仍在连接。 - William Sterling
2个回答

9
William Sterling的评论很有道理,而且对我也有效,
在为NEVPNStatusDidChange添加观察者之前,像下面这样为VPN管理器对象加载偏好设置,
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)

     }

6

试试这个:

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

我已经这样做了,在我的viewController中,代码是`[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(VPNStatusChanged:) name:NEVPNStatusDidChangeNotification object:nil];//状态始终为NEVPNStatusInvalid ... NSLog(@“vpn状态为%ld”,[NEVPNManager sharedManager] .connection.status);` 我可以观察状态。但是如果杀掉应用程序并重新打开,则状态始终为无效。 - William Sterling
3
明白了!必须在通知之前加载VPN配置,然后NEVPNStatusDidChangeNotification才能起作用!非常感谢。 - William Sterling
1
你是否保留了从addObserver返回的NSObjectProtocol对象?我的以前的代码片段没有展示它,但我已经在视图控制器中声明了一个类变量: var notificationObserver:NSObjectProtocol? - hungri-yeti
刚看到你的评论,很高兴能帮助到你。 - hungri-yeti
我在通知上遇到了错误的排序...最后一条通知没有反映出当前的VPN状态。这可能吗? - Lubbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接