Чаму ваша праграма для iPhone не можа ўключыць або выключыць сістэмны VPN
Публічная праграма не можа пераключыць сістэмны VPN, прачытаць яго стан або прымусіць злучэнне. Правілы On Demand, профілі Always On на кантраляваных прыладах і MDM — гэта варыянты.
Кіраўнік прадукта просіць кнопку, якая ўключае карпаратыўны VPN, і запыт гучыць банальна. На iOS гэта не дробная функцыя; яна знаходзіцца па-за публічным кантрактам, і любы абыход ці не праходзіць разгляд, ці ламаецца ў наступным рэлізе. Прайдзіце з запытам праз тое, што платформа фактычна дазваляе, і дызайн амаль напіша сябе сам. Праграма можа валодаць канфігурацыяй VPN і запускаць яе. Праграма не можа дасягнуць сістэмнага перамыкача, не можа прачытаць стан профілю, які яна не стварала, і не можа ўтрымліваць карыстальніка ў сетцы супраць яго волі.
Пачніце з трох рэчаў, якія мае на ўвазе карыстальнік
Аддзяліце значэнні, перш чым аддзяляць API. Часам карыстальнік хоча, каб тунель вашай праграмы быў падключаны, часам — каб перамыкач у Наладах быў уключаны для профілю, які ўсталяваў нехта іншы, а часам — каб тэлефон не мог выходзіць у сетку без тунеля. Гэта адпавядае тром розным механізмам, і толькі першы адкрыты для звычайнай праграмы.
Другое значэнне і спараджае пытанні на Stack Overflow, і падтрыманага адказу на яго няма. Перамыкач у Наладах належыць карыстальніку, а на кіраваных прыладах — профілю. Ніводнае публічнае API не пералічвае канфігурацыі VPN, не паведамляе, ці падняты сістэмны тунель, і не пераключае яго.
Што праграма сапраўды можа стварыць
NetworkExtension дае праграме ўласную канфігурацыю праз NEVPNManager. З правам Personal VPN і згодай карыстальніка праграма захоўвае канфігурацыю, якая з’яўляецца ў Наладах пад яе імем, і можа запускаць або спыняць гэта адзінае злучэнне. Гэта рэальная магчымасць, якую можна прайсці разгляд, і гэта таксама ўвесь аб’ём: менеджар чытае і запісвае толькі тое, што стварыў.
Права не даецца аўтаматычна. Вы запытваеце яго ў Apple і абгрунтоўваеце, навошта праграме наогул тунель, а кліент, чыя адзіная мэта — уключыць чужы профіль, добрага адказу не мае. Пастаўшчыкі пакетных тунеляў ідуць па тым жа правіле з іншым класам: NETunnelProviderManager валодае канфігурацыямі на аснове пастаўшчыка, якія праграма ўсталявала сама. Ні адзін з шляхоў не дасягае профілю, які даставіў MDM.
Згода дзейнічае і ў момант захавання. Запіс канфігурацыі запытвае ў карыстальніка пацверджанне, і гэта не тое, што праграма можа замаўчаць дзеля зручнасці.
Чытанне стану ўпіраецца ў той самы мур
Статус выглядае прыязней за кіраванне і гэтак жа зачынены. NEVPNStatus паведамляе несапраўдны, адключаны, падключэнне, падключаны, пацвярджэнне або адключэнне для ўласнай канфігурацыі праграмы, і пры кожнай змене з’яўляецца апавяшчэнне. Ён нічога не кажа пра тунель, усталяваны профілем кіравання, а гэта менавіта той стан, які хоча бачыць служба падтрымкі.
Маніторынг сеткавага шляху і змены інтэрфейса прапануюць як замену на аглядах дызайну. Яны апісваюць шлях, які праходзіць трафік праграмы, а ён змяняецца па прычынах, не звязаных са станам VPN, і выкарыстанне іх як індыкатара VPN дае інтэрфейс, які хлусіць у абодва бакі.
On Demand і Always On — сапраўдныя рычагі
Падтрыманыя рычагі жывуць у профілі, а не ў праграме. Правілы On Demand кажуць сістэме, калі падключацца: упарадкаваны спіс умоў з дзеяннямі, які ацэньвае аперацыйная сістэма, а не ваш код. Правіла, якое падключаецца на любым інтэрфейсе, стварае адчуванне пастаяннага злучэння, не даючы праграме ніякага кантролю.
Always On VPN — гэта механізм прымусу, і ён прывязаны да нагляду. На паднаглядной прыладзе MDM усталёўвае профіль, які трымае тунель узнятым; на асабістым тэлефоне без нагляду тыя ж ключы не даюць той жа паводзіны. Гэтая асіметрыя наўмысная, і ніякая камбінацыя ключоў карыснай нагрузкі яе не знішчае. Калі патрабаванне сапраўды ў тым, што VPN павінен быць уключаны, патрабаванне насамрэч у тым, што прыладай трэба кіраваць.
Паміж імі стаіць больш слабы брат: правіла, якое перападключаецца пасля адключэння карыстальнікам. Яно падключаецца пры наступнай ацэнцы правіла, а гэта не тое ж, што імгненна, і карыстальнік, які адключыўся наўмысна, заўважыць розніцу. Праектуйце інтэрфейс вакол гэтай шчыліны, а не абяцайце замак.
Адпраўляйце падтрыманы шлях
Чатыры пытанні вырашаюць механізм да таго, як з’явіцца код: каму належыць прылада, ці пад наглядам яна, які кліент завяршае тунель і адкуль бярэцца профіль. Калі хоць адно з гэтага невядома, запыт на функцыю не гатовы да ацэнкі.
Прыватнае API, якое торкае сістэмны VPN, пройдзе дэма і праваліць разгляд, а калі яго адправяць іншым шляхам, ён зламаецца ў наступным рэлізе iOS. Няма варыянту гэтага абмену, які варты перамыкача.
Тэлеметрыя кіравання — асобны канал: яна паведамляе, што профіль усталяваны і ці адпавядае прылада, а гэта справаздачнасць, а не паверхня кіравання для кожнай праграмы. Тэстуйце паток на рэальнай прыладзе пасля кожнага абнаўлення, бо падтрыманыя паводзіны жывуць у АС, а АС рухаецца.