Steven
Steven5 min lugemist

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.

macOS
Load
Arendus
GeekBye väljalasked
Sinu Maci rakendus annab mikrofonile loa — ja unustab selle iga käivitusega

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

  1. 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.
  2. 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.
  3. 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).

Seotud artiklid

Rahulik tarkvara: vilkuva lüliti tapmine ja vestlusele õpetamine ütlema, mis režiimis ta on
Steven
Steven5 min lugemist

Rahulik tarkvara: vilkuva lüliti tapmine ja vestlusele õpetamine ütlema, mis režiimis ta on

Kaks väikest GeekBye väljalaset, ilma suurte funktsioonideta — lihtsalt seadete lüliti, mis lakkas vilkumast, ja vestlusassistent, mis lõpuks ütleb, kas ta vastas koosolekurežiimis või koodirežiimis. Nii palju "rahulik tarkvara" tegelikult maksab, üks detail korraga.

Toode
Disain
Arendus
Tarkvara täiuslikuna tarnimise anatoomia: kuidas koodiülevaatus tabas selle, mida testid ei suutnud
Steven
Steven5 min lugemist

Tarkvara täiuslikuna tarnimise anatoomia: kuidas koodiülevaatus tabas selle, mida testid ei suutnud

Kogu GeekBye v2 sarja vältel kordub üks ja seesama: parandus läbib arendaja masinas iga testi ning siis tõestab koodiülevaatus, et peaaegu kõigi teiste jaoks oleks see läbi kukkunud. See on üheksa väljalaske taga olev töövoog — ülevaatuse värav, esmalt-parandus tabamised ja testi-enne-tarnimist distsipliin, mis muudab "minu masinas töötab" fraasiks "see töötab".

Inseneeria
Protsess
Koodiülevaatus
Üks CSS-i muutuja, viis ülevaatusringi ja Swifti tööriistakett, mis valetas
Steven
Steven6 min lugemist

Üks CSS-i muutuja, viis ülevaatusringi ja Swifti tööriistakett, mis valetas

GeekBye v2.0.7 muutis kogu overlay reguleeritavalt läbipaistvaks — mis kõlab nagu üherealine CSS-i muudatus ja seda kindlasti ei olnud. Tegelik lugu on selles, mida koodiülevaatus tabas: kaks pinda, mis keeldusid tuhmumast, salvestusriba, mis nägi sama läbipaistvuse juures vale välja, ja kompileeritud binaar, mis kõikus 672 baiti edasi-tagasi, sest meie enda dokumentatsioon ütles ülevaatajale vale Swifti versiooni.

Inseneeria
Disain
Ehitus