วิธีการส่งออก Cocoa Touch Framework ที่“ อ้วน” (สำหรับโปรแกรมจำลองและอุปกรณ์)


107

ด้วยXcode 6Cocoa Frameworksเราได้รับความสามารถในการสร้างแบบไดนามิกของตัวเอง

ใส่คำอธิบายภาพที่นี่

เพราะว่า:

  • โปรแกรมจำลองยังคงใช้32-bitไลบรารี

  • ตั้งแต่วันที่ 1 มิถุนายน 2015 การอัปเดตแอปที่ส่งไปยัง App Store จะต้องมีการรองรับ 64 บิตและสร้างด้วย iOS 8 SDK ( developer.apple.com )

เราต้องสร้างห้องสมุดไขมันเพื่อเรียกใช้โครงการบนอุปกรณ์และเครื่องจำลอง เช่นรองรับทั้ง 32 และ 64 บิตใน Frameworks

แต่ฉันไม่พบคู่มือใด ๆ วิธีการส่งออก universal fat Framework สำหรับการรวมกับโครงการอื่น ๆ ในอนาคต (และแชร์ไลบรารีนี้กับใครบางคน)

นี่คือขั้นตอนของฉันในการทำซ้ำ:

  1. ตั้งค่าONLY_ACTIVE_ARCH=NOในไฟล์Build Settings

    ใส่คำอธิบายภาพที่นี่

  2. เพิ่มการสนับสนุนarmv7 armv7s arm64 i386 x86_64ให้Architectures(แน่นอน)

ใส่คำอธิบายภาพที่นี่

  1. สร้าง Framework และเปิดใน Finder:

ใส่คำอธิบายภาพที่นี่ ใส่คำอธิบายภาพที่นี่

  1. เพิ่มกรอบงานนี้ในโครงการอื่น

ผลลัพธ์จริง:

แต่ในที่สุดฉันก็ยังมีปัญหากับการรันโปรเจ็กต์ด้วยเฟรมเวิร์กนี้บนอุปกรณ์และโปรแกรมจำลอง

  • ถ้าฉันใช้กรอบจากDebug-iphoneosโฟลเดอร์ - มันทำงานบนอุปกรณ์และได้รับข้อผิดพลาดในเครื่องจำลอง:ld: symbol(s) not found for architecture i386

      xcrun lipo -info CoreActionSheetPicker

    สถาปัตยกรรมในไฟล์ fat: CoreActionSheetPicker คือ armv7 armv7s arm64

  • ถ้าฉันใช้กรอบจากDebug-iphonesimulatorโฟลเดอร์ - มันใช้งานได้กับเครื่องจำลอง และฉันมีข้อผิดพลาดบนอุปกรณ์:ld: symbol(s) not found for architecture arm64

      xcrun lipo -info CoreActionSheetPicker

    สถาปัตยกรรมในไฟล์ fat: CoreActionSheetPicker คือ: i386 x86_64

ดังนั้นจะสร้างเฟรมเวิร์กแบบไดนามิกที่ทำงานบนอุปกรณ์และเครื่องจำลองได้อย่างไร?

คำตอบนี้เกี่ยวข้องกับXcode 6 iOS การสร้าง Cocoa Touch Framework - ปัญหาด้านสถาปัตยกรรมแต่ไม่ซ้ำกัน


อัปเดต:

ฉันพบ "แฮ็กสกปรก" สำหรับกรณีนี้ ดูของฉันคำตอบด้านล่าง หากมีใครทราบวิธีที่สะดวกกว่านี้โปรดแจ้งให้เราทราบ!


ปัญหาที่ซ้ำกันstackoverflow.com/questions/24039470/…
Andrius Steponavičius

@ AndriusSteponavičiusคำถามนี้ถูกถามเมื่อ 2 เดือนก่อนหน้านี้
skywinder

ใช่ แต่มีคำตอบที่ละเอียดกว่านี้ซึ่งฉันคิดว่าผู้ใช้ควรรู้
Andrius Steponavičius

ตั้งค่า ONLY_ACTIVE_ARCH = NO ใน Build Settings เป็นขั้นตอนที่สำคัญ
Jedidja

เฟรมเวิร์กของคุณต้องการทั้ง i386 x86_64 สไลซ์ในไบนารีไขมันหากคุณต้องการรันบนตัวจำลองแม้ว่าคอมพิวเตอร์ของคุณจะมีสถาปัตยกรรม 64 บิต !!! เรียนรู้ว่าวิธีที่ยาก
J.beenie

คำตอบ:


82

ความเป็นจริงของคำตอบนี้คือกรกฎาคม 2015 เป็นไปได้มากว่าสิ่งต่างๆจะเปลี่ยนไป

TLDR;

ปัจจุบัน Xcode ไม่มีเครื่องมือสำหรับการส่งออกเฟรมเวิร์กไขมันสากลโดยอัตโนมัติดังนั้นนักพัฒนาจึงต้องหันไปใช้lipoเครื่องมือด้วยตนเอง นอกจากนี้ตามเรดาร์นี้ก่อนที่จะส่งไปยังผู้พัฒนา AppStore ซึ่งเป็นผู้บริโภคของเฟรมเวิร์กจะต้องใช้lipoเพื่อดึงชิ้นส่วนจำลองออกจากเฟรมเวิร์ก

คำตอบอีกต่อไปนี้


ฉันทำการวิจัยที่คล้ายกันในหัวข้อนี้ (ลิงก์ที่ด้านล่างของคำตอบ)

ผมไม่ได้พบเอกสารที่เป็นทางการใด ๆ เกี่ยวกับการกระจายของเพื่อการวิจัยของฉันอยู่บนพื้นฐานของการสำรวจของแอปเปิ้ลฟอรั่มพัฒนาคาร์เธจและ Realm โครงการและการทดลองของตัวเองกับxcodebuild, lipo, codesignเครื่องมือ

นี่คือคำพูดยาว ๆ (พร้อมมาร์กอัปเล็กน้อยจากฉัน) จากเธรดฟอรัมนักพัฒนาของ Apple การส่งออกแอพที่มีกรอบในตัว :

วิธีที่เหมาะสมในการส่งออกกรอบงานจากโครงการกรอบคืออะไร?

ขณะนี้วิธีเดียวคือสิ่งที่คุณทำ:

  • สร้างเป้าหมายสำหรับทั้งอุปกรณ์จำลองและอุปกรณ์ iOS
  • ไปที่โฟลเดอร์ DerivedData ของ Xcode สำหรับโปรเจ็กต์นั้นและไลโปสองไบนารีเข้าด้วยกันเป็นเฟรมเวิร์กเดียว อย่างไรก็ตามเมื่อคุณสร้างกรอบเป้าหมายใน Xcode ตรวจสอบให้แน่ใจว่าได้ปรับการตั้งค่าเป้าหมาย "Build Active Architecture Only" เป็น "NO" สิ่งนี้จะช่วยให้ Xcode สร้างเป้าหมายสำหรับ binarty หลายประเภท (arm64, armv7 ฯลฯ ) นี่อาจเป็นเหตุผลว่าทำไมจึงทำงานจาก Xcode แต่ไม่ใช่ไบนารีแบบสแตนด์อโลน

  • นอกจากนี้คุณจะต้องตรวจสอบให้แน่ใจว่าชุดรูปแบบถูกตั้งค่าเป็นรุ่นรุ่นและสร้างเป้าหมายกรอบงานกับรุ่น หากคุณยังคงได้รับข้อผิดพลาดที่ไม่ได้โหลดไลบรารีให้ตรวจสอบส่วนของโค้ดในกรอบ

  • ใช้lipo -info MyFramworkBinaryและตรวจสอบผลลัพธ์

lipo -info MyFrameworkBinary

ผลลัพธ์คือ i386 x86_64 armv7 arm64

  • กรอบงานสากลสมัยใหม่จะมี 4 ชิ้น แต่อาจรวมได้มากกว่านี้: i386 x86_64 armv7 arm64 หากคุณไม่เห็นอย่างน้อย 4 ชิ้นนี้ก็อาจเป็นเพราะการตั้งค่า Build Active Architecture

สิ่งนี้อธิบายกระบวนการค่อนข้างเหมือนกับที่ @skywinder ทำในคำตอบของเขา

นี่คือวิธีการใช้คาร์เธจ LipoและRealm ใช้ Lipo


รายละเอียดที่สำคัญ

มีเรดาร์: Xcode 6.1.1 & 6.2: ไม่สามารถส่งเฟรมเวิร์ก iOS ที่มีชิ้นส่วนจำลองไปยัง App Store ได้และการสนทนาที่ยาวนานเกี่ยวกับRealm # 1163และCarthage # 188ซึ่งจบลงด้วยวิธีแก้ปัญหาพิเศษ:

ก่อนที่จะส่งไปยังไบนารีของกรอบงาน AppStore iOS จะต้องถูกถอดออกจากชิ้นส่วนจำลอง

Carthage มีรหัสพิเศษ: CopyFrameworksและเอกสารประกอบที่เกี่ยวข้อง:

สคริปต์นี้ใช้กับข้อบกพร่องในการส่ง App Store ที่เรียกใช้โดยไบนารีสากล

Realm มีสคริปต์พิเศษ: strip-frameworks.shและเอกสารประกอบที่เกี่ยวข้อง:

ขั้นตอนนี้จำเป็นสำหรับการแก้ไขข้อบกพร่องในการส่ง App Storeเมื่อเก็บถาวรไบนารีสากล

นอกจากนี้ยังมีบทความดี: ตัดเส้นสถาปัตยกรรมที่ไม่พึงประสงค์จากห้องสมุดแบบไดนามิกใน Xcode

ตัวฉันเองใช้ Realm strip-frameworks.shซึ่งทำงานให้ฉันได้อย่างสมบูรณ์แบบโดยไม่มีการปรับเปลี่ยนใด ๆ แม้ว่าทุกคนสามารถเขียนได้ตั้งแต่เริ่มต้น


ลิงก์ไปยังหัวข้อของฉันซึ่งฉันแนะนำให้อ่านเนื่องจากมีแง่มุมอื่นของคำถามนี้: การเซ็นรหัส - การสร้างกรอบงาน iOS / OSX: จำเป็นต้องออกแบบโค้ดก่อนแจกจ่ายให้กับนักพัฒนารายอื่นหรือไม่


1
ฉันใช้ lipo แต่เมื่อเฟรมเวิร์กกำลังสร้างในโปรแกรมจำลองมันแสดงตัวระบุที่ไม่ได้รับการแก้ไขพร้อมชื่อคลาส แต่ในอุปกรณ์มันใช้งานได้ หากใช้ไบนารีเวอร์ชันจำลองแล้วมันใช้งานได้ .. ความคิดใด
Susim Samanta

2
ฉันไม่พบหลักฐานใด ๆ ที่มีการเปลี่ยนแปลงโดย Xcode 8.2 ในเดือนธันวาคม 2559: /
Geoffrey Wiseman

1
@Geoffrey สิ่งนี้มีการเปลี่ยนแปลงใน Xcode 9.2 หรือมีอะไรที่แตกต่างออกไป? นี่เป็นครั้งแรกของฉันในการสร้างกรอบไบนารีสำหรับการแจกจ่ายและฉันก็กลัวแล้ว ...
ScottyB

ยังไม่ได้ทำสิ่งนี้สักหน่อยเศร้า - พูดไม่ได้ โชคดี.
Geoffrey Wiseman

57

นี่ไม่ใช่วิธีแก้ปัญหาที่ชัดเจน แต่มีทางเดียวที่ฉันพบ:

  1. ตั้งค่าONLY_ACTIVE_ARCH=NOในไฟล์Build Settings

    • สร้างไลบรารีสำหรับโปรแกรมจำลอง
    • สร้างไลบรารีสำหรับอุปกรณ์
  2. เปิดในProductsโฟลเดอร์คอนโซลสำหรับกรอบงานของคุณ (คุณสามารถเปิดได้โดยเปิดโฟลเดอร์กรอบงานและcd ..จากที่นั่น)

ใส่คำอธิบายภาพที่นี่ ใส่คำอธิบายภาพที่นี่

  1. เรียกใช้สคริปต์นี้จากProductsโฟลเดอร์ สร้างกรอบไขมันในโฟลเดอร์นี้ (หรือทำด้วยตนเองตามที่อธิบายไว้ด้านล่างในข้อ3. 4. )

หรือ:

  1. รวม 2 Frameworks เหล่านี้โดยใช้lipoโดยสคริปต์นี้ (แทนที่YourFrameworkNameเป็นชื่อ Framework ของคุณ)

    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- เป็นไบนารีไขมันพร้อมใช้งาน! คุณสามารถนำเข้าโครงการของคุณได้!

สำหรับโครงการที่ไม่ได้อยู่ในพื้นที่ทำงาน:

นอกจากนี้คุณยังสามารถลองใช้กระทู้นี้ตามที่อธิบายไว้ที่นี่ แต่ดูเหมือนว่าจะใช้ไม่ได้กับโครงการในพื้นที่ทำงาน


ฉันคิดว่า Apple ไม่ยอมรับไบนารีไขมันอีกต่อไป kodmunki.wordpress.com/2015/03/04/…
Monstieur

1
@skywinder คุณพบวิธีง่ายๆในการส่งออก Cocoa Touch Framework ไปยังไบนารีไขมันหรือไม่? ฉันใช้แนวทางเดียวกับข้างต้น แต่ไม่ชอบ Xcode ควรมีบางอย่างที่ทำให้กระบวนการเป็นไปโดยอัตโนมัติ
dev gr

1
@devgr ยังไม่ .. นั่นคือสาเหตุที่ฉันไม่ยอมรับคำตอบของตัวเอง ยังคงมองหาทางออกที่ดีกว่า
skywinder

1
ไม่สามารถทำงานในโปรแกรมจำลองได้ แต่ทำงานในอุปกรณ์ด้วยขั้นตอน 3 และ 4
jose920405

1
@ ใครสามารถอธิบายได้ว่าทำไมใช้Debug-โฟลเดอร์กับlipo -create? กรอบนี้สามารถใช้ในReleaseการกำหนดค่าได้หรือไม่และทำไม ขอบคุณ.
Yevhen Dubinin

10

คำตอบของ @Stainlav มีประโยชน์มาก แต่สิ่งที่ฉันทำแทนคือการรวบรวมเฟรมเวิร์กสองเวอร์ชัน (เวอร์ชันหนึ่งสำหรับอุปกรณ์และอีกเวอร์ชันหนึ่งสำหรับโปรแกรมจำลอง) จากนั้นเพิ่มสิ่งต่อไปนี้Run Script Phaseเพื่อคัดลอกเฟรมเวิร์กที่คอมไพล์ไว้ล่วงหน้าโดยอัตโนมัติสำหรับสถาปัตยกรรมที่กำลังทำงานอยู่

echo "Copying frameworks for architecture: $CURRENT_ARCH"
if [ "${CURRENT_ARCH}" = "x86_64" ] || [ "${CURRENT_ARCH}" = "i386" ]; then
  cp -af "${SRCROOT}/Frameworks/Simulator/." "${SRCROOT}/Frameworks/Active"
else
  cp -af "${SRCROOT}/Frameworks/Device/." "${SRCROOT}/Frameworks/Active"
fi

วิธีนี้ฉันไม่ได้ใช้lipoเพื่อสร้างเฟรมเวิร์กไขมันไม่ใช่ทั้ง Realm strip-frameworks.shเพื่อลบส่วนที่ไม่จำเป็นออกเมื่อส่งไปยัง App Store


คุณเชื่อมโยงกับข้อใด
Jaka Jančar

@ JakaJančarฉันเชื่อมโยงกับคนใน${SRCROOT}/Frameworks/Activeโฟลเดอร์ พวกเขาจะถูกแทนที่ด้วยกรอบงานที่คอมไพล์ไว้ล่วงหน้าที่เหมาะสมสำหรับสถาปัตยกรรมที่ใช้งานอยู่ในเวลาคอมไพล์
odm

2
รักเลย! วิธีนี้ง่ายกว่าวิธีการรวมแล้วฉีกออกจากกันlipoมาก
clozach

2

โดยพื้นฐานแล้วฉันพบทางออกที่ดีมาก คุณเพียงแค่ทำตามขั้นตอนง่ายๆเหล่านี้

  1. สร้างกรอบสัมผัสโกโก้
  2. ตั้งค่า bitcode เปิดใช้งานเป็น No
  3. เลือกเป้าหมายของคุณและเลือกแก้ไขโครงร่าง เลือกเรียกใช้และเลือกเผยแพร่จากแท็บข้อมูล
  4. ไม่จำเป็นต้องตั้งค่าอื่น ๆ
  5. ตอนนี้สร้างเฟรมเวิร์กสำหรับตัวจำลองใด ๆ เนื่องจากโปรแกรมจำลองทำงานบนสถาปัตยกรรม x86
  6. คลิกที่กลุ่มผลิตภัณฑ์ใน Project Navigator และค้นหาไฟล์. Framework
  7. คลิกขวาที่ไฟล์แล้วคลิกที่ Show in finder คัดลอกและวางลงในโฟลเดอร์ใด ๆ ฉันชอบชื่อ 'จำลอง' เป็นการส่วนตัว
  8. ตอนนี้สร้างเฟรมเวิร์กสำหรับอุปกรณ์ iOS ทั่วไปและทำตามขั้นตอนที่ 6 ถึง 9 เพียงแค่เปลี่ยนชื่อโฟลเดอร์เป็น 'อุปกรณ์' แทน 'ตัวจำลอง'
  9. คัดลอกไฟล์. เฟรมของอุปกรณ์และวางในไดเร็กทอรีอื่น ๆ ฉันชอบซูเปอร์ไดเร็กทอรีของทั้งสองทันที ดังนั้นโครงสร้างไดเร็กทอรีจึงกลายเป็น:
    • เดสก์ทอป
    • อุปกรณ์
      • MyFramework.framework
    • จำลอง
      • MyFramework.framework
    • MyFramework.framework ตอนนี้เปิดเทอร์มินัลและ cd ไปที่เดสก์ท็อป ตอนนี้เริ่มพิมพ์คำสั่งต่อไปนี้:

lipo - สร้าง 'อุปกรณ์ / MyFramework.framework / MyFramework' 'จำลอง / MyFramework.framework / MyFramework' - เอาท์พุท 'MyFramework.framework / MyFramework'

และนั่นแหล่ะ ที่นี่เรารวมตัวจำลองและเวอร์ชันอุปกรณ์ของไบนารี MyFramework ที่มีอยู่ภายใน MyFramework.framework เราได้รับกรอบงานสากลที่สร้างขึ้นสำหรับสถาปัตยกรรมทั้งหมดรวมถึงเครื่องจำลองและอุปกรณ์


ฉันต้องการสร้างไฟล์ FAT โดยเปิดใช้งาน bitcode ช่วยชี้แนะด้วยครับ.
user3898700

2

ฉันต้องการอัปเดตคำตอบที่ยอดเยี่ยมนี้โดย @odm ตั้งแต่ Xcode 10 CURRENT_ARCHตัวแปรจะไม่สะท้อนสถาปัตยกรรมบิลด์อีกต่อไป ดังนั้นฉันจึงเปลี่ยนสคริปต์เพื่อตรวจสอบแพลตฟอร์มแทน:

echo "Copying frameworks for platform: $PLATFORM_NAME"
rm -R "${SRCROOT}/Frameworks/Active"
if [ "${PLATFORM_NAME}" = "iphonesimulator" ]; then
    cp -af "${SRCROOT}/Frameworks/Simulator/." "${SRCROOT}/Frameworks/Active"
else
    cp -af "${SRCROOT}/Frameworks/Device/." "${SRCROOT}/Frameworks/Active"
fi

ฉันยังเพิ่มบรรทัดเพื่อล้างไดเรกทอรีเป้าหมายก่อนที่จะคัดลอกเนื่องจากฉันสังเกตเห็นว่าไฟล์เพิ่มเติมในไดเรกทอรีย่อยจะไม่ถูกเขียนทับเป็นอย่างอื่น


1

คำตอบของฉันครอบคลุมประเด็นด้านล่าง:

  • สร้างเฟรมเวิร์กที่ใช้ได้กับทั้งตัวจำลองและอุปกรณ์

  • วิธีการส่งออก Cocoa Touch Framework ที่“ อ้วน” (สำหรับโปรแกรมจำลองและอุปกรณ์ทั้งคู่)

  • สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม x86_64

  • ld: ไม่พบสัญลักษณ์สำหรับสถาปัตยกรรม x86_64

ขั้นตอนที่ 1: สร้างเฟรมเวิร์กของคุณก่อนด้วยเป้าหมาย Simulator

ขั้นตอนที่ 2: หลังจากประสบความสำเร็จในกระบวนการสร้างเครื่องจำลองตอนนี้สร้างสำหรับกรอบงานของคุณด้วยการเลือกเป้าหมายอุปกรณ์หรือการเลือกอุปกรณ์ iOS ทั่วไป

ขั้นตอนที่ 3: ตอนนี้เลือกเป้าหมายกรอบงานของคุณและสำหรับสิ่งนั้นภายใต้ "Build Phases" เลือก "Add Run Script" และคัดลอกโค้ดสคริปต์ด้านล่าง)

ขั้นตอนที่ 4: ในที่สุดก็สร้างอีกครั้งและเฟรมเวิร์กของคุณก็พร้อมสำหรับทั้งตัวจำลองและความเข้ากันได้ของอุปกรณ์ เย่!!!!

[หมายเหตุ: เราต้องเตรียมเฟรมเวิร์กที่เข้ากันได้ให้พร้อมก่อนขั้นตอนที่ 4 ขั้นสุดท้าย (ตัวจำลองและสถาปัตยกรรมอุปกรณ์เข้ากันได้หากไม่ได้โปรดทำตามขั้นตอนที่ 1 และ 2 ด้านบนให้ถูกต้อง)

ดูภาพอ้างอิง:

ใส่คำอธิบายภาพที่นี่

ใส่คำอธิบายภาพที่นี่

ใส่โค้ดด้านล่างลงในพื้นที่เชลล์:

#!/bin/sh


UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal


# make sure the output directory exists

mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"


# Step 1. Build Device and Simulator versions

xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build


# Step 2. Copy the framework structure (from iphoneos build) to the universal folder

cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"


# Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory

SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/."

if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then

cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"

fi


# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory

lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"


# Step 5. Convenience step to copy the framework to the project's directory

cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"


# Step 6. Convenience step to open the project's directory in Finder

open "${BUILD_DIR}/${CONFIGURATION}-universal"


คริปนี้เหมือนเรียกตัวเองเลยทำให้วนไปวนมาไม่สิ้นสุด !! ต้องรีสตาร์ทคอมพิวเตอร์หลังจากเปิดใช้งานแล้ว! กำลังวางไข่กระบวนการ xcodebuild ใหม่อย่างต่อเนื่อง ... และเปิดหน้าต่างตัวค้นหาใหม่ - จะลงคะแนน
J.beenie

ตรวจสอบคำตอบของ @ l0gg3r ในSO Q / A นี้สำหรับสคริปต์ที่คล้ายกันโดยไม่มีปัญหาการเรียกซ้ำ
J.beenie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.