NEVPNManager не захоўвае? Парадак: загрузіць, уключыць, захаваць, падключыцца
Код 4 і код 5 звычайна азначаюць, што профіль адрэдагаваны да загрузкі або захаваны, пакуль ён быў адключаны. Выпраўце парадак выклікаў, потым праверце права.
Два коды памылкі тлумачаць большасць першых спроб Network Extension VPN на iOS: NEVPNErrorDomain Code=4 і Code=5. Ні адзін з іх не скарга сервера. Адзін з’яўляецца, калі праграма піша налады ў аб’ект, які ніколі не чытаўся з дыска, а другі — калі сам запіс не ўдаецца, часцей за ўсё таму, што профіль захоўваецца, пакуль ён яшчэ адключаны. Абодва выпраўляюцца зменай парадку чатырох выклікаў, а не крананнем параметраў IKEv2.
Спачатку загрузіце, інакш захаванню няма з чым параўнаць
Менеджэр трымае копію захаванага профілю, і аб’ект, які вы рэдагуеце, не з’яўляецца гэтай копіяй, пакуль вы яго не прачытаеце. Спачатку выклічце loadFromPreferences, рэдагуйце ўнутры яго апрацоўшчыка завяршэння, потым захавайце. Калі прапусціць чытанне, рамка ўбачыць разыходжанне паміж тым, што ў яе ёсць, і тым, што вы пішаце. У Swift форма аднаковая для кожнага кроку, і кожны крок належыць свайму замыканню:
let mgr = NEVPNManager.shared()
mgr.loadFromPreferences { loadErr in
guard loadErr == nil else { return }
let proto = NEVPNProtocolIKEv2()
proto.serverAddress = "vpn.example.net"
proto.username = "alice"
proto.useExtendedAuthentication = true
mgr.protocolConfiguration = proto
mgr.isEnabled = true
mgr.saveToPreferences { saveErr in
// do not start here; reload, then connect
}
}
Запуск тунеля знутры замыкання захавання — гэта тая ж памылка ў іншым месцы. Ён выконваецца да таго, як профіль будзе перачытаны, таму выклік запуску бачыць стан, які вы пабудавалі, а не стан, які быў захаваны. Замыканне захавання завяршаецца другім loadFromPreferences, і толькі гэты апрацоўшчык завяршэння выклікае startVPNTunnel.
Сцяг уключэння — частка захавання
Захаваны профіль бяздзейны, пакуль яго не ўключаць. Усталюйце isEnabled = true у тым жа запісе, інакш профіль трапіць на дыск адключаным, і startVPNTunnel адмовіцца, нават калі Налады паказваюць канфігурацыю, якая выглядае поўнай.
Знешнія правакі — другая палова гэтага. Калі карыстальнік нешта змяняе ў Наладах або прылада перамяшчаецца паміж сеткамі, перачытайце, перш чым давяраць значэнням, якія вы яшчэ трымаеце ў памяці. Аб’ект не назірае гэтыя змены за вас. Састарэлая копія — гэта тое, як праграма запісвае профіль, які ціха адкочвае праваку карыстальніка. Два суседнія палі ствараюць ціхую праблему ў той жа момант: правілы on-demand павінны быць масівам аб’ектаў правілаў, а не пустой заглушкай, а disconnectOnSleep павінен адлюстроўваць паводзіны, якія вы выбралі, а не скапіяванае значэнне па змаўчанні.
Трэцім бакам даступныя толькі два пратаколы
Network Extension дае праграмам IPsec і IKEv2. L2TP і PPTP застаюцца ўнутры сістэмы, таму праграма, якой яны патрэбны, не можа іх атрымаць, і рэалістычныя адказы — шлюз з падтрымкай IKEv2 або кіраваны профіль канфігурацыі.
Уліковыя даныя ідуць па той жа схеме. Пакладзіце пароль у Keychain і перадайце пастаянную спасылку замест радка. Пустая спасылка падчас захавання звычайна азначае, што пошук выканаўся раней, чым элемент быў запісаны, а не што менеджэр зламаны.
І тое, і другое — рашэнні дызайну, а не абыходныя шляхі. Праграма, якая трымае пароль у сваіх уласных наладах, выбірае шлях, які рамка не ўхваляе, і яе збой чытаецца як памылка захавання.
Выключыце адсутнасць права, перш чым перапісваць код
Калі loadFromPreferences увогуле не выклікае зваротны выклік, верагодная прычына — адсутная магчымасць Network Extension або профіль забеспячэння, які яе не змяшчае. Такі збой завісае замест таго, каб выдаць памылку, і менавіта таму працоўны код перапісваюць гадзінамі. Праверце права ў падпісанай зборцы, якую вы збіраецеся выпускаць, бо запуск у сімулятары і на прыладзе можа адрознівацца, а важная мэта — гэта прылада. Адкрыйце налады подпісу мэты і пацвердзіце, што магчымасць Network Extension прысутнічае менавіта для гэтай зборкі.
Профіль забеспячэння без права збойвае гэтак жа на абсталяванні, хаця тая ж зборка можа нармальна загружацца ў сімулятары. Праверце падпісаны архіў на рэальнай прыладзе, перш чым перапісваць парадак выклікаў.
Сачыце за зменамі стану, а не за здагадкамі
Назірайце NEVPNStatusDidChangeNotification і запісвайце manager.connection.status пасля кожнага кроку. Стан, які ніколі не пакідае invalid, азначае, што профіль не захаваны або права адсутнічае. Злучэнне, якое дасягае connecting і ніколі не падключаецца, паказвае на прапанову або ўліковыя даныя, а гэта іншае расследаванне з іншымі доказамі.
Пацвердзіце, што профіль з’яўляецца ў раздзеле Налады, Агульныя, VPN, і запішыце памылку з кожнага замыкання. Гэтыя два факты аддзяляюць памылку парадку ад памылкі дазволаў без здагадак.