Eğer gerçekten istersen, mutlaka olur.

Statik iOS Framework – Objective C

8 ay ago, Written by , Posted in IOS, MOBİL

Framework, bizlere-uygulama geliştiricilerine, kullanabileceği bazı özellikleri hazırlanmış biçimde sunan kütüphanelere sahip yapılara verdiğimiz bir isimdir. XCode ile birlikte önceden tanımlanmış ve varsayılan olarak bir çok framework gelir. Örneğin; Stringlerle, collectionlarla ve diğer veri tipleri ile ilgili işlemleri yönetebildiğimiz Foundation.framework ya da web içeriklerini uygulamamıza entegre etmemize olanak sağlayan WebKit.framework gibi.

Bununla birlikte bazı durumlarda kendi frameworklerimizi oluşturmak isteyebiliriz. Aynı kodları farklı projelerde değerlendirmek istediğimiz için ya da yazdığımız bir kütüphaneyi diğer geliştiricilerin kullanıma sunmak için ihtiyaç duyabiliriz. Ben de bu yazımda sizlere nasıl bunu başaracağımızı göstermeye çalışacağım.

Genel Bakış

Bu projede iki ayrı temel taş söz konusu: Statik kütüphane (.a uzantılı kütüphane) ve aggregate.
Statik kütüphanemiz kodlarımızı içeren yapı olacak ve aynı zamanda hangi header dosyalarımızın public ya da private olacağını ayarlayabilmemize yarayacak. Public headerlarımız frameworkümüzü projesine dahil eden herkesin erişebileceği headerlardır. Private olanlar ise kütüphane kullanımı için şart ama dışarı açılmayan headerlarımızı temsil eder.
Aggregate ise kütüphanemizi i386/armv6/armv7/armv7 platformlarına derlememize olanak sağlar. Frameworkümüzü dağıtmak(distribute) istediğimizde kullanmamız gerekiyor.

Statik Kütüphane Oluşturma

XCode’da File> New > Project yolunu izleyerek bir Cocoa Touch Static Library projesi oluşturalım. Projenize bir isim verin. Ben projeye Egimo ismini verdim. Bu da derlediğimizde Egimo.framework dosyasını oluşturacak.

Diğer kullanıcılar bizim frameworkümüzü projelerine dahil ederken olarak çağıracaklar. Dolayısıyla frameworkümüzün kendi adında bir kapsayıcı header görevi görecek bir Egimo.h header dosyasına ihtiyacı vardır. Zaten projenizi oluşturduğunuzda otomatik olarak Xcode sizin için yaratacaktır. Bu header dosyası projenizde kullanıma açtığınız(public) headerlarınızın bulunduğu bir wrapper görevi görecektir. Yani bu header dosyasını projesine dahil eden bir kişi, sizin hangi headerlarınıza erişim sağlayacak? Dolayısıyla hem Egimo.h hem de diğer public kullanıma açmak istediğiniz header dosyalarınızın public olarak işaretlendiğine emin olun.

Bunun için: Build Phase >New Header Phase

Daha sonrasında Egimo.h’ı sürükleyip public içerisine bırakalım.

Bu işlemden sonra “Target Membership” de Egimo.h ın işaretlendiğine emin olalım. Header scope’unun da “Project” den “Public” olarak değiştirildiğini görelim.

Xcode varsayılan olarak public ve private header dosyalarını aynı path üzerine koyar. Karmaşayı önlemek için önerim bunu ayırmanız. Bunun için “Build Settings > Public Headers Folder Path” yolunu izleyerek “$(PROJECT_NAME)Headers” olarak set edelim. Bu şekilde public headerlarımız “EgimoHeaders” klasörü altında toplanacaktır.

Ayrıca “Code Stripping” i kapatmamızda fayda var. Bunu frameworkümüzü kullanacak kişiye bırakmamız daha makul. Bunun için Build Settings’te aşağıdaki ayarlamaları yapalım.

“Dead Code Stripping” => No
“Strip Debug Symbols During Copy” => No
“Strip Style” => Non-Global Symbols

Tüm mimarilere destek verebilmek için yine Build Settings’e girip “Build Active Architecture Only” için “No” seçeneğini seçelim.

Framework Olarak Derleme

Statik kütüphanemizi .framework olarak derleyebilmek için bir script kullanacağız. Bunun için Build Phase > New Run Script Phase yolunu izliyoruz.

Enjekte etmemiz gerekin script kodunu aşağıda bulabilirsiniz.

Aggregate Target Ekleme

Framework geliştirdiğimizde sadece test ettiğimiz platformu göz önünde bulundurmamak lazım. Örneğin; iPhone simulatorde geliştirme yapıp test ediyorsak bizim için i386 platformu yeterli geliyor. Ama diğer yazılımcılara frameworkümüzü verdiğimizde onların tekrar derleme şansı yok. Bu yüzden tüm platformlara destek vermemiz gerekir. Yani bir “fat binary” oluşturmamız gerekiyor. Bu binary içerisinde tüm platformlar (i386, armv6, armv7, and armv7s) desteklenecek. İşte bu noktada anahtar kelimemiz “aggregate“.

1.Aşama: File > New > Target > Crossplatform > Aggregate

2.Aşama: Target Depencies’de “Egimo” nun olduğuna emin olalım.

3.Aşama: Build Phase > New Run Script Phase

Diğer platformlara derleyebilmek için yine bir script enjekte etmemiz lazım.

ÖNEMLİ!
Yukarıdaki scriptte dikkat etmemiz gereken bir kaç önemli nokta var.

Verdiğim script sizin kütüphane isminizin proje isminizle aynı olduğunu varsaymaktadır.

SF_TARGET_NAME=${PROJECT_NAME}

Eğer durum bu değilse, yani örneğin; Xcode projenizin ismi “EgimoFramework” ve target isminiz “Egimo” ise scriptteki değişiklik şöyle olmalıdır:

SF_TARGET_NAME=Egimo

Diğer bir önemli nokta ise, eğer Cocoapods kullanıyorsanız, proje yerine workspace i derlemeniz gerekiyor.
xcrun xcodebuild satırını şu şekilde değişelim.(Not: Proje isminizle target isminizin aynı olduğu varsayılıyor.)

xcrun xcodebuild ONLY_ACTIVE_ARCH=NO -workspace “${PROJECT_DIR}/${PROJECT_NAME}.xcworkspace” -scheme “${TARGET_NAME}” -configuration “${CONFIGURATION}” -sdk ${SF_OTHER_PLATFORM}${SF_SDK_VERSION} BUILD_DIR=”${BUILD_DIR}” OBJROOT=”${OBJROOT}” BUILD_ROOT=”${BUILD_ROOT}” SYMROOT=”${SYMROOT}” $ACTION

4.Aşama:

Artık her şey hazır. Oluşturduğumuz aggregate targetını derlediğimizde projemizin product dizininde frameworkümüz oluşacaktır. Örnek adres: ~/Library/Developer/Xcode/DerivedData/Egimo/Build/Products/Debug-iphoneos/.

Not: Derleme yaparken “Generic iOS Device” seçeneğiyle derlersek distribute etmeye hazırız demektir. Aksi takdirde sadece simulator için derlemiş oluruz.

Bu dizin adresinize girdiğimizde her şeyi doğru şekilde yapıp yapmadığımızı anlamak için;

“lipo -info Egimo.framework/Egimo” komutunu terminalde çalıştıralım. Aldığımız geri dönüş aşağıdaki gibi olduysa her şeyi doğru yapmışız demektir.

Architectures in the fat file: Egimo.framework/Egimo are: armv7 i386 x86_64 arm64

Sonuç

Artık nasıl framework oluşturduğumuzu biliyoruz. Şimdi kütüphanemize örnek olması açısından yeni bir header ve implementasyon dosyası ekleyelim: Matematik.h ve Matematik.m. Bu header dosyasının diğer kullanıclar tarafından erişilebilir olmasını istediğimden dolayı “Public Headers” içerisine eklemem ve “Egimo.h”‘da referans göstermem gerekiyor.

Öncelikle bu dosyaları oluşturdum ve basitçe iki sayının toplamını veren bir “sum” fonksiyonu oluşturdum.

Her şey bu kadar. Tekrar aggregate derlendiğinde frameworkümüz hazır. İçeriği aşağıdaki gibi oldu.

Diğer yazılımcılar bizim frameworkümüzü kullanmak istediğinde kullanacağı dosyada;

olarak projesine dahil edebilir.

Hayatınızdan kod eksik olmasın.
Emre Demir

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir