70'ten Fazla iOS Uygulaması Yayınlarken Öğrendiklerimiz

Küçük bir stüdyo olarak 72 iOS uygulaması yayınlarken öğrendiklerimiz: tek döngülü MVP, ortak şablonlar, yapay zekâ altyapısı, App Store adları ve toplu bakım.

· 6 dk

Biz BernSoftware'iz; 2020'de İstanbul'da kurulmuş küçük bir yazılım stüdyosuyuz. 2024 ile 2026 arasında App Store'a 72 uygulama çıkardık: şarap etiketlerini, madeni paraları ya da koleksiyon kartlarını tanıyan yapay zekâ tarayıcıları, sağlık takip uygulamaları, NFC okuyucu/yazıcı gibi araçlar ve birkaç bulmaca ile parti oyunu.

Bizim büyüklüğümüzdeki bir ekip için bu çok fazla uygulama. Bunu ancak her birini sıfırdan başlayan bir proje gibi ele almayı bıraktığımızda başarabildik. Bunun için nelerin gerektiğini aşağıda anlatıyoruz.

1. MVP kapsamını tek bir döngü etrafında belirleyin

Yayınladığımız uygulamaların neredeyse hepsi tek bir temel döngü üzerine kurulu. Tanıma uygulaması: kamerayı doğrultun, cevabı alın, koleksiyona kaydedin. Takip uygulaması: bir şey kaydedin, eğilimi görün, hatırlatma alın. Oyun: tek bir girdi, tek bir kural, giderek zorlaşan seviyeler.

Döngüye hizmet etmeyen bir özellik "sonra" listesine gider. İlk sürümün kanıtlaması gereken tek şey, döngünün tekrar edilmeye değer olduğudur; ayarlar, paylaşım ve temalar bekleyebilir. İşe yarayan bir test: uygulamayı Apple'ın ad için verdiği 30 karakterle anlatamıyorsanız kapsam fazla geniştir.

2. Tek tek uygulamalar değil, aileler kurun

Katalog birkaç aileye ayrılıyor:

  • Kamera tanıyıcıları. 72 uygulamanın en az 17'si bir fotoğraf çekip yapılandırılmış bir sonuç döndürüyor: sanat eseri, balık, şarap, oyuncak, küf, mantar, bitki, taş, madeni para, mücevher, antika, arkeolojik buluntu, çizgi roman, spor kartı, TCG kartı, parfüm ve gıda alerjenleri.
  • Üretken görsel araçları. Saç ve sakal deneme, sanal kabin, araç modifikasyonu, iç mekân tasarımı, logo, tişört tasarımı ve fotoğraf restorasyonu.
  • Metin asistanları. E-posta yazma, metni başka sözcüklerle yeniden yazma, not özetleme, PDF'lerden bilgi kartı çıkarma ve ödev yardımı.
  • Takip ve yardımcı uygulamalar. GLP-1 doz kaydı, kalori takibi, evcil hayvan bakım hatırlatmaları, alarmlar, widget'lar ve NFC araçları.

Bir ailenin içinde işin büyük kısmı ortaktır: kamerayla çekim, yükleme, sonuç ekranı, koleksiyon listesi, karşılama ekranları (onboarding) ve ayarlar. Uygulamadan uygulamaya değişen şey çoğunlukla yapılandırmadır. Bir tanıma uygulaması için basitleştirilmiş bir taslak:

// Basitleştirilmiş taslak: tek tanıma şablonu, çok sayıda uygulama
type ScannerConfig = {
  appId: string;
  subject: string;            // "wine label", "coin", "mushroom"
  resultFields: string[];     // sonuç kartında gösterilen alanlar
  prompt: (locale: string) => string;
  theme: { accent: string; icon: string };
};

export const wine: ScannerConfig = {
  appId: "wine-scanner",
  subject: "wine label",
  resultFields: ["winery", "vintage", "grape", "region"],
  prompt: (l) => `Identify the wine in this photo. Answer in ${l} as JSON with: winery, vintage, grape, region.`,
  theme: { accent: "#7c1f3d", icon: "wine" },
};

Böylece yeni bir tanıma uygulaması çoğu zaman yeni bir yapılandırma, ikon, ekran görüntüleri ve istem (prompt) demek; bunlara gerçek fotoğraflarla yapılan testler eklenir. Bir uyarı: şablonu neyin tekrar edeceğine dair bir tahminden değil, zaten çalışan uygulamalardan çıkarın.

3. Teknolojiyi stüdyo için değil, her uygulama için ayrı seçin

Varsayılan tercihimiz TypeScript ve Expo ile React Native, çünkü tüketici uygulamalarının çoğunda tek kod tabanı ve hızlı ilerlemek, platformun derinliklerine erişmekten daha önemlidir. Temel döngü donanıma bağlıysa ilk günden Swift ile native geliştiriyoruz. Örneğin gizli kamera dedektörümüz, BLE cihazlarını bulan CoreBluetooth taramasını cihazın üzerinde çalışan bir CoreML nesne tanıma modeliyle birleştiriyor. Sürekli bakımını yapmanız gereken bir köprü, baştan native başlamaktan daha pahalıya gelir.

4. Yapay zekâ özellikleri bir model sorunu değil, bir iş hattı sorunudur

Yapay zekâ uygulamalarımızın çoğu barındırılan modelleri çağırıyor: metin asistanları için LLM API'leri, görsel uygulamaları için bulut GPU'larında çalışan Stable Diffusion, GFPGAN ve Real-ESRGAN gibi modeller. Model seçmek işin kolay kısmıydı. Zor olan, modelin etrafındaki her şeydi:

  • Anahtarları ve istemleri sunucuda tutun. Uygulama bizim arka ucumuzu (backend), arka uç da sağlayıcıyı çağırır. Böylece uygulama güncellemesi çıkarmadan sağlayıcı değiştirebilir, istemleri düzeltebilir ve istek sınırı koyabiliriz.
  • Ağır işleri kuyruğa alın. Saç deneme gibi uygulamalarda GPU sunucularının önünde bir Node.js iş kuyruğu duruyor ve ilerlemeyi WebSocket üzerinden uygulamaya iletiyor; kullanıcı donmuş bir yükleniyor simgesi yerine işin gerçekten ilerlediğini görüyor.
  • Görselleri önce cihazda küçültün. Yüklemeden önce sıkıştırmak ve kırpmak hem veri trafiğini hem gecikmeyi azaltır.
  • Yapılandırılmış çıktı isteyin. Tanıma uygulamaları sabit alanlı JSON ister ve ekrana basmadan önce doğrular. Bir sonuç kartı modelin ham metnini asla göstermemeli.
  • Kişisel verileri cihazda tutun. GLP-1 takip uygulamamız şifrelenmiş yerel bir SQLite veritabanı kullanıyor; fotoğraf kasası uygulamamız da verisini cihazda saklıyor. Her özelliğin bir sunucuya ihtiyacı yok.

5. App Store meta verilerini ürünün bir parçası sayın

App Store, uygulama adı için 30 karakter veriyor. 72 uygulamamızın adlarının hepsi bu sınıra sığıyor ve 64'ü 25 ya da daha fazla karakter kullanıyor. Çoğu aynı kalıbı izliyor: kısa bir marka, bir ayraç, ardından arama ifadesi; "CardSnap | Sports Card Scanner" ya da "GLP-1 Tracker: Dose Log" gibi. Marka kimliği taşır; ifade ise insanların gerçekten aradığı kelimeleri kullanır.

Meta verileri ve ekran görüntülerini başvurudan önceki gece değil, ilk derlemeyle birlikte hazırlayın. Üç ekran görüntüsü temel döngüyü gösteremiyorsa kapsam fazla geniştir.

İnceleme süreci için hatalara olduğu kadar meta veri ve izin sorunlarına da hazırlanın. İzin pencereleri belirli bir amaç açıklaması ister ve kullanıcı "İzin Verme"yi seçtikten sonra da uygulamanın çalışmaya devam etmesi gerekir.

6. Yalnızca arayüz metinlerini değil, adları ve tanıtım yazılarını da yerelleştirin

Dünyaya satış yapan bir Türk stüdyosuyuz ve bu belli oluyor. Bazı uygulamaların mağaza adı Türkçe ("Pasaport Fotoğrafı | Vize ID"); bazıları ise İngilizce bir markayı Türkçe arama terimleriyle bir araya getiriyor ("Coin ID: Para Değer Tarayıcı"). Kıyafet tarayıcımız Zara, H&M ve Amazon'un yanında Trendyol'u da anıyor, çünkü kullanıcıları alışverişlerini bu mağazalardan yapıyor.

  • Arayüz metinlerini çevirmek işin kolay kısmı. Mağaza adı, alt başlık ve anahtar kelimeler her pazar için ayrı bir araştırma ister.
  • İngilizce kelime çalıştıran bir uygulama ya da metni sesli okuyan çok dilli bir İncil okuyucu gibi bazı uygulamalarda yerelleştirme son rötuş değil, ürünün kendisidir.
  • Kullanıcının dil ve bölge ayarını yapay zekâ istemlerine aktarın; böylece Türkçe konuşan bir kullanıcı, araya bir çeviri adımı girmeden Türkçe bir sonuç kartı alır.

7. 70 uygulamanın bakımı, her şeyi toplu yapmak demektir

Her iOS sürümü yeni SDK gereksinimleri, ekran boyutları ve izin kuralları getirir. 72 uygulamayı tek tek yamalamak gerçekçi değil; bu yüzden aile aile çalışıyoruz: kodu ortak olan uygulamalar, bir kez test edilmiş bir düzeltmeyi ya da SDK yükseltmesini birlikte alabiliyor.

İşe yarayanlar:

  • Her uygulamanın yapılandırmasını, meta verilerini ve ekran görüntülerini kodunun yanında, aynı depoda tutun.
  • Hangi uygulamaları yaşatacağınıza bilinçli olarak karar verin. Bir uygulamayı satıştan kaldırmak, kendi hâline bırakıp eskimesini izlemekten iyidir.
  • Arka ucu da uygulamalar kadar yakından izleyin. Sağlayıcı tarafındaki bir kesinti, kullanıcıya bozuk bir uygulama gibi görünür.

Son söz

Bunların hiçbiri büyük bir ekip gerektirmiyor. Gereken şunlar: her uygulamada tek bir döngü, ancak iki kez yazıldıktan sonra ortaklaştırılan kod ve kod kadar ciddiye alınan mağaza meta verileri.

Böyle bir proje mi planlıyorsun?

10 adımda planla