EYDefterEmre Yakut
← tüm yazılar
Mobil · Hata avı

Mac’im yok, iOS uygulamam var

Fly4cast’in iOS sürümünü Windows’ta yazdım, bulutta derledim, TestFlight’a çıkardım. Zor kısım kod değildi — imzalama. Çünkü imzalama bir derleme adımı değil, bir kimlik zinciri.

Windows kaynak · git push XcodeGen proje üretilir bulut macOS arşiv + imza TestFlight build n+1 tuzaklar:· dev profili ile App Store arşivi olmaz· .p8 anahtarı printf %b ile yazılır· IPA yolu ios/build/ios/ipa· build no = son TestFlight + 1Mac’im yok. iOS uygulamam var.imzalama bir derleme adımı değil, bir kimlik zinciri — kopan halkayı bul.

Fly4cast’in web ve Android tarafı hazırdı. iOS gerekiyordu ve elimde Mac yoktu.

“Mac al” en kolay cevap. Ama bir uygulamayı test etmek için donanım almak, problemi çözmek değil satın almak. Denedim: kodu Windows’ta yaz, derlemeyi bulutta yap.

İlk engel: proje dosyası

Xcode projesi tek bir dosya değil; içinde her kaynak dosyanın ve her ayarın kaydı olan devasa bir yapı. Elle düzenlenemez, birleştirilemez, Windows’ta üretilemez.

Çözüm: proje dosyasını hiç tutmamak. Bir tanım dosyası yazıyorsun ve gerçek proje derleme anında üretiliyor.

ios/project.yml     ← git'te duran tek şey, okunabilir
        ↓  (derleme sunucusunda)
ios/App.xcodeproj   ← üretilir, git'e girmez

Yan fayda: birleştirme çakışması diye bir şey kalmıyor.

Asıl engel: imzalama

Derleme birkaç denemede oturdu. İmzalama üç gün aldı — çünkü tek bir işlem değil, birbirine bağlı dört şeyin uyuşması:

parçanedirkoptuğunda
Sertifikaseni tanımlayan anahtar çifti“geçerli imzalama kimliği yok”
Profilhangi uygulama, hangi cihaz, hangi yetkilerarşiv oluşur, yükleme reddedilir
Yetkilerpush, app group, arka planözellik sessizce çalışmaz
API anahtarıyüklemeyi yapan kimlikderleme biter, yükleme yapılmaz

Tuzak 1 — yanlış profil türü

İlk hata en öğreticisiydi: arşivleme “takım bulunamadı / kayıtlı cihaz yok” diyerek düşüyordu.

Sebep: ortam geliştirme profili almıştı. Geliştirme profili yalnız kayıtlı cihazlarda çalışan derlemeler üretir; bulut çalıştırıcısında kayıtlı cihaz yok, dolayısıyla arşiv oluşmuyor. Mağaza için dağıtım profili gerekiyordu.

Tuzak 2 — anahtarın diske yazılışı

Yükleme için kullanılan anahtar bir PEM dosyası: metin gibi görünen, satır sonları anlamlı olan bir yapı. Anahtarı ortam değişkeninden alıp dosyaya yazarken satır sonları kaçış dizisi olarak kalıyordu.

echo "$KEY" > key.p8       # \n kaçışları olduğu gibi yazıldı
printf %b "$KEY" > key.p8   # kaçışlar gerçek satır sonuna çevrildi

Tek kelimelik fark, yarım gün.

Tuzak 3 — çıktının nerede olduğu

Derleme başarılı, imzalama başarılı, yükleme “dosya bulunamadı”. Arşivin dışa aktarıldığı yol, yükleyicinin aradığı yol değildi. Yapılandırmadaki desen bir seviye yukarıyı gösteriyordu.

Bu tür hatalar en sinir bozucu olanlar: her şey çalışıyor, sadece iki taraf farklı klasöre bakıyor.

Build numarası

Başlangıçta numarayı sabit bir ofsetle artırıyordum. Kısa sürede karıştı: bazı derlemeler yüklenmedi, numaralar boşluklu ilerledi, hangi sürümün nerede olduğu belirsizleşti.

Doğrusu basit: yüklemeden önce mevcut en yüksek numarayı sor, bir artır.

Bir de olmayan bir hata

CI’ın ilk kuralı

Bir noktada analitik kütüphanesi “derlenmiyor” diye iki saat uğraştım. Derlenmiyordu, çünkü kodu derleme sunucusunun çektiği depoya göndermemiştim. Yerelde vardı, uzakta yoktu.

Bir şey “yerelde çalışıyor ama CI’da çalışmıyor” ise, önce CI’ın gerçekten ne gördüğünü doğrula. Vakaların çoğunda kodda fark yok; CI senin göndermediğin bir şeye bakıyor.

Sonunda

Şimdi akış şöyle: Windows’ta kod yazılıyor, gönderiliyor, bulutta macOS çalıştırıcısı projeyi üretiyor, derliyor, dağıtım profiliyle imzalıyor, TestFlight’a yüklüyor. Telefonuma bildirim geliyor.

Toplam kurulum üç gün. Bir Mac’in bedeli bundan fazla — ve daha önemlisi, bu kurulum her derleme için aynı şekilde çalışıyor; benim makinemin durumuna bağlı değil.

Asıl kazanç donanımdan tasarruf değil: derleme ortamının tekrarlanabilir olması. “Bende çalışıyor” cümlesini ortadan kaldıran şey bu.

MobilHata avı