
Mac Uygulamanız Mikrofon Erişimi Alıyor — Sonra Her Açılışta Unutuyor
GeekBye mikrofon izni istedi, siz verdiniz ve çalıştı. Bir sonraki açılışta: yok oldu. Üstelik uygulama Sistem Ayarları → Mikrofon'da hiç görünmedi bile. Suçlu, uygulamayı sessizce kaybolan bir yoldan çalıştıran bir macOS güvenlik özelliğiydi — işte teşhis ve tek istemlik çözüm.
İşte insanın kendi gözlerinden şüphe etmesine yol açan bir hata. GeekBye'ı yüklüyorsunuz, mikrofon erişimi istiyor, İzin Ver'e tıklıyorsunuz ve transkripsiyon çalışıyor. Harika. Kapatıyorsunuz, ertesi sabah tekrar açıyorsunuz — ve yeniden mikrofon erişimi istiyor. Elle düzeltmek için Sistem Ayarları → Gizlilik ve Güvenlik → Mikrofon'a bakmaya gidiyorsunuz ve GeekBye listede bile yok. Reddedilmemiş. İzin verilmemiş. Sadece yok, sanki hiç istememiş gibi.
Her bir parça ayrı ayrı doğru görünüyordu. İstem gerçekti. İzin o anda çalışıyordu. Uygulama doğru kullanım metinleriyle düzgün imzalanmış ve noter onaylıydı. Yine de izin her açılışta buharlaşıyordu. GeekBye v2.0.6 bunu düzeltti — ve kök neden, macOS'in sizi korumak için yaptığı en sinsi şeylerden biri.
Uygulamayı kendisinden gizleyen özellik
Suçlu, bir Gatekeeper güvenlik özelliği olan macOS App Translocation. Bir uygulamayı indirip doğrudan DMG'den veya ~/Downloads klasörünüzden çalıştırdığınızda — hâlâ "karantinada" olduğu her yerden — macOS onu gördüğünüz yerden çalıştırmaz aslında. Onu şeffaf bir şekilde /private/var/folders/.../AppTranslocation/… altında derinlerde, rastgele, salt okunur bir yola kopyalar ve o kopyayı çalıştırır. Bu iyi bir savunmadır: kötü niyetli bir indirmenin yanındaki dosyalarla oynamasını engeller.
Ama işte çakışma burada. macOS'in izin sistemi (TCC — mikrofonunuzu, kameranızı, ekranınızı kimin kullanabileceğini takip eden şey) bir uygulamayı yolu ve kod kimliğiyle tanır. Uygulama transloke edildiğinde, o yol rastgele ve geçicidir. Yani mikrofon erişimi verdiğinizde, macOS izni sadakatle kaydeder — ancak bir sonraki açılışta var olmayacak bir yola karşı. Uygulamayı yeniden açın, macOS onu farklı bir rastgele yola transloke eder, kaydı olmayan bir uygulama görür ve yeniden sorar. Ve o hayalet yol hiçbir zaman kararlı bir konum olmadığı için, uygulama Sistem Ayarları → Mikrofon'da hiçbir zaman kalıcı bir satır kazanmaz.
Uygulama bir hayalete izin veriyordu.
Bu aynı zamanda neden yalnızca bazı insanların bununla karşılaştığının da nedeni. GeekBye kopyanız zaten /Applications'ta yaşıyorsa — çünkü onu oraya sürüklediniz ya da otomatik güncelleme yoluyla oraya geldi — karantina yok, translokasyon yok, kararlı bir yol var ve her şey mükemmel şekilde kalıcı olur. Hata bizim için ve ilk kurulumunu geçmiş herkes için görünmezdi; tam olarak en uzun süre hayatta kalan türden bir hata.
Çözüm: uygulamaya gerçek bir yuva verin
Sorunun tamamı kararsız bir yol olduğundan, çözüm uygulamayı kararlı bir yola taşımaktır. v2.0.6, GeekBye'ın transloke olarak (ya da sadece /Applications dışında) çalıştığını algılar ve tek tıkla "Move to Applications" sunar — paketi /Applications'a kopyalayıp oradan yeniden başlatan macOS yeniden konumlandırma çağrısını kullanarak. O andan itibaren uygulamanın sabit bir kimliği olur: mikrofon izni kalır, ekran kaydı kalır ve GeekBye sonunda beklediğiniz yerde, Sistem Ayarları'nda görünür.
İstem bu konuda naziktir. Move to Applications, Not Now ve Don't Ask Again sunar — ve son seçimi hatırlar, böylece uygulamayı başka bir yerden çalıştırmak için bilinçli bir nedeni olan birini asla rahatsız etmez. İstemin gösterilip gösterilmeyeceği kararı küçük, saf fonksiyonlara ayrılmıştır (bu derleme transloke mi? /Applications dışında mı? kullanıcı bastırdı mı?), böylece mantık, gerçek bir karantina biriminde gerçek bir noter onaylı derleme başlatmaya gerek kalmadan birim testiyle sınanır.
Aynı sürüm izin deneyiminin kendisini de basitleştirdi. GeekBye eskiden özel, kendine özgü bir uygulama içi izin penceresi açardı — işletim sisteminin zaten iyi yaptığı bir şeyi yeniden üretmeye çalışan birkaç yüz satır arayüz. v2.0.6 bunu sildi ve yerel macOS izin istemine dayandı; bunu, yalnızca gerekli bir izin gerçekten eksik olduğunda beliren sessiz, engellemeyen bir bildirim çubuğu destekliyor. Daha az kod ve kullanıcıların zaten tanıdığı bir davranış, çünkü diğer her Mac uygulaması aynı şekilde çalışır.
En gurur duyduğum kısım: inanmadan önce kanıtladık
Translokasyonu tahmin edip bir çözüm yayınlamak kolay olurdu. Bunun yerine sürüm önce bir açılış tanılaması yayınladı: GeekBye artık açılışta kendi yürütülebilir yolunu ve transloke olup olmadığını, /Applications içinde olup olmadığını ve mevcut mikrofon ve ekran izni durumunu bildiriyor. Bu telemetri, akla yatkın bir teoriyi doğrulanmış bir teoriye dönüştürdü — üretim verileri, etkilenen oturumların gerçekten de /Applications dışındaki transloke yollardan çalıştığını gösterdi, tam da öngörüldüğü gibi.
Bu sıralama önemli. "İstem beliriyor ama izin kalmıyor" ifadesinin birkaç olası açıklaması var — bir imzalama sorunu, eksik bir kullanım metni, bir yetkilendirme (entitlement) sorunu, bir TCC veritabanı tuhaflığı. API düzeyindeki nedenleri eledik (istek yolu gösterilebilir biçimde doğruydu) ve ardından umutlu bir çözüm yayınlayıp destek biletlerinin durmasını ummak yerine gerçek verilerin kimlik/yol katmanını işaret etmesine izin verdik.
Bu hatanın öğrettiği üç şey
- İstem gösteren ama kalıcı olmayan bir izin, bir API sorunu değil, bir kimlik sorunudur. İstek kodu doğruysa ve izin yine de yok oluyorsa, isteği yeniden yazmayı bırakın. İşletim sisteminin izni hangi yola ve kod kimliğine bağladığını — ve bu kimliğin açılışlar arasında kararlı olup olmadığını — sorun.
- Tanılamayı çözümle birlikte (veya ondan önce) yayınlayın. Birkaç alan — nereden çalışıyorum, izin durumum ne — eğitimli bir tahmini doğrulanmış bir kök nedene dönüştürdü ve tam olarak hangi kullanıcıların etkilendiğini söyledi. Yamalamadan önce şüphelendiğiniz sınırı ölçümleyin.
- Geliştiricilerden saklanan hatalar, "yanlış" ortamda çalışanlardır. Bizimki her geliştirme makinesinde
/Applications'ta yaşıyordu, dolayısıyla hata bizim için yapısal olarak görünmezken ilk kez kullananları vuruyordu. Bir rapor yeniden üretilemediğinde ilk soru kullanıcı yanılıyor mu değil, çalıştığı yerde ne farklı olduğudur.
GeekBye v2.0.6, yeniden konumlandırma istemini ve tanılamayı birlikte yayınladı. Bunun içine oturduğu daha geniş güvenilirlik yayı için, bir versiyon 2 gerçekte neye mal olur (v2.0.0) ve ekran kaydı neden yanlış monitörü yakalar (v2.0.10) yazılarına bakın — o da yalnızca belirli bir ortamda ortaya çıkan başka bir hata. Yanı başındaki küçük ayrıntılar sürümü için, sakin yazılım: titreme düzeltmesi ve yanıt modu çipi (v2.0.3 + v2.0.5).