İçeriğe atla
megapromotingHadi konuşalım

Uzmanlık · Masaüstü uygulamaları

Bilgisayara kurulan uygulamalar. macOS üzerinde iki tane oluşturduk; Windows ve Linux için bu sayfa tarihçe değil, tekliftir.

macOS için yerel uygulamalar kuruyoruz; mantık çekirdeği ekrandan ayrı tutulur, böylece aynı mantık telefonda da çalışır. Windows ve Linux/Ubuntu için henüz teslim ettiğimiz bir şey yok ve bunu, işi kabul edeceğimiz koşullarla birlikte aynen yazıyoruz. İlk soru hâlâ gerçekten kurulmuş bir uygulamaya ihtiyacınız olup olmadığıdır.

Teklif, koşullarıylaRegula e mecanică și o aplic mecanic. Pe macOS avem două implementări proprii, construite și rulabile: o aplicație de bară de meniu cu 25 de fișiere Swift, care refolosește 15 fișiere din nucleul unui proiect de iPhone, și o a doua aplicație, mai simplă, care e un înveliș WebKit peste o aplicație web. Ambele au binar compilat pe această mașină. Dar serviciul, așa cum e numit, acoperă trei familii de sisteme, iar pentru două dintre ele — Windows și Linux/Ubuntu — am căutat serios și am găsit zero: niciun proiect .NET sau Qt propriu, niciun `tauri.conf.json`, niciun Electron scris de noi, niciun `.desktop`, niciun ambalaj deb, rpm sau AppImage. În plus, niciuna dintre cele două aplicații de macOS nu a fost vreodată împachetată într-un instalator distribuibil. Cu doar una din trei platforme acoperită și zero distribuții, pagina se scrie ca ofertă cu condiții. Când vom livra prima aplicație de Windows sau de Linux, se schimbă valoarea, nu textul.

Size sorduğumuz ilk soru, hangi sistem için olduğu değil, gerçekten kurulu bir uygulamaya ihtiyacınız olup olmadığıdır. Tarayıcının vermediği bir şeye ihtiyaç duyduğunda kurmaya değer: sensörlere veya çevre birimlerine doğrudan erişim, sistem çubuğunda sürekli görünürlük, internetsiz çalışma, kişinin her seferinde yüklemeden disk üzerindeki dosyalara erişim ya da pencere kapalıyken arka planda çalıştırma. Bunlardan hiçbiri gerekmiyorsa, bir bağlantıdan açılan bir siteyi yapmak, güncellemek ve sürdürmek daha ucuzdur — iş daha küçük çıksa bile bunu size söyleriz.

macOS’ta iki uygulama oluşturduk. İlki bir menü çubuğu uygulaması: 25 kendi Swift dosyası, ayrıca aynı ürünün iPhone projesinden doğrudan alınan 15 çekirdek dosyası — aynı dosyalar, kopya değil. Doğrudan Swift derleyicisini çağıran bir script ile derlenir, hedef `arm64-apple-macosx14`, SwiftUI, AppKit, CoreMotion, Vision ve UserNotifications dahil olmak üzere on bir sistem çerçevesini bağlar. Ortaya çıkan ikili 6.516.128 bayttır. İkincisi çok daha basittir ve bunu açıkça söylemek gerekir: üç Swift dosyası, bir web uygulamasının üzerine kurulmuş bir WebKit kabuğu, sandbox ve hardened runtime etkin, Intel ve Apple işlemciler için evrensel olarak derlenmiş. Bunlar iki farklı şeydir ve biz onları farklı adlandırırız.

Açıkça söyleyelim, elimizde olmayanlar. Windows: sıfır. .NET, WPF, WinForms, WinUI projeleri, `.xaml`, `.appxmanifest`, `.msi`, `.wxs` dosyaları aradık — diskte bulduğumuz her şey, başka bir projede vendörlenmiş, bizim yazmadığımız üçüncü taraf bir C kütüphanesine aittir. Linux masaüstü: sıfır — burada oluşturulmuş hiçbir `.desktop` dosyası, hiçbir deb veya AppImage paketi yok. Bizim yazdığımız Electron veya Tauri: sıfır. Ve en az bunun kadar önemli: macOS’taki iki uygulamanın hiçbiri bugüne kadar bir kurulum paketine dönüştürülmedi. Bunlar yerel olarak oluşturulmuş, ad-hoc imzalı, ekip kimliği olmayan `.app` paketleri olarak var.

Yine de bugüne kadarki deneyimin aktardığı şey var ve yeni bir proje için önemli olan kısım bu: mantık çekirdeğini arayüzden ayrı tutma disiplini. macOS projesinde hesaplama ve politika dosyaları arayüzü içe aktarmıyor, bu yüzden Mac’te sıradan program olarak, simülatör olmadan derlenip çalıştırılıyor; mantık paketi birkaç saniye içinde çalışıyor. Aynı ayrım, başka bir sisteme taşımayı yeniden yazma değil, kabuk sorunu haline getiriyor. Windows veya Linux yapabileceğimizi söylerken dayandığımız şey budur — sahip olmadığımız bir deneyim değil.

Neleri kapsıyor

Çalışma, bileşenlerine ayrılmış hâliyle

Önce kurulu bir uygulamaya ihtiyacınız olup olmadığına karar veriyoruz

Beş kriter, sırayla kontrol edilir: sensörlere veya çevre birimlerine erişim, sistem çubuğunda varlık, internetsiz çalışma, disk üzerindeki dosyalara doğrudan erişim, pencere kapalıyken arka planda çalışma. Bunlardan hiçbiri geçerli değilse, önerimiz bir web uygulamasıdır ve nedeni pratiktir: kurulu bir uygulamanın her bilgisayarda imzalanması, dağıtılması ve güncellenmesi gerekir; bu üç adımın her biri bir kez değil, sürekli maliyet yaratır.

Çekirdek bir kez yazılır ve ne üzerinde çalıştığını bilmez

macOS uygulamamızda masaüstü hedefi, iPhone projesinin çekirdeğinden 15 dosyayı kendi kaynakları olarak listeler — hesaplama, kalibrasyon, geçmiş, bildirim ve sağlık verisi politikaları. Kopyalanmış değiller, aynı dosyalar. Sonuç: bir algoritma düzeltmesi tek yerde yapılır ve her ikisinde de görünür. İkinci sonuç, sizin için daha önemlisi: çekirdek, uygulamayı başlatmadan test edilebilir.

Platform kabuğu ince kalır, ve ne kadar ince olduğunu size söyleriz

Menü çubuğu uygulaması, AppKit uygulama delegesi üzerinde `MenuBarExtra` kullanır — yerel kod, ama az; çünkü geri kalanı ortak çekirdektir. Diğer macOS uygulamamız ise bunun tam tersidir: SwiftUI için paketlenmiş bir `WKWebView`, yani bir web uygulamasının üzerindeki bir pencere. İkisi de meşru macOS uygulamalarıdır, ama emek, hız ve sisteme erişim açısından farklı şeyler ifade eder. Hangisine ihtiyacınız olduğu başta belirlenir, teslimde keşfedilmez.

Bir butona basarak değil, bir script ile oluşturuyoruz

Meniu çubuğu uygulaması, doğrudan Swift derleyicisini çağıran, hedefi ve çerçeve listesini açıkça yazan, ardından `.app` paketini yerleştirip imzalayan yüz satırın altındaki bir betikten oluşturulur. Bir betiğe sığan bir derleme başka bir makinede de aynı şekilde çalışır ve otomatik bir hatta konabilir; yalnızca bir geliştirme programının arayüzünde var olan bir derleme bunu yapamaz.

Sandbox ve güçlendirilmiş çalışma zamanı, uygulama ağa çıktığında

İkinci macOS uygulaması sandbox etkin ve tek bir ağ izniyle başlar, o da istemci iznidir — sunucu değil, kullanıcının dosyalarına erişim değil, kamera değil, mikrofon değil. Güçlendirilmiş çalışma zamanı proje yapılandırmasından açılır. İzinler en baştan, okunabilir kısa bir liste olarak beyan edilir; bir şey yolunda gitmediğinde sonradan eklenmez.

İmzalama kodun değil, hesabın sorunudur ve bunu en başta masaya koyuyoruz

Bizim macOS uygulamalarımız ad-hoc olarak imzalanır: doğrulama yerel olarak geçer, ancak ekip kimliği yoktur ve proje yapılandırmasında geliştirme ekibi alanı boştur. Mağaza dışı dağıtım için bir macOS paketi, tanımlanabilir bir geliştirici sertifikasıyla imzalanmaya ve Apple notarizasyonundan geçmeye ihtiyaç duyar; aksi halde alıcının işletim sistemi onu engeller. Bu, işlevsellikten çok hesap ve süreç sorunudur — ama gerçek bir sorundur ve biz bunu son toplantıda saklamıyoruz.

Windows ve Linux: kabul etmeden önce ne istiyoruz

Ön aşama olarak ücretli bir uyumluluk kontrolü; bir belgeyle değil, sizin bilgisayarınızda açılan bir iskeletle biter. Bu aşamada üç şey belirlenir: hangi çalışma zamanını kullanacağımız ve neden, imzalama sertifikasını ve dağıtım hesabını kimin üstleneceği, ve bir güncellemenin insanların bilgisayarlarına nasıl ulaşacağı. Bu üçünden herhangi birine yanıt yoksa çalışma başlamaz. Teslim etmediğimiz bir platformu, bunu bir formaliteymiş gibi sunarak üstlenmeyiz.

Linux sunucusu Linux masaüstü değildir ve bu ikisini karıştırmıyoruz

Sistemlerimiz gün gün Linux üzerinde çalışır: hata durumunda yeniden başlatılan sistem birimleri, önde web sunucusu, günlükler ve bunların döngüsel rotasyonu. Bu, Linux ile gerçek bir deneyimdir, ama bu sunucu deneyimidir. Ubuntu için pencereli bir uygulama başka bir disiplindir — paketleme, grafik ortamla entegrasyon, depo üzerinden ya da kendi kendine yeten bir dosya ile dağıtım — ve orada teslim ettiğimiz hiçbir şey yok. Bu farkı bir mühendis üç saniyede görür; biz onu önceden söylemek daha iyidir.

Yapmadıklarımız

Bunu ilk kez yaptığımızı söylemeden, hiç üretmediğimiz bir kurulum aracını vaat etmiyoruz. Uygulamanın sistemden ne istediğini önce doğrulamadan, yalnızca moda diye bir çalışma zamanı seçmiyoruz. Ve mevcut bir masaüstü uygulamayı, aldığımız kaynaklardan kendi makinemizde sıfırdan kurmadan devralmıyoruz — derleme tekrarlanamıyorsa, sonrasındaki her tahmin bir falcılıktır.

Nasıl görünüyor

Süreç, adım adım.

01

Kurulu mu web mi olduğuna beş kritere göre karar veriyoruz

Sensörler ve çevre birimleri, sistem çubuğu, internetsiz çalışma, dosyalara erişim, arka planda çalışma. Kararı yazılı olarak, gerekçesiyle birlikte teslim ediyoruz; gerekçe „kurulu uygulamaya ihtiyacınız yok” olsa bile. Bu aşama kısadır ve kayıp olmadan burada durulabilir.

02

Çekirdeği kuruyor ve platform olmadan test ediyoruz

Mantık, durumlar, kalıcılık, politikalar — arayüzden bağımsız olacak ve komut satırı programı olarak derlenip çalıştırılabilecek şekilde yazılır. Test paketini ve onu sizin nasıl çalıştıracağınız komutu teslim ediyoruz. Sonradan ikinci bir platform ortaya çıkarsa, işin en baştan doğru yapılıp yapılmadığı burada anlaşılır.

03

Platform kabuğunu yerleştiriyoruz

macOS’ta: pencereler veya menü çubuğu, bildirimler, izinler, `.app` paketi, yapılandırma betiği. Windows veya Linux’ta: ilk aşamadaki uyumluluk kontrolünden sonra, orada seçilen çalışma zamanı ile. Aşamanın sonunda uygulama bizimkinde değil, sizin makinenizde açılır.

04

İmzalama, dağıtım, güncelleme

Çoğu projenin geç fark ettiği ve bizim görünmesi için açıkça en sona koyduğumuz aşama: sertifika, hesap, platformun istediği yerde noter tasdiki, güncelleme kanalı. Buradaki mevcut macOS tıkanmamız da bu — uygulamalar ekip tanımlayıcısı olmadan, ad-hoc imzalı. Sizin projenizde hesap sizindir ve tıkanma ortadan kalkar.

DocumenteConversațiiSurseSintezăAcțiuneEchipăContexteazăSurse autorizate. Acțiuni revizuite.
Un nucleu în centru — calcul, calibrare, istoric, politici — care nu importă nicio interfață și de aceea se testează singur. În jur, patru învelișuri de platformă: iPhone și macOS, legate și construite, desenate plin; Windows și Linux desktop, desenate deschis, pentru că nu există. Al cincilea nod, distribuția, e legat de macOS printr-o linie întreruptă: pachetul se construiește și se semnează ad-hoc, dar nu trece de notarizare, deci nu ajunge pe alt calculator. Desenul spune ce e făcut și ce nu, în aceeași imagine.

Veriler

Neye dokunuyoruz, nerede duruyorlar ve ne kadar kalıyorlar

Veri koruma sorumlusu olan herkesin soracağı sorular — o sormadan önce burada sorulmuş hâliyle.

Kurulu bir uygulama, tarayıcıdaki bir uygulamadan daha fazlasını görür
Bunu istemenizin nedeni de bu, aynı zamanda riski de bu: diske, kullanıcının dosya sistemine ve izin verilirse çevre birimlerine erişimi vardır. Bu yüzden izinler açıkça beyan edilir ve minimumda tutulur. Sandbox’lı uygulamamızda tam olarak bir izin vardır, o da ağ istemcisi izni.
Uygulamanın sunucusu yoksa veriler nerede durur
İnsanın bilgisayarında. Menü çubuğu uygulamasında geçmiş kendi dosyasına yazılır, tercihleri ise sistemin ayar deposuna, uygulama önekli anahtarlarla kaydedilir. Bir sunucuya hiçbir şey gitmez; bunun basit bir nedeni vardır: uygulamada ağ kodu yoktur. Ağ kodu olduğunda, izinler sayfasında kimin ne aldığı yazılır.
Varsayılan olarak neleri toplamıyoruz
Açıkça istenip arayüzde beyan edilmedikçe hiçbir telemetri, hiçbir cihaz tanımlayıcısı, hiçbir kullanım raporu. Masaüstü uygulaması, telemetrinin fark edilmeden geçtiği bir yerdir; bu yüzden eklenirse, görünür biçimde, kapatma düğmesiyle eklenir ve hangi alanların gittiği yazılır.
Güncellemeler bir ayrıntı değil, bir karardır
Bugün otomatik bir güncelleme kanalımız yok. Yeni bir projede bu, imzalama ve dağıtımla birlikte ilk üç karardan biridir: manuel mi güncellenir, platform mağazası üzerinden mi, yoksa kendi kanalınızla mı? Her seçeneğin farklı bir sürekli maliyeti ve farklı bir güvenlik yüzeyi vardır ve ilk kod satırından önce seçilir, sonra değil.
Bizde kalanlar
Kaynaklar, çalıştığımız sürece; teslimattan sonra, sözleşmede kararlaştırılanlar. İmzalama sertifikaları ideal olarak sizin kuruluş hesabınızda kalır — eğer bizimkinde kalırlarsa, her güncelleme için bize bağlı kalırsınız ve bu, bir sonuç değil bilinçli bir seçim olmalıdır.

Bir vaka

İkinci bir uygulama olmadan, bir iPhone uygulamasının çekirdeğinden çıkarılmış bir macOS uygulaması

Durum

Başlangıçta oturumun kalibre edilmiş bir konumuna göre baş eğimini ölçen kendi iPhone ürünümüz vardı. Aynı kurallar — kalibrasyon, eşikler, geçmiş, bildirim politikaları — insanın zaten ekranın önünde oturduğu Mac’te de anlamlıydı. Asıl soru bunun yapılıp yapılamayacağı değil, mantığın ne kadarının yeniden yazılması gerektiğiydi.

Ne kurduk

Sıfır, çünkü çekirdek en baştan ekranı bilmeden yazılmıştı. macOS hedefi, iPhone projesindeki 15 dosyayı kendi kaynakları olarak listeler; buna masaüstüne özgü 25 Swift dosyası eklenir: pencere, AppKit delegesi üzerinden sistem çubuğu menüsü, bildirimler, ortam hizmeti. Derleme Xcode arayüzünden geçmez: bir betik doğrudan Swift derleyicisini `arm64-apple-macosx14` hedefiyle çağırır ve on bir sistem çerçevesini açıkça bağlar, ardından `.app` paketini yerleştirir ve imzalar; sonunda da imzayı doğrular.

Ne çıktı

Apple işlemciler için 6.516.128 baytlık bir ikili, tek bir komutla derlenmiş, başlayıp menü çubuğunda duran. Aynı algoritma düzeltmesi telefona ve Mac’e gider, çünkü bu aynı dosyadır, elle senkronize edilmiş bir kopya değil.

Vakanın söylemedikleri

Uygulama dağıtılmıyor ve şu anda bu halde dağıtılamaz: imza ad-hoc, ekip tanımlayıcısı yok ve proje yapılandırmasında geliştirme ekibi alanı boş. Başka bir bilgisayarda sistem tarafından engellenirdi. Bu bir hesap ve noter tasdiki sorunu, işlevsellik sorunu değil — ama çözümsüz bir sorun olarak kalıyor ve onu böyle yazıyoruz, ayrıntı olarak değil.

Sorular

İnsanların aramadan önce bize sordukları

Siz iki Mac uygulamanız olduğunu söylüyorsanız, bu sayfada neden «ofertă» yazıyor?

Çünkü hizmetin adı “masaüstü uygulamaları” ve üç sistem ailesini kapsıyor; biz ise birinde teslim yaptık. Kendimize uyguladığımız kural, her “yaptık” türü ifade için kodda gösterilebilir en az iki kendi uygulamamızı gerektiriyor. macOS’ta var. Windows ve Linux’ta sıfır var ve Mac uygulamalarının hiçbiri dağıtılabilir bir yükleyici içinde hiç paketlenmedi. Başka bir şey söyleyen bir sayfa, bir mühendisin ikinci sorusunda elenir.

Şu anda indirebileceğim bir Mac uygulamanız var mı?

Hayır. İkisi de makinemizde oluşturulan `.app` paketleri olarak mevcut: biri Apple işlemciler için derlenmiş, diğeri Intel ve Apple için evrensel. Ad-hoc imzalılar; bu, yerel doğrulamadan geçtikleri ama ekip kimliği taşımadıkları anlamına gelir, dolayısıyla başka bir bilgisayarda sistem onları engellerdi. Karşınızda yapabileceğimiz şey onları başlatmak, kodu ve derleme betiğini açmak ve mantık paketini çalıştırmaktır.

Sizdeki iki Mac uygulaması arasındaki fark nedir?

Biri yerel, diğeri web’in üstünde bir penceredir ve fark büyüktür. Yerel olanın 25 kendi Swift dosyası ile iPhone sürümüyle ortak 15 çekirdek dosyası vardır, AppKit uygulama delegesi üzerinden menü çubuğuna tutunur ve hareket sensörleri, bildirimler ve görüntü işleme dâhil on bir sistem çerçevesini bağlar. İkincisi üç dosyaya sahiptir ve bir web uygulamasını `WKWebView` içinde gösterir. İkincisi hızlıca yapılır ve uygulamanız zaten web tabanlıysa ve yalnızca Dock’ta bir simge istiyorsanız doğru bir seçimdir. Sisteme ihtiyaç duyduğunuzda doğru bir seçim değildir.

Windows için uygulama yapıyor musunuz?

Hiçbiri teslim edilmedi ve başka bir şey iddia etmiyoruz. Disklerimizde .NET, WPF, WinForms, WinUI, XAML arayüz dosyaları, uygulama bildirileri, MSI ya da WiX paketleri gibi herhangi bir iz aradık; görünen her şey, başka bir projede yalnızca kullandığımız üçüncü taraf bir C kitaplığına ait. Windows’a ihtiyacınız varsa, ilk aşama sizin bilgisayarınızda çalışan bir iskeletle sonuçlanan bir uyumluluk kontrolüdür ve ancak ondan sonra geri kalanını konuşuruz.

Peki Linux veya Ubuntu için?

Aynı konum, önemli bir notla. Linux için pencereli uygulama: teslim edilmiş sıfır, tarafımızca oluşturulmuş hiçbir deb ya da AppImage paketi yok. Linux sunucuları: her gün — sistem servisleri, önde web sunucusu, günlükler, hata durumunda yeniden başlatma. Bunlar iki ayrı disiplindir ve birincisini ikincinin kanıtı olarak kullanmak dürüst olmaz.

Daha kolay olduğu için neden Electron değil?

Çünkü hiçbiri teslim edilmedi ve olmayan yerde deneyimimiz varmış gibi davranmayacağız. Disklerimizde çalışan iki Electron uygulaması var, ama bunlar başka yazarlardan klonlanmış depolar; bize ait sıfır katkı var — bu sayfada “kanıt” olmasınlar diye commit geçmişlerinde tam olarak kontrol ettik. Gerçek bir projede, paketlenmiş bir web ortamı ile yerel kod arasındaki seçim, uygulamanın sistemden ne istediği, paketin ne kadar ağır olduğu ve bakımın bedelini kimin ödeyeceği bilindikten sonra yapılır; modaya göre değil.

Sizde bir Mac uygulamasının yayımlanmasını ne engelliyor?

Kod değil, hesap. Proje yapılandırmasında geliştirme ekibi alanı boş ve oluşturulan paketin imzası ekip kimliği olmadan ad-hoc. Mağaza dışı dağıtım için macOS, tanımlanabilir bir geliştirici sertifikası ve paketin notarizasyondan geçmesini ister. Sizin bir projenizde sertifika ve hesap sizin kuruluşunuza aittir, dolayısıyla bu engel basitçe ortaya çıkmaz — ama maliyeti ve süresiyle birlikte en baştan öngörülmelidir.

Bir site yapıp işi bitirmek daha kolay değil mi?

Çoğu zaman evet, ve bunu siz bize söylemeden önce biz size söylüyoruz. Bir sitenin imzaya, notarizasyona, yükleyiciye, güncelleme kanalına ya da her işletim sistemi için ayrı bir sürüme ihtiyacı yoktur. Kurulu uygulama, sensörlere, çevre birimlerine, internet olmadan çalışmaya, sistem çubuğunda sürekli bulunmaya ya da kullanıcının dosyalarına doğrudan erişime ihtiyaç duyulduğunda kazanır. Bunların hiçbiri listede yoksa, para başka bir yere daha iyi harcanır.

Zaten sahip olduğumuz bir masaüstü uygulamasını devralabilir misiniz?

Herhangi bir tahminden önce doğrulanmış bir koşulla: onu aldığımız kaynaklardan, kendi makinemizde sıfırdan oluşturabilmemiz. Derleme yeniden üretilmiyorsa — bağımlılıklar, sertifikalar, yazılmamış adımlar eksikse — o zaman kimse dürüstçe hiçbir şeyi tahmin edemez ve ilk işlev, yeni işlevsellik değil, derlemenin yeniden üretilmesi olur. Bunu en başta söylüyoruz ki ortasında fark edilmesin.

Yukarıdaki iddialar neye dayanıyor (14 kaynak)

Bunlardan 14 tanesi depolarımızdaki kod ve dosyalardır. Adlarını ya da satırlarını yayımlamıyoruz: hepsi bir arada, tek bir sayfada, yalnızca bize ait olmayan sistemlerin nasıl kurulduğunu fazla net anlatırdı. İstek üzerine, depoda sizinle birlikte gözden geçiriyoruz — doğrulama hâlâ mümkün, sadece bir görüşme içinde yapılıyor.

Neyin daha iyi çalışmasını isterdiniz?

Bize sürecinizi anlatın. Neyin kurulmaya değer olduğuna, neyi bağlayabileceğimize ve sonucu nasıl doğrulayacağımıza birlikte karar verelim.

Hadi konuşalım