Steven
Steven5 min. skaitymo

Jūsų „Mac" programa gauna prieigą prie mikrofono — ir kaskart paleidus ją pamiršta

„GeekBye" paprašė leidimo naudoti mikrofoną, jį suteikėte, ir viskas veikė. Kitą kartą paleidus: dingo. O programa apskritai nepasirodė Sistemos nuostatose → Mikrofonas. Kaltininku buvo „macOS" saugumo funkcija, tyliai paleidžianti programą iš kelio, kuris pranyksta — štai diagnozė ir pataisa vienu paspaudimu.

macOS
Leidimai
Inžinerija
„GeekBye" leidimai
Jūsų „Mac" programa gauna prieigą prie mikrofono — ir kaskart paleidus ją pamiršta

Štai klaida, dėl kurios imi abejoti savo akimis. Įsidiegiate „GeekBye", jis paprašo prieigos prie mikrofono, spustelite Leisti, ir transkripcija veikia. Puiku. Uždarote, kitą rytą atidarote — o jis prašo prieigos prie mikrofono vėl. Einate patikrinti Sistemos nuostatų → Privatumas ir saugumas → Mikrofonas, kad pataisytumėte rankomis, o „GeekBye" sąraše apskritai nėra. Ne uždrausta. Ne leista. Tiesiog nėra, tarsi jis niekada ir neprašė.

Kiekvienas atskiras dalykas atrodė teisingas. Užklausa buvo tikra. Leidimas tą akimirką veikė. Programa buvo tinkamai pasirašyta ir notarizuota su teisingomis naudojimo eilutėmis. Ir vis dėlto suteiktas leidimas kaskart paleidus išgaruodavo. „GeekBye" v2.0.6 tai pataisė — o pirminė priežastis yra vienas gudriausių dalykų, kuriuos „macOS" daro, kad jus apsaugotų.

Funkcija, kuri slėpė programą nuo jos pačios

Kaltininkas yra „macOS App Translocation", „Gatekeeper" saugumo funkcija. Kai atsisiunčiate programą ir paleidžiate ją tiesiai iš DMG arba iš ~/Downloads aplanko — bet kur, kur ji tebėra „karantine" — „macOS" iš tikrųjų paleidžia ją ne ten, kur ją matote. Jis skaidriai nukopijuoja ją į atsitiktinį tik skaitymui skirtą kelią giliai po /private/var/folders/.../AppTranslocation/… ir paleidžia kopiją. Tai gera apsauga: ji neleidžia kenksmingam atsisiuntimui klastoti šalia esančių failų.

Bet štai susidūrimas. „macOS" leidimų sistema (TCC — tai, kas seka, kas gali naudoti jūsų mikrofoną, kamerą, ekraną) atpažįsta programą pagal jos kelią ir kodo tapatumą. Kai programa yra translokuota, tas kelias yra atsitiktinis ir laikinas. Taigi kai suteikiate prieigą prie mikrofono, „macOS" stropiai užfiksuoja suteikimą — keliui, kurio kitą kartą paleidus nebus. Atidarote programą vėl, „macOS" translokuoja ją į kitą atsitiktinį kelią, mato programą, apie kurią neturi jokio įrašo, ir klausia iš naujo. O kadangi tas fantominis kelias niekada nėra stabili vieta, programa niekada neįgyja nuolatinės eilutės Sistemos nuostatose → Mikrofonas.

Programa suteikdavo leidimą vaiduokliui.

Būtent todėl su tuo susidūrė tik kai kurie žmonės. Jei jūsų „GeekBye" kopija jau gyveno /Applications — nes nutempėte ją ten arba nes ji ten atsidūrė per automatinį atnaujinimą — nėra karantino, nėra translokacijos, kelias stabilus, ir viskas išlieka tobulai. Klaida buvo nematoma mums ir kiekvienam po pirmojo įdiegimo, o tai kaip tik toks klaidos tipas, kuris išgyvena ilgiausiai.

Pataisa: suteikite programai tikrus namus

Kadangi visa problema — nestabilus kelias, pataisa yra perkelti programą į stabilų. v2.0.6 aptinka, kai „GeekBye" veikia translokuotas (arba tiesiog veikia už /Applications ribų), ir siūlo vienu paspaudimu „Move to Applications" — naudodamas „macOS" perkėlimo iškvietimą, kuris nukopijuoja paketą į /Applications ir iš ten jį paleidžia iš naujo. Nuo tos akimirkos programa turi pastovų tapatumą: mikrofono suteikimas laikosi, ekrano įrašymas laikosi, o „GeekBye" pagaliau pasirodo Sistemos nuostatose ten, kur to tikitės.

Užklausa dėl to yra mandagi. Ji siūlo Move to Applications, Not Now ir Don't Ask Again — ir įsimena paskutinį pasirinkimą, tad programa niekada neįkyri tam, kuris turi sąmoningą priežastį paleisti ją iš kitur. Sprendimas, ar apskritai rodyti užklausą, izoliuotas į mažas, grynas funkcijas (ar ši versija translokuota? ar ji už /Applications ribų? ar naudotojas ją nutildė?), tad logika padengta vienetiniais testais be poreikio paleisti tikrą notarizuotą versiją tikrame karantino tome.

Tas pats leidimas supaprastino ir pačią leidimų patirtį. „GeekBye" anksčiau iššokdavo su pritaikytu, savadarbiu vidiniu leidimų langu — keliais šimtais sąsajos eilučių, mėginančių atkartoti tai, ką OS ir taip daro gerai. v2.0.6 jį ištrynė ir atsirėmė į savąją „macOS" leidimų užklausą, paremtą tyliu, neblokuojančiu skydeliu, kuris pasirodo tik tada, kai reikalingo leidimo iš tikrųjų trūksta. Mažiau kodo ir elgsena, kurią naudotojai jau atpažįsta, nes visos kitos „Mac" programos veikia taip pat.

Dalis, kuria labiausiai didžiuojuosi: įrodėme tai anksčiau, nei patikėjome

Būtų buvę lengva translokaciją atspėti ir išleisti pataisą. Vietoj to leidimas pirmiausia išleido paleisties diagnostiką: paleidus „GeekBye" dabar praneša savo paties vykdomojo failo kelią ir tai, ar jis translokuotas, ar yra /Applications viduje, bei esamą mikrofono ir ekrano leidimų būseną. Ši telemetrija tikėtiną teoriją pavertė patvirtinta — gamybos duomenys parodė, kad paveikti seansai iš tikrųjų veikė iš translokuotų kelių už /Applications ribų, būtent kaip ir buvo numatyta.

Ši tvarka svarbi. „Užklausa pasirodo, bet leidimas nesilaiko" turi kelis galimus paaiškinimus — parašo problema, trūkstama naudojimo eilutė, teisių (entitlement) klausimas, TCC duomenų bazės keistenybė. API lygmens priežastis atmetėme (užklausos kelias buvo akivaizdžiai teisingas), o paskui leidome realaus pasaulio duomenims nurodyti į tapatumo/kelio sluoksnį, užuot išleidę pataisą su viltimi ir tikėdamiesi, kad pagalbos užklausos nustos ateiti.

Trys dalykai, kurių moko ši klaida

  1. Leidimas, kuris klausia, bet nesilaiko, yra tapatumo, o ne API problema. Jei užklausos kodas teisingas, o suteikimas vis tiek dingsta, liaukitės perrašinėję užklausą. Paklauskite, prie kokio kelio ir kodo tapatumo OS sieja suteikimą — ir ar tas tapatumas stabilus tarp paleidimų.
  2. Išleiskite diagnostiką kartu su (arba prieš) pataisą. Keli laukai — iš kur veikiu, kokia mano leidimų būsena — pavertė pagrįstą spėjimą patvirtinta pirmine priežastimi ir tiksliai pasakė, kurie naudotojai buvo paveikti. Aprūpinkite prietaisais ribą, kurią įtariate, prieš ją lopdami.
  3. Klaidos, kurios slepiasi nuo kūrėjų, yra tos, kurios veikia „netinkamoje" aplinkoje. Mūsiškė gyveno /Applications kiekvienoje kūrėjo mašinoje, tad buvo struktūriškai nematoma mums, tuo pat metu paliesdama pirmakart besinaudojančius. Kai pranešimas neatsikartoja, pirmasis klausimas yra kuo skiriasi vieta, kur tai veikia, o ne ar naudotojas klysta.

„GeekBye" v2.0.6 išleido perkėlimo užklausą ir diagnostiką kartu. Dėl platesnio patikimumo lanko, į kurį tai įsirašo, žr. kiek iš tikrųjų kainuoja 2 versija (v2.0.0) ir kodėl ekrano įrašymas fiksuoja ne tą monitorių (v2.0.10) — dar viena klaida, iškilusi tik konkrečioje aplinkoje. Dėl gretimo smulkių detalių leidimo, ramus programinis įrankis: mirgėjimo pataisa ir atsakymo režimo žetonas (v2.0.3 + v2.0.5).

Susiję straipsniai

Atskirti skambutį nuo atvertos programos
Steven
Steven7 min. skaitymo

Atskirti skambutį nuo atvertos programos

GeekBye gali pastebėti, kad prisijungei prie vaizdo susitikimo, ir pasiūlyti jį įrašyti. Aptikimas pasirodo esąs lengvoji pusė — Swift binaras, kas dešimt sekundžių skaitantis langų pavadinimus. Sunkioji pusė yra tikslumas: nesuveikti, kai Zoom tiesiog atvertas, nesiūlyti susitikimo, kurį jau įrašinėji, ir nenutildyti mikrofono skambutyje, kuriame iš tikrųjų esi. Trys leidimai, ir kiekvienas yra apsauga, kuriai teko išmokti nenugalėti pačios savęs.

Inžinerija
macOS
Desktop
Keturi leidimai per dvidešimt šešias valandas: kalbos vamzdynas ir „bridge release"
Steven
Steven5 min. skaitymo

Keturi leidimai per dvidešimt šešias valandas: kalbos vamzdynas ir „bridge release"

GeekBye nuo v1.7.6 iki v1.8.1: kalbos nustatymas, kuris niekada nebuvo palikęs nešiojamojo, Cmd+/ perdanga, rodanti tavo tikrus sparčiuosius klavišus, versija be jokių kodo pakeitimų — ir vištos bei kiaušinio problema migruojant automatinių atnaujinimų srautą.

Inžinerija
Leidimai
Desktop
Tyla buvo laikančioji
Steven
Steven6 min. skaitymo

Tyla buvo laikančioji

Du paskutiniai GeekBye v1 leidimai — apie tą pačią nemalonią tiesą: transkripcija realiu laiku per tikrą tinklą nėra be nuostolių, o sąžiningas žingsnis — liautis apsimetinėti, kad taip yra. v1.8.20 laikė kiekvieno garso fragmento kopiją diske, prieš atmesdamas jį pakartotinio prisijungimo metu, ir ėmė garsiai žymėti spragas transkripcijoje. v1.9.0 nustojo siųsti tylą, kad sutaupytų pralaidumą — ir atrado, kad tyla buvo būtent tas signalas, pagal kurį transkribuotojas suprato, jog sakinys baigėsi. Du leidimai apie daiktų išmetimo kainą.

Inžinerija
Audio
Patikimumas