Aktīva VPN noteikšana sandboxotā Mac lietotnē
Šim jautājumam nav publiskas API, un saskarnes nosaukuma triks ir tikai heiristika. Sešas pārbaudes, lai izlemtu, no kā jūsu lietotnei patiešām būtu jāatkarojas.
Jums vajadzīgs viens ekrāns, kas uzvedas citādi, kad tunelis ir aktīvs, un nav izsaukuma, kas to pateiktu. Tas ir izlaišanas ierobežojums: macOS neviena publiska sistēma neziņo, vai ir pievienots patvaļīgs VPN, un iOS statuss pieder lietotnei, kas instalēja konfigurāciju. Tālākās pārbaudes ved no šīs robežas līdz kaut kam, ko varat izlaist, un jebkura no tām var agri beigt meklēšanu.
1. pārbaude: vai uz šo jautājumu vispār var atbildēt?
Sandbox atrisina jautājumu pirms jebkuras API. Trešās puses process nevar uzskaitīt cita piegādātāja paplašinājumu un nevar nolasīt arī šī paplašinājuma konfigurāciju, tāpēc nav atbalstīta objekta, ko jautāt.
Katrs apiešanas ceļš atduras pret to pašu sienu. Saskarnes saraksti, scutil --nc list un tieša sistēmas konfigurācijas lasīšana vai nu prasa tiesības, ko sandbox aiztur, vai arī ir atkarīga no uzvedības, ko Apple nekad nav solījusi. Ja plānam vajag kaut ko no tā, problēma ir plāns. Funkcija, kas balstīta uz nedokumentētu detaļu, ir atbalsta biļete ar piegādes datumu.
2. pārbaude: vai jūsu lietotne pati pārvalda tuneli?
Ja jā, jums ir atbalstīta atbilde jūsu pašu konfigurācijai. Ielādējiet iestatījumus, apstrādājiet kļūdu, pēc tam nolasiet statusu un abonējiet izmaiņas, nevis aptaujājiet:
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
}Esiet precīzs par to, ko tas atgriež: jūsu instalētā tuneļa stāvokli. Lietotājs, kurš izmanto citu klientu, tiks rādīts kā atvienots, un tā nav jūsu koda kļūda. Izlemiet, kuru no šiem diviem jautājumiem jūsu funkcija patiešām uzdod, pirms būvējat uz atbildes.
3. pārbaude: ko heiristika jums patiešām pateiktu?
Plaši kopētā pieeja jautā sistēmas starpniekservera vārdnīcai par tās tvēruma ierakstiem un nolasa atslēgas, kas nejauši ir saskarnes nosaukumi:
let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []Atslēga, kas sākas ar tap, tun, ppp, ipsec vai utun nozīmē, ka pastāv tuneļa tvēruma saskarne. Visa nosaukuma saskaņošana uzreiz neizdodas, jo iOS 12 nāca ar utun1 un utun2, un daži profili parādās kā ipsec4, ppp0 vai utun0. Salīdziniet prefiksus.
Tomēr nosaukums nenorāda īpašnieku. Sistēmas funkcijas un citu piegādātāju paplašinājumi arī veido utun saskarnes, un tāda var pastāvēt, nenesot neko no jūsu trafika. Lasiet to kā mājienu, ka tuvumā ir kaut kas tuneļa formā, neko spēcīgāku. Viltus pozitīvs šeit ir lēts, ja ierobežojat tikai vienu funkciju, un dārgs, ja ierobežojat pieteikšanās ekrānu.
4. pārbaude: vai tā vietā varat pārbaudīt galamērķi?
Ja lietotnei tikai jāzina, vai iekšējais pakalpojums ir sasniedzams, pārbaudiet šo pakalpojumu. Īsa pārbaude ar taimautu atbild uz jautājumu, no kura funkcija patiešām atkarīga, un tā turpina darboties, kad lietotājs maina klientu vai tunelis maina formu.
Sasniedzamība ir novērojums par jūsu ceļu. Saskarnes nosaukums ir secinājums par kaut ko jūsu ceļam blakus, tāpēc heiristika rada strīdus kļūdu ziņojumos, bet pārbaude rada pierādījumus. Ja pārbaude neizdodas, kamēr lietotājs uzstāj, ka VPN ir ieslēgts, jums tagad ir konkrēts ceļš atkļūdošanai: vārdu izšķiršana, maršruts vai pakalpojuma atļauja.
5. pārbaude: vai platforma var uzspiest to, kas jums vajadzīgs?
Kad prasība ir garantija, ka nekas neizbēgs no tuneļa, profils ir īstā vieta, nevis detektors. includeAllNetworks ieslēgšana pilna tuneļa konfigurācijā iOS 14 vai jaunākā maina platformas uzvedību, nevis liek jūsu lietotnei to secināt. Karodziņš dokumentēts NEVPNProtocol atsaucē.
Tas ir cita veida atbilde: uzspiešana novērojuma vietā. Tā arī attiecas tikai uz profiliem, kurus kontrolējat, tāpēc nepalīdz patērētāju lietotnei, kas vēro cita tuneli.
6. pārbaude: padariet kļūmi drošu un novērojamu
Izslēdziet tikai to iespēju, kurai vajadzīgs tunelis, un atstājiet pārējo lietotni lietojamu. Detektors, kas katru reizi, kad nav pārliecināts, paslēpj visu saskarni, rada pārtraukumu ikvienam, kura tunelis izmanto nosaukumu, ko jūs nekad negaidījāt. Atgriezieties pie konservatīvas uzvedības: vietējās funkcijas turpina darboties, un tiek atspējots tikai tas attālinātais izsaukums, kuram tiešām vajadzīgs tunelis. Šī izvēle ir produkta lēmums, un tā ir pelnījusi tikt pierakstīta blakus heiristikai.
Reģistrējiet, ko novērojāt: saskarnes nosaukumus, platformas versiju un vienas pārbaudes rezultātu. Tas pārvērš nākamo ziņojumu no strīda par pārbaudi. Pēc tam dodiet priekšroku atbalstītai deklarācijai, kur tāda ir, jo pārvaldīta konfigurācija var skaidri nest nodomu un novērst lielāko daļu iemesla vispār pārbaudīt nosaukumus.
Ja 1.–5. pārbaude atstāja jūs bez atbalstītas atbildes, izlaidiet pārbaudi un godīgi marķējiet rezultātu. Dokumentēts labāko pūļu signāls ir labāks produkta lēmums nekā privāta API, kas salūzt nākamajā laidienā.