iOS projesi en iyi uygulamaları ve araçları

Açık kaynak kodlu bir Xcode proje şablonu ile

Greenfield iOS projeleri üzerinde çalışırken genellikle sıfırdan yeni bir projeye başlamak zorunda kaldım. Bunu yaparken, ben ve ekibim her zaman araçları birleştirmek, proje yapısını kurmak, temel sınıfları yazmak, dış kütüphaneleri birleştirmek, vb. Temel proje kurulumuna çok fazla zaman harcıyorduk.

Proje başlangıcında harcanan zamanın kurtarılabileceğine ve sürecin çoğunlukla otomatikleştirilebileceğine karar verdim. Kullandığımız her zamanki en iyi uygulamaları ve araçları yazdım ve yeni projelere başlarken benim ve ekibimin kullanabileceği bir proje şablonu hazırladım. Bu şablon proje kurulum zamanından tasarruf etmeli ve ayrıca her bir ekip üyesinin alıştıracağı ortak bir temel sağlamalıdır ki böylece proje yapısını ve temellerini düşünmek ve keşfetmek zorunda kalmazsınız. Her zaman aynı olacaklar.

Şablonda yer alan her araç veya en iyi uygulama kendi başına bir makaleyi hak eder ancak her noktayı denemek ve özetlemek ve neden bunları dahil ettiğimin kısa bir açıklamasını yapmak istedim.

Cocoapods

Bunun bir girişe ihtiyacı olduğunu sanmıyorum. İOS projeleri için dış bağımlılıkları yönetmek için kullanılan kütüphanedir. Uzun zamandan beri var ve binlerce (milyonlarca) projede sağlam ve savaş testi yapıldı. Orada Carthage gibi alternatif bağımlılık yöneticileri var ama desteklediği en geniş açık kaynak kodlu projeye sahip olduğu için Cocoapod'larla gitmeye karar verdim. Cocoapod'ları kullanmak çok kolaydır ve ihtiyaç duyabileceğiniz paketleri kolayca keşfetmenizi sağlayan bir arama diziniyle birlikte gelir.

Şablon proje Swiftlint ve R.swift içeren basit bir Podfile ile birlikte geliyor. Şablon ayrıca bağımlılıkları gidermek için kullanılan Cocoapod versiyonunu yönetmek için bir Gemfile içerir. Bu, ekibinizdeki geliştiricilerin Cocoapod'ların farklı sürümlerini kullanarak bağımlılıklar yüklemeleri sırasında ortaya çıkan sorunları önleyen, genellikle göz ardı edilen bir gelişmedir. Gemfile tüm takım boyunca aynı Cocoapod versiyonunu kullanmaya zorlar.

Swiftlint

Swiftlint, takımdaki her programcı için belirli kuralları ve kodlama stilini uygulamak için çok kullanışlı bir araçtır. Bunu, programcıyı zorla açmalar, zorla atma, zorlama denemeleri, vb. Gibi tehlikeli şeyler hakkında uyaran ama aynı zamanda tüm programcıların aynı “kod stili” ile ilgili kuralları takip etmesini sağlayarak ortak bir kodlama stili uygulayan otomatik bir kod inceleme sistemi olarak düşünebilirsiniz. girinti veya boşluk kuralları gibi. Bu, bu temel kontrolleri yaparak yalnızca kod inceleme zamanından tasarruf etmenin yanı sıra, projedeki tüm dosyaların okunabilirliğini artıran ve sonuç olarak tüm geliştiriciler tarafından anlaşılmalarını sağlayan muazzam faydalara sahiptir. Tüm kuralların bir listesini burada bulabilirsiniz. Şablonda Swiftlint, Cocoapodlar aracılığıyla kurulur ve Yapım Aşaması adımına dahil edilir, böylece geliştiriciyi her proje yapısında uyarır ve uyarır.

R.swift

R.swift, resimler, yazı tipleri, yerelleştirmeler gibi güçlü şekilde yazılmış, otomatik tamamlanmış kaynakları elde etmek için bir araçtır. Bunu, projenizi tarayarak ve kaynakları elde etmek için gereken hızlı sınıfları oluşturarak yapar. Bu kütüphanenin en büyük satış noktası kaynakları kullanırken kodunuzu hazırlaması:

  • Tam yazılmış - daha az döküm ve bir yöntemin ne getireceğini tahmin etme
  • Derleme zamanı kontrol edildi - uygulamanızın çalışma zamanında çökmesine neden olan yanlış dizeler yok
  • Otomatik Tamamlandı - bu resim / nib / storyboard adını bir daha asla tahmin etmek zorunda kalmayın

Resmi string API kullanarak aşağıdaki kodu göz önünde bulundurun:

let icon = UIImage (adlandırılmış: “custom-icon”)

Resim adını yanlış yazdıysanız, burada bir sıfır alabilirsiniz. Ekibinizden herhangi bir üye resim kaynağının adını değiştirirse, bu kod sıfır değerini döndürür veya resmi açmaya zorlarsanız çökecektir. R.swift kullanırken bu olur:

let icon = R.image.customIcon ()

Simgenin gerçekten var olduğundan emin olabilirsiniz (derleme zamanı kontrolleri sayesinde derleyici sizi uyaracaktır) ve otomatik tamamlama özelliğini kullanacağınız için simge adında bir yazım hatası yapamayacağınızdan eminsiniz.

R.swift, Cocoapod'lar aracılığıyla kurulur ve şablona Yapı Aşaması olarak entegre edilir ve her yapı için Swift sarmalayıcı sınıflarını oluşturur. Bu, bir dosya / resim / yerelleştirme / yazı tipi / renk / uç vb. Eklerseniz, projeyi derledikten sonra R.swift kullanarak sizin için uygun olacaktır.

Testler için ayrı AppDelegate

Genellikle gözden kaçan iyi bir uygulama, testleri çalıştırırken ayrı bir TestAppDelegate sınıfına sahip olmaktır. Neden iyi bir fikir? Genelde, AppDelegate sınıfı uygulama başlangıcında çok fazla iş yapar. Bir pencere kurabilir, uygulamanın temel UI yapısını oluşturabilir, bildirimler için kayıt olabilir, bir veritabanı ayarlayabilir ve hatta bazen bazı arka uç servisine API çağrıları yapabilir. Ünite testlerinin herhangi bir yan etkisi olmamalıdır. Gerçekten rastgele api çağrıları yapmak ve uygulamanızın tüm UI yapısını sadece bazı ünite testlerini yapmak için ayarlamak istemez misiniz?

TestAppDelegate, test paketi yürütme sırasında yalnızca bir kez çalıştırılmasını istediğiniz kodlara sahip olmak için de harika bir yerdir. Alaycı, taslaklar ağ istekleri vb. Üreten kodlar içerebilir.

Şablon, uygulamanın ana giriş noktası olan bir main.swift dosyası içerir. Bu dosyada uygulamanın şu anda çalıştığı ortamın ne olduğunu kontrol eden yöntemler var ve eğer test ortamı ise TestAppDelegate'i çağırır.

Derleyici performans profili bayrakları

Swift, Objective-C (IMO) 'dan daha kolay, kullanımı kolay ve çok daha güvenli bir dildir. Ancak ilk tanıtıldığında, büyük bir dezavantajlı - derleme zamanı vardı. Swift 2 gün içinde, 40k satır Swift kodu (orta ölçekli bir proje) olan bir proje üzerinde çalışıyordum. Kod, jenerik ve tip çıkarımı bakımından çok ağırdı ve temiz bir yapı oluşturmak yaklaşık 5 dakika sürdü. Küçük bir değişiklik bile yaptığınızda, proje yeniden derlenecek ve değişikliği görmesi yaklaşık 2 dakika sürecektir. Bu şimdiye kadar yaşadığım en kötü geliştirici deneyimlerinden biriydi ve bu yüzden Swift'i kullanmayı neredeyse bıraktım.

O zamanlar tek çözüm, projenin derleme zamanlarını denemek ve profil oluşturmak ve kodunuzu bu şekilde değiştirmeye çalışmaktı, bu derleyiciyi daha hızlı hale getirecekti. Buna yardımcı olmak için Apple, bir yöntem gövdesi derlerken veya bir ifadenin türünü çözerken çok uzun süren sizi uyaracak bazı resmi olmayan derleyici bayraklarını tanıtır. Bu bayrakları şablon projesine ekledim, böylece uygulamanız için başlangıçtan itibaren uzun derleme süreleri hakkında uyarılacaksınız.

Günümüzde, derleme zamanları çarpıcı bir şekilde iyileştirildi ve nadiren yalnızca derleme zamanlarını iyileştirmek için kodunuzu ince ayar yapmanız gerekir. Ancak, proje çok büyüyünce sorunu çözmeyi denemek için o zaman daha önce bilmek daha iyidir.

Geliştirme / Hazırlama / Üretim konfigürasyonları

Bir başka iyi uygulama (ya da gereklilik diyebilirim) geliştirme, evreleme ve üretim ortamları için ayrı konfigürasyonlara ve çevre değişkenlerine sahip olmaktır. Günümüzde hemen hemen her uygulama bir tür arka uç servisine bağlanmak zorundadır ve genellikle bu servisler birden fazla ortamda kullanılır. Geliştirme ortamı, günlük dağıtımlar ve donanım geliştiriciler için kodlarını test etmek için kullanılır. Aşama ortamı, test edenlerin ve müşterilerin test edebileceği kararlı sürümler için kullanılır. Üretim ortamının ne için olduğunu hepimiz biliyoruz.

Bir iOS projesinde birden fazla ortamı desteklemenin bir yolu, proje düzeyinde yapılandırma eklemektir.

Proje seviyesi yapılandırmaları

Yapılandırmaları tanımladıktan sonra, her ortam için değişkenleri içeren bir Configuration.plist dosyası oluşturabilirsiniz.

Configuration.plist

Projeyi çalıştırırken, hangi konfigürasyonun kullanılması gerektiğini belirleyebilirsiniz. Bunu yapı şemasında yapabilirsiniz.

Daha sonra proje Info.plist dosyasına bir ek özellik eklemeniz gerekir. Bu özelliğin değeri çalışma zamanında geçerli yapılandırmanın adına göre dinamik olarak çözülecektir.

Bunların hepsi şablonda sizin için önceden yapılandırılmıştır.

Geriye kalan tek şey, yapı şemasında seçilen konfigürasyona bağlı olarak, çalışma zamanındaki bu değişkenleri alabilen bir sınıf yazmaktır. Şablon, geçerli ortam için değişkenleri alabilen bir ConfigurationManager sınıfı içerir. Nasıl çalıştığını görmek için o sınıfın uygulanmasını Github'da kontrol edebilirsiniz.

Benioku

Her projenin, en azından bağımlılıkların nasıl kurulacağına ve projenin nasıl yürütüleceğine ilişkin talimatlar içeren temel bir Benioku olması gerekir. Ayrıca proje mimarisi ve modülleri ile ilgili açıklamalar içermelidir. Ne yazık ki geliştiriciler dokümantasyon yazmaktan hoşlanmıyor (bir benioku bunun bir parçası) ve aylardır geliştirilmekte olan bir proje gördüm ve hatta temel bir Benioku'ları bile vardı. Bu temel benioku yazma yükünü ortadan kaldırmak için, şablon kurulum ve proje yapısını kapsayan standart bir benioku içerir. Şablonu kullanarak yeni bir proje kurduğunuzda, Benioku otomatik olarak eklenecektir.

Gitignore

Günümüzde, çoğu proje sürüm kontrol sistemi olarak GIT kullanmaktadır. GIT kullanırken, genellikle derleme klasörü veya türetilmiş veri klasörü gibi projedeki bazı dosya veya klasörleri görmezden gelmezsiniz. İOS projenize uygun bir gitignore dosyası arama sıkıntısından kurtulmak için, şablon Github katılımcıları tarafından sağlanan standart bir gitignore içerir.

Derin linkleri ve bildirimleri kullanmak için temel sınıflar

Günümüzde hemen hemen her uygulama derin bağlantıları ve bildirimleri ele almak zorundadır. Bunu yapmak için, bir geliştiricinin AppDelegate sınıfında bir miktar kazan kodunu yazması gerekir. Şablonun kapsamı vardı ve ayrıca derin bağlantılar ve bildirimlerle çalışmayı kolaylaştıran temel sınıflar sağlıyor.

özet

Özetle, şablon en iyi uygulamaları dahil etmeye çalışır ve faydalı üçüncü taraf araçlarını entegre eder. Bu, sizi ve ekibimizi yeni proje kurulumuna harcadığınız saatten kurtarmalı ve ayrıca projenin geri kalanı için ortak ve güçlü bir temel sağlamalıdır. Size iyi hizmet edebilir!

Not: Şablon için herhangi bir sorun veya özellik isteğiniz varsa, bana sadece Github'ta bir sorun bırakın. Boş zamanlarımda çözmeye çalışacağım.