[ملاحظة. ترجمة: ترجمة المنشور الذي تسبب في نقاش واسع حول Habré ، أصبحت مهتمة بالقواعد الجديدة لمطوري البرمجيات التي قدمتها Apple. يتحدث هذا المقال عن التجربة الشخصية في إتقان القواعد مع أحد مطوري اللعبة.]مقدمة
في الإصدار الجديد من نظام التشغيل MacOS ، قدمت شركة Apple متطلبات معينة للتطبيقات التي كانت بمثابة توصيات: ملفات قابلة للتنفيذ 64 بت وتوقيع وتوثيق. لن يتم تشغيل التطبيقات التي لا تفي بهذه المتطلبات.
يتم ذلك من أجل حماية عمل المستخدمين ومنع انتشار البرامج الضارة ، ولكن في نفس الوقت يجعل الحياة صعبة للغاية ، لا سيما بالنسبة لأولئك الذين لا يمثل Mac منصة التطوير الرئيسية الخاصة بهم ، ولكنهم يرغبون في بدء دعم Mac أو مواصلة دعمه .
هذا صحيح بشكل خاص لمطوري الألعاب الذين يقومون بنشر ألعاب Mac على Steam. حتى التغييرات الأخيرة ، لم تكن الألعاب التي تم إطلاقها من Steam بحاجة للتوقيع والتوثيق ، ولكن الآن يجب عليها الامتثال للقواعد نفسها التي يتبعها أي شخص آخر.
لقد انتهيت للتو من معرفة كيفية تطبيق هذه المتطلبات على لعبة
Airships: Conquer the Skies . تعمل Airships في Java ، وبالتالي تتطلب JVM ، ولكن بشكل عام ، كل شيء آخر سيكون قابلاً للتطبيق على معظم المطورين.
إليك ما تعلمته حول التوقيع على تطبيق Mac وتوثيقه لم يتم تجميعه مباشرةً بواسطة Xcode. يرجى ملاحظة أن المعلومات يتم الحصول عليها من بحثي الخاص وقد لا تكون دقيقة بنسبة 100 ٪.
أسئلة وتصحيحات هي موضع ترحيب. تاريخ الحالة
تتناول هذه المقالة التوقيع والتوثيق. الحصول على الملف القابل للتنفيذ 64 بت من البرنامج مهمة بيئة المترجم أو التطوير الخاصة بك.
في نظام التشغيل MacOS ، عادة ما يتم حزم التطبيقات في حزمة - مجلدات تحتوي على الملف القابل للتنفيذ ، بالإضافة إلى موارد وبيانات تعريف إضافية. يعني التوقيع على حزمة إنشاء اختباري تشفير لمحتويات الحزمة ، يتبعه إنشاء توقيع تشفير مع شهادة تصدرها Apple للمطور. التوقيع عبارة عن بيان تضمنه شخصيًا السلوك الصحيح للتطبيق. إذا تغيرت محتويات الحزمة ، وتغير المجموع الاختباري ، وتوقف التوقيع عن مطابقتها ، فقم بتحذير نظام التشغيل من أنه قد تم إجراء تغييرات غير مصرح بها على الحزمة.
تم توقيع التطبيق في جميع أنحاء لسنوات عديدة. بعد ذلك بقليل ، أصبحت التطبيقات ضرورية للتوثيق. يعني التوثيق أنك ترسل تطبيق Apple موقعًا ، وأن الشركة تقوم بإجراء عمليات فحص إضافية وتسجيل التطبيق. إذا كان التوثيق ناجحًا ، فأنت "تمسك" بالتوثيق على تطبيقك ، حتى تتمكن الأجهزة غير المتصلة بالإنترنت التي لا يمكنها الوصول إلى الإنترنت من التأكد من أن التطبيق قد تم توثيقه.
هذا نوع من الاستعارة للتعامل مع المستندات الورقية. يجمع المطور في حزمة جميع الأجزاء التي تشكل التطبيق. ثم يقوم بإنشاء قائمة بجميع عناصر الحزمة (المجموع الاختباري) ويوقع هذه القائمة (بتوقيع رقمي) ، والذي يقوم بإلصاقها بالحزمة. ثم يمرر الحزمة الموقعة إلى كاتب العدل السيد يابلوكوف ، الذي يتحقق مما إذا كان كل شيء متوافقًا مع الحزمة ، ثم يقوم بتسجيلها. انه يعطي المطور إيصالا أن دباسة تعلق على الحزمة. هذا إذا قال المطور أن التطبيق آمن ، كما يقول السيد يابلوكوف إنه آمن ، فعلى الأرجح هو كذلك. وإذا حاول شخص سيء تغيير محتوياته ، فستتوقف قائمة عناصر الحزمة عن مطابقتها ، وسيعلم المستخدم أنه ليس من الضروري استخدامها.
متطلبات
ما هو ضروري للتوقيع وتوثيق التطبيق:
- كمبيوتر Mac جديد بما يكفي لتشغيل Xcode 11 عليه ، أي جديد بما يكفي لتشغيل macOS 10.14.3. إذا لم تكن قد قمت بتثبيت Xcode حتى الآن ، فسيكون هناك حاجة إلى 25 غيغابايت من المساحة الحرة للتثبيت.
- إذا لم تكن مطورًا رسميًا لشركة Apple ، فسيتطلب الأمر تسجيل دخول بمعرف Apple وحوالي 110 دولارات للعضوية.
المصادقة الثنائية
إذا لم يكن لديك حساب بعد ، فقم بتمكين المصادقة الثنائية لمعرف Apple الخاص بك. يمكن القيام بذلك من أي جهاز i أو جهاز Mac. على نظام Mac ، انتقل إلى لوحة تحكم iCloud من إعدادات تفضيلات النظام. في الأعلى يجب أن يكون هناك لوحة تقترح لتمكين 2FA.
شراء عضوية
قم
بتسجيل الدخول إلى
https://developer.apple.com/ باستخدام معرف Apple الخاص بك وانتقل إلى علامة التبويب العضوية. شراء أو ترقية عضوية برنامج Apple Developer إذا لزم الأمر. يرجى ملاحظة أن معالجة عملية الشراء تستغرق بعض الوقت على الأنظمة الداخلية لشركة Apple ، لذلك إذا كنت غير قادر على إنشاء شهادات (انظر أدناه) ، فاشرب كوبًا من الشاي لفترة من الوقت وتهدأ.
معرف التطبيق
قد تحتاج إلى تسجيل معرف حزمة التطبيق في الجهة الخلفية للمطور. يمكن العثور على معرف الحزمة في YourApp.app/Contents/Info.plist. (يمكنك فتح حزم التطبيقات بالنقر بزر الماوس الأيمن عليها وتحديد "إظهار محتويات الحزمة".) يجب أن يكون المعرف com.yourcompanyname.applicationname ، على سبيل المثال ، تشتمل لعبة Airships الخاصة بي على com.zarkonnen.airships.
لتسجيل معرف ، سجّل الدخول إلى
https://developer.apple.com/ ، وحدد "الشهادات ، والمعرّفات والتوصيفات" في الجزء الأيمن ، ثم حدد "المعرفات" في الصفحة التالية. ثم يمكنك النقر فوق الزر "+" لإضافة معرف التطبيق.
كلمة مرور التطبيق
لتسجيل الدخول من سطر الأوامر ، ستحتاج إلى كلمة مرور التطبيق ، لذلك انتقل إلى
https://appleid.apple.com/account/manage وقم بإنشائها.
Xcode والأدوات
قم بتثبيت Xcode من خلال متجر تطبيقات Mac App. ثم قم أيضًا بتثبيت أدوات سطر أوامر Xcode من
https://developer.apple.com/download/more . تحتاج إلى أدوات سطر الأوامر لـ Xcode 11 أو إصدار Xcode الذي تستخدمه.
شهادة
إطلاق Xcode ، انتقل إلى التفضيلات ، افتح علامة التبويب حسابات. إذا لزم الأمر ، أضف معرف Apple الخاص بك إلى قائمة الحسابات. ثم انقر فوق الزر "إدارة الشهادات ..." في الزاوية اليمنى السفلى. يتم عرض الشهادات التي لديك لتوقيع التطبيقات. تحتاج إلى شهادة "تطبيق معرف المطور" ؛ إذا لم يكن في القائمة ، ثم إنشائه. انقر فوق "تم" ثم "تنزيل" في نافذة التفضيلات: الحسابات لتنزيل الشهادات محليًا.
إعداد التطبيق
لكي يعمل التطبيق بشكل صحيح على النظام الجديد ، يجب أن يكون الملف القابل للتنفيذ والمكتبات 64 بت.
بالإضافة إلى ذلك ، ينفذ Mac OS عملية تسمى "translocation": لأسباب أمنية ، فإنه ينقل حزمة التطبيقات قيد التشغيل إلى موقع عشوائي. في حالة طلبي ، تجلى ذلك في حقيقة أنه لم يتمكن من العثور على ملفات البيانات الموجودة بجانب حزمة التطبيق. يمكنك الحصول على الموقع الأصلي لحزمة التطبيق ، لكنني قمت بحل المشكلة ببساطة عن طريق وضع كل شيء في الحزمة.
أذونات (استحقاقات)
هذه أذونات خاصة يضيفها المطور إلى جانب توقيع الشفرة ، مما يسمح للتطبيقات الموقعة بتنفيذ إجراءات معينة. إذا قمت بترجمة التطبيق باستخدام Xcode ، فسيعمل كل شيء بمفرده ؛ خلاف ذلك ، سوف تحتاج إلى إنشاء ملف plist يحتوي على جميع الاستحقاقات التي تحتاج إليها. يمكن إنشاء ملفات Plist باستخدام Xcode ، وعلى
https://developer.apple.com/documentation/bundleresources/entitlements هناك قائمة من الاستحقاقات.
لإنشاء ملف plist جديد باستخدام Xcode ، حدد "ملف جديد" ثم انقر فوق "قائمة الممتلكات" في القائمة التي تظهر. أضف العناصر ذات الاستحقاقات التي تحتاج إليها في قاموس الجذر ؛ لديهم معاني منطقية: نعم.
في حالة لعبتي ، نظرًا لأنه مكتوب بلغة Java ، كنت بحاجة إلى الأذونات التالية لتشغيل JVM: com.apple.security.cs.allow-jit ، com.apple.security.cs.allow-unsigned-قابل للتنفيذ ، com. apple.security.cs.disable-القابل للتنفيذ ، حماية الصفحة ، com.apple.security.cs.disable-library-validation ، com.apple.security.cs.allow-dyld-environment-variables. بالنسبة للمستخدم ، فإنهم يبدون مخيفين ، لذا إذا لم تكن بحاجة إليهم ، فلا تضيفهم بعد ذلك.
في وقت لاحق من هذه المقالة ، سنفترض أنك وضعت حقوقك في ملف يسمى entitlements.plist.
التوقيع
هذه هي عملية إنشاء توقيع رقمي يبلغ: الشخص الذي لديه حق الوصول إلى شهادة التوقيع يعد بأن حزمة التطبيقات المحددة هذه موثوقة وليست ضارة. أي تغييرات في حزمة التطبيق (باستثناء إرفاق تأكيد التوثيق ، انظر أعلاه) بعد توقيعه يبطل التوقيع ويطلب إعادة التوقيع على الحزمة.
هذا يعني أيضًا أن التطبيق الخاص بك يجب ألا يغير أي شيء في محتويات حزمة التطبيق ، على سبيل المثال ، لا تضع ذاكرة تخزين مؤقت هناك.
يتم توقيع كل ملف قابل للتنفيذ ومكتبة ديناميكية في حزمة التطبيق بشكل منفصل. في بعض الحالات ، قد تكون المكتبات موقعة بالفعل. أي أنه من المهذب والهدوء توقيع حزمة عن طريق توقيع كل عنصر بدوره ، ثم التوقيع على الحزمة بأكملها. إذا كان لدى أي عنصر بالفعل توقيع ، فسيظل في مكانه.
إحدى الطرق الخشنة والفعالة هي فرض توقيع عميق ، أي أنه سيتم تطبيق توقيعك على جميع عناصر حزمة التطبيق ، مع استبدال جميع التواقيع السابقة. هذا هو بالضبط ما سنفعله ، لأنه أبسط ولأن التوقيعات السابقة قد تكون غير صالحة أو غير قوية بما فيه الكفاية.
ستحتاج الأمر مخيف التالية:
codesign -s "Developer ID Application: <YourName>" --timestamp --options runtime -f --entitlements entitlements.plist --deep YourApp.app
يعني الخيار
--timestamp
أن الطابع الزمني الصحيح ، وهو أمر ضروري
--timestamp
الناجح ، مضمن مع التوقيع.
الخيار -
--options runtime
يعني أن التوقيع يتضمن "وقت تشغيل صلب" ، وهو أمر ضروري أيضًا للتوثيق الناجح.
يمكنك معرفة التوقيع من قبل الفريق
codesign -d -vvvv YourApp.app
يجب عليك أيضًا تشغيل التطبيق للتأكد من استمرار العمل بعد التوقيع.
إذا كنت ترغب في تسجيل العناصر بطريقة أكثر مهذبة ،
--deep
الأمرين
-f
و
-f
--deep
من الأمر ، قم أولاً
--deep
جميع الملفات والمكتبات القابلة للتنفيذ داخل التطبيق ، ثم التطبيق بالكامل.
التوثيق
بعد توقيع التطبيق ، تحتاج إلى توفيره لأنظمة Apple للتوثيق من أجل أن تقول: "انظر ، لقد وقعت على هذا الشيء."
للقيام بذلك ، قم أولاً بضغط التطبيق في ملف مضغوط خاص باستخدام الأمر ditto:
/usr/bin/ditto -c -k --keepParent YourApp.app YourApp.zip
ببساطة التفاف التطبيق في الرمز البريدي باستخدام Finder أو لن يعمل سطر الأوامر.
ثم أرسل الرمز البريدي للتوثيق:
xcrun altool --notarize-app --primary-bundle-id "<id>" -u "<appleid>" -p "<app-specific password>" --file YourApp.zip
مثال:
xcrun altool --notarize-app --primary-bundle-id "com.zarkonnen.airships" -u "dave@hotmail.com" -p "bwnh-pbbt-llpt-xxxx" --file Airships.zip
يمكن العثور على معرف الحزمة من خلال النظر إلى YourApp.app/Contents/Info.plist. (يمكنك فتح حزم التطبيقات بالنقر بزر الماوس الأيمن عليها واختيار "إظهار محتويات الحزمة".)
التوثيق يمكن أن يستغرق وقتا طويلا. عادة ما تكون هذه بضع ثوانٍ أو دقائق ، لكن في بعض الأحيان قد تكون ساعة. صب المزيد من الشاي ، أو شيء أقوى ، اختر لنفسك. عاجلاً أم آجلاً ستحصل على شيء مثل هذا:
No errors uploading 'YourApp.zip'.
RequestUUID = 29926ae6-f551-4d54-b283-e29d6f9b9156
الآن يمكننا استخدام الأمر التالي للتحقق من حالة الحزمة المرسلة:
xcrun altool --notarization-info <RequestUUID> -u -u "<appleid>" -p "<app-specific password>"
مثال:
xcrun altool --notarization-info 29926ae6-f551-4d54-b283-e29d6f9b9156 -u "dave@hotmail.com" -p "bwnh-pbbt-llpt-xxxx"
سيتم عرض شيء مشابه:
التاريخ: 2019-10-08 06:59:58 +0000
تجزئة: 0774fb95035408bacecebd64935a611ecd27b45ad9cbf3cc1aa48fa1e0eaa649
LogFileURL: https: //osxapps-ssl.itunes.apple.com/itunes-assets/Enigma123 / ...
الحالة: النجاح
رمز الحالة: 0
رسالة الحالة: تمت الموافقة على الحزمة
أكرر ، التأكيد يستغرق عادة حوالي 15 دقيقة ، ولكن في بعض الأحيان يستغرق عدة ساعات لنفس التطبيق. نعم هكذا.
إذا كانت الحالة فاشلة ، فراجع الأخطاء المدرجة بواسطة عنوان URL لملف السجل. إذا نجحت ، فقم بإلقاء نظرة على أي حال ، لأنه قد تكون هناك تحذيرات ، وقد تصبح هذه التحذيرات أخطاء عندما تشدد Apple متطلباتها مرة أخرى.
التعلق
أخيرًا ، سنقوم "بربط" تأكيد التوثيق على حزمة التطبيق حتى يتمكن نظام التشغيل Mac من التحقق من ذلك دون اتصال بالإنترنت. للقيام بذلك ، يجب تنفيذ أمر قصير بشكل مدهش:
xcrun stapler staple "YourApp.app"
تهانينا ، لقد اشتركت وسجلت تطبيق Mac. يمكنك الآن توزيع حزمة التطبيق بأي طريقة مناسبة لك إذا لم تتغير في هذه العملية.
جافا
إذا كنت في نفس القارب معي وتحتاج إلى الإضافة إلى الحزمة مع تطبيق JVM ، فتابع القراءة.
هناك عدة خيارات لدمج حزمة JVM مع تطبيق Java. أود أن أوصي AppBundler ، وهي مهمة النمل التي تقوم بكل العمل لك. في البداية ، يمكن تنزيل AppBundler من java.net ، ولكن بفضل إهمال Oracle لبقية نظام Java الأساسي ، أصبح عليك الآن تنزيل أحدث إصدار من
https://github.com/TheInfiniteKind/appbundler .
هناك يمكنك العثور على المصادر والوثائق ، ولكن ليس جرة ، لأنه من المفترض أنك تستخدم Maven. إذا كنت لا تستخدم Maven ، فيمكنك أخذ الجرة من هنا:
https://jar-download.com/artifacts/com.panayotis/appbundlerاتبع الإرشادات الواردة في الوثائق على صفحة جيثب لتكوين الحزمة. أنا شخصياً أستخدم NetBeans ، ولحل المشكلة ، قمت بإدراج الأسطر التالية في build.xml:
<target name = "- post-jar">
<taskdef name = "bundleapp"
classpath = "lib / appbundler-1.1.0.jar"
classname = "com.oracle.appbundler.AppBundlerTask" />
<bundleapp
jvmrequired = "1.7"
outputdirectory = "/ home / zar / Desktop"
اسم = "المناطيد"
اسم العرض = "المناطيد"
اسم قابل للتنفيذ = "المناطيد"
معرف = "com.zarkonnen.airships"
الاختصار = "1"
الإصدار = "1"
mainclassname = "com.zarkonnen.airships.Main"
حقوق النشر = "2019 David Stark"
applicationCategory = "public.app-category.games">
<classpath dir = "dist" />
<runtime dir = "/ home / zar / Desktop / jdk-11.0.4.jdk / Contents / Home" />
<arch name = "x86_64" />
<option value = "- Dapple.laf.useScreenMenuBar = true" />
<option value = "- Dcom.apple.macos.use-file-dialog-package = true" />
<option value = "- Dcom.apple.macos.useScreenMenuBar = true" />
<option value = "- Dcom.apple.mrj.application.apple.menu.about.name = Airships" />
<option value = "- Xdock: name = Airships" />
<option value = "- Dcom.apple.smallTabs = true" />
<option value = "- Dfile.encoding = UTF-8" />
<option value = "- Xmx1024M" name = "Xmx" />
</ Bundleapp>
</ الهدف>
هذه هي المهمة التي يتم تنفيذها بعد إنشاء ملف jar. يستخدم appbundler-1.1.0.jar لإنشاء حزمة تطبيق مع JVM مضمن.
يمكن تنزيل JDK المستخدم بواسطتي من
https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html . لقد اخترت الإصدار 11 لأنه يحتوي على LTS (دعم طويل الأجل) ، لكن يستخدم شروط ترخيص Oracle القديمة ، بينما يحتوي الإصدار 13 على مجموعة جديدة غريبة من قيود الترخيص.
يوجد أيضًا JVMs OpenJDK خالية من الناحية القانونية ، لكنني لم أتمكن من حملهم على العمل مع أداة تجميع التطبيقات.
ملاحظة: JVM هي "Java Virtual Machine". JRE هي "بيئة وقت تشغيل Java" التي تتضمن JVM plus عناصر إضافية ، مثل محدث Java. JDK هي "Java Development Kit" التي تتكون من JRE بالإضافة إلى الأشياء اللازمة لكتابة برامج Java ، مثل برنامج التحويل البرمجي. قبل Java 8 ، كان JRE متاحًا للمستخدمين بشكل منفصل ، ولكن منذ ذلك الحين كان JDK فقط متاحًا ، وبالتالي فإننا نربط بيئة تطوير Java بلعبة كمبيوتر.
يجب أن تكون قادرًا على التوقيع العميق وتوثيق الحزمة الناتجة. تحتوي وثائق AppBundler على مجموعة كاملة من الخيارات الإضافية ، مثل إضافة رمز وجمعيات أنواع الملفات وإنشاء JVM للتجريد من أجل التطبيق.
مزيد من القراءة
إضافة
- طرح مستخدم Reddit AMemoryOfEternity سؤالًا على منتديات مطور Steam ، واتضح أنه بينما لا تكون إعلامات تطبيقات Steam مطلوبة على الإطلاق. يجب أن تكون 64 بت ، لكن من غير الواضح ما إذا كان من الضروري توقيعها. رابط ، يتطلب الوصول إلى Steamworks
- لقد خففت Apple قواعد التوثيق مؤقتًا ، لذا فهي تسمح لك في الوقت الحالي بتوثيق التطبيقات التي لا تحتوي على وقت تشغيل صلب ، أو تحتوي على مكونات فرعية ، أو ليس لديها معرف مطور ، أو ليس لها طوابع زمنية ، إلخ. ستظل مثل هذه الأشياء معروضة في تقرير التوثيق كتحذيرات ، لذا من الأفضل محاولة التخلص منها حتى يتم الاعتناء بها.
- وفقًا لـ Valve ، لكي تعمل واجهة برمجة تطبيقات Steam ، ستحتاج إلى منح الاستحقاق com.apple.security.cs.allow-dyld-environment-variables: "يقوم Steam بحقن واجهة برمجة تطبيقات dylib من خلال DYLD_INSERT_LIBRARIES ، والتي يتم حظرها افتراضيًا بواسطة وقت التشغيل الصلب ، ويجب التحقق منه ، لذلك فقط أضف الإذن "com.apple.security.cs.allow-dyld-environment-variables" لتكون قادرًا على تعيين متغيرات بيئة DYLD. "