Када градите VPN екран унутар iOS апликације, прво изненађење је да листа протокола у апликацији Подешавања није листа API-ја. Оквир Network Extension дозвољава вашој апликацији да направи једну личну VPN конфигурацију, у власништву те апликације, и прихвата само неколико протоколних објеката. Све остало што људи очекују, од L2TP до преузетог профила, налази се изван те површине или је приватно за Apple. Грешке које следе обично нису багови, то API одбија посао који никада није добио.

Мит: API је уређивач Подешавања

Верује се да, пошто iOS може да конфигурише профиле IKEv1, IKEv2, L2TP и IPsec, апликација може програмски да направи било који од њих. Не може. Оквир излаже апликацији која га позива тачно једно место конфигурације, а то место прихвата само мали скуп јавних протоколних класа. Све остало што људи очекују, од L2TP до преузетог профила, налази се изван те површине или је приватно за Apple.

Грешке које следе обично нису багови. То API одбија посао који никада није добио, а решење је да се екран дизајнира око онога што API поседује.

Три протоколна објекта и они који не постоје

Ваше опције су IKEv1 преко NEVPNProtocolIPSec, IKEv2 преко NEVPNProtocolIKEv2, и NETunnelProviderProtocol ако испоручујете сопствено проширење пакетног тунела. Референца NEVPNManager наводи прихваћене протоколне објекте. L2TP и PPTP се никада не појављују на тој листи јер Apple није објавио класе за њих. Покушај било ког од њих завршава се при чувању грешком или, још горе, конфигурацијом коју систем тихо одбија да користи.

Десктоп код следи друга правила. На macOS-у SCNetworkInterfaceCreateWithInterface слаже тип интерфејса као што је L2TP преко IPv4 и прикачује га на мрежну услугу, а networksetup -connectpppoeservice покреће резултат. Потребна су администраторска права и помоћни алат, јер заједничка тајна и лозинка иду у системски привезак кључева. Копирајте тај дизајн на iOS и ништа се не компајлира.

Проследите референцу привеска кључева, не лозинку

Ниједна од две IKE класе не прихвата лозинку као текст. Две особине passwordReference и sharedSecretReference желе трајну референцу привеска кључева, коју добијате из SecItemCopyMatching захтевом за kSecReturnPersistentRef. Прослеђивање података ставке, или убацивање низа у поље, производи неуспех чувања или везу са празним акредитивима. Референце је трајна само онолико колико је ставка привеска кључева иза ње, зато ставка мора да постоји пре састављања конфигурације. Направите је у истој трансакцији као чување и уклонићете целу класу грешака редоследа.

Аутентикација сертификатом иде другим путем: identityData плус identityDataPassword за PKCS#12 блок. Испорука тог блока унутар пакета апликације је навика пренета из примерног кода, а не одлука о издању, јер лозинка путује са њим и свака копија апликације носи исти идентитет.

Право и доступност портирају све

Менаџер можда уопште не постоји, а разлог је провизионисање. Идентификатор ваше апликације захтева могућност Network Extension заједно са правом за лични VPN, а профил који потписује изградњу мора да носи оба.

Прескочите то и дељена инстанца враћа nil, или чување не успева са грешком која никада не помиње право. Доступност су друга врата. Ако циљате нешто старије од iOS 8, симбол недостаје у време извршавања, па је неуспех пад или nil менаџер, а не менаџер без конфигурације. Проверите окружење извршавања и право пре него што дебагујете свој граф објеката.

Учитајте, измените, сачувајте, затим пратите редослед на захтев

Третирајте животни циклус као учитавање, измену и чување и никада не прескачите учитавање. Док се loadFromPreferences не заврши, менаџер ништа не држи и протоколни објекат не може да се чита или замени.

Друго чување замењује конфигурацију уместо да дода још једну, па недовршено чување може да оштети профил који је радио. Правила на захтев чине уређени низ, и тај редослед је политика. Ставите правило повезивања од било где испред правила искључивања и након ручног искључивања следи тренутно поновно повезивање, што изгледа као дефект али следи документовану процену.

Померите правило искључивања напред када радња корисника мора да победи. Оно што остаје изван контроле апликације једнако је важно. Руте долазе из тунела или серверске политике, а не из поставке коју ви задајете, при чему добављач пакетног тунела извештава о њима када се покрене. Апликација не може да наведе или уреди профиле које су инсталирале друге апликације или конфигурациони профили, зато не обећавајте екран који приказује сваки VPN на уређају.

Повезани чланци