Я пишу инструмент VPN, используя структуру NetworkExtension
. Я могу подключиться к IPSec через NEVPNManager.sharedManager
и получить уведомление, когда статус подключения VPN изменится. Но когда я закрываю приложение и снова открываю его, NEVPNManager.Connect.Status
всегда ноль, что означает, что он не может отображать правильное состояние подключения. Как это решить?
Проверка NEVPNManager подключается после перезапуска приложения?
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
Я сделал это. В моем 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
понятно ! должен загрузить конфигурацию vpn перед уведомлением, и тогда NEVPNStatusDidChangeNotification сработал! большое спасибо.
- person William Sterling; 21.08.2016
Вы сохраняете NSObjectProtocol, возвращенный из addObserver? Мой предыдущий фрагмент этого не показывает, но у меня есть:
var notificationObserver:NSObjectProtocol?
как переменная класса в контроллере представления
- person hungri-yeti; 21.08.2016
только что увидел ваш комментарий, рад помочь.
- person hungri-yeti; 21.08.2016
У меня неправильная сортировка уведомлений... последнее уведомление не отражает текущий статус 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