Tunel işləyəndə bir ekranın fərqli davranması lazımdır, amma bunu sizə deyən heç bir çağırış yoxdur. Buraxılış məhdudiyyəti budur: macOS-da heç bir ictimai çərçivə ixtiyari VPN-in qoşulub-qoşulmadığını bildirmir, iOS-da isə status konfiqurasiyanı quraşdıran tətbiqə aiddir. Aşağıdakı yoxlamalar bu hədddən buraxa biləcəyiniz bir şeyə qədər aparır və onlardan hər hansı biri axtarışı erkən bitirə bilər.

Yoxlama 1: suala ümumiyyətlə cavab vermək mümkündürmü?

Sandbox sualı hər hansı API-dən əvvəl həll edir. Üçüncü tərəf prosesi başqa satıcının uzantısını sadalaya bilməz və həmin uzantının konfiqurasiyasını da oxuya bilməz, ona görə də soruşmaq üçün dəstəklənən obyekt yoxdur.

Hər bir dolanma yolu eyni divara çırpılır. İnterfeys siyahıları, scutil --nc list və birbaşa sistem konfiqurasiyası oxunuşları ya sandboxın əsirgədiyi hüquqlar tələb edir, ya da Apple-ın heç vaxt vəd etmədiyi davranışdan asılıdır. Plan bunlardan birini tələb edirsə, problem planın özüdür. Sənədləşdirilməmiş bir detal üzərində qurulan funksiya çatdırılma tarixi olan dəstək biletidir.

Yoxlama 2: tətbiqiniz tuneli özü idarə edirmi?

Əgər edirsə, öz konfiqurasiyanız üçün dəstəklənən cavabınız var. Üstünlükləri yükləyin, xətanı emal edin, sonra statusu oxuyun və sorğulamaq əvəzinə dəyişikliklərə abunə olun:

vpnManager.loadFromPreferences { error in
    // handle a load failure before reading status
}

NotificationCenter.default.addObserver(
    forName: .NEVPNStatusDidChange,
    object: nil,
    queue: nil
) { note in
    let status = (note.object as? NEVPNConnection)?.status
}

Bunun nə qaytardığına dəqiq olun: quraşdırdığınız tunelin vəziyyəti. Fərqli müştəri işlədən istifadəçi qoşulmamış kimi görünəcək və bu sizin kodunuzda xəta deyil. Cavab üzərində qurmazdan əvvəl funksiyanızın əslində bu iki sualdan hansını verdiyinə qərar verin.

Yoxlama 3: evristika sizə əslində nə deyərdi?

Geniş surətlənən yanaşma sistem proksi lüğətindən onun əhatəli qeydlərini soruşur və açarları oxuyur, onlar da təsadüfən interfeys adlarıdır:

let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []

Açarı tap, tun, ppp, ipsec və ya utun ilə başlayırsa, tunel əhatəli interfeysin mövcud olduğunu bildirir. Bütün adı uyğunlaşdırmaq dərhal uğursuz olur, çünki iOS 12 utun1 və utun2 ilə gəldi və bəzi profillər ipsec4, ppp0 və ya utun0 kimi görünür. Əvəzində prefiksləri müqayisə edin.

Buna baxmayaraq, ad heç bir sahibi müəyyən etmir. Sistem funksiyaları və digər satıcıların uzantıları da utun interfeysləri yaradır və biri sizin trafikinizin heç birini daşımadan mövcud ola bilər. Bunu ətrafda tunel formasında bir şeyin olduğuna dair işarə kimi oxuyun, daha güclü bir şey kimi yox. Burada yanlış müsbət yalnız bir funksiyanı qapadırsanız ucuzdur, giriş ekranını qapadırsanız bahalıdır.

Yoxlama 4: əvəzində təyinatı sınaqdan keçirə bilərsinizmi?

Tətbiq yalnız daxili xidmətin əldə edilə bilən olub-olmadığını bilməlidirsə, həmin xidməti sınayın. Taimautlu qısa bir zond funksiyanın həqiqətən asılı olduğu suala cavab verir və istifadəçi müştəri dəyişdikdə və ya tunel formasını dəyişdikdə işləməyə davam edir.

Əldə edilə bilənlik yolunuz haqqında bir müşahidədir. İnterfeys adı yolunuza bitişik bir şey haqqında çıxarışdır, buna görə evristika buq hesabatlarında mübahisə yaradır, zond isə sübut yaradır. İstifadəçi VPN-in işlədiyini israr edərkən zond uğursuz olursa, indi sazlamaq üçün konkret bir yolunuz var: ad həlli, marşrut və ya xidmət icazəsi.

Yoxlama 5: platforma lazım olanı tətbiq edə bilərmi?

Tələb tuneldən heç nəyin çıxmamasına zəmanət olduqda, profil orada yerləşir, detektor deyil. includeAllNetworks parametrini iOS 14 və ya daha sonrakı versiyada tam tunel konfiqurasiyasında aktivləşdirmək tətbiqinizdən nəticə çıxarmasını istəmək əvəzinə platformanın davranışını dəyişir. Bayraq NEVPNProtocol sənədində təsvir olunub.

Bu, fərqli cavab növüdür: müşahidə əvəzinə tətbiqetmə. O da yalnız sizin idarə etdiyiniz profillərə aiddir, ona görə başqasının tunelini izləyən istehlakçı tətbiqinə kömək etmir.

Yoxlama 6: uğursuzluğu təhlükəsiz və müşahidə edilə bilən et

Yalnız tunelə ehtiyac duyan qabiliyyəti söndürün və tətbiqin qalan hissəsini istifadə edilə bilən saxlayın. Əmin olmadıqda bütün interfeysi gizlədən detektor, tuneli heç vaxt gözləmədiyiniz bir ad istifadə edən hər kəs üçün kəsinti yaradır. Əvəzində mühafizəkar davranışa qayıdın: yerli funksiyalar işləməyə davam edir və yalnız tunelə həqiqətən ehtiyac duyan uzaq çağırış deaktiv edilir. Bu seçim məhsul qərarıdır və evristikanın yanında yazılmağa layiqdir.

Müşahidə etdiklərinizi qeyd edin: interfeys adları, platforma versiyası və bir zondun nəticəsi. Bu, növbəti hesabatı mübahisədən yoxlamaya çevirir. Sonra dəstəklənən bəyannaməyə sahib olduğunuz yerdə ona üstünlük verin, çünki idarə olunan konfiqurasiya niyyəti açıq şəkildə daşıya və adları yoxlamaq üçün əsas səbəblərin çoxunu aradan qaldıra bilər.

Yoxlamalar 1-dən 5-ə qədər sizi dəstəklənən cavabsız qoyubsa, zondunu buraxın və nəticəni dürüst adlandırın. Sənədləşdirilmiş ən yaxşı səy siqnalı növbəti buraxılışda pozulan şəxsi API-dən daha yaxşı məhsul qərarıdır.

Əlaqəli məqalələr