Защо приложението ви за 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. Няма версия на тази размяна, която да си струва за един превключвател.
Телеметрията за управление е отделен канал: тя съобщава, че профил е инсталиран и дали устройството е съвместимо, което е отчетност, а не повърхност за контрол на приложение. Тествайте потока на реално устройство след всяка актуализация, защото поддържаното поведение живее в операционната система, а тя се движи.