API anahtarı veya uygulamanız için gereken üçüncü parti servislerin token’ı gibi gizli anahtarları saklamanın bazı geleneksel yöntemlerini bilyor olabilirsin. Ama günümüzde SwiftPM kullanarak uygulamanı modülerleştirme yaklaşımları giderek daha popüler hale geliyor.
Örneğin, Point-Free’nin bu konuda harika bir ücretsiz bölümü var ve Majid Jabrayilov yakın zamanda “Microapps architecture” hakkında 4 bölümlük bir seri yazdı (bölümler 1, 2, 3, 4) — başlamak için ikisini de önerebilirim.
Ayrıca, açık kaynak kütüphanelerde de gizli anahtarları saklamak isteyebilirsin, örneğin kütüphanenin kullanıcılarının kendi token’larını sağlayacağı ama senin testlerinin kendi token’ınla çalışmasını istediğin üçüncü parti servis entegrasyonunun birim testlerinde.
Bu durumların ortak noktası, elle yönetilen bir Package.swift dosyasına dayanmaları — sadece bir uygulama projesine bağımlılık eklediğinde Xcode’un senin için yönettiği dosya değil. Uygulama veya proje birçok küçük modüle bölünmüş durumda ve karşılık gelen bir .xcodeproj dosyası yok, Xcode doğrudan Package.swift dosyasını açar, projeye ihtiyaç duymadan.
Bu aynı zamanda, ayrı modüller için Xcode’da herhangi bir build ayarı veya build script’i belirtmenin bir yolu olmadığı, her şeyin doğrudan Package.swift manifest dosyasında yapılması gerektiği anlamına geliyor.
SwiftPM’e gelecek sürümlerde bu tür özellikler ekleniyor olsa da (SE-303, SE-325, SE-332), .xcconfig dosyaları gibi Xcode’a özgü özellikleri destekleyeceklerine dair bir işaret yok.
Gizli anahtarlarımızı Git’e commit etmekten nasıl saklayabiliriz ki Git sağlayıcımıza veya repo’muza erişimi olan herkese sızdırmayalım — bugün?
SwiftPM resources ve JSONDecoder
Bunun tek bir “en iyi” cevabı olmadığından eminim ve başkalarının benden daha akıllıca fikirleri olabilir. Ama işleri basit tutmayı seviyorum ve temel özellikleri kullanmayı tercih ediyorum çünkü onları iyi biliyorum, diğer geliştiricilerin gerektiğinde hızlıca anlayacağını bekliyorum ve geleceğe dayanıklı olduklarından emin olabiliyorum.
Kullanmak istediğim yaklaşım, web geliştirmede yaygın olan klasik .env dosyası yaklaşımı. Ama özel formatlı bir .env dosyası yerine, gizli anahtarlarımın bulunduğu basit bir .json dosyası istiyorum, çünkü JSON dosyaları birçok iOS geliştiricisi için tanıdık ve Swift’te JSONDecoder sayesinde bunları parse etmek için yerleşik destek var. Dosya veya daha genel olarak “kaynak” yükleme de Swift 5.3’ten beri SwiftPM tarafından destekleniyor (SE-271).
İşte gizli anahtarları Git’ten saklamak istediğim temel fikrin ana hatları:
Anahtarları içeren ama değerleri olmayan bir
secrets.json.sampledosyasını Git’e commit etGeliştiricilerin bunu kopyalayıp
.sampleuzantısını kaldırması ve değerleri eklemesisecrets.jsondosyasını.gitignoreile yoksayarak asla commit edilmemesini sağlaGizli anahtarları okumak için
Decodable’a uygun basit birstructsağla
Bu yazının geri kalanı bu yaklaşımın nasıl uygulanacağına dair adım adım bir rehber. Örnek olarak, iki üçüncü parti çeviri servisiyle entegre olan açık kaynak çeviri aracım BartyCrouch’un birim testlerini kullanacağım.
⚠️ Bu yaklaşımı kullanıcılara göndereceğin bir uygulama target’ına uygulamayı planlıyorsan, bu NSHipster makalesindeki
.xcconfigyaklaşımında anlatılan aynı sorunla karşılaşma ihtimalin var. Benim yöntemim sadece gizli anahtarları Git’ten saklamaya yardımcı olur, kullanıcılara göndermeyi planlıyorsan ek obfuscation’a ihtiyacın olacak.
secrets.json kaynak dosyasını ekleme
Önce projemize secrets.json dosyasını ekleyelim. Karşılık gelen bir secrets.json.sample ve bir Secrets.swift dosyası olacağı için, önce Secrets adında bir klasör oluşturmayı, sonra secrets.json adında boş bir dosya oluşturmayı ve iki anahtarlı basit bir JSON sözlük yapısı eklemeyi tercih ediyorum:

Böylece CI’ım da gizli anahtarlarıma sızdırmadan güvenli bir şekilde erişecek şekilde kurulmuş oluyor.

