«وفجأة — انهار التطبيق»: نتعرف على dyld: Library not loaded: @rpath/libswiftCore.dylib
\n\nهل سبق لك أن شغّلت تطبيق Swift الخاص بك، ورأيت شاشة البداية الجميلة، ثم — بام! — شاشة سوداء ووحدة تحكم مليئة بالأحرف الحمراء؟ مألوف؟ إذا واجهت مرة واحدة على الأقل الرسالة dyld: Library not loaded: @rpath/libswiftCore.dylib، فأنت تعرف شعور الذعر الخفيف هذا. على Stack Overflow، حصد هذا السؤال آلاف المشاهدات، وليس من دون سبب: الخطأ خادع، لكنه قابل للحل تمامًا.
في هذه المقالة، لن نقدم مجرد تعليمات جافة. سنحلل لماذا «تُفقد» مكتبات Swift في وقت التشغيل، وكيفية تجنب ذلك، وماذا تفعل إذا وقعت بالفعل في المشكلة. هيا بنا!
\n\nما هو dyld ولماذا يغضب؟
\n\ndyld (dynamic link editor) هو مُحمّل المكتبات الديناميكية في macOS وiOS. عندما يتم تشغيل تطبيقك، يبحث dyld عن جميع المكتبات الضرورية وفقًا للمسارات المحددة في الملف الثنائي. أحد هذه المسارات هو @rpath (مسار البحث في وقت التشغيل). إذا لم يتم العثور على المكتبة (مثل libswiftCore.dylib) في هذا المسار، يتعطل dyld مع ظهور خطأ.
ببساطة: لقد أخبرت التطبيق «خذ الكتاب من الرف @rpath»، ولكن الرف كان فارغًا. هذا هو كل التحقيق.
\n\nلماذا يحدث هذا تحديدًا مع libswiftCore.dylib؟
\n\nlibswiftCore.dylib هو جوهر بيئة تشغيل Swift. بدونه، لا يعمل أي كود Swift. يظهر الخطأ غالبًا في ثلاث حالات:
- \n
- استخدام Xcode 14+ والمشروع مُهيأ لإصدار قديم من Swift. \n
- ربط أُطر عمل أو CocoaPods تتطلب إصدارًا معينًا من بيئة تشغيل Swift.
- نسيان تفعيل «Always Embed Swift Standard Libraries» في إعدادات البناء.
5 طرق لإصلاح dyld: Library not loaded: @rpath/libswiftCore.dylib
\n\nدعنا ننتقل إلى التطبيق العملي. فيما يلي طرق مثبتة، من الأبسط إلى الأكثر تعقيدًا. لكل منها، سأقدم مثالاً على الكود أو الإعدادات.
\n\n1. تفعيل «Always Embed Swift Standard Libraries»
\n\nالسبب الأكثر شيوعًا. إذا كان تطبيقك لا يضمّن مكتبات Swift في الحزمة، فلن يجدها dyld على الجهاز.
\n\nكيفية الإصلاح:
\n- \n
- افتح المشروع في Xcode. \n
- اختر Target ← Build Settings. \n
- ابحث عن
Always Embed Swift Standard Libraries. \n - اضبط القيمة على
Yes.
إذا كنت تستخدم CocoaPods، تحقق من عدم وجود سطر في Podfile يعطل هذا السلوك:
# سيء (قد يسبب الخطأ)\npost_install do |installer|\n installer.pods_project.targets.each do |target|\n target.build_configurations.each do |config|\n config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO'\n end\n end\nend\n\n# جيد\npost_install do |installer|\n installer.pods_project.targets.each do |target|\n target.build_configurations.each do |config|\n config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'YES'\n end\n end\nend\n\n\n2. التحقق من توافق إصدارات Swift
\n\nإذا قمت بربط إطار عمل تم بناؤه باستخدام Swift 5.7، بينما مشروعك يستخدم Swift 5.5 — مرحبًا بك في الخطأ. بيئة تشغيل Swift ليست متوافقة مع الإصدارات السابقة «بنسبة 100%».
\n\nالحل: تأكد من أن جميع التبعيات تستخدم نفس إصدار Swift. افتح الطرفية ونفّذ:
\n\n# معرفة إصدار Swift لإطار عمل معين .framework\nstrings MyFramework.framework/MyFramework | grep "Swift"\n# أو تحقق عبر xcrun\nxcrun swift --version\n\n\nإذا تم بناء الإطار بإصدار مختلف — أعد بنائه أو قم بتحديثه.
\n\n3. مسح Derived Data وإعادة بناء المشروع
\n\nأحيانًا يخزن Xcode مسارات قديمة للمكتبات. غالبًا ما يحل البناء الكامل المشكلة.
\n\n# حذف Derived Data يدويًا\nrm -rf ~/Library/Developer/Xcode/DerivedData