Provisioning Profile Nedir?

Zafer Ayan
5 min readDec 10, 2020

--

iOS uygulaması geliştiren herkesin hayatında en az bir kez karşılaştığı terimlerden biridir. Apple tarafından belirlenen tanıma bir bakalım:

Provisioning profile, yazılımcıları ve cihazları yetkilendirilmiş bir iPhone Development Team’e bağlayan ve ilgili cihazların test için kullanımını etkinleştiren, dijital varlıklardan oluşan bir koleksiyonudur.

Buradan da anlaşılacağı gibi profile, yazılımcıların hangi cihazlar üzerinde, hangi uygulamayı debug edeceğinin belirlenmesini sağlamaktadır.

Peki neden Provisioning Profile’a ihtiyacımız var?

Android’de olduğu gibi apk atarak uygulama yükleme durumu iOS uygulamalarının geliştiriminde mümkün değildir. Çünkü Apple’ın güvenlik politikaları gereği, ilgili uygulama Apple tarafından imzalanmış olmalıdır. Fakat, uygulama geliştirimi yapılırken, Apple’a sunmadan önce cihazlarda da test/debug edilmesi gereklidir. Bu nedenle cihaz ve geliştirim hesabını birbirine bağlayacak bir sistem/dosya gereklidir. Bu dosyaya Provisioning Profile dosyası denir. Geliştirim süresince, uygulamayı hangi cihazların çalıştırabileceğine ve bu uygulamanın, hangi uygulama servislerine (Push NotificationNFC vs.) erişebileceği profile dosyası tarafından belirlenebilir. Apple hesabından indirilen provisioning profile dosyası app bundle içerisine entegre edildiğinde, uygulama artık imzalanmış (code-signed) hale gelir. Provisioning profile dosyasında, test edilmesi istenen her bir cihaz dahil edilmelidir. Eğer provisioning profile içerisindeki bilgiler belirlenen kriterler ile eşleşmezse, cihaz ilgili uygulamayı çalıştıramaz.

Provisioning Profile içerisinde hangi bilgiler bulunur?

  • Geliştirim sertifikaları (Development Certificates): Yazılımcı tarafından, uygulamanın fiziksel cihaz üzerinde çalıştırılarak test edilmesi içindir
  • Benzersiz cihaz kimlikleri (Unique Device Ids): Uygulamanın çalıştırılacağı cihaz id’leridir.
  • Uygulama kimliği (App ID): Bir development team tarafından geliştirilen bir veya daha fazla uygulamayı belirlemek için kullanılan string ifadedir. Örneğin WhatsApp uygulaması için, com.facebook.whatsapp veya birden fazla uygulama için com.facebook.* şeklinde olabilir)

Provisioning profile içerisinde belirtilen cihazlar, yalnızca içerisinde kendi iPhone geliştirim sertifikaları bulunan yazılımcılar tarafından test edilmek için kullanılabilir. Bir cihaz, birden fazla provisioning profile içerebilir.

Bir uygulama, iPhone cihazı üzerinde debug edilmek için yüklenirken hangi aşamalardan geçer?

  • Provisioning profile dosyası, Mac’teki keychain’de yer alan developer sertifikasını işaret eder.
  • XCode bu sertifikayı kullanarak kodu imzalar.
  • Cihazın UUID’sinin, provisioning profile’da yer alan cihaz id’leri arasında var olup olmadığı kontrol edilir.
  • Provisioning profile içerisindeki AppID değeri, uygulamanın bundle identifier’ı içerip içermediği kontrol edilir.
  • App ID ile ilişkilendirilen entitlement’lar (NFC, Push notification vb.) kontrol edilir.
  • Uygulamayı imzalamak için kullanılan private key’in sertifika içerisindeki public key ile ilişkisi kontrol edilir.
Kaynak: stackoverflow

Buradaki görsele bakarak AppID’nin kontrol edildiğini, sertifikanın doğrulandığını, Team’in eşleştiğini, capabilities ve entitlements’ın da uyumlu olduğunu görebilirsiniz.

Tüm bu kontrol işlemlerinden başarılı bir şekilde geçildiğinde imzalanmış binary dosya cihaza iletilir ve aynı provisioning profile’a sahip olduğu kontrol edilir ve uygulama çalıştırılır. Eğer bu adımlarda herhangi biri dahi geçilemezse, uygulama yüklenemez ve gri renkte bir uygulama ikonu ile karşılaşırsınız:

Yüklenemediği için logosu griye dönen uygulama ikonu — GitHub

Development ve Distribution provisioning profile’ları arasındaki fark nedir?

Distribution provisioning profile’da herhangi bir device ID’si yer almamaktadır. Eğer register edilmiş bir cihaz kümesine özel olarak uygulama dağıtılmak istenirse, Ad-Hoc profile kullanılarak bu işlem gerçekleştirilebilir.

Distribution Profile, uygulamanın App Store üzerinden dağıtımı yapılırken kullanılır. Apple’a iletilen review aşamasından geçen uygulama, Apple tarafından imzalanır ve herhangi bir cihaz üzerinde çalıştırılabilir hale gelir.

Code signing nedir?

Code signing (kod imzalama) sayesinde iOS, imzalanmış olan uygulamayı tanır ve imzalama aşamasından yükleme aşamasına kadar geçen sürede uygulama paketinde bir değişiklik olmadığını garanti edilmiş olur. Signing Identity ise Apple tarafından sizin için oluşturulan public ve private key’leri içerir. Bu key ikilisi kullanılarak uygulamanın imzalanması sağlanır.

Certificate Signing Request (CSR) nedir?

Certificate Signing Request (Sertifika imzalama isteği), bir sertifika edinmek için Certificate Authority’e başvuru yapılırken verilen bir metin dosyasıdır.

iOS uygulama geliştiriminde ise CSR oluşturarak Apple’dan bir sertifika talebinde bulunabilir. CSR oluşturulurken public ve private key’ler de oluşturulur. CSR dosyası oluşturulan public key’i içerir ve Certificate Authority, CSR’ı kullanarak bir sertifika üretir. Üretilen sertifika yalnızca CSR üretilirken oluşturulan private key ile çalışabilir. Eğer private key kaybolursa, sertifika da geçersiz olur.

Apple’dan sertifika alınırken süreç nasıl işler?

  • Keychain Access uygulaması kullanılarak bir CSR isteği yapılır.
  • Keychain uygulaması bir private key bir de certSigningRequest dosyası oluşturur. Private key, keychain içerisinde saklanır. certSigningRequest ise Apple’a upload edilir.
  • Apple, ilgili isteği doğrular ve bir sertifika oluşturur. Sertifika içerisinde sisteminize indirebileceğiniz bir public key yer alır. Dosya indirildikten sonra çift tıklanarak Keychain Access uygulaması içerisinde açılır. Sertifika Keychain’e eklenir ve public key, Keychain’deki private key ile eşleşerek Code Signing Identity’i oluşturur.
  • Son olarak, uygulama yükleme esnasında, uygulamanın imzalanırken kullanıldığı private key, public key ile eşleştirilir. Eğer bir hata oluşursa uygulama yüklenemez.

CSR ile sertifika oluşturma aşamaları nasıl gerçekleşir?

Keychain Access > Certificate Assistant > Request a Certificate From a Certificate Authority seçilir
iOS Developer Program’a başvurulurken kullanılan bilgilerle User Email Address ve Common Name alanları doldurulur. CA Email Address alanı boş bırakılır. Saved to disk seçilir. Eğer key boyutu ayarlanmak istenirse “Let me specify key pair information” seçilebilir. Continue’a tıklanır.
.certSigningRequest dosyası kaydedilir ve CSR oluşturulmuş olur.
.certSigningRequest dosyasının içeriği encoded halde bulunmaktadır.
.certSigningRequest dosyasının içeriğinin kontrolü için openssl komutu kullanılabilir. openssl req -in CertificateSigningRequest.certSigningRequest -noout -text
Keychain access uygulamasında public ve private key’ler görüntülenebilir.
Sertifika oluşturmak için https://developer.apple.com/account/resources/certificates/list adresine gidilir ve + butonuna tıklanır
“Create a New Certificate” ekranında “iOS App Development” seçilir ve Continue butonuna tıklanır.
“Choose File” butonuna tıklanarak daha önceden oluşturulan .certSigningRequest dosyası seçilir ve Continue butonuna tıklanır.
Son ekranda Download butonuna tıklanarak sertifika indirilir.
Üretilen sertifika sürükle bırak yapılarak keychain’e eklenebilir. Görselde de görüldüğü gibi sertifika ile ilgili private key, keychain tarafından eşleştirilmiştir.

Sonuç olarak

Provisioning profile, belirlenen bundleId’ye sahip uygulama paketinin, hangi cihazlar üzerinde, hangi geliştiriciler tarafından çalıştırılacağının belirlenmesini sağlar.

Bu yazım hakkında soru ve görüşlerinizi aşağıdaki yorumlar kısmından yazabilirsiniz. Bana destek vermek için alkış simgesine tıklayabilirsiniz. Sonraki yazımda görüşmek üzere…

Kaynaklar:

--

--

No responses yet