Ko NEVPNManager var izveidot iOS (un ko ne)
iOS VPN API izveido vienu lietotnei piederošu konfigurāciju no trim protokolu klasēm. L2TP, PPTP un parakstītie profili nav šīs virsmas daļa.
Veidojot VPN ekrānu iOS lietotnē, pirmais pārsteigums ir tas, ka Iestatījumu lietotnes protokolu saraksts nav API saraksts. Network Extension ietvars ļauj lietotnei izveidot vienu personīgu VPN konfigurāciju, kas pieder šai lietotnei, un tā pieņem tikai dažus protokola objektus. Viss pārējais, ko cilvēki gaida, no L2TP līdz lejupielādētam profilam, atrodas ārpus šīs virsmas vai ir Apple privāts. Turpmākās kļūdas parasti nav kļūdas programmā, tā API atsakās no darba, kas tam nekad netika dots.
Mīts: API ir Iestatījumu redaktors
Tiek uzskatīts, ka tā kā iOS spēj konfigurēt IKEv1, IKEv2, L2TP un IPsec profilus, lietotne var programmatiski izveidot jebkuru no tiem. Nevar. Ietvars piešķir izsaucējai lietotnei tieši vienu konfigurācijas vietu, un šī vieta pieņem tikai nelielu publisku protokola klašu kopu. Viss pārējais, ko cilvēki gaida, no L2TP līdz lejupielādētam profilam, atrodas ārpus šīs virsmas vai ir Apple privāts.
Turpmākās kļūdas parasti nav kļūdas programmā. Tā API atsakās no darba, kas tam nekad netika dots, un risinājums ir veidot ekrānu ap to, kas API pieder.
Trīs protokola objekti un tie, kuru nav
Jūsu iespējas ir IKEv1 caur NEVPNProtocolIPSec, IKEv2 caur NEVPNProtocolIKEv2, un NETunnelProviderProtocol, ja piegādājat savu pakešu tuneļa paplašinājumu. NEVPNManager atsauce uzskaita pieņemtos protokola objektus. L2TP un PPTP nekad neparādās šajā sarakstā, jo Apple tiem nepublicēja klases. Jebkura no tiem mēģināšana beidzas saglabāšanas laikā ar kļūdu vai, vēl ļaunāk, ar konfigurāciju, kuru sistēma klusi atsakās izmantot.
Darbvirsmas kods ievēro citus noteikumus. macOS SCNetworkInterfaceCreateWithInterface sakrauj saskarnes tipu, piemēram, L2TP pār IPv4, un pievieno to tīkla pakalpojumam, un networksetup -connectpppoeservice palaiž rezultātu. Nepieciešamas administratora tiesības un palīgrīks, jo koplietotais noslēpums un parole nonāk sistēmas atslēgu saišķī. Kopējiet šo dizainu uz iOS, un nekas nekompilējas.
Nododiet atslēgu saišķa atsauci, nevis paroli
Neviena no IKE klasēm nepieņem paroli kā tekstu. Divas īpašības passwordReference un sharedSecretReference vēlas pastāvīgu atslēgu saišķa atsauci, ko iegūstat no SecItemCopyMatching, pieprasot kSecReturnPersistentRef. Elementa datu nodošana vai virknes ievietošana laukā rada saglabāšanas kļūdu vai savienojumu ar tukšiem akreditācijas datiem. Atsauce ir tikpat noturīga kā aiz tās esošais atslēgu saišķa elements, tāpēc elementam jāpastāv pirms konfigurācijas salikšanas. Izveidojiet to tajā pašā transakcijā kā saglabāšanu, un jūs novērsīsit veselu secības kļūdu klasi.
Sertifikāta autentifikācija iet citu ceļu: PKCS#12 blobam nepieciešams identityData plus identityDataPassword. Šī bloba piegāde lietotnes komplektā ir no parauga koda pārņemts ieradums, nevis izlaišanas lēmums, jo parole ceļo kopā ar to un katra lietotnes kopija nes vienu un to pašu identitāti.
Tiesības un pieejamība nosaka visu
Pārvaldnieks var nemaz neeksistēt, un iemesls ir nodrošināšana. Jūsu lietotnes identifikatoram nepieciešama Network Extension iespēja kopā ar personīgā VPN tiesībām, un profilam, kas paraksta būvējumu, jābūt abām.
Izlaidiet to, un koplietotā instance atgriež nil, vai arī saglabāšana neizdodas ar kļūdu, kas nekad nemin tiesības. Pieejamība ir otrie vārti. Ja mērķējat uz kaut ko vecāku par iOS 8, izpildlaikā trūkst simbola, tāpēc kļūme ir avārija vai nil pārvaldnieks, nevis pārvaldnieks bez konfigurācijas. Pārbaudiet izpildlaiku un tiesības pirms objektu grafa atkļūdošanas.
Ielādējiet, mainiet, saglabājiet, tad vērojiet pieprasījuma secību
Uztveriet dzīves ciklu kā ielādi, izmaiņas un saglabāšanu un nekad neizlaidiet ielādi. Kamēr loadFromPreferences nav pabeigts, pārvaldnieks neko netur un protokola objektu nevar nolasīt vai nomainīt.
Otra saglabāšana aizstāj konfigurāciju, nevis pievieno vēl vienu, tāpēc nepabeigta saglabāšana var sabojāt profilu, kas darbojās. Pieprasījuma noteikumi veido sakārtotu masīvu, un šī secība ir politika. Novietojiet savienošanās no jebkur noteikumu pirms atvienošanās noteikuma, un pēc manuālas atvienošanās seko tūlītēja atkārtota savienošanās, kas izskatās pēc defekta, bet atbilst dokumentētajam novērtējumam.
Pārvietojiet atvienošanās noteikumu uz priekšu, kad lietotāja darbībai jāuzvar. Tas, kas paliek ārpus lietotnes kontroles, ir tikpat svarīgs. Maršruti nāk no tuneļa vai servera politikas, nevis no jūsu iestatītās izvēles, un pakešu tuneļa nodrošinātājs par tiem ziņo palaišanas laikā. Lietotne nevar uzskaitīt vai rediģēt profilus, ko instalējušas citas lietotnes vai konfigurācijas profili, tāpēc nesoliet ekrānu, kas rāda katru VPN ierīcē.