ميزات تجميع وتسليم تطبيقات iOS

في هذه المقالة ، نشارك تجربة إنشاء تطبيقات iOS وتقديمها للمستخدمين ، والتي اكتسبها Plarium Krasnodar في عملية تصحيح أخطاء CI / CD.

ميزات تجميع وتسليم تطبيقات iOS

تدريب

كل شخص مرتبط بشكل أو بآخر بتطوير تطبيقات لأجهزة Apple ، تمكن بالفعل من تقدير الراحة المثيرة للجدل للبنية التحتية. توجد التعقيدات في كل مكان ، من قائمة ملف تعريف المطور إلى أدوات التصحيح والبناء.

هناك الكثير من المقالات حول "الأساسيات" على الشبكة ، لذلك سنحاول تسليط الضوء على الشيء الرئيسي. إليك ما تحتاجه لبناء التطبيق بنجاح:

  • حساب المطور;
  • جهاز قائم على macOS يعمل كخادم بناء ؛
  • ولدت شهادة المطور، والتي سيتم استخدامها أيضًا للتوقيع على الطلب ؛
  • التطبيق الذي تم إنشاؤه باستخدام ملف ID (يجب ملاحظة أهمية معرف الحزمة ، لأن استخدام معرف حرف البدل يجعل من المستحيل استخدام العديد من وظائف التطبيق ، على سبيل المثال: المجالات المرتبطة وإشعارات الدفع و Apple تسجيل الدخول وغيرها) ؛
  • ملف توقيع الطلب.

يجب إنشاء شهادة مطور عبر Keychain على أي جهاز macOS. نوع الشهادة مهم جدا. اعتمادًا على بيئة التطبيق (Dev ، QA ، Staging ، Production) ، ستختلف (التطوير أو التوزيع) ، بالإضافة إلى نوع ملف تعريف توقيع التطبيق.

الأنواع الرئيسية للملفات الشخصية:

  • التطوير - مصمم للتوقيع على طلب فريق التطوير ، يتم استخدام شهادة التطوير (اكتب اسم iPhone Developer: XXXXX) ؛
  • Ad Hoc - مخصص لتوقيع تطبيق الاختبار والتحقق الداخلي من قبل قسم ضمان الجودة ، باستخدام شهادة التوزيع الخاصة بالمطور (اسم النوع iPhone Distribution: XXXXX) ؛
  • App Store هو إصدار إصدار للاختبار الخارجي عبر TestFlight وتحميله إلى App Store ، باستخدام شهادة توزيع المطور.

عند إنشاء ملفات تعريف التطوير والمخصصة ، يشار إليها أيضًا قائمة الأجهزة، حيث يمكنك تثبيت الإصدار ، والذي يسمح لك بمزيد من تقييد الوصول للمستخدمين. لا توجد قائمة بالأجهزة في ملف تعريف App Store ، نظرًا لأن TestFlight ، الذي ستتم مناقشته لاحقًا ، مسؤول عن التحكم في الوصول أثناء الاختبار التجريبي المغلق.

من أجل الوضوح ، يمكنك تقديم ملف تعريف المطور في شكل جدول أدناه. هذا يجعل من السهل فهم معلمات التجميع التي نحتاجها ومن أين نحصل عليها.

ميزات تجميع وتسليم تطبيقات iOS

جمعية

لتسهيل فصل التجميعات حسب المشروع والبيئة ، نستخدم أسماء ملفات تعريف النموذج ${ProjectName}_${Instance}، أي اسم المشروع + مثيل (اعتمادًا على بيئة التطبيق: Dev و QA و GD و Staging و Live وما إلى ذلك).

عند الاستيراد إلى خادم الإنشاء ، يغير ملف التعريف اسمه إلى معرف فريد وينتقل إلى المجلد /Users/$Username/Library/MobileDevice/Provisioning Profiles (أين $Username يطابق اسم حساب المستخدم لخادم الإنشاء).

هناك طريقتان لتجميع ملف * .ipa - ملف قديم (PackageApplication) وحديث (من خلال إنشاء XcAchive وتصديره). تعتبر الطريقة الأولى قديمة ، حيث تمت إزالة وحدة حزم ملف التطبيق من توزيع Xcode منذ الإصدار 8.3. لاستخدامه ، تحتاج إلى نسخ الوحدة النمطية من 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 Developer: 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//'

إذا كان التطبيق يستخدم ملف تعريف إضافيًا (على سبيل المثال ، للإشعارات الفورية) ، فعندئذٍ بدلاً من 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"

ومع ذلك ، تعتبر هذه الطريقة قديمة من وجهة نظر شركة آبل. يتم الحصول على * .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 - متجر التطبيقات.

$BundleID - معرف التطبيق المحدد في إعدادات التطبيق. يمكنك التحقق من الأمر:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId - إعدادات اسم المطور ومعرف ملف تعريف التوقيع التي تم استخدامها مسبقًا ويجب أن تتطابق مع القيم الموجودة في إعدادات التصدير.

$TeamID - معرف مكون من عشرة أرقام بين قوسين بعد اسم المطور ، على سبيل المثال: iPhone Developer: ...... (XXXXXXXXXX) ؛ يمكن التحقق منها في Keychain.

بعد ذلك ، باستخدام أمر التصدير ، نحصل على ملف * .ipa الضروري:

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

تسليم

الآن يجب تسليم الملف المجمع إلى المستخدم النهائي ، أي تثبيته على الجهاز.

هناك العديد من الخدمات لتوزيع أبنية التطوير و Ad Hoc ، مثل HockeyApp و AppBlade وغيرها ، ولكن في هذه المقالة سنركز على خادم مستقل لتوزيع التطبيقات.

يتم تثبيت تطبيق iOS على مرحلتين:

  1. الحصول على بيان تثبيت التطبيق من خلال Items Service.
  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 تطبيق تركيب البناء الخاص به ، والذي يمنحنا:

  • الحكم الذاتي والاستقلال ،
  • مركزية التحكم في الوصول والتثبيت الآمن للتطبيقات من خلال روابط "مؤقتة" تم إنشاؤها ديناميكيًا ،
  • وظائف قابلة للتوسيع (أي ، يمكن لفريق التطوير ، إذا لزم الأمر ، دمج الوظائف المفقودة في تطبيق موجود).

تجريب

الآن سنتحدث عن اختبار ما قبل الإصدار للتطبيق باستخدام TestFlight.

المتطلبات الأساسية للتنزيل هي نوع ملف تعريف توقيع App Store ووجود مفاتيح API التي تم إنشاؤها.

هناك عدة طرق لتنزيل التطبيق:

  • عبر Xcode (المنظم) ،
  • عبر altool ،
  • عبر Application Loader للإصدارات الأقدم من Xcode (الآن الناقل).

للتنزيل التلقائي ، يتم استخدام أداة altool ، والتي لها أيضًا طريقتان للترخيص:

  • كلمة المرور الخاصة بالتطبيق ،
  • مفتاح API.

يفضل تنزيل التطبيق باستخدام مفتاح API.

للحصول على مفتاح API ، انتقل إلى صلة وإنشاء مفتاح. بالإضافة إلى المفتاح نفسه بتنسيق * .p8 ، نحتاج إلى معلمتين: معرف الإصدار و 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 التطبيق في غضون يوم أو يومين وبعد ذلك سيصبح متاحًا للمختبرين الخارجيين: سيتم إرسال روابط للتثبيت عن طريق البريد.

هناك طريقة أخرى لتنزيل تطبيق من خلال 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

كما ترى ، فإن قيمة الاسم المختصر (موفر تصاعدي) التي نبحث عنها تتطابق مع معلمة $ TeamID التي استخدمناها عند إنشاء التطبيق.

للتحقق من صحة التطبيق وتحميله في TestFlight ، استخدم الأمر:

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

كقيمة معلمة -p يمكنك أن تأخذ القيمة $AppPswd في شكل غير مشفر (صريح).

ومع ذلك ، كما ذكرنا سابقًا ، من وجهة نظر الأداء ، من الأفضل اختيار مفتاح API لترخيص altool ، نظرًا لأن الإصدارات المختلفة من Xcode بها مشكلات معينة ("لا ترى" سلسلة المفاتيح ، وأخطاء التفويض عند التحميل ، وما إلى ذلك. ).

هذا ، في الواقع ، كل شيء. أتمنى أن يشارك كل شخص في إنشاءات ناجحة وإصدارات خالية من المتاعب في متجر التطبيقات.

المصدر: www.habr.com

إضافة تعليق