كسكودي 6 دائرة الرقابة الداخلية خلق إطار الكاكاو تاتش-قضايا أبنية

StackOverflow https://stackoverflow.com//questions/24039470

سؤال

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

ld: warning: ignoring file /Library/Frameworks/MyFramework.framework/MyFramework, file was built for x86_64 which is not the architecture being linked (arm64): /Library/Frameworks/MyFramework.framework/MyFramework
Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_MyFrameworkWebService", referenced from:
      objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ld: warning: ignoring file /Library/Frameworks/MyFramework.framework/MyFramework, file was built for x86_64 which is not the architecture being linked (armv7): /Library/Frameworks/MyFramework.framework/MyFramework
Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_MyFrameworkWebService", referenced from:
      objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

حسنا لقد حاولت تغيير إعدادات مشروع الإطار والهدف (أبنية وبناء بنية صالحة فقط وأبنية صالحة).لقد فعلت الشيء نفسه لمشروع التطبيق دائرة الرقابة الداخلية ولكن لا شيء يعمل.أعتقد أن هناك شيئا لم أفهمه.

على سبيل المثال عندما أقوم ببناء إطار عمل فقط 386 (دائرة الرقابة الداخلية محاكاة) تحقق مع سطر الأوامر "زكرون يبو-إنفو ميفراميورك" ، لدي مشكلة

دينار:تحذير:تجاهل ملف / مكتبة / أطر / ميفراميورك.الإطار / ميفراميورك ، تم بناء ملف ل س 86_64 التي ليست الهندسة المعمارية التي يتم ربطها (ط 386)...

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

هل كانت مفيدة؟

المحلول 11

آسف، لقد اترك هذا الموضوع مفتوحا لفترة طويلة ... لقد أجاب البعض منكم بشكل صحيح على سؤالي.عندما كتبت هذا السؤال، لم أمسك وجود شريحتين في إطار كامل (يسمى أيضا FAT) (جاهزا للاستخدام).واحد لأجهزة iOS وواحدة للمحاكاة.عندما اكتشفت أنني قدمت برنامج نصي باستخدام أمر ليبو للاندماج الشريفين وحصلت على إطار كامل تلقائيا.

نصائح أخرى

بناءً على جميع الردود، نشر على raywenderlich.com و ال جوهر انشأ من قبل كريس كونواي خطرت لي هذا.

من خلال تنفيذ الخطوات التالية، تمكنت من إنشاء إطار عمل Cocoa Touch (بما في ذلك ملفات Swift وObjective-C) الذي يحتوي على جميع البنيات لكل من جهاز المحاكاة والجهاز:

  1. قم بإنشاء هدف (إجمالي) جديد في مشروع إطار العمل الخاص بك
  2. ضمن "مراحل البناء"، حدد "إضافة برنامج نصي للتشغيل" وانسخ محتوياته هذا الملف
  3. يختار ال الهدف الكلي في ال مخطط القائمة المنسدلة للاختيار
  4. يبني ال هدف ل ال مخطط إجمالي

نأمل أن يساعد :)

تحديث: تم إصلاح خطأ في الجوهر حيث كانت المسارات في الخطوة رقم 3 غير صحيحة.شكرا ل توكوريكو!!

تحديث في Xcode 7 و8، انقر فوق ملف>جديد>الهدف...وهناك حدد مجموعة "أخرى" لتحديد الهدف الإجمالي

جرب الخطوات التالية لإنشاء مساحة عمل تحتوي على مشروع إطار عمل ومشروع تطبيق.

مساحة العمل:

  • إنشاء مساحة عمل.

مشروع الإطار:

  • إنشاء دائرة الرقابة الداخلية إطار لمسة الكاكاو المشروع داخل مساحة العمل.
  • أضف فئة Objective C بسيطة صفي (الرأس .h وملف التنفيذ .m)، وقم بإنشاء طريقة - (باطلة) تحياتي.
  • اذهب المشروع مراحل البناء > الرؤوس > تحرك MyClass.h من مشروع ل عام.
  • تغيير المخطط إلى إطار المشروع واختيار محاكاة دائرة الرقابة الداخلية, ، ثم بناء.(يختار جهاز iOS إذا كان التطبيق الذي يدمج هذا الإطار يعمل على الجهاز.سأستمر في استخدام جهاز المحاكاة في هذا المثال)
  • يجب ألا يكون لديك أي مشكلة في البناء، فبنية الإطار موجودة في ملفك البيانات المشتقة الدليل الذي يمكنك العثور عليه منظم.

مشروع التطبيق:

  • قم بإنشاء تطبيق Swift Single View داخل مساحة العمل.
  • اسحب فوق بناء إطار عمل محاكاة iOS (موجود في Debug-iphonesimulator أو الإصدار-iphonesimulator) لمشروعك.
  • قم بإنشاء رأس جسر لكشف أساليب فئة Objective C لـ Swift.
  • قم باستيراد MyClass.h في ملف رأس التجسير.
  • لاحظ أنه إذا لم يتم العثور على تعريف MyClass، فقم بإضافة إطار العمل الرؤوس مسار لبناء الإعدادات مسارات البحث في العناوين.
  • إنشاء مثيل ل صفي في viewDidLoad of ViewController.swift, ، ثم اتصل تحيات.
  • أضف إطار عمل إلى الهدف > الثنائيات المضمنة
  • قم بتغيير المخطط إلى مشروع التطبيق واختر محاكاة دائرة الرقابة الداخلية, ، ثم بناء.
  • يجب أن تكون قادرًا على رؤية رسائل الترحيب.

لاحظ أن المثال أعلاه يوضح كيفية إنشاء تطبيق يعمل فيه محاكاة.إذا كنت بحاجة إلى إنشاء مكتبة ثابتة عالمية تعمل على كليهما محاكاة و الأجهزة, ، فالخطوات العامة هي:

  • بناء مكتبة ل محاكاة
  • بناء مكتبة ل جهاز
  • الجمع بينهما باستخدام يبو

هناك مراجع جيدة على شبكة الإنترنت حول هذا الموضوع، هنا على سبيل المثال.

إنشاء ثنائي عالمي للإطار:انتقل إلى دليل البيانات المشتقة من إطار العمل بعد ذلك / بناء / المنتجات, ، من المفترض أن يساعدك الأمر التالي في إنشاء ملف ثنائي عالمي منتجات الدليل:

lipo -create -output "framework-test-01-universal" "Debug-iphonesimulator/framework-test-01.framework/framework-test-01" "Debug-iphoneos/framework-test-01.framework/framework-test-01" 

لاحظ أن اختبار الإطار-01 هو اسم مشروع الإطار الخاص بي.

فيما يلي خطوات لإنشاء إطار عمل (عالمي) للدهون:

  1. مجموعة ONLY_ACTIVE_ARCH=NO في ال Build Settings في مشروعك.

    • بناء مكتبة لمحاكاة
    • بناء مكتبة للجهاز
  2. فتح في وحدة التحكم Products مجلد للإطار الخاص بك (يمكنك فتحه عن طريق فتح مجلد الإطار و cd .. من هناك)

enter image description here enter image description here

  1. تشغيل هذا البرنامج النصي من عند Products مجلد.أنه يخلق إطار الدهون في هذا المجلد.(أو القيام بذلك يدويا كما هو موضح أدناه في 4. 5.)

    framework_name="${$(basename $(find ./Debug-iphoneos -type d -name '*.framework' -maxdepth 1))%.*}" && \
    cp -R Debug-iphoneos/$framework_name.framework ./$framework_name.framework && \
    lipo -create -output "$framework_name.framework/$framework_name" "Debug-iphonesimulator/$framework_name.framework/$framework_name" "Debug-iphoneos/$framework_name.framework/$framework_name"
    

أو:

  1. الجمع بين هذه الأطر 2 باستخدام ليبو بواسطة هذا البرنامج النصي (استبدال YourFrameworkName إلى اسم الإطار الخاص بك)

    lipo -create -output "YourFrameworkName" "Debug-iphonesimulator/YourFrameworkName.framework/YourFrameworkName" "Debug-iphoneos/YourFrameworkName.framework/YourFrameworkName"
    
  2. استبدال مع ثنائي جديد واحد من الأطر القائمة:

    cp -R Debug-iphoneos/YourFrameworkName.framework ./YourFrameworkName.framework
    mv YourFrameworkName ./YourFrameworkName.framework/YourFrameworkName
    

  1. الربح: ./YourFrameworkName.framework - هو ثنائي الدهون جاهز للاستخدام! يمكنك استيراده إلى المشروع الخاص بك!

للمشروع ، وهذا ليس في xcworkspace- إس:

يمكنك أيضا محاولة استخدام هذا الجوهر ولكن يبدو أنه لا يعمل للمشاريع في مساحات العمل.

الطريقة التي فعلتها، مماثلة ل VLADOF، ولكن نأمل أكثر بساطة قليلا. أنا جعلت الإطار الفرعي لمشروع التطبيق.

مشروع إطار

  • قم بإنشاء إطار لمس دائم iOS Cocoa جديد. نسميها MyLIB. سيؤدي ذلك إلى إنشاء myLib.h
  • أضف فئة كاكاو تاتش بسيطة OBJ-C، MyClass (.h & .m) وفي تنفيذ .m، قم بإنشاء طريقة تعرض سلسلة، - (NSSTRING *) تحية؛
  • في mylib.h، أضف هذا بالقرب من القاع، #import "myclass.h"
  • في قسم مراحل / رؤوس بناء الهدف، حرك myclass.h من قسم المشروع إلى القسم العام.
  • قم ببناء (CMD-B)
  • أغلق المشروع

مشروع التطبيق

  • إنشاء مشروع جديد تطبيق عرض واحد، إما SWIFT أو OBJ-C. نسميها myapp.
  • من finder، اسحب ملف مشروع MyLIB الخاص بك إلى قسم منظم اليد اليسرى من نافذة MyApp وتأكد من أن خط الإدراج أقل من MyApp. هذا يجعل myLIB فرعي من myapp. (لا يزال من الممكن استخدامه بنفس الطريقة في مشاريع أخرى)
  • انقر فوق myapp في المنظم ثم حدد الهدف myapp وحدد مراحل بناء.
  • في التداول المستهدف، انقر فوق علامة + إضافة MyLib.
  • في رابط مع المكتبات، انقر فوق علامة + علامة + إضافة MyLib.FrameWork.

للحصول على تطبيق OBJ-C

  • في viewcontroller.m، أضف #import
  • في viewdididload، أضف الأسطر التالية:
  • mylib * x= [[mylib alloc] init]؛
  • nslog (@ "٪٪ @"، X.Greetings)؛
  • قم بتشغيل المشروع ويجب أن ترى الرسالة في نافذة Debug. -

للحصول على تطبيق SWIFT

  • في viewcontroller.swift، إضافة استيراد MyLIB
  • في viewdididload، أضف الأسطر التالية:
  • var x: mylib= myLib ()
  • println ("(x.greetings ())") -

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

لقد غيرت سيناريو شخص ما قليلا لدعم جميع هياكل المحاكاة:

giveacodicetagpre.

فيديو قديم فعلت منذ الرابط أعلاه سابقا غير متوفر بعد الآن.

href="https://youtu.be/86cpaa3frrrrg" rel="nofollow noreferrer"> كيفية إنشاء إطار اتصال الكاكاو باستخدام XCode 6

عدد قليل من النقاط الإضافية حول النهج المشترك بواسطة VLADOF أكثر قابلية للتطبيق على الأطر القائمة السريعة

  1. البرنامج النصي في الارتباط المرتبط يحتاج إلى تعديل لنسخ جميع الملفات من كل من iPhiesimulator و iPhoneos لأن SWIFT لديه ملفات محمولة منفصلة للذراع و i386
  2. تأكد من أن لديك Archs="x86_64" only_active_arch= no in the build for iphiesimulator لتجنب قضايا رابط للمحاكاة
  3. تأكد من أن واجهتك / فئة تمتد nsobject خلاف ذلك، وإلا فسوف تعمل في مشكلات عند محاولة استخدام التعليمات البرمجية في SWIFT (ستشكو من عدم القدرة على إنشاء كائن باستخدام ().

أخيرا، حصلت عليه للعمل بالنسبة لي! وآسف على الإطار الأصفر الكبير، ليس لدي أي فكرة عن كيفية تهيئة ذلك بشكل أفضل.

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

  1. إنشاء هدف جديد (إجمالي) في مشروع الإطار الخاص بك
  2. حدد المجموع في مساحة العمل وإضافة "مرحلة البرنامج النصي تشغيل جديد"
  3. ضع التعليمات البرمجية التالية في ذلك:

    giveacodicetagpre
  4. حدد المجموع في اختيار المخطط المنسدلة

  5. بناء، لقد انتهيت!
  6. المشكلة كانت أن دليل محاكاة يشير إلى دليل غير موجود، وتغيير "الإطار" إلى "$ {project_name}" في 2 أماكن فعلت الخدعة :)

أراد إضافة شيء إلى إجابة النصي ليبو المقدمة من Skywinder

تم نشر هذا السؤال منذ لحظة (Xcode 6) لكنني واجهت نفس المشكلة مؤخرا مع Xcode 10.

لذلك المشكلة هي: الإطار المدمج لا يدعم مساحة كافية.

في حالة عدم معرفة المرء أن المعماريين المعماريين، تحتوي أجهزة iPhone المختلفة على بنية مختلفة، وهنا قائمة كاملة:

  • arm6: iPhone 1، 2، 3G
  • arm7: يستخدم في أقدم الأجهزة الداعمة للأجهزة iOS [32 بت]. اي فون 4، 4S
  • Arm7s: كما هو مستخدم في iPhone 5 و 5C [32 بت]. iPhone 5، 5C
  • arm64: لمعالج الذراع 64 بت في iPhone 5S [64 بت]. آيفون 5 أس وما فوق.
  • arm64e: تستخدم في شرائح A12. iPhone XS / XS MAX / XR
  • i386: للمحاكاة 32 بت
  • x86_64: يستخدم في محاكاة 64 بت

لذلك، إذا كنت تستخدم الإطار على محاكي، فإن الإطار يحتاج إلى دعم I386 أو x86_64؛ إذا كنت تقوم بتشغيل تطبيقك على iPhone 6، فإن الإطار يحتاج إلى دعم هندسة ARM64.

لذلك، في معظم الحالات، يحتاج إطار عمل لدعم جميع الهيغات المذكورة أعلاه.

الآن مرة أخرى إلى كيفية حل المشكلة. نحتاج إلى بناء إطار كلا الجهازين والمحاكاة.

كيفية بناء للأجهزة:

  1. في "عام"، حدد "هدف النشر".
  2. في "إعداد إعدادات"، بدوره "بناء البنية النشطة فقط" إلى "لا"
  3. في "إعداد إعدادات"، تأكد من قوائم "البنية الصالحة" يسرد كل البنية التي تحتاجها. عادة نحن فقط نستخدم الإعدادات الافتراضية خيارات (ARM64، ARM64E، ARMV7، ARMV7S).
  4. انتقل إلى "تحرير المخطط" -> "تشغيل" -> "تكوين"، تغيير "بناء" التكوين "إلى" الإصدار "
  5. حدد نظام نشط "جهاز iOS Generic iOS". ضرب CMD + B لبناء المشروع.
  6. انقر بزر الماوس الأيمن فوق [myframeworkproject] .FrameWork ضمن مجلد "منتجات" في مشروع Xcode الخاص بك، وضرب "إظهار في Finder". [MyFrameWorkProject] يدعم جميع الهيغات المحددة في الخطوة 2.
  7. اسحب [myframeworkproject] .framework إلى المشروع الذي يحتاج إلى استخدام هذا الإطار. بالإضافة إلى ذلك، اسحب [myframeworkproject] .FrameWork إلى "الثنائيات المضمنة" أيضا.
  8. كيفية بناء المحاكاة:

    1. الخطوة 1 إلى 4 نفس أعلاه.
    2. حدد أي محاكاة كمخطط نشط. ضرب CMD + B لبناء مشروع.
    3. الخطوة 6 إلى 7 نفس أعلاه.
    4. كيفية بناء لكل من الجهاز والمحاكاة:

      بعد أن يكون لديك إطار للأجهزة، ستحتاج إلى الجمع بين إطار المحاكاة والإطار للأجهزة مع أمر "Lipo". إعادة تسمية إطار المحاكاة إلى [myframeworkproject] _sim.framework ونسخ كلا الأطر إلى نفس المجلد. قم بتشغيل الأمر أدناه في المحطة (تأكد من أنك في المجلد):

      giveacodicetagpre.

      الآن [myframeworkproject] .framework هو المنتج النهائي الذي يدعم كل من المحاكاة والأجهزة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top