
Sinu Maci rakendus annab mikrofonile loa — ja unustab selle iga käivitusega
GeekBye küsis mikrofoni luba, sina andsid selle ja kõik töötas. Järgmisel käivitusel: kadunud. Ja rakendust polnud üldse Süsteemiseadete → Mikrofoni loendis. Süüdlaseks osutus vaikselt töötav macOS-i turvafunktsioon, mis käivitas rakenduse asukohast, mis kaob — siin on diagnoos ja üheainsa dialoogiaknaga lahendus.
Siin on viga, mis paneb sind oma silmi kahtluse alla seadma. Sa installid GeekBye, see küsib mikrofoni juurdepääsu, sa klõpsad Allow (Luba) ja transkribeerimine töötab. Suurepärane. Sa väljud, avad selle järgmisel hommikul uuesti — ja see küsib mikrofoni juurdepääsu uuesti. Lähed vaatama Süsteemiseadete → Privaatsus ja turvalisus → Mikrofon, et see käsitsi ära parandada, ja GeekBye pole isegi loendis. Mitte keelatud. Mitte lubatud. Lihtsalt puudu, justkui poleks kunagi küsinudki.
Iga üksik tükk nägi õige välja. Dialoogiaken oli päris. Luba töötas hetkel. Rakendus oli korralikult allkirjastatud ja notariseeritud õigete kasutusstringidega. Ja ometi haihtus luba iga käivitusega. GeekBye v2.0.6 parandas selle — ja algpõhjus on üks salakavalamaid asju, mida macOS sinu kaitseks teeb.
Funktsioon, mis peitis rakendust tema enda eest
Süüdlaseks on macOS App Translocation, Gatekeeperi turvafunktsioon. Kui sa laadid rakenduse alla ja käivitad selle otse DMG-st või oma ~/Downloads kaustast — kõikjalt, kus see on veel "karantiinis" — ei käivita macOS seda tegelikult sealt, kus sa seda näed. See kopeerib selle läbipaistvalt juhuslikku, kirjutuskaitstud asukohta sügavale /private/var/folders/.../AppTranslocation/… alla ja käivitab selle koopia. See on hea kaitse: see takistab pahatahtlikul allalaadimisel enda kõrval olevaid faile rikkumast.
Aga siin on kokkupõrge. macOS-i lubade süsteem (TCC — see, mis jälgib, kellel on õigus kasutada sinu mikrofoni, kaamerat, ekraani) tuvastab rakenduse selle asukoha ja koodi identiteedi järgi. Kui rakendus on translokeeritud, on see asukoht juhuslik ja ajutine. Nii et kui sa annad mikrofoni juurdepääsu, salvestab macOS kohusetundlikult loa — asukoha vastu, mida järgmisel käivitusel enam ei eksisteeri. Ava rakendus uuesti, macOS translokeerib selle teistsugusesse juhuslikku asukohta, näeb rakendust, millest tal pole mingit kirjet, ja küsib uuesti. Ja kuna see fantoomasukoht ei ole kunagi stabiilne, ei teeni rakendus kunagi püsivat rida Süsteemiseadete → Mikrofoni loendis.
Rakendus andis luba tondile.
Seepärast tabaski see ainult mõnda inimest. Kui sinu GeekBye koopia juba asus kaustas /Applications — kuna sa lohistasid selle sinna või kuna see jõudis sinna automaatvärskenduse kaudu — pole karantiini, pole translokatsiooni, on stabiilne asukoht ja kõik püsib täiuslikult. Viga oli nähtamatu nii meile kui ka kõigile, kes olid oma esimesest installist möödas, mis on täpselt selline viga, mis püsib kõige kauem.
Lahendus: anna rakendusele päris kodu
Kuna kogu probleem seisneb ebastabiilses asukohas, on lahenduseks viia rakendus stabiilsesse asukohta. v2.0.6 tuvastab, kui GeekBye töötab translokeerituna (või lihtsalt väljaspool /Applications), ja pakub üheainsa klõpsuga "Move to Applications" (Teisalda Applications-kausta) — kasutades macOS-i ümberpaigutuskutset, mis kopeerib paketi kausta /Applications ja taaskäivitab selle sealt. Sellest hetkest alates on rakendusel fikseeritud identiteet: mikrofoni luba püsib, ekraanisalvestuse luba püsib, ja GeekBye ilmub lõpuks Süsteemiseadetesse, kust sa seda ootaksidki.
Dialoogiaken on selle suhtes viisakas. See pakub Move to Applications, Not Now (Mitte praegu) ja Don't Ask Again (Ära küsi uuesti) — ja jätab viimase valiku meelde, nii et rakendus ei tüüta kunagi kedagi, kellel on tahtlik põhjus seda mujalt käivitada. Otsus, kas dialoogiakent üldse näidata, on eraldatud väikestesse, puhastesse funktsioonidesse (kas see build on translokeeritud? kas see on väljaspool /Applications? kas kasutaja on selle vaigistanud?), nii et loogikat saab ühiktestida ilma, et oleks vaja käivitada päris notariseeritud buildi päris karantiinis oleval köitel.
Sama väljalase lihtsustas ka lubade kogemust ennast. GeekBye kuvas varem kohandatud, ainulaadse rakendusesisese lubade akna — paarsada rida kasutajaliidest, mis üritas taastoota midagi, mida OS juba hästi teeb. v2.0.6 kustutas selle ja toetus macOS-i natiivsele lubade dialoogiaknale, mida toetab vaikne, mitteblokeeriv ribareklaam, mis ilmub ainult siis, kui mõni vajalik luba tegelikult puudub. Vähem koodi ja käitumine, mille kasutajad juba ära tunnevad, sest iga teine Maci rakendus töötab samamoodi.
See osa, mille üle olen kõige uhkem: me tõestasime selle enne, kui uskusime
Oleks olnud lihtne translokatsiooni oletada ja parandus välja saata. Selle asemel saatis väljalase esimesena välja käivitusdiagnostika: käivitamisel raporteerib GeekBye nüüd oma enda käivitatava faili asukoha ja selle, kas see on translokeeritud, kas see on kaustas /Applications, ning praeguse mikrofoni ja ekraani loa oleku. See telemeetria muutis usutava teooria kinnitatuks — tootmisandmed näitasid, et mõjutatud seansid töötasid tõepoolest translokeeritud asukohtadest väljaspool kausta /Applications, täpselt nagu ennustatud.
See järjekord on oluline. "Dialoogiaken ilmub, aga luba ei püsi" — sellel on mitu võimalikku seletust: allkirjastamise probleem, puuduv kasutusstring, õigustuste (entitlement) probleem, TCC-andmebaasi imelikkus. Me välistasime API-tasandi põhjused (päringutee oli tõestatavalt õige) ja lasksime siis päris maailma andmetel osutada identiteedi/asukoha kihile, selle asemel et saata välja lootusrikas parandus ja loota, et tugipiletid lakkavad.
Kolm asja, mida see viga õpetab
- Luba, mis küsib, kuid ei püsi, on identiteedi probleem, mitte API probleem. Kui päringukood on õige ja luba ikkagi kaob, lõpeta päringu ümberkirjutamine. Küsi, millise asukoha ja koodi identiteediga OS luba seob — ja kas see identiteet on käivituste vahel stabiilne.
- Saada diagnostika välja koos parandusega (või enne seda). Mõned väljad — kust ma töötan, mis on mu loa olek — muutsid haritud oletuse kinnitatud algpõhjuseks ja ütlesid meile täpselt, millised kasutajad olid mõjutatud. Instrumenteeri kahtlustatav piir enne, kui seda parandad.
- Vead, mis peidavad end arendajate eest, on need, mis töötavad "vales" keskkonnas. Meie oma elas igal arendusmasinal kaustas
/Applications, nii et viga oli meile struktuurselt nähtamatu, kuid tabas esmakordseid kasutajaid. Kui raport ei taastu, on esimene küsimus mis on erinev selles, kus see töötab, mitte kas kasutaja eksib.
GeekBye v2.0.6 saatis ümberpaigutuse dialoogiakna ja diagnostika koos välja. Laiema töökindluse kaare kohta, millesse see paigutub, vaata mida version 2 tegelikult nõuab (v2.0.0) ja miks ekraanisalvestus jäädvustab vale monitori (v2.0.10) — veel üks viga, mis tuli esile ainult kindlas keskkonnas. Kõrvaltoas oleva pisidetailide väljalaske kohta vaata rahulik tarkvara: virvenduse parandus ja vastamisrežiimi märgis (v2.0.3 + v2.0.5).