iOS uygulamaları oluşturma ve sunma özellikleri

Bu yazıda, Plarium Krasnodar stüdyosunun CI/CD hata ayıklama sürecinde biriktirdiği iOS uygulamalarının derlenmesi ve kullanıcılara sunulması deneyimini paylaşıyoruz.

iOS uygulamaları oluşturma ve sunma özellikleri

Eğitim

Apple cihazları için uygulamaların geliştirilmesinde şu veya bu şekilde yer alan herkes, altyapının tartışmalı rahatlığını zaten takdir etmiştir. Zorluklar her yerde bulunur: geliştirici profili menüsünden hata ayıklama ve derleme araçlarına kadar.

İnternette "temel bilgiler" hakkında pek çok makale var, bu yüzden asıl şeyi vurgulamaya çalışacağız. Uygulamanızı başarıyla oluşturmak için ihtiyacınız olan şey:

  • geliştirici hesabı;
  • derleme sunucusu görevi gören macOS tabanlı bir cihaz;
  • oluşturulan geliştirici sertifikasıayrıca başvuruyu imzalamak için kullanılacak olan;
  • benzersiz ile oluşturulan uygulama ID (Paket Tanımlayıcının önemine dikkat edilmelidir, çünkü joker karakter kimliğinin kullanılması uygulamanın birçok işlevinin kullanılmasını imkansız hale getirir, örneğin: İlişkili Etki Alanları, Anlık Bildirimler, Apple Oturum Açma ve diğerleri);
  • profil uygulama imzaları

Herhangi bir macOS cihazında Anahtar Zinciri aracılığıyla bir geliştirici sertifikası oluşturulmalıdır. Sertifikanın türü çok önemlidir. Uygulama ortamına (Geliştirme, Kalite Güvencesi, Hazırlama, Üretim) ve uygulama imza profilinin türüne bağlı olarak farklılık gösterecektir (Geliştirme veya Dağıtım).

Ana profil türleri:

  • Geliştirme - geliştirme ekibinin başvurusunu imzalamak için tasarlanmış bir Geliştirme sertifikası kullanılır (tip adı iPhone Geliştiricisi: XXXXX);
  • Geçici - bir test başvurusunun imzalanması ve QA departmanı tarafından dahili doğrulama yapılması amacıyla geliştiricinin Dağıtım sertifikası kullanılır (tip adı iPhone Dağıtımı: XXXXX);
  • App Store - TestFlight aracılığıyla harici test yapmak ve App Store'a yüklemek için sürüm sürümü, geliştiricinin Dağıtım sertifikası kullanılır.

Geliştirme ve Özel amaçlı profiller oluşturulurken ayrıca belirtilir aygıt listesi, üzerine kullanıcılar için erişimi daha da kısıtlamanıza olanak tanıyan bir yapı yükleyebilirsiniz. Kapalı beta testi sırasında erişim kontrolü daha sonra tartışılacak olan TestFlight tarafından gerçekleştirildiğinden App Store profilinde cihaz listesi yoktur.

Anlaşılır olması açısından geliştiricinin profilini aşağıdaki tablo şeklinde sunabilirsiniz. Bu, montaj için hangi parametrelere ihtiyacımız olduğunu ve bunları nereden alabileceğimizi anlamamızı kolaylaştırır.

iOS uygulamaları oluşturma ve sunma özellikleri

montaj

Montajları projeye ve ortama göre ayırmayı kolaylaştırmak için aşağıdaki gibi profil adlarını kullanırız: ${ProjectName}_${Instance}, yani proje adı + örnek (uygulama ortamına bağlıdır: Dev, QA, GD, Staging, Live vb.).

Yapı sunucusuna aktarıldığında profil, adını benzersiz bir kimliğe dönüştürür ve klasöre taşınır /Users/$Username/Library/MobileDevice/Provisioning Profiles (burada $Username derleme sunucusunun kullanıcı hesabı adına karşılık gelir).

*.ipa dosyası oluşturmanın iki yolu vardır: eski (PackageApplication) ve modern (XcAchive oluşturma ve dışa aktarma yoluyla). Sürüm 8.3'ten bu yana uygulama dosyası paketleme modülü Xcode dağıtımından kaldırıldığı için ilk yöntemin eski olduğu kabul ediliyor. Kullanmak için modülü eski Xcode'dan (sürüm 8.2 ve öncesi) klasöre kopyalamanız gerekir:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Ve sonra şu komutu çalıştırın:

chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/*

Daha sonra uygulamanın *.app dosyasını toplamanız gerekir:

xcodebuild 
-workspace $ProjectDir/$ProjectName.xcworkspace 
-scheme $SchemeName 
-sdk iphoneos 
build 
-configuration Release 
-derivedDataPath build 
CODE_SIGN_IDENTITY=”$DevAccName”
PROVISIONING_PROFILE=”$ProfileId”
DEPLOYMENT_POSTPROCESSING=YES 
SKIP_INSTALL=YES 
ENABLE_BITCODE=NO

Nerede:

-workspace — proje dosyasının yolu.

-scheme - projede belirtilen, kullanılan şema.

-derivedDataPath — birleştirilmiş uygulamayı (*.app) indirme yolu.

CODE_SIGN_IDENTITY — Anahtar Zinciri'nde doğrulanabilen geliştirici hesabının adı (iPhone Geliştiricisi: XXXX XXXXXXX, parantez içinde TeamID olmadan).

iOS uygulamaları oluşturma ve sunma özellikleri

PROVISIONING_PROFILE — Uygulamayı imzalamak için şu komutla elde edilebilecek profil kimliği:

cd "/Users/$Username/Library/MobileDevice/Provisioning Profiles/" && find *.mobileprovision -type f | xargs grep -li ">${ProjectName}_${Instance}<" | sed -e 's/.mobileprovision//'

Uygulama ek bir profil kullanıyorsa (örneğin, Anında Bildirimler için), o zaman bunun yerine PROVISIONING_PROFILE belirtmek:

APP_PROFILE=”$AppProfile” 
EXTENSION_PROFILE=”$ExtProfile” 

Daha sonra, ortaya çıkan *.app dosyası *.ipa olarak paketlenmelidir. Bunu yapmak için aşağıdaki gibi bir komut kullanabilirsiniz:

/usr/bin/xcrun --sdk iphoneos PackageApplication 
-v $(find "$ProjectDir/build/Build/Products/Release-iphoneos" -name "*.app") 
-o "$ProjectDir/$ProjectName_$Instance.ipa"

Ancak bu yöntem Apple açısından eskimiş sayılıyor. *.ipa dosyasını uygulama arşivinden dışa aktararak elde etmek uygundur.

Öncelikle arşivi şu komutla toplamanız gerekir:

xcodebuild 
-workspace $ProjectDir/$ProjectName.xcworkspace 
-scheme $SchemeName 
-sdk iphoneos 
-configuration Release 
archive 
-archivePath $ProjectDir/build/$ProjectName.xcarchive 
CODE_SIGN_IDENTITY=”$DevAccName” 
PROVISIONING_PROFILE=”$ProfileId”
ENABLE_BITCODE=NO 
SYNCHRONOUS_SYMBOL_PROCESSING=FALSE

Farklılıklar montaj yönteminde ve seçeneklerde yatmaktadır SYNCHRONOUS_SYMBOL_PROCESSING, derleme sırasında sembol boşaltmayı devre dışı bırakır.

Daha sonra dışa aktarma ayarlarına sahip bir dosya oluşturmamız gerekiyor:

ExportSettings="$ProjectDir/exportOptions.plist"

cat << EOF > $ExportSettings
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>compileBitcode</key>
<false/>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<false/>
<key>method</key>
<string>$Method</string>
<key>provisioningProfiles</key>
<dict>
<key>$BundleID</key>
<string>$ProfileId</string>
</dict>
<key>signingCertificate</key>
<string>$DevAccName</string>
<key>signingStyle</key>
<string>manual</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>$TeamID</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
EOF

Nerede:

$Method — teslim yöntemi, uygulama imza profili türüne karşılık gelir; yani Geliştirme için değer geliştirme, Geçici için - geçici ve App Store için - uygulama mağazası olacaktır.

$BundleID — Uygulama ayarlarında belirtilen Uygulama Kimliği. Komutla kontrol edebilirsiniz:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId — daha önce kullanılmış olan ve dışa aktarma ayarlarındaki değerlerle eşleşmesi gereken geliştirici adı ve imza profili kimliği ayarları.

$TeamID — geliştiricinin adından sonra parantez içinde on haneli kimlik, örneğin: iPhone Geliştiricisi: …… (XXXXXXXXXX); Anahtarlık'ta kontrol edilebilir.

Daha sonra, dışa aktarma komutunu kullanarak gerekli *.ipa dosyasını elde ederiz:

xcodebuild 
-exportArchive 
-archivePath $ProjectDir/build/$ProjectName.xcarchive 
-exportPath $ProjectDir 
-exportOptionsPlist $ExportSettings

Teslim

Artık toplanan dosyanın son kullanıcıya teslim edilmesi yani cihaza kurulması gerekiyor.

HockeyApp, AppBlade ve diğerleri gibi Geliştirme ve Özel yapıların dağıtımına yönelik birçok hizmet vardır, ancak bu makalede uygulamaları dağıtmak için bağımsız bir sunucudan bahsedeceğiz.

İOS için uygulamanın kurulumu 2 aşamada gerçekleşir:

  1. Öğeler Hizmeti aracılığıyla uygulama yükleme bildiriminin alınması.
  2. *.ipa dosyasının manifestte belirtilen bilgilere göre HTTPS aracılığıyla kurulumu.

Bu nedenle, öncelikle şu komutla bir kurulum bildirimi (dosya türü *.plist) oluşturmamız gerekir:

cat << EOF > $manifest
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>$ipaUrl</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>$BundleID</string>
<key>bundle-version</key>
<string>$AppVersion</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>$ProjectName_$Instance</string>
<key>subtitle</key>
<string>$Instance</string>
</dict>
</dict>
</array>
</dict>
</plist>
EOF

Gördüğünüz gibi manifest, uygulamanın oluşturulmasında yer alan hemen hemen tüm parametreleri içerir.

Uygulama sürümü ($AppVersion) şu komutla kontrol edilebilir:

defaults read $ProjectDir/Info CFBundleVersion

Parametre $ipaUrl *.ipa dosyasını indirmek için doğrudan bir bağlantı içerir. İOS'un yedinci sürümünden itibaren uygulamanın HTTPS aracılığıyla yüklenmesi gerekir. Sekizinci versiyonda, bildirimin formatı biraz değişti: gibi uygulama simgelerinin ayarlarının bulunduğu bloklar

<images>
   <image>...</image>
</images>

Bu nedenle, uygulamayı yüklemek için aşağıdaki gibi bir bağlantıya sahip basit bir HTML sayfası yeterlidir:

itms-services://?action=download-manifest&url=https://$ServerUrl/$ProjectName/$Instance/iOS/$AppVersion/manifest.plist

Plarium, geliştirme ve test departmanlarının ihtiyaçları için kendi yapı kurulum uygulamasını oluşturdu ve bu bize şunları sağlıyor:

  • özerklik ve bağımsızlık,
  • Erişim kontrolünün merkezileştirilmesi ve dinamik olarak oluşturulan "geçici" bağlantılar aracılığıyla uygulamaların güvenli kurulumu,
  • genişletilebilir işlevsellik (yani geliştirme ekibi gerekirse eksik işlevleri mevcut bir uygulamaya entegre edebilir).

Test

Şimdi uygulamanın yayın öncesi testlerinden bahsedeceğiz. Test uçuşu.

İndirme için gerekli koşullar, App Store imza profilinin türü ve oluşturulan API anahtarlarının varlığıdır.

Uygulamayı indirmenin birkaç yolu vardır:

  • Xcode (Organizatör) aracılığıyla,
  • alttool aracılığıyla,
  • Xcode'un eski sürümleri (şimdi Transporter) için Uygulama Yükleyici aracılığıyla.

Otomatik indirme için ayrıca iki yetkilendirme yöntemine sahip olan alttool kullanılır:

  • Uygulamaya Özel Şifre,
  • API Anahtarı.

Uygulamanın API Anahtarını kullanarak indirilmesi tercih edilir.

API Anahtarını almak için şuraya gidin: bağlantı ve bir anahtar oluşturun. *.p8 formatındaki anahtarın kendisine ek olarak iki parametreye ihtiyacımız olacak: IssuerID ve KeyID.

iOS uygulamaları oluşturma ve sunma özellikleri

Daha sonra indirilen anahtarı derleme sunucusuna aktarın:

mkdir -p ~/.appstoreconnect/private_keys
mv ~/Downloads/AuthKey_${KeyID}.p8 ~/.appstoreconnect/private_keys/

Uygulamayı TestFlight'a yüklemeden önce uygulamayı doğrulamanız gerekiyor, bunu şu komutla yapıyoruz:

xcrun altool 
--validate-app 
-t ios 
-f $(find "$ProjectDir" -name "*.ipa") 
--apiKey “$KeyID” 
--apiIssuer “$IssuerID” 

Nerede apiKey и apiIssuer API anahtar oluşturma sayfasından alan değerlerine sahip olun.

Daha sonra başarılı doğrulamanın ardından uygulamayı şu komutla yüklüyoruz: --upload-app aynı parametrelerle.

Uygulama bir veya iki gün içinde Apple tarafından test edilecek ve ardından harici test uzmanlarına sunulacak: kurulum için bağlantılar e-postayla gönderilecek.

Alttool aracılığıyla bir uygulamayı indirmenin başka bir yolu da Uygulamaya Özel Şifre kullanmaktır.

Uygulamaya Özel Şifreyi almak için şu adrese gitmeniz gerekir: bağlantı ve bunu Güvenlik bölümünde oluşturun.

iOS uygulamaları oluşturma ve sunma özellikleri

Daha sonra bu şifre ile Keychain’de build sunucu kaydı oluşturmalısınız. Xcode'un 11. sürümünden itibaren bu şu komutla yapılabilir:

xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswd

Nerede:

$DeveloperName — Apple hizmetlerinde oturum açmak için kullanılan iOS geliştirici hesabının adı.

$AppPswd — Uygulamaya Özel Şifre oluşturuldu.

Daha sonra asc-provider parametresinin değerini alıyoruz ve şifre içe aktarma işleminin başarısını şu komutla kontrol ediyoruz:

xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"

Çıktıyı alıyoruz:

Provider listing:
- Long Name - - Short Name -
XXXXXXX        XXXXXXXXX

Gördüğünüz gibi gerekli Short Name değeri (asc-provider) uygulamayı derlerken kullandığımız $TeamID parametresi ile örtüşüyor.

Uygulamayı doğrulamak ve TestFlight'a yüklemek için şu komutu kullanın:

xcrun altool 
--(validate|upload)-app   
-f $(find "$ProjectDir" -name "*.ipa") 
-u "$DeveloperName" 
-p "@keychain:Altool" 

Parametre değeri olarak -p değerini alabilirsin $AppPswd şifrelenmemiş (açık) biçimde.

Ancak, daha önce de belirtildiği gibi, performans açısından, alttool yetkilendirmesi için API Anahtarını seçmek daha iyidir, çünkü Xcode'un farklı sürümlerinde belirli sorunlar vardır ("Anahtarlığı görmüyor", yükleme sırasında yetkilendirme hataları vb.).

Aslında hepsi bu. Herkesin App Store'da başarılı derlemelere ve sorunsuz sürümlere katkıda bulunmasını dilerim.

Kaynak: habr.com

Yorum ekle