Қолданбаңыз ажыратылған дейді, мәзір жолағы қосылған дейді, ал трафик анық ағып тұр. Бұл алшақтық қайталап көрумен түзетілетін жарыс жағдайы емес: қолданба мен туннель бөлек процестер, ал кодыңыз оқитын нысан — жүйе сақтайтын конфигурацияның кэштегі көрінісі. Apple-дың Personal VPN беті — басқару API-і, деректер жолы емес, және оның оғаш мінезінің көбі осы бір фактіден туындайды. Әр шақыруда шын мәнінде не болатыны мынау.

Менеджер нысаны — кэштегі көрініс, туннель емес

NETunnelProviderManager жүйеге тиесілі теңшелімдер қоймасынан толтырылады, сондықтан loadFromPreferences аяқталмайынша оның қасиеттері ештеңе білдірмейді. Оған дейін connection.status оқысаңыз, әдепкі мән аласыз, сондықтан қайта іске қосқаннан кейінгі алғашқы күй жаңартуы туннель жұмыс істеп тұрса да ажыратылған деп хабарлайды. Алдымен жүктеңіз, содан кейін күй мен протокол конфигурациясын сол аяқтау өңдегішінен оқыңыз. Кейінгі өзгерістерді сұрау жасаудың орнына NEVPNStatusDidChange арқылы бақылаңыз, және хабарлама On Demand іске қосқан қосылымдар үшін де іске қосылатынын ескеріңіз, онда бірдеңе қайтаратын қолданба шақыруы мүлде жоқ. Протокол теңшелімдеріне де сол қатысты: олар жүктелген конфигурациядан оқылады, қолданба бергеннен емес.

Туннельдің өзі Network Extension провайдерінің процесінде өмір сүреді, сондықтан қолданба байланысты жоғалтпай өз күйін жоғалтуы мүмкін. Интерфейс көрсететіннің бәрі менеджерден қайта құрылуы керек, өткен сессиядан есте сақталмауы керек.

Іске қосу тәртібі: сақта, жүкте, содан кейін іске қос

Провайдерге негізделген қосылымға ретімен үш қадам керек. Провайдер конфигурациясын жазып, saveToPreferences шақырыңыз, менеджерді жүктеңіз, сонда сақталған конфигурация қолыңыздағы болсын, содан кейін NETunnelProviderSession.startVPNTunnel() арқылы іске қосыңыз. Сақтауды өткізіп жіберсеңіз, іске қосудың іске қосатын ештеңесі жоқ; сақтаудан бұрын жүктесеңіз, менеджер әлі ескі конфигурацияны бейнелейді.

startVPNTunnel қайтаратын логикалық мән тек сұраныстың қабылданғанын айтады. Провайдер деңгейіндегі сәтсіздіктер кейінірек ажыратылған күйге өзгеру ретінде келеді, оны NEVPNStatusDidChange хабарламасы арқылы бақылайсыз, ал хабарлама өңдегіші loadFromPreferences кейін connection.status қайта оқуы керек, өйткені кэштегі мән әлі ескі болуы мүмкін. Сұраныс деңгейіндегі сәтсіздіктер шақырудың ерекшелік лақтыратын түрінен бірден қайтады немесе startVPNTunnelAndReturnError: қате шығу параметрі арқылы. Қайтарылған мәнді нәтиже деп қарайтын код ешқашан орнамаған қосылым туралы хабарлайды. Тағы бір үнсіз сәтсіздік — орнатылған кеңейтімге сәйкес келмейтін провайдер бума идентификаторы: сұраныс қабылданбайды, және хабарламада ештеңе идентификаторға нұсқамайды. Идентификатор қате болса, сұраныс әдетте бірден сәтсіз аяқталады, провайдер журналының бір жолы да шықпай тұрып.

Іске қосудан кейін теңшелімдерді қайта жүктеу — күй экрандарын дұрыс ететін нәрсе. Жүйе конфигурацияны өзгерткенде менеджер сізге жаңа конфигурацияны итермейді.

Сенім материалы профиль арқылы келеді, ешқашан қолданба кодынан емес

Қолданбаның iOS сенім қоймасына тамыр сертификатын қосуға қолдау көрсетілген жолы жоқ, сондықтан Personal VPN конфигурациясы тек құрылғы әлдеқашан сенетін материалға сілтеме жасай алады: орнатылған профиль, құрылғыны басқару немесе жүйе басқа себептермен сенетін CA құрған тізбекке. Бірінші іске қосуда өз CA-ын жасап, жүйе оны мойындайды деп күтетін қолданба провайдердің ішіндегі тексеруден өтпейді, онда қолданба интерфейсі себепті көре алмайды.

Бұл шекараны қандай болса сондай дизайн шектеуі деп қабылдаңыз және сенім тірегін тіркеу профилімен бірге жеткізіңіз. VPN аутентификациясын сенім шешімінен бөлек ұстаңыз, өйткені олар әр жерде сәтсіз болады және оларды әртүрлі адамдар жөндейді.

Есептегіштер интерфейстен келеді, VPN API-інен емес

Менеджер күй мен конфигурацияны ашады, ал туннель сайын байт санайтын ештеңе жоқ. Егер пайдалану сандары керек болса, getifaddrs() шақырып, тиісті интерфейс үшін if_data оқыңыз: Wi-Fi үшін en0, ұялы желі үшін pdp_ip интерфейстері және туннельдің өзі үшін utun құрылғысы. utun есептегіштері ішкі трафикті сипаттайды және протокол үстемесін қамтиды.

Бұл сандар болжам, қолданба бойынша есеп емес, және интерфейс қайта жасалғанда нөлденеді. Интерфейсте оларды солай белгілеңіз, әйтпесе біреу оларды клиентке шот жазу үшін қолданады. Егер қолданба бойынша сандар керек болса, мүлде басқа механизм керек, бұл өрістерді жақсырақ оқу емес.

Тазарту stopVPNTunnel ішінде, тоқтатуда емес

applicationWillTerminate жүйе процесті өлтіруі мүмкін болғанға дейін бірнеше секунд береді, бұл қосылымды тарқату үшін сенімді орын емес. Тоқтатуды stopVPNTunnel()-ге жіберіңіз немесе оны провайдердің тоқтату қайта шақыруында өңдеңіз, және іске қосқан менеджер немесе конфигурация идентификаторын сақтаңыз, сонда тоқтату құрылғыдағы барлық конфигурацияны емес, сол қосылымды нысанаға алады.

Бұл идентификаторды тиесілі профильдің қасында сақтаңыз, өйткені менеджер нысаны пайдаланушы қай конфигурацияны таңдағанын жазып қоймайды. Және On Demand көтерген қосылымның артында қолданба шақыруы мүлде жоқ екенін есте сақтаңыз, сондықтан күй экраны бірдеңе салудан бұрын әлі де теңшелімдерді жүктеуі керек.

Қатысты мақалалар