مع إصدار نظام التشغيل MacOS 10.14.5 ، أضافت Apple عملية التوثيق الإلزامي للتطبيقات قبل توزيعها. أود أن أخبرك ما هو وما الصعوبات التي نشأت مع هذا التحديث عند التطوير على Electron.js.

مقدمة
بعد عامين من طفرة Electron.js ، كل holivars الساخنة حول مدى سوء هو ولماذا هناك حاجة هادئة. دعونا لا نشعلها في التعليقات. شكرا لك
يستخدم مشروعنا أداة إنشاء الإلكترون لبناء التطبيق ، ولكن بالنسبة إلى أداة الإلكترون ، سيكون هذا الإجراء هو نفسه تقريبًا.
المشروع بحد ذاته هو قاذفة للألعاب السحابية ، يتم من خلالها إطلاق عميل أصلي للوصول إلى كمبيوتر بعيد.
لا يبدو توقيع تطبيق مع باني الإلكترونات أمرًا معقدًا ، ولكن من أجل الاكتمال ، سأتحدث باختصار عن هذا الإجراء. إذا لم يكن لديك أي مشاكل في التوقيع على التطبيق ، يمكنك تخطي هذا الفصل.
توقيع التطبيق
لتوقيع التطبيق ، نحتاج إلى تصدير شهادات من الحساب الشخصي لمطور Apple. سنحتاج:
- تطبيق معرف المطور
- معرف المطور المثبت
- * تطبيق مطور برامج الجهة الخارجية ومثبت مطور برامج الجهات الخارجية (إذا كنت تخطط لنشر التطبيق في AppStore)
يتم إصدار شهادة Developer ID Installer لتطبيق معين ، لذلك يلزم توفر هذه الحزمة. لباني الإلكترون ، يتم تحديده بواسطة المعلمة appId في package.json

يجب جمع الشهادات في ملف واحد. للقيام بذلك ، قم بإضافتهم إلى سلسلة المفاتيح (نقرات على الشهادة).
ثم نذهب إلى سلسلة المفاتيح ، وحدد الشهادات اللازمة وانقر فوق "تصدير العناصر" في قائمة السياق. بعد التصدير ، نحصل على ملف واحد بالملحق .p12.

بعد ملف الشهادة المستلمة ، أضف الإدخالات التالية إلى متغيرات البيئة
- CSC_LINK (المسار إلى ملف الشهادة. p12)
- CSC_KEY_PASSWORD (كلمة مرور الوصول إلى الشهادة)
إذا لم تقم بإضافة هذه المتغيرات ، فسوف يبحث الجامع تلقائيًا عن المفاتيح المناسبة في مستودع المفاتيح. تتيح لك إضافة هذه الإدخالات تحديد الشهادات التي تريد استخدامها للتوقيع.
بعد هذه العمليات ، يمكنك بدء عملية الإنشاء ويجب أن يسير كل شيء بسلاسة.
هذا يعمل بسلاسة حتى تم إصدار نظام التشغيل MacOS 10.14.5 ....
ما الذي تغير مع نظام التشغيل MacOS 10.14.5
استطراد صغير. أثناء إجراء آخر عمل على الرقعة الجديدة في الليل ، قررت ترك مجموعة إصدار الإنتاج في الصباح. مع ملاحظة أن التحديث جاء على macOS أطلقه وذهب للنوم.
في صباح اليوم التالي ، فوجئت برؤية التجمع يسقط من خطأ غير معروف في وقت التوقيع على التطبيق - "معرف المطور غير الموثق".
لا تؤجل حتى يوم غد ما يمكن فعله اليوم. بنيامين فرانكلين
جوهر المشكلة
بدءًا من نظام التشغيل MacOS 10.14.5 ، طرحت شركة Apple إجراء التوثيق الإلزامي. كانت مقالة Apple الأولى حول هذا الموضوع في عام 2018 ، لكن مع هذا التحديث أصبح هذا الإجراء إلزاميًا. كيف تبدو؟
تقوم بجمع التطبيق -> إرساله إلى خادم Apple -> تصادق عليه Apple -> تُرجع حالة الشهادة الناجحة -> يتم تنفيذ الأمر الخاص بتعيين ختم الشهادة.
للمطورين على Xcode ، تحتاج فقط إلى وضع علامة على التوثيق

أيضا ، يمكن إجراء عملية توثيق التطبيق الذي تم جمعه عن طريق أمر في المحطة.
$ xcrun altool --notarize-app --primary-bundle-id "com.example.ote.zip" --username "AC_USERNAME" --password "@keychain:AC_PASSWORD" --file OvernightTextEditor_11.6.8.zip
- معرف الحزمة الأساسي - حزمة التطبيق
- اسم المستخدم - developer.apple.com تسجيل دخول المستخدم
- كلمة المرور - "كلمة المرور الخاصة بالتطبيق". يمكن إنشاؤه في حسابك الشخصي appleid.apple.com تحت حساب المطور.
إذا لم تقم بإجراء التوثيق ، فعندما يحاول المستخدم تثبيت التطبيق ، ستتعطل نافذة بها خطأ. برنامج حماية البوابة هو المسؤول عن التحقق من أمان التطبيق. كان هو الذي كسر تجميع التطبيق على باني الإلكترون.

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

تصحيح للتوثيق
اقترح مستخدم Github Kallin حلاً على الفور ، مع إضافة معلمتين جديدتين إلى الإعدادات. الأول هو "gatekeeperAssess" - تعطيل التحقق من التجميع بعد التوقيع ، والثاني هو "sign" - الذي يعطل توقيع ملف التثبيت (dmg) مع شهادة. يتم تضمين هذا الالتزام في إصدار باني الإلكترون 20.43.0.
بالنسبة لعملية التوثيق نفسها ، لدى electron-userland وحدة لتوثيق الإلكترون تؤدي هذه المهمة ، تحتاج فقط إلى كتابة برنامج نصي صغير وتشغيله باستخدام ربط afterSign.
توقيع الطلب وعملية التوثيق

في البداية ، تحتاج إلى التحقق من أنك قمت بتثبيت إصدار أداة إنشاء الإلكترون> = 20.43.0 وتثبيت حزمة التوثيق الإلكتروني.
إضافة 2 إدخالات إلى متغيرات البيئة:

قم الآن بإنشاء برنامج نصي للتوثيق سيتم تنفيذه بعد توقيع التطبيق.
const notarize = require('electron-notarize').notarize; module.exports = async (context) => { const { electronPlatformName } = context; if (electronPlatformName === 'darwin') { try { console.log('Try notarize app'); await notarize({ appBundleId: 'APP_BUNDLE_ID', appPath: './dist/mac/APP_NAME.app', appleId: process.env.appleId, appleIdPassword: process.env.appleASP, }); console.log('Success notarize'); } catch (err) { console.log(err); } } };
نحن حفظه في مكان مناسب لك.
أيضًا ، من أجل التوثيق الصحيح ، نحتاج إلى تحديد حقوق الوصول
إلى موارد النظام لتطبيقنا. للقيام بذلك ، قم بإنشاء ملف بناء / entitlements.mac.inherit.plist
<?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>com.apple.security.cs.allow-jit</key> <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.allow-dyld-environment-variables</key> <true/> <key>com.apple.security.cs.disable-library-validation</key> <true/> <key>com.apple.security.cs.disable-executable-page-protection</key> <true/> <key>com.apple.security.cs.debugger</key> <true/> <key>com.apple.security.automation.apple-events</key> <true/> </dict> </plist>
محتويات الملف في حالتي. قد يكون هناك تكوين مختلف بالنسبة لك. وصف جميع الحقول .
إلزامي لـ Electron.js هو - com.apple.security.cs.allow-unsigned-قابل للتنفيذ الذاكرة.
الآن تحديث الإعدادات في package.json
في قسم نظام التشغيل MacOS:

- gatekeeperAssess (تعطيل التحقق من صحة التطبيق على جانب علامة الإلكترون - osx)
- hardenedRuntime (يسمح لك بإنشاء قائمة أذونات الأمان والوصول إلى موارد النظام)
- الاستحقاقات (المسار إلى ملف أذونات الوصول لتطبيقنا)
في القسم العام من إعدادات باني الإلكترون:

- afterSign (المسار إلى نص التوثيق ، والذي سيتم إطلاقه بعد توقيع التطبيق)
نبدأ عملية التجميع. قد يبدو الأمر معلقًا بعض الشيء ، لكن نقل الملف إلى خادم Apple وانتظار الرد يستغرق بعض الوقت (من 3 إلى 10 دقائق)
يمكن عرض حالة الإشعارات في الجهاز عن طريق تشغيل الأمر:
$ xcrun altool --notarization-history 0 -u $appleId -p $appleASP
سيتم تقديم الجواب في جدول. قد يكون لحالة الحالة القيمة "العملية" ، "المعتمدة" ، "غير صالحة"

إذا كانت الحالة "غير صالحة" ، يمكنك أن ترى من خلال رقم الطلب ما الخطأ الذي حدث بالضبط.
$ xcrun altool --notarization-info "RequestUUID" -u $appleId
هذه هي العملية الكاملة للتوقيع والتوثيق. أتمنى أن تجد هذا المقال مفيدًا. شكرا لك
إضافة صغيرة
عند نقل التطبيق للاختبار ، تم اكتشاف خلل مثير للاهتمام. التطبيق الذي تم استلامه عبر Telegram رفض ببساطة البدء. عند عرض السجلات ، تم اكتشاف أن التطبيق تم عزله بواسطة Telegram. لأي سبب وكيف حدث هذا ، لم أجد الإجابة. عند إرسال ملف عبر Yandex.Disk (أو أي طريقة أخرى للتنزيل من خلال مستعرض) ، لا تحدث هذه المشكلة.

روابط مفيدة