Tunnel ishlayotganda iOS VPN ilovangiz nega uzilgan deb ko'rsatadi
iOS ilovangiz tunnelni boshqaradi, lekin unga egalik qilmaydi va menejer holati keshda saqlanadi. Avval sozlamalarni yuklang, keyin holat va interfeys hisoblagichlarini o'qing.
Ilovangiz uzilgan deydi, menyu qatori ulangan deydi, trafik esa aniq oqmoqda. Bu tafovut qayta urinish bilan tuzatiladigan poyga holati emas: ilova va tunnel alohida jarayonlar, kodingiz o'qiydigan obyekt esa tizim saqlaydigan konfiguratsiyaning keshdagi ko'rinishidir. Apple'ning Personal VPN yuzasi boshqaruv API'si, ma'lumot yo'li emas, va uning g'alati xatti-harakatlarining ko'p qismi shu bitta faktdan kelib chiqadi. Har bir chaqiruvda aslida nima sodir bo'lishi quyida.
Menejer obyekti keshdagi ko'rinish, tunnel emas
NETunnelProviderManager tizimga tegishli sozlamalar omboridan to'ldiriladi, shuning uchun loadFromPreferences tugamaguncha uning xossalari hech narsani anglatmaydi. Undan oldin connection.status o'qisangiz, standart qiymat olasiz, shuning uchun qayta ishga tushirgandan keyingi birinchi holat yangilanishi tunnel ishlayotganda uzilgan deb xabar beradi. Avval yuklang, keyin holat va protokol konfiguratsiyasini o'sha tugatish ishlovchisidan o'qing. Keyingi o'zgarishlarni so'rov yuborish o'rniga NEVPNStatusDidChange orqali kuzating va bildirishnoma On Demand boshlagan ulanishlar uchun ham ishga tushishini yodda tuting, u yerda biror narsa qaytaradigan ilova chaqiruvi umuman yo'q. Xuddi shu narsa protokol sozlamalariga ham tegishli: ular yuklangan konfiguratsiyadan o'qiladi, ilova uzatganidan emas.
Tunnelning o'zi Network Extension provayderi jarayonida yashaydi, shuning uchun ilova ulanishni yo'qotmasdan o'z holatini yo'qotishi mumkin. Interfeys ko'rsatadigan hamma narsa menejerdan qayta qurilishi kerak, oldingi sessiyadan eslab qolinmasligi kerak.
Ishga tushirish tartibi: saqla, yukla, keyin ishga tushir
Provayderga asoslangan ulanish tartib bilan uch qadam talab qiladi. Provayder konfiguratsiyasini yozing va saveToPreferences ni chaqiring, saqlangan konfiguratsiya qo'lingizdagisi bo'lishi uchun menejerni yuklang, keyin NETunnelProviderSession.startVPNTunnel() orqali ishga tushiring. Saqlashni tashlab ketsangiz, ishga tushirishning ishga tushiradigan hech narsasi yo'q; saqlashdan oldin yuklasangiz, menejer hali ham eski konfiguratsiyani aks ettiradi.
startVPNTunnel qaytaradigan mantiqiy qiymat faqat so'rov qabul qilinganini aytadi. Provayder darajasidagi nosozliklar keyinroq uzilgan holatiga o'zgarish sifatida keladi, uni siz NEVPNStatusDidChange bildirishnomasi orqali kuzatasiz, va bildirishnoma ishlovchisi loadFromPreferences dan keyin connection.status ni qayta o'qishi kerak, chunki keshdagi qiymat hali eski bo'lishi mumkin. So'rov darajasidagi nosozliklar chaqiruvning istisno tashlaydigan shaklidan darhol qaytadi yoki startVPNTunnelAndReturnError: xatosining chiqish parametri orqali. Qaytgan qiymatni natija deb hisoblaydigan kod hech qachon o'rnatilmagan ulanish haqida xabar beradi. Yana bir jim nosozlik — o'rnatilgan kengaytmaga mos kelmaydigan provayder to'plam identifikatori: so'rov rad etiladi va xabarda hech narsa identifikatorga ishora qilmaydi. Agar identifikator noto'g'ri bo'lsa, so'rov odatda darhol muvaffaqiyatsiz bo'ladi, provayderning birorta jurnal satri chiqishidan oldin.
Ishga tushirishdan keyin sozlamalarni qayta yuklash holat ekranlarini to'g'ri qiladigan narsadir. Tizim konfiguratsiyani o'zgartirganda menejer sizga yangi konfiguratsiyani itarib yubormaydi.
Ishonch materiali profil orqali keladi, hech qachon ilova kodidan emas
Ilovaning iOS ishonch omboriga ildiz sertifikat qo'shishning qo'llab-quvvatlanadigan yo'li yo'q, shuning uchun Personal VPN konfiguratsiyasi faqat qurilma allaqachon ishonadigan materialga murojaat qilishi mumkin: o'rnatilgan profil, qurilma boshqaruvi yoki tizim boshqa sabablarga ko'ra ishonadigan CA tomonidan qurilgan zanjir. Birinchi ishga tushishda o'z CA sini yaratib, tizim uni tan oladi deb kutadigan ilova provayder ichidagi tekshiruvda muvaffaqiyatsiz bo'ladi, u yerda ilova interfeysi sababni ko'ra olmaydi.
Bu chegarani qanday bo'lsa shunday dizayn cheklovi deb qabul qiling va ishonch langarini ro'yxatga olish profili bilan birga yuboring. VPN autentifikatsiyasini ishonch qaroridan alohida tuting, chunki ular turli joylarda muvaffaqiyatsiz bo'ladi va ularni turli odamlar sozlaydi.
Hisoblagichlar interfeysdan keladi, VPN API sidan emas
Menejer holat va konfiguratsiyani ochib beradi, tunnel boshiga bayt hisoblaydigan hech narsa yo'q. Agar ishlatish raqamlari kerak bo'lsa, getifaddrs() ni chaqiring va tegishli interfeys uchun if_data ni o'qing: Wi-Fi uchun en0, uyali aloqa uchun pdp_ip interfeyslari va tunnelning o'zi uchun utun qurilmasi. utun hisoblagichlari ichki trafikni tavsiflaydi va protokol qo'shimcha xarajatini o'z ichiga oladi.
Bu raqamlar taxminlar, ilova bo'yicha hisob emas, va interfeys qayta yaratilganda ular nolga tushadi. Interfeysda ularni shunday belgilang, aks holda kimdir ularni mijozga hisob-faktura yozish uchun ishlatadi. Agar ilova bo'yicha raqamlar kerak bo'lsa, butunlay boshqa mexanizm kerak, bu maydonlarni yaxshiroq o'qish emas.
Tozalash stopVPNTunnel ichida, tugatishda emas
applicationWillTerminate tizim jarayonni o'ldirishidan oldin sizga bir necha soniya beradi, va bu ulanishni yechish uchun ishonchli joy emas. To'xtatishni stopVPNTunnel() ga yuboring yoki provayderning to'xtatish qayta chaqiruvida hal qiling, va ishga tushirgan menejer yoki konfiguratsiya identifikatorini saqlang, shunda to'xtatish qurilmadagi har bir konfiguratsiyani emas, o'sha ulanishni nishonga oladi.
Bu identifikatorni u tegishli profilning yonida saqlang, chunki menejer obyekti foydalanuvchi qaysi konfiguratsiyani tanlaganini qayd etmaydi. Va On Demand ko'targan ulanishning orqasida hech qanday ilova chaqiruvi yo'qligini yodda tuting, shuning uchun holat ekrani biror narsa chizishdan oldin hali ham sozlamalarni yuklashi kerak.