Tətbiqiniz əlaqə kəsildi deyir, menyu çubuğu isə qoşulduğunu göstərir və trafik açıq şəkildə axır. Bu fərq yenidən cəhdlə düzəldilə bilən yarış vəziyyəti deyil: tətbiq və tunel ayrı proseslərdir, kodunuzun oxuduğu obyekt isə sistemin saxladığı konfiqurasiyanın keşlənmiş görünüşüdür. Apple-ın Personal VPN səthi idarəetmə proqram interfeysidir, məlumat yolu deyil, və onun qəribə davranışlarının çoxu bu tək faktdan irəli gəlir. Hər çağırış altında əslində nə baş verdiyi budur.

Menecer obyekti keşlənmiş görünüşdür, tunel deyil

NETunnelProviderManager sistemin sahib olduğu üstünlüklər anbarından doldurulur, ona görə xassələri loadFromPreferences tamamlanana qədər heç nə ifadə etmir. Bundan əvvəl connection.status oxusanız standart dəyər alırsınız; buna görə yenidən işə salındıqdan sonra ilk status yenilənməsi tunel işlədiyi halda əlaqə kəsildi bildirir. Əvvəlcə yükləyin, sonra həmin tamamlama işləyicisindən statusu və protokol konfiqurasiyasını oxuyun. Sonrakı dəyişiklikləri sorğulamaq əvəzinə NEVPNStatusDidChange vasitəsilə izləyin və qeyd edin ki, bildiriş On Demand tərəfindən başladılan bağlantılar üçün də işə düşür, burada heç bir tətbiq çağırışı heç nə qaytarmır. Eyni şey protokol parametrlərinə də aiddir: onlar yüklənmiş konfiqurasiyadan oxunur, tətbiqin ötürdüyündən deyil.

Tunelin özü Network Extension provayder prosesində yaşayır, ona görə tətbiq bağlantını itirmədən öz vəziyyətini itirə bilər. İnterfeysin göstərdiyi hər şey menecerdən yenidən qurulmalıdır, əvvəlki sessiyadan xatırlanmamalıdır.

Başlatma sırası: saxla, yüklə, sonra başlat

Provayderə əsaslanan bağlantı sıra ilə üç addım tələb edir. Provayder konfiqurasiyasını yazın və saveToPreferences çağırın, meneceri yükləyin ki saxlanılmış konfiqurasiya sizin tutduğunuz olsun, sonra NETunnelProviderSession.startVPNTunnel() vasitəsilə başladın. Saxlamanı atlayın və başlatmanın işə salacağı heç nə olmaz; saxlamadan əvvəl yükləyin və menecer hələ də köhnə konfiqurasiyanı əks etdirər.

startVPNTunnel tərəfindən qaytarılan Boolean yalnız sorğunun qəbul edildiyini bildirir. Provayder səviyyəli nasazlıqlar sonradan əlaqə kəsildi statusuna keçid kimi gəlir, bunu NEVPNStatusDidChange bildirişi ilə izləyirsiniz və bildiriş işləyicisi connection.status dəyərini loadFromPreferences sonra yenidən oxumalıdır, çünki keşlənmiş dəyər hələ köhnə ola bilər. Sorğu səviyyəli nasazlıqlar çağırışın istisna atan formasından dərhal qayıdır və ya startVPNTunnelAndReturnError: xarici xəta parametri ilə gəlir. Qaytarılan dəyəri nəticə sayan kod heç vaxt qurulmamış bağlantı bildirir. Digər səssiz nasazlıq quraşdırılmış uzantıya uyğun gəlməyən provayder paket identifikatorudur: sorğu rədd edilir və mesajda heç nə identifikatora işarə etmir. Əgər identifikator səhvdirsə, sorğu adətən dərhal uğursuz olur, hər hansı provayder jurnal sətri görünməzdən əvvəl.

Başlatmadan sonra üstünlükləri yenidən yükləmək status ekranlarını düzgün edən şeydir. Sistem konfiqurasiyanı dəyişdikdə menecer sizə yenisini itələmir.

Etimad materialı profil vasitəsilə gəlir, heç vaxt tətbiq kodundan gəlmir

Tətbiqin iOS etimad anbarına kök sertifikat əlavə etmək üçün dəstəklənən yolu yoxdur, ona görə Personal VPN konfiqurasiyası yalnız cihazın artıq etimad göstərdiyi materiala istinad edə bilər: quraşdırılmış profil, cihaz idarəetməsi və ya sistemin başqa səbəblərdən etimad göstərdiyi sertifikat mərkəzi tərəfindən qurulmuş zəncir. İlk işə salınmada öz sertifikat mərkəzini yaradan və sistemin ona etimad göstərəcəyini gözləyən tətbiq provayder daxilində yoxlamada uğursuz olacaq, burada tətbiqin interfeysi səbəbi görə bilmir.

Bu sərhədi olduğu kimi dizayn məhdudiyyəti kimi qəbul edin və etimad lövbərini qeydiyyat profili ilə birlikdə göndərin. VPN autentifikasiyasını etimad qərarından ayrı saxlayın, çünki onlar fərqli yerlərdə uğursuz olur və fərqli insanlar tərəfindən sazlanır.

Sayğaclar interfeysdən gəlir, VPN proqram interfeysindən deyil

Menecer status və konfiqurasiya təqdim edir, hər tunel üçün bayt sayan heç nə yoxdur. İstifadə rəqəmləri lazımdırsa, getifaddrs() çağırın və müvafiq interfeys üçün if_data oxuyun: Wi-Fi üçün en0, hüceyrə üçün pdp_ip interfeysləri, tunelin özü üçün isə utun cihazı. utun sayğacları daxili trafiki təsvir edir və protokol yüklərini əhatə edir.

Bu rəqəmlər təxminlərdir, hər tətbiq üçün uçot deyil, və interfeys yenidən yaradıldıqda sıfırlanır. Onları interfeysdə belə adlandırın, yoxsa kimsə onlarla müştəriyə hesab-faktura yazacaq. Hər tətbiq üçün rəqəmlər lazımdırsa, tamamilə başqa mexanizm lazımdır, bu sahələrin daha yaxşı oxunması deyil.

Təmizləmə stopVPNTunnel-də olmalıdır, dayandırmada deyil

applicationWillTerminate sistemin prosesi öldürməsindən əvvəl sizə bir neçə saniyə verir, bu isə bağlantını sökmək üçün etibarlı yer deyil. Dayandırmanı stopVPNTunnel() ünvanına göndərin və ya provayderin dayandırma geri çağırışında idarə edin, və başlatdığınız menecer və ya konfiqurasiya identifikatorunu saxlayın ki, dayandırma cihazdakı hər konfiqurasiyanı deyil, həmin bağlantını hədəf alsın.

Bu identifikatoru aid olduğu profilin yanında saxlayın, çünki menecer obyekti istifadəçinin hansı konfiqurasiyanı seçdiyini qeyd etmir. Və unutmayın ki, On Demand tərəfindən qaldırılan bağlantının arxasında heç bir tətbiq çağırışı yoxdur, ona görə status ekranı hər şeyi çəkməzdən əvvəl üstünlükləri yükləməlidir.

Əlaqəli məqalələr