Steven
Steven5 min lasīšana

Tava Mac lietotne piešķir mikrofona piekļuvi — un aizmirst to katrā palaišanas reizē

GeekBye pieprasīja mikrofona atļauju, tu to piešķīri, un viss strādāja. Nākamajā palaišanas reizē — pazudis. Un pati lietotne vispār neparādījās sadaļā Sistēmas iestatījumi → Mikrofons. Vaininieks bija macOS drošības funkcija, kas klusi palaida lietotni no ceļa, kas pazūd — lūk, diagnoze un labojums vienā uzvednē.

macOS
Atļaujas
Inženierija
GeekBye laidieni
Tava Mac lietotne piešķir mikrofona piekļuvi — un aizmirst to katrā palaišanas reizē

Lūk, kļūda, kas liek šaubīties par pašam savām acīm. Tu instalē GeekBye, tā pieprasa mikrofona piekļuvi, tu noklikšķini Allow (Atļaut), un transkripcija strādā. Lieliski. Tu aizver lietotni, atver to nākamajā rītā — un tā pieprasa mikrofona piekļuvi atkal. Tu dodies pārbaudīt Sistēmas iestatījumi → Privātums un drošība → Mikrofons, lai to izlabotu manuāli, un GeekBye vispār nav sarakstā. Ne liegts. Ne atļauts. Vienkārši nav, it kā tā nekad nebūtu prasījusi.

Katra atsevišķa daļa izskatījās pareiza. Uzvedne bija īsta. Atļauja tobrīd strādāja. Lietotne bija pareizi parakstīta un notarizēta ar pareizajām lietojuma virknēm. Un tomēr piešķīrums izgaroja katrā palaišanas reizē. GeekBye v2.0.6 to novērsa — un galvenais cēlonis ir viena no viltīgākajām lietām, ko macOS dara, lai tevi aizsargātu.

Funkcija, kas slēpa lietotni no tās pašas

Vaininieks ir macOS App Translocation, Gatekeeper drošības funkcija. Kad tu lejupielādē lietotni un palaid to tieši no DMG vai no savas ~/Downloads mapes — jebkur, kur tā vēl ir "karantīnā" — macOS to patiesībā nepalaid no vietas, ko tu redzi. Tā caurspīdīgi nokopē to uz nejauši ģenerēta, tikai lasāma ceļa dziļi zem /private/var/folders/.../AppTranslocation/… un palaid šo kopiju. Tā ir laba aizsardzība: tā neļauj ļaunprātīgai lejupielādei manipulēt ar failiem tai blakus.

Bet lūk, kur ir sadursme. macOS atļauju sistēma (TCC — tā lieta, kas seko līdzi, kurš drīkst izmantot tavu mikrofonu, kameru, ekrānu) identificē lietotni pēc tās ceļa un koda identitātes. Kad lietotne ir translocēta, šis ceļš ir nejaušs un pagaidu. Tāpēc, kad tu piešķir mikrofona piekļuvi, macOS paklausīgi reģistrē piešķīrumu — pret ceļu, kas nākamajā palaišanas reizē neeksistēs. Atver lietotni atkal, macOS to translocē uz citu nejaušu ceļu, ierauga lietotni, par kuru tai nav nekādu ierakstu, un prasa vēlreiz. Un tā kā šis fantoma ceļš nekad nav stabila vieta, lietotne nekad neiegūst pastāvīgu ierakstu sadaļā Sistēmas iestatījumi → Mikrofons.

Lietotne piešķīra atļauju spokam.

Tieši tāpēc arī ar to saskārās tikai daži cilvēki. Ja tava GeekBye kopija jau atradās /Applications — jo tu to tur ievilki vai tā tur nokļuva ar automātisko atjaunināšanu — nav karantīnas, nav translokācijas, ir stabils ceļš, un viss saglabājas nevainojami. Kļūda bija neredzama mums un ikvienam, kurš pārsniedzis savu pirmo instalāciju, un tieši tāda veida kļūda izdzīvo visilgāk.

Labojums: iedod lietotnei īstas mājas

Tā kā visa problēma ir nestabils ceļš, labojums ir dabūt lietotni uz stabila ceļa. v2.0.6 nosaka, kad GeekBye darbojas translocēta (vai vienkārši darbojas ārpus /Applications), un piedāvā vienā klikšķī "Move to Applications" (Pārvietot uz Applications) — izmantojot macOS pārvietošanas izsaukumu, kas nokopē pakotni uz /Applications un pārpalaiž to no turienes. No šī brīža lietotnei ir fiksēta identitāte: mikrofona piešķīrums paliek, ekrāna ierakstīšana paliek, un GeekBye beidzot parādās sadaļā Sistēmas iestatījumi, kur tu to gaidītu.

Uzvedne ir pieklājīga par to. Tā piedāvā Move to Applications (Pārvietot uz Applications), Not Now (Ne tagad) un Don't Ask Again (Vairs neprasīt) — un tā atceras pēdējo izvēli, lai lietotne nekad neuzmāktos kādam, kuram ir apzināts iemesls palaist to no citurienes. Lēmums par to, vai vispār rādīt uzvedni, ir izolēts mazās, tīrās funkcijās (vai šis būvējums ir translocēts? vai tas ir ārpus /Applications? vai lietotājs to apslāpēja?), lai loģiku varētu vienībtestēt bez nepieciešamības palaist īstu notarizētu būvējumu uz īsta karantinēta sējuma.

Tas pats laidiens arī vienkāršoja pašu atļauju pieredzi. GeekBye agrāk atvēra pielāgotu, speciāli izgatavotu iekšēju atļauju logu — pāris simti UI koda rindu, kas mēģināja atveidot to, ko OS jau dara labi. v2.0.6 to izdzēsa un paļāvās uz vietējo macOS atļauju uzvedni, ko atbalsta kluss, nebloķējošs baneris, kas parādās tikai tad, kad nepieciešama atļauja patiešām trūkst. Mazāk koda un uzvedība, ko lietotāji jau atpazīst, jo katra cita Mac lietotne strādā tāpat.

Daļa, ar kuru lepojos visvairāk: mēs to pierādījām, pirms tam noticējām

Būtu bijis viegli uzminēt translokāciju un izlaist labojumu. Tā vietā laidiens vispirms izlaida startēšanas diagnostiku: palaišanas brīdī GeekBye tagad ziņo pats savu izpildāmā faila ceļu un vai tā ir translocēta, vai tā atrodas iekš /Applications, un pašreizējo mikrofona un ekrāna atļauju statusu. Šī telemetrija pārvērta ticamu teoriju par apstiprinātu — ražošanas dati parādīja, ka skartās sesijas patiešām darbojās no translocētiem ceļiem ārpus /Applications, tieši kā prognozēts.

Šī secība ir svarīga. "Uzvedne parādās, bet atļauja nepaliek" var būt vairāki iespējami skaidrojumi — parakstīšanas problēma, trūkstoša lietojuma virkne, tiesību (entitlement) problēma, TCC datubāzes īpatnība. Mēs izslēdzām API līmeņa cēloņus (pieprasījuma ceļš bija pierādāmi pareizs), tad ļāvām reālās pasaules datiem norādīt uz identitātes/ceļa slāni, nevis izlaidām cerīgu labojumu un cerējām, ka atbalsta pieteikumi apstāsies.

Trīs lietas, ko šī kļūda māca

  1. Atļauja, kas parādās uzvednē, bet nesaglabājas, ir identitātes problēma, nevis API problēma. Ja pieprasījuma kods ir pareizs un piešķīrums joprojām pazūd, pārtrauc pārrakstīt pieprasījumu. Jautā, kādam ceļam un koda identitātei OS piesaista piešķīrumu — un vai šī identitāte ir stabila starp palaišanas reizēm.
  2. Izlaid diagnostiku kopā ar labojumu (vai pirms tā). Daži lauki — no kurienes es darbojos, kāds ir mans atļauju statuss — pārvērta izglītotu minējumu par pārbaudītu galveno cēloni un pateica mums precīzi, kuri lietotāji bija skarti. Instrumentē robežu, ko tu turi aizdomās, pirms to labo.
  3. Kļūdas, kas slēpjas no izstrādātājiem, ir tās, kas darbojas "nepareizajā" vidē. Mūsējā dzīvoja /Applications uz katras izstrādes mašīnas, tāpēc kļūda mums bija strukturāli neredzama, kamēr skāra pirmreizējos lietotājus. Kad ziņojums neatkārtojas, pirmais jautājums ir kas ir atšķirīgs vietā, kur tas darbojas, nevis vai lietotājs kļūdās.

GeekBye v2.0.6 izlaida pārvietošanas uzvedni un diagnostiku kopā. Plašākajam uzticamības lokam, kurā tas iekļaujas, skati ko patiesībā prasa versija 2 (v2.0.0) un kāpēc ekrāna ierakstīšana tver nepareizo monitoru (v2.0.10) — vēl viena kļūda, kas parādījās tikai konkrētā vidē. Kaimiņu sīko detaļu laidienam skati mierīga programmatūra: mirgošanas labojums un atbilžu režīma čips (v2.0.3 + v2.0.5).