Δυνατότητες κατασκευής και παράδοσης εφαρμογών iOS

Σε αυτό το άρθρο, μοιραζόμαστε την εμπειρία της συναρμολόγησης και της παράδοσης εφαρμογών iOS στους χρήστες, την οποία έχει συγκεντρώσει το στούντιο Plarium Krasnodar κατά τη διαδικασία εντοπισμού σφαλμάτων CI/CD.

Δυνατότητες κατασκευής και παράδοσης εφαρμογών iOS

Εκπαίδευση

Κάθε άτομο που με τον ένα ή τον άλλο τρόπο εμπλέκεται στην ανάπτυξη εφαρμογών για συσκευές Apple έχει ήδη εκτιμήσει την αμφιλεγόμενη ευκολία της υποδομής. Οι δυσκολίες εντοπίζονται παντού: από το μενού προφίλ προγραμματιστή μέχρι τα εργαλεία εντοπισμού σφαλμάτων και κατασκευής.

Υπάρχουν πολλά άρθρα σχετικά με τα "βασικά" στο Διαδίκτυο, οπότε θα προσπαθήσουμε να επισημάνουμε το κύριο πράγμα. Δείτε τι χρειάζεστε για να δημιουργήσετε την εφαρμογή σας με επιτυχία:

  • λογαριασμό προγραμματιστή;
  • μια συσκευή που βασίζεται σε macOS που λειτουργεί ως διακομιστής κατασκευής.
  • δημιουργούνται πιστοποιητικό προγραμματιστή, το οποίο θα χρησιμοποιηθεί περαιτέρω για την υπογραφή της αίτησης·
  • δημιουργήθηκε εφαρμογή με μοναδική ID (θα πρέπει να σημειωθεί η σημασία του Bundle Identifier, επειδή η χρήση του αναγνωριστικού χαρακτήρων μπαλαντέρ καθιστά αδύνατη τη χρήση πολλών λειτουργιών της εφαρμογής, για παράδειγμα: Συσχετισμένοι τομείς, Ειδοποιήσεις Push, Είσοδος Apple και άλλες).
  • προφίλ υπογραφές αίτησης.

Ένα πιστοποιητικό προγραμματιστή πρέπει να δημιουργηθεί μέσω Keychain σε οποιαδήποτε συσκευή macOS. Το είδος του πιστοποιητικού είναι πολύ σημαντικό. Ανάλογα με το περιβάλλον εφαρμογής (Dev, QA, Staging, Production) θα διαφέρει (Ανάπτυξη ή Διανομή), όπως και ο τύπος του προφίλ υπογραφής της εφαρμογής.

Κύριοι τύποι προφίλ:

  • Ανάπτυξη - που προορίζεται για την υπογραφή της εφαρμογής της ομάδας ανάπτυξης, χρησιμοποιείται πιστοποιητικό ανάπτυξης (όνομα τύπου iPhone Developer: XXXXX).
  • Ad Hoc - που προορίζεται για την υπογραφή μιας δοκιμαστικής εφαρμογής και την εσωτερική επαλήθευση από το τμήμα QA, χρησιμοποιείται το πιστοποιητικό διανομής του προγραμματιστή (όνομα τύπου iPhone Distribution: XXXXX).
  • App Store - έκδοση έκδοσης για εξωτερική δοκιμή μέσω TestFlight και μεταφόρτωση στο App Store, χρησιμοποιείται το πιστοποιητικό διανομής του προγραμματιστή.

Κατά τη δημιουργία προφίλ ανάπτυξης και ad hoc, υποδεικνύεται επίσης λίστα συσκευών, στο οποίο μπορείτε να εγκαταστήσετε μια έκδοση, η οποία σας επιτρέπει να περιορίσετε περαιτέρω την πρόσβαση για τους χρήστες. Δεν υπάρχει λίστα συσκευών στο προφίλ του App Store, καθώς ο έλεγχος πρόσβασης κατά τη διάρκεια της κλειστής δοκιμής beta γίνεται από το TestFlight, το οποίο θα συζητηθεί αργότερα.

Για λόγους σαφήνειας, μπορείτε να παρουσιάσετε το προφίλ του προγραμματιστή με τη μορφή πίνακα παρακάτω. Αυτό καθιστά ευκολότερο να κατανοήσουμε ποιες παραμέτρους χρειαζόμαστε για τη συναρμολόγηση και από πού να τις λάβουμε.

Δυνατότητες κατασκευής και παράδοσης εφαρμογών iOS

συνέλευση

Για να διευκολύνουμε τον διαχωρισμό συγκροτημάτων ανά έργο και περιβάλλον, χρησιμοποιούμε ονόματα προφίλ όπως ${ProjectName}_${Instance}, δηλαδή όνομα έργου + παρουσία (εξαρτάται από το περιβάλλον εφαρμογής: Dev, QA, GD, Staging, Live και ούτω καθεξής).

Όταν εισάγεται στον διακομιστή κατασκευής, το προφίλ αλλάζει το όνομά του σε ένα μοναδικό αναγνωριστικό και μετακινείται στο φάκελο /Users/$Username/Library/MobileDevice/Provisioning Profiles (Οπου $Username αντιστοιχεί στο όνομα λογαριασμού χρήστη του διακομιστή κατασκευής).

Υπάρχουν δύο τρόποι για να δημιουργήσετε ένα αρχείο *.ipa - legacy (PackageApplication) και σύγχρονο (μέσω δημιουργίας και εξαγωγής XcAchive). Η πρώτη μέθοδος θεωρείται απαρχαιωμένη, καθώς από την έκδοση 8.3 η ενότητα συσκευασίας αρχείων εφαρμογής έχει αφαιρεθεί από τη διανομή Xcode. Για να το χρησιμοποιήσετε, πρέπει να αντιγράψετε τη μονάδα από το παλιό Xcode (έκδοση 8.2 και παλαιότερη) στον φάκελο:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Και μετά εκτελέστε την εντολή:

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

Στη συνέχεια, πρέπει να συλλέξετε το αρχείο *.app της εφαρμογής:

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

Πού:

-workspace — διαδρομή προς το αρχείο του έργου.

-scheme — το σύστημα που χρησιμοποιείται, που καθορίζεται στο έργο.

-derivedDataPath — διαδρομή για τη λήψη της συναρμολογημένης εφαρμογής (*.app).

CODE_SIGN_IDENTITY — το όνομα του λογαριασμού προγραμματιστή, το οποίο μπορεί να επαληθευτεί στο Keychain (Προγραμματιστής iPhone: XXXX XXXXXXX, χωρίς το TeamID σε αγκύλες).

Δυνατότητες κατασκευής και παράδοσης εφαρμογών iOS

PROVISIONING_PROFILE — Αναγνωριστικό προφίλ για την υπογραφή της αίτησης, το οποίο μπορείτε να αποκτήσετε με την εντολή:

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

Εάν η εφαρμογή χρησιμοποιεί ένα πρόσθετο προφίλ (για παράδειγμα, για Push Notifications), τότε αντί για PROVISIONING_PROFILE υποδεικνύω:

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

Στη συνέχεια, το αρχείο *.app που προκύπτει θα πρέπει να συσκευαστεί σε *.ipa. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε μια εντολή όπως:

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

Ωστόσο, αυτή η μέθοδος θεωρείται ξεπερασμένη από την πλευρά της Apple. Είναι σημαντικό να αποκτήσετε *.ipa με εξαγωγή από το αρχείο της εφαρμογής.

Πρώτα πρέπει να συλλέξετε το αρχείο με την εντολή:

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

Οι διαφορές έγκεινται στη μέθοδο συναρμολόγησης και τις επιλογές SYNCHRONOUS_SYMBOL_PROCESSING, το οποίο απενεργοποιεί την εκφόρτωση συμβόλων κατά το χρόνο κατασκευής.

Στη συνέχεια πρέπει να δημιουργήσουμε ένα αρχείο με ρυθμίσεις εξαγωγής:

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

Πού:

$Method — μέθοδος παράδοσης, αντιστοιχεί στον τύπο προφίλ υπογραφής εφαρμογής, δηλαδή, για Ανάπτυξη η τιμή θα είναι ανάπτυξη, για Ad Hoc - ad-hoc και για App Store - app-store.

$BundleID — Αναγνωριστικό εφαρμογής, το οποίο καθορίζεται στις ρυθμίσεις της εφαρμογής. Μπορείτε να ελέγξετε με την εντολή:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId — Ρυθμίσεις αναγνωριστικού ονόματος προγραμματιστή και προφίλ υπογραφής που χρησιμοποιήθηκαν στο παρελθόν και πρέπει να ταιριάζουν με τις τιμές στις ρυθμίσεις εξαγωγής.

$TeamID — δεκαψήφιο αναγνωριστικό σε αγκύλες μετά το όνομα του προγραμματιστή, παράδειγμα: Προγραμματιστής iPhone: …… (XXXXXXXXXX); μπορεί να ελεγχθεί στο Keychain.

Στη συνέχεια, χρησιμοποιώντας την εντολή εξαγωγής, λαμβάνουμε το απαραίτητο αρχείο *.ipa:

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

Διανομή

Τώρα το συλλεγμένο αρχείο πρέπει να παραδοθεί στον τελικό χρήστη, δηλαδή να εγκατασταθεί στη συσκευή.

Υπάρχουν πολλές υπηρεσίες για τη διανομή αναπτυξιακών και Ad Hoc builds, όπως HockeyApp, AppBlade και άλλες, αλλά σε αυτό το άρθρο θα μιλήσουμε για έναν αυτόνομο διακομιστή για τη διανομή εφαρμογών.

Η εγκατάσταση της εφαρμογής για iOS πραγματοποιείται σε 2 στάδια:

  1. Λήψη του δηλωτικού εγκατάστασης της εφαρμογής μέσω της Υπηρεσίας Ειδών.
  2. Εγκατάσταση του αρχείου *.ipa σύμφωνα με τις πληροφορίες που καθορίζονται στο μανιφέστο μέσω HTTPS.

Επομένως, πρέπει πρώτα να δημιουργήσουμε μια δήλωση εγκατάστασης (τύπος αρχείου *.plist) με την εντολή:

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

Όπως μπορείτε να δείτε, το μανιφέστο περιέχει σχεδόν όλες τις παραμέτρους που εμπλέκονται στη δημιουργία της εφαρμογής.

Έκδοση εφαρμογής ($AppVersion) μπορεί να ελεγχθεί με την εντολή:

defaults read $ProjectDir/Info CFBundleVersion

Παράμετρος $ipaUrl περιέχει έναν άμεσο σύνδεσμο για τη λήψη του αρχείου *.ipa. Από την έβδομη έκδοση του iOS, η εφαρμογή πρέπει να εγκατασταθεί μέσω HTTPS. Στην όγδοη έκδοση, η μορφή της δήλωσης έχει αλλάξει ελαφρώς: μπλοκ με ρυθμίσεις για εικονίδια εφαρμογών όπως

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

Έτσι, για να εγκαταστήσετε την εφαρμογή, αρκεί μια απλή σελίδα HTML με έναν σύνδεσμο όπως αυτός:

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

Για τις ανάγκες των τμημάτων ανάπτυξης και δοκιμών, η Plarium δημιούργησε τη δική της εφαρμογή εγκατάστασης build, η οποία μας δίνει:

  • αυτονομία και ανεξαρτησία,
  • συγκεντρωτισμός του ελέγχου πρόσβασης και ασφαλής εγκατάσταση εφαρμογών μέσω «προσωρινών» δυναμικά δημιουργημένων συνδέσμων,
  • επεκτάσιμη λειτουργικότητα (δηλαδή, η ομάδα ανάπτυξης, εάν είναι απαραίτητο, μπορεί να ενσωματώσει λειτουργίες που λείπουν σε μια υπάρχουσα εφαρμογή).

Δοκιμές

Τώρα θα μιλήσουμε για τη δοκιμή πριν από την κυκλοφορία της εφαρμογής χρησιμοποιώντας Testlight.

Απαιτούμενες προϋποθέσεις για τη λήψη είναι ο τύπος του προφίλ υπογραφής του App Store και η παρουσία κλειδιών API που δημιουργούνται.

Υπάρχουν διάφοροι τρόποι λήψης της εφαρμογής:

  • μέσω Xcode (Οργανωτής),
  • μέσω altool,
  • μέσω Application Loader για παλαιότερες εκδόσεις του Xcode (τώρα Transporter).

Για αυτόματη λήψη, χρησιμοποιείται το altool, το οποίο έχει επίσης δύο μεθόδους εξουσιοδότησης:

  • Κωδικός πρόσβασης για συγκεκριμένη εφαρμογή,
  • Κλειδί API.

Είναι προτιμότερο να κάνετε λήψη της εφαρμογής χρησιμοποιώντας το κλειδί API.

Για να λάβετε το κλειδί API, μεταβείτε στο σύνδεσμος και δημιουργήστε ένα κλειδί. Εκτός από το ίδιο το κλειδί σε μορφή *.p8, θα χρειαστούμε δύο παραμέτρους: IssuerID και KeyID.

Δυνατότητες κατασκευής και παράδοσης εφαρμογών iOS

Στη συνέχεια, εισαγάγετε το κλειδί λήψης στον διακομιστή κατασκευής:

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

Πριν ανεβάσετε την εφαρμογή στο TestFlight, πρέπει να επικυρώσετε την εφαρμογή, το κάνουμε με την εντολή:

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

Πού apiKey и apiIssuer έχουν τιμές πεδίου από τη σελίδα δημιουργίας κλειδιού API.

Στη συνέχεια, μετά την επιτυχή επικύρωση, φορτώνουμε την εφαρμογή με την εντολή --upload-app με τις ίδιες παραμέτρους.

Η εφαρμογή θα δοκιμαστεί από την Apple εντός μίας ή δύο ημερών και στη συνέχεια θα είναι διαθέσιμη σε εξωτερικούς ελεγκτές: θα τους αποσταλούν σύνδεσμοι μέσω email για εγκατάσταση.

Ένας άλλος τρόπος λήψης μιας εφαρμογής μέσω του altool είναι να χρησιμοποιήσετε τον κωδικό πρόσβασης για συγκεκριμένη εφαρμογή.

Για να αποκτήσετε τον κωδικό πρόσβασης για συγκεκριμένη εφαρμογή, πρέπει να μεταβείτε στο σύνδεσμος και δημιουργήστε το στην ενότητα Ασφάλεια.

Δυνατότητες κατασκευής και παράδοσης εφαρμογών iOS

Στη συνέχεια, θα πρέπει να δημιουργήσετε μια εγγραφή διακομιστή κατασκευής στο Keychain με αυτόν τον κωδικό πρόσβασης. Από την έκδοση 11 του Xcode αυτό μπορεί να γίνει με την εντολή:

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

Πού:

$DeveloperName — το όνομα του λογαριασμού προγραμματιστή iOS που χρησιμοποιείται για τη σύνδεση στις υπηρεσίες της Apple.

$AppPswd — δημιουργήθηκε κωδικός πρόσβασης για συγκεκριμένη εφαρμογή.

Στη συνέχεια, παίρνουμε την τιμή της παραμέτρου asc-provider και ελέγχουμε την επιτυχία της εισαγωγής κωδικού πρόσβασης με την εντολή:

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

Παίρνουμε την έξοδο:

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

Όπως μπορείτε να δείτε, η απαιτούμενη τιμή Short Name (asc-provider) συμπίπτει με την παράμετρο $TeamID που χρησιμοποιήσαμε κατά τη δημιουργία της εφαρμογής.

Για να επικυρώσετε και να φορτώσετε την εφαρμογή στο TestFlight, χρησιμοποιήστε την εντολή:

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

Ως τιμή παραμέτρου -p μπορείτε να πάρετε την τιμή $AppPswd σε μη κρυπτογραφημένη (σαφή) μορφή.

Ωστόσο, όπως αναφέρθηκε ήδη, από την άποψη της απόδοσης, είναι καλύτερο να επιλέξετε το API Key για εξουσιοδότηση altool, καθώς διαφορετικές εκδόσεις του Xcode έχουν ορισμένα προβλήματα («δεν βλέπει» Keychain, σφάλματα εξουσιοδότησης κατά τη μεταφόρτωση κ.λπ.).

Αυτό είναι όλο, στην πραγματικότητα. Εύχομαι σε όλους τους εμπλεκόμενους επιτυχημένες εκδόσεις και απρόσκοπτες εκδόσεις στο App Store.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο