iOS VPN колдонмосу туннель иштеп турганда эмне үчүн ажыратылган көрсөтөт
iOS колдонмоңуз туннелди башкарат, бирок ага ээ эмес, ал эми менеджердин абалы кэште сакталган. Адегенде параметрлерди жүктөңүз, анан абалды жана интерфейс эсептегичтерин окуңуз.
Колдонмоңуз ажыратылган дейт, меню тилкеси туташкан дейт, ал эми трафик анык агып жатат. Бул ажырым кайталоо менен оңдолуучу жарыш абалы эмес: колдонмо менен туннель өзүнчө процесстер, жана кодүңүз окуган объект — система сактаган конфигурациянын кэштеги көрүнүшү. 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 көтөргөн туташуунун артында колдонмо чакыруусу такыр жок экенин унутпаңыз, ошондуктан абал экраны бир нерсе тартуудан мурун дагы эле параметрлерди жүктөшү керек.