ویژگی های ساخت و ارائه برنامه های iOS

در این مقاله، تجربه مونتاژ و ارائه اپلیکیشن‌های iOS به کاربران را به اشتراک می‌گذاریم که استودیو Plarium Krasnodar در فرآیند اشکال‌زدایی CI/CD انباشته است.

ویژگی های ساخت و ارائه برنامه های iOS

پرورش

هر فردی که به نوعی درگیر توسعه برنامه های کاربردی برای دستگاه های اپل است، قبلاً از راحتی بحث برانگیز زیرساخت قدردانی کرده است. مشکلات در همه جا یافت می شود: از منوی پروفایل توسعه دهنده گرفته تا ابزارهای اشکال زدایی و ساخت.

مقالات زیادی در مورد "مبانی" در اینترنت وجود دارد ، بنابراین ما سعی خواهیم کرد نکته اصلی را برجسته کنیم. آنچه برای ساخت موفقیت آمیز برنامه خود نیاز دارید به شرح زیر است:

  • حساب توسعه دهنده;
  • مبتنی بر دستگاه macOS، به عنوان یک سرور ساخت عمل می‌کند؛
  • تولید شده است گواهی توسعه دهنده، که بیشتر برای امضای برنامه استفاده خواهد شد.
  • ایجاد برنامه با منحصر به فرد ID (باید به اهمیت Bundle Identifier توجه داشت، زیرا استفاده از شناسه wildcard استفاده از بسیاری از عملکردهای برنامه را غیرممکن می کند، به عنوان مثال: دامنه های مرتبط، Push Notifications، Apple Sign In و موارد دیگر).
  • نمایه امضاهای برنامه

گواهی توسعه‌دهنده باید از طریق Keychain روی هر دستگاهی که مبتنی بر ... است، تولید شود. macOSنوع گواهی بسیار مهم است. بسته به محیط برنامه (توسعه، تضمین کیفیت، مرحله‌بندی، تولید)، متفاوت خواهد بود (توسعه یا توزیع)، همانطور که نوع پروفایل امضای برنامه نیز متفاوت خواهد بود.

انواع اصلی پروفیل:

  • توسعه - برای امضای درخواست تیم توسعه طراحی شده است، از یک گواهی توسعه استفاده می‌شود (نام نوع iPhone توسعه‌دهنده: XXXXXX)؛
  • Ad Hoc - که برای امضای یک برنامه آزمایشی و تأیید داخلی توسط بخش QA طراحی شده است، از گواهی توزیع توسعه‌دهنده استفاده می‌شود (نام نوع iPhone توزیع: XXXXXX)؛
  • App Store - نسخه انتشار برای آزمایش خارجی از طریق TestFlight و آپلود در فروشگاه App، گواهی توزیع توسعه دهنده استفاده می شود.

هنگام ایجاد نمایه های توسعه و Ad Hoc نیز نشان داده می شود لیست دستگاه، که می توانید یک بیلد را روی آن نصب کنید که به شما امکان می دهد دسترسی کاربران را بیشتر محدود کنید. هیچ لیستی از دستگاه ها در نمایه اپ استور وجود ندارد، زیرا کنترل دسترسی در طول آزمایش بتا بسته توسط 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، بدون شناسه تیم داخل پرانتز).

ویژگی های ساخت و ارائه برنامه های 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"

اما این روش از نظر اپل منسوخ تلقی می شود. به دست آوردن *.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 توسعه‌دهنده: …… (XXXXXXXXX)؛ قابل تأیید در Keychain.

سپس با استفاده از دستور export فایل *.ipa لازم را بدست می آوریم:

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

تحویل

اکنون فایل جمع آوری شده باید به کاربر نهایی تحویل داده شود، یعنی روی دستگاه نصب شود.

خدمات زیادی برای توزیع توسعه و بیلدهای Ad Hoc مانند HockeyApp، AppBlade و غیره وجود دارد، اما در این مقاله در مورد سرور مستقل برای توزیع برنامه ها صحبت خواهیم کرد.

نصب برنامه برای iOS در 2 مرحله انجام می شود:

  1. دریافت مانیفست نصب برنامه از طریق سرویس Items.
  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 برنامه نصب بیلد خود را ایجاد کرده است که به ما می دهد:

  • استقلال و استقلال،
  • تمرکز کنترل دسترسی و نصب امن برنامه ها از طریق پیوندهای پویا ایجاد شده "موقت"،
  • قابلیت توسعه پذیر (یعنی تیم توسعه، در صورت لزوم، می تواند توابع از دست رفته را در یک برنامه موجود ادغام کند).

آزمایش

اکنون در مورد آزمایش قبل از انتشار برنامه با استفاده از آن صحبت خواهیم کرد تست پرواز.

شرایط لازم برای دانلود، نوع پروفایل امضای اپ استور و وجود کلیدهای API تولید شده است.

چندین راه برای دانلود اپلیکیشن وجود دارد:

  • از طریق Xcode (سازمان دهنده)،
  • از طریق altool،
  • از طریق Application Loader برای نسخه های قدیمی Xcode (اکنون Transporter).

برای دانلود خودکار از altool استفاده می شود که دو روش مجوز نیز دارد:

  • رمز عبور ویژه برنامه،
  • کلید ای پی ای.

ترجیحاً برنامه را با استفاده از کلید 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 با همین پارامترها

این برنامه ظرف یک یا دو روز توسط اپل آزمایش می‌شود و سپس برای آزمایش‌کنندگان خارجی در دسترس قرار می‌گیرد: پیوندهایی برای نصب به آنها ایمیل می‌شود.

راه دیگر برای دانلود یک برنامه از طریق altool استفاده از رمز عبور خاص برنامه است.

برای دریافت گذرواژه مخصوص برنامه باید به این آدرس بروید پیوند و در قسمت Security تولید کنید.

ویژگی های ساخت و ارائه برنامه های iOS

در مرحله بعد، باید یک رکورد سرور ساخت در Keychain با این رمز عبور ایجاد کنید. از نسخه 11 Xcode این کار را می توان با دستور زیر انجام داد:

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

که در آن:

$DeveloperName - نام حساب توسعه دهنده iOS که برای ورود به سرویس های اپل استفاده می شود.

$AppPswd - ایجاد رمز عبور خاص برنامه.

در مرحله بعد، مقدار پارامتر asc-provider را دریافت می کنیم و موفقیت وارد کردن رمز عبور را با دستور زیر بررسی می کنیم:

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

خروجی را می گیریم:

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

همانطور که می بینید، مقدار نام کوتاه مورد نیاز (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، خطاهای مجوز در حین آپلود و غیره).

این همه، در واقع. برای همه کسانی که درگیر ساخت‌های موفق و نسخه‌های بدون دردسر در اپ استور هستند آرزو می‌کنم.

منبع: www.habr.com

خرید هاست قابل اعتماد برای سایت های دارای حفاظت DDoS، سرورهای VPS VDS 🔥 خرید هاستینگ معتبر با محافظت در برابر حملات DDoS، سرورهای VPS و VDS | ProHoster