ส่งไปที่ปัญหาเกี่ยวกับ App Store: สถาปัตยกรรมที่ไม่รองรับ x86


253

ดังนั้นฉันจึงพยายามใช้ Shopify API เมื่อฉันเก็บถาวรแอพและตรวจสอบแล้วมันไม่มีปัญหา แต่เมื่อฉันส่งไปที่ app store มันทำให้ฉันมีปัญหาต่อไปนี้

  1. ข้อผิดพลาด ITMS-90087: "สถาปัตยกรรมที่ไม่รองรับปฏิบัติการของคุณมีสถาปัตยกรรมที่ไม่สนับสนุน '[x86_64, i386]'
  2. ข้อผิดพลาด ITMS-90209: "การจัดตำแหน่งเซกเมนต์ไม่ถูกต้อง App Binary ที่ SJAPP.app/Frameworks/Buy.framework/Buy ไม่มีการจัดตำแหน่งเซกเมนต์ที่เหมาะสมลองสร้างแอพใหม่ด้วยเวอร์ชัน Xcode ล่าสุด" (ฉันใช้เวอร์ชั่นล่าสุดอยู่แล้ว)
  3. ข้อผิดพลาด ITMS-90125: "ไบนารีไม่ถูกต้องข้อมูลการเข้ารหัสในคำสั่งโหลด LC_ENCRYPTION_INFO หายไปหรือไม่ถูกต้องหรือไบนารีถูกเข้ารหัสอยู่แล้วไบนารีนี้ดูเหมือนจะไม่ได้ถูกสร้างขึ้นด้วย Apple Linker"
  4. คำเตือน ITMS-90080: "The Payload ที่ปฏิบัติการได้ /..../ Buy.framework ไม่ใช่ตำแหน่งที่สามารถดำเนินการได้อิสระโปรดตรวจสอบให้แน่ใจว่าการตั้งค่าบิวด์ของคุณได้รับการกำหนดค่าเพื่อสร้างไฟล์ PIE"

4
ข้อความแรกฟังดูราวกับว่ามันเป็นแบบจำลองการสร้าง
Phillip Mills

เมื่อฉันสร้างที่เก็บถาวรสำหรับการส่งฉันเลือกอุปกรณ์ iOS ในตัวเลือกอุปกรณ์จากนั้นสร้างที่เก็บถาวรถ้านั่นคือสิ่งที่คุณถาม
Saurabh Jain

2
ฉันเห็นด้วยกับ @PhillipMills มีสมาธิกับข้อผิดพลาดครั้งแรกของคุณ ทำไมคุณมีไบนารี x86_64 ในแอป iOS ของคุณ ไม่ว่าคุณจะทำอะไรแปลก ๆ ด้วยการตั้งค่าการสร้างของคุณ ... หรือคุณอัปโหลดบิลด์เครื่องมือจำลอง
Stephen Darlington

@ pAkY88 ฉันไม่สามารถ ฉันเพิ่งโพสต์ในฟอรัม Shopify API และกำลังรอการตอบกลับ จะโพสต์บางอย่างแน่นอนถ้าฉันเจอหนึ่ง
Saurabh Jain

ฉันมีพฤติกรรมนี้เมื่อฉันอัพโหลดโดยใช้ Application Loader 3.5
SudoPlz

คำตอบ:


395

ปัญหาคือว่ากรอบการซื้อประกอบด้วยการสร้างสำหรับทั้งตัวจำลอง (x86_64) และอุปกรณ์จริง (ARM)

แน่นอนว่าคุณไม่ได้รับอนุญาตให้ส่งไบนารี่ไบนารีไปยัง App Store สำหรับสถาปัตยกรรมที่ไม่สนับสนุนดังนั้นการแก้ปัญหาคือ "ลบ" สถาปัตยกรรมที่ไม่จำเป็นออกจากไบนารีสุดท้ายก่อนส่งไป

Daniel Kennett คิดค้นโซลูชันที่ดีและให้สคริปต์นี้เพื่อเพิ่มในขั้นตอนการสร้าง:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
    FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
    FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
    echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

    EXTRACTED_ARCHS=()

    for ARCH in $ARCHS
    do
        echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
        lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
        EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
    done

    echo "Merging extracted architectures: ${ARCHS}"
    lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
    rm "${EXTRACTED_ARCHS[@]}"

    echo "Replacing original executable with thinned version"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

done

ฉันใช้มันและมันก็ทำงานได้อย่างสมบูรณ์

แก้ไข: ตรวจสอบให้แน่ใจว่าคุณดูสคริปต์ที่แก้ไขซึ่งโพสต์โดย Varrry เนื่องจากสคริปต์นี้มีปัญหาเล็กน้อย


6
@ pAkY88 ฉันใช้สคริปต์นี้ในโครงการ Xcode เพื่อแก้ไขปัญหาของ App Store ที่กล่าวถึงข้างต้น แต่ตอนนี้เมื่อฉันไปที่ Build ฉันมีข้อผิดพลาดร้ายแรงมาก -> ข้อผิดพลาดร้ายแรง: lipo: อินพุตไฟล์ (/ ... Frameworks / Bolts.framework / Bolts) ต้องเป็นไฟล์อ้วนเมื่อระบุตัวเลือก -extract แนวคิดใดที่จะแก้ไขปัญหานี้
SamoanProgrammer

52
ฉันคิดว่ามันค่อนข้างโง่: คุณต้องรวม arm + x86 เพื่อให้แอปของคุณทำงานได้ทั้งอุปกรณ์จำลองและอุปกรณ์และต้องตัด x86 ออกเพื่อส่งไปยัง app store ทำไม Apple ไม่ทำแถบที่ปลายของพวกเขาตราบเท่าที่ตรวจพบ x86? พวกเขาสามารถช่วยด้วยเหตุผลทางเทคนิคมากมายในการปกป้องสิ่งนี้ แต่ไม่มีเหตุผลทางธุรกิจเนื่องจากมันไม่เป็นมิตรกับผู้ใช้เลย
superarts.org

5
@Skoua เลือกเป้าหมายที่เกี่ยวข้องจากนั้น "Build Phases" และวางไว้หลังการกระทำ "Embed Frameworks"
Piotr Tobolski

6
สคริปต์ข้างต้นมีประโยชน์ แต่ไม่ได้กล่าวถึงขั้นตอนในการเรียกใช้สคริปต์ใน Xcode เมื่อต้องการเรียกใช้สคริปต์นี้ไปที่ TARGETS -> เลือก Build Phases จากนั้นส่วนหัวส่วนบนใน Xcode แตะที่ Editor -> เพิ่มเฟสของ build -> เพิ่มเฟสสคริปต์ Build build และคุณจะได้คอลัมน์ในส่วน Build Phase ของ TARGET ที่นี่คุณสามารถคัดลอกวางสคริปต์ด้านบนและอัปโหลดไปยัง Appstore ได้สำเร็จ
shashi Gupta

5
ไม่ทำงานใน Xcode 11.2 - ใครพบวิธีแก้ปัญหา?
JMIT

180

คำตอบที่ได้รับจากงาน pAkY88 แต่ฉันประสบปัญหาเดียวกับ Mario A Guzman ในhttps://stackoverflow.com/a/35240555/5272316 : เมื่อเราตัดสถาปัตยกรรมที่ไม่ได้ใช้ออกไปเราจะไม่สามารถเรียกใช้สคริปต์ได้อีกเนื่องจากพยายามลบออก ไม่ใช่ชิ้นส่วนที่มีอยู่เนื่องจาก xcode ไม่ได้ฝังไบนารีอีกครั้งทุกครั้ง แนวคิดคือ - เพียงลบ i386 และ x86_64 สไลซ์เมื่อสร้างเพื่อเก็บถาวรดังนั้นฉันจึงปรับเปลี่ยนสคริปต์:

echo "Target architectures: $ARCHS"

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")

FRAMEWORK_TMP_PATH="$FRAMEWORK_EXECUTABLE_PATH-tmp"

# remove simulator's archs if location is not simulator's directory
case "${TARGET_BUILD_DIR}" in
*"iphonesimulator")
    echo "No need to remove archs"
    ;;
*)
    if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "i386") ; then
    lipo -output "$FRAMEWORK_TMP_PATH" -remove "i386" "$FRAMEWORK_EXECUTABLE_PATH"
    echo "i386 architecture removed"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
    fi
    if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "x86_64") ; then
    lipo -output "$FRAMEWORK_TMP_PATH" -remove "x86_64" "$FRAMEWORK_EXECUTABLE_PATH"
    echo "x86_64 architecture removed"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
    fi
    ;;
esac

echo "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")

done

สคริปต์นี้จะลบ i386 และ x86_64 สไลซ์ออกจากไบนารีไขมัน (หากมีอยู่) หากไม่ได้ใช้สำหรับเครื่องจำลอง (นั่นหมายถึงโฟลเดอร์ปลายทางไม่เหมือนกับ "Debug-iphonesimulator")

ขออภัยฉันไม่คุ้นเคยกับเชลล์สคริปต์ดังนั้นอาจมีใครบางคนสามารถเขียนมันได้อย่างสง่างาม แต่มันใช้งานได้)


1
ขอบคุณสำหรับความคิด. ฉันเพิ่งเพิ่มการตรวจสอบรหัสจากคำตอบที่ยอมรับได้ในขณะที่ลูปcase "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esacและมันทำงานเหมือนมีเสน่ห์
Michael Radionov

ฉันกำลังเพิ่มสคริปต์นี้TARGET -> Build Phases -> [CP] Embedded Pods Frameworksแต่มันใช้งานไม่ได้และฉันยังคงอัปโหลดไปยังข้อผิดพลาด iTunesConnect วิธีรันสคริปต์นี้
PiterPan

2
PiterPan เพิ่มเป็นเฟส RunScript แยกต่างหาก
Varrry

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

ทำทุกอย่างที่นี่แนะนำจัดการเพื่อล้างข้อผิดพลาดคาร์เธจ; แต่จำเป็นต้องอัปโหลดที่ App Store โดยไม่ผ่านการตรวจสอบเพื่อรับข้อมูลที่เป็นประโยชน์เกี่ยวกับสาเหตุที่ล้มเหลว จัดการเพื่อแก้ไขปัญหาดังกล่าวและดำเนินการต่อไป ...
3069232

90

หากคุณใช้คาร์เธจคุณอาจประสบปัญหานี้เนื่องจากโครงการคือ:

  • ไม่มีcarthage copy-frameworksเฟสการสร้าง
  • หรือเฟสบิลด์ไม่รวมเฟรมเวิร์กทั้งหมด (รายการที่ไม่สมบูรณ์)

การดำเนินการนี้กรองกรอบไปยังรายการของสถาปัตยกรรมที่ถูกต้อง(รหัส)

การตั้งค่าขั้นตอนการสร้างกรอบการทำสำเนา

จากขั้นตอนการสร้างคาร์เธจสำหรับ iOS :

บนแท็บการตั้งค่าเป้าหมายของแอปพลิเคชัน“ สร้างเฟส” ให้คลิกไอคอน“ +” และเลือก“ เฟสเรียกใช้สคริปต์ใหม่” สร้าง Run Script ที่คุณระบุเชลล์ของคุณ (เช่น: bin / sh) เพิ่มเนื้อหาต่อไปนี้ลงในพื้นที่สคริปต์ด้านล่างเชลล์:

/usr/local/bin/carthage copy-frameworks

และเพิ่มเส้นทางไปยังเฟรมเวิร์กที่คุณต้องการใช้ภายใต้“ ไฟล์อินพุต” เช่น:

$(SRCROOT)/Carthage/Build/iOS/Box.framework $(SRCROOT)/Carthage/Build/iOS/Result.framework $(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework

สคริปต์นี้ทำงานกับข้อผิดพลาดในการส่ง App Store ที่เรียกใช้โดยไบนารีสากลและตรวจสอบให้แน่ใจว่ามีการคัดลอกไฟล์และ dSYMs ที่เกี่ยวข้องกับบิตโค้ดที่จำเป็นเมื่อทำการเก็บถาวร


ในฐานะที่เป็นบันทึกเพิ่มเติมฉันเพิ่งพบปัญหานี้เมื่อเปลี่ยนจากการใช้เฟรมเวิร์กของบุคคลที่สามที่รวบรวมไว้ล่วงหน้าเป็นเวอร์ชันใหม่ของเฟรมเวิร์กเดียวกันที่ติดตั้งโดยใช้คาร์เธจ แม้แต่ครั้งเดียวที่คาร์เธจตั้งค่าไว้ครบถ้วนฉันก็ยังได้รับข้อผิดพลาดนี้ต่อไป สำหรับฉันการแก้ไขคือการลบเฟรมเวิร์กทั้งหมดออกจากโครงการและเพิ่มกลับมาอีกครั้ง หากคุณใช้คาร์เธจและคำตอบนี้ไม่สามารถแก้ไขได้ให้ลองทำดู
Ash

1
แน่นอนโพสต์ที่ดี โปรดทราบว่าบ่อยครั้งทางออกที่ดีที่สุดของคุณคือเพียงแค่ลบเฟรมทั้งหมดออกและเริ่มเพิ่มเฟรมเวิร์กทั้งหมดของคุณจาก Carthage ไชโย
Fattie

ฉันใช้ Carthage และ Marshal และการเพิ่ม$(SRCROOT)/Carthage/Build/iOS/Marshal.frameworkทำงานได้ดี
Ricardo Mutti

ใน iOS ที่ทันสมัย ​​99% ของเวลานี้เป็นปัญหา - คุณเพียงแค่ลืมกรอบการทำสำเนา (100% ของโครงการตอนนี้ใช้ Carthage)
Fattie

41

ฉันแก้ไขข้อผิดพลาด ITMS-90080 โดยการลบเฟรมเวิร์ก (SVProgressHUD ที่ยอดเยี่ยม) ออกจากส่วนของไบนารีที่ฝังตัว (เป้าหมาย Xcode -> แท็บทั่วไป)

ป้อนคำอธิบายรูปภาพที่นี่


5
คำตอบนี้ควรมี upvotes อีกมากมาย ฉันสงสัยว่าเป็นสาเหตุหลักของคนจำนวนมากที่ใช้คาร์เธจ
mm2001

15
หากคุณกำลังพยายามฝังเฟรมเวิร์กแบบไดนามิกให้เอาผลลัพธ์ในข้อความแสดงข้อผิดพลาดนี้ให้ฉัน: "เหตุผล: ไม่พบรูปภาพ"
electronix384128

1
สิ่งนี้ใช้ได้สำหรับฉัน คุณต้องลบเฟรมเวิร์กออกจาก Embedded Binaries และเพียงเพิ่มเข้าไปใน Linked Frameworks และ Libraries นอกจากนี้คุณต้องทำสิ่งอื่นเช่นเรียกใช้สคริปต์ที่คุณพบในคำตอบอื่น ๆ
smileBot

33

หากคุณใช้Carthageให้แน่ใจว่าคุณEmbed Frameworks Build Stepอยู่ก่อนCarthage copy-frameworks


ในบางกรณีที่ผิดปกติ (ตัวอย่าง: กรอบ Lottie-iOS):

  • คุณจะมีมันใน "ลิงก์ห้องสมุด" ตามปกติ

  • แต่คุณต้องยังชัดเจนเพิ่มใน "กรอบฝัง" (แม้ว่าที่ดูเหมือนไม่มีจุดหมายเพราะมันทำงานอย่างสมบูรณ์แบบเมื่อคุณมีได้เฉพาะใน "ฝังกรอบ")

  • และวางไว้ในกรอบงานการคัดลอก

  • และให้แน่ใจว่า copy-frameworks อยู่หลัง "Embed Frameworks"


วิธีนี้เป็นปัญหาของฉัน ขอบคุณ.
DookieMan

15

ลบ[x86_64, i386]จากเฟรมเวิร์กโดยใช้ขั้นตอนด้านล่าง [x86_64, i386]ใช้สำหรับจำลอง

  1. เปิด Terminal

  2. เปิดเส้นทางการลากโครงการของคุณตามกรอบไปยัง Terminal

    ตัวอย่าง: cd /Users/MAC/Desktop/MyProject/Alamofire.framework

  3. ตั้งชื่อ Framework ของคุณในคำสั่งด้านล่างและเรียกใช้

lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire

  1. ตอนนี้เปิดโครงการของคุณอีกครั้งล้างสร้าง & เรียกใช้และสร้างที่เก็บถาวร ...

@mahipal Singh .. หลังจากลบโดยใช้คำสั่ง lipo แอพไม่ทำงานในโปรแกรมจำลอง มีข้อผิดพลาดเช่น x84_64 ขาดหายไปสำหรับ iphone simulator แต่ทำงานได้ดีในอุปกรณ์จริง
Hitarth

เป็นเพราะเครื่องจำลองสนับสนุนการดีบักเฟรมเวิร์ก
MAhipal Singh

14

ฉันจะเพิ่ม 2 เซ็นต์ของฉันที่นี่ (ในทางที่น่ากลัวน้อยกว่า :-) ฉันพบไลบรารี่จำนวนมากจากผู้จัดจำหน่ายที่ (ด้วยเหตุผลบางอย่าง) ไม่ทำงานตามปกติโดยเพิ่มลงในFrameworksไดเรกทอรีตามเอกสารของ Apple วิธีเดียวที่เราสามารถทำให้มันทำงานได้คือการดึง.framekworkสิทธิ์ลงในไดเรกทอรีโครงการและเชื่อมโยงEmbedded FrameworksและLink Binary with Librariesด้วยตนเองในการตั้งค่าการสร้าง สิ่งนี้ดูเหมือนว่าจะทำงานได้โดยไม่มีปัญหาใด ๆ เช่นเดียวกับห้องสมุดที่มีไขมันพวกเขามาพร้อมกับ Simulator Simulator ภายนอกi386 และx86_64พร้อมกับarmสถาปัตยกรรม

วิธีที่รวดเร็วในการตรวจสอบสถาปัตยกรรมในไลบรารีไขมันคือ

$ cd 'Project_dir/Project'
$ lipo -info 'YourLibrary.framework/YourLibExec`

ซึ่งควรคายเอาท์พุทแบบนี้

Architectures in the fat file: YourLibrary.framework/YourLibExec are: i386 x86_64 armv7 arm64

สิ่งนี้เป็นการยืนยันว่าคุณจะต้อง "ตัดแต่งไขมัน" (คือi386& x86_64) จากเฟรมเวิร์กของคุณก่อนที่จะอัปโหลด iTunesConnect Archival ซึ่งไม่อนุญาตให้มีสถาปัตยกรรมเหล่านี้ (เนื่องจากไม่รองรับ iOS)

ตอนนี้คำตอบทั้งหมด (หรืออย่างน้อยคำตอบบางส่วน) ที่นี่ให้สคริปต์เรียกใช้ที่ยอดเยี่ยมเหล่านี้ที่ฉันแน่ใจว่าทำงานได้ดีจริงๆ แต่เฉพาะในกรณีที่ Framework ของคุณอยู่ในFrameworksไดเรกทอรี ตอนนี้ถ้าคุณไม่ใช่เชลล์สคริปต์ junkie สคริปต์เหล่านั้นที่ไม่มีการแก้ไขจะไม่ทำงานกับสถานการณ์ที่ฉันอธิบายข้างต้น อย่างไรก็ตามมีวิธีที่ง่ายมากในการกำจัดi386& x86_64สถาปัตยกรรมออกจากกรอบ

  1. เปิดเทอร์มินัลในไดเรกทอรีโครงการของคุณ

  2. เปลี่ยนไดเรกทอรีโดยตรงเป็น.framekworkเช่น

    cd YourProjectDir/YourProject/YourLibrary.framework

  3. เรียกใช้ชุดคำสั่งที่แสดงด้านล่าง -

$ mv YourLibrary YourLibrary_all_archs
$ lipo -remove x86_64 YourLibrary_all_archs -o YourLibrary_some_archs
$ lipo -remove i386 YourLibrary_some_archs -o YourLibrary
$ rm YourLibrary_all_archs YourLibrary_some_archs

บางสิ่งที่ควรทราบที่นี่ - lipo -removeต้องทำหนึ่งครั้งเพื่อให้แต่ละสถาปัตยกรรมลบออก lipoไม่ได้ปรับเปลี่ยนแฟ้มใส่มันเพียง แต่ผลิตไฟล์เพื่อให้คุณมีการเรียกใช้lipo -removeครั้งเดียวสำหรับการและx86_64 i386คำสั่งด้านบนเป็นเพียงการทำเช่นนั้นโดยการเปลี่ยนชื่อไฟล์ปฏิบัติการเป็นครั้งแรกจากนั้นในที่สุดก็ลบอาร์คที่ต้องการแล้วทำความสะอาดไฟล์ที่เหลือ และนั่นคือตอนนี้คุณควรเห็นเครื่องหมายถูกสีเขียวใน Application Loader Archival ที่อัปโหลดไปยัง iTunesConnect

สิ่งที่ควรทราบ : ขั้นตอนข้างต้นควรทำในขณะที่การสร้างการผลิตเนื่องจาก.frameworkจะถูกถอดออกจากสถาปัตยกรรมจำลองการสร้างบนเครื่องจำลองจะหยุดทำงาน (ซึ่งคาดว่า) ในสภาพแวดล้อมการพัฒนาไม่จำเป็นต้องตัดสถาปัตยกรรมออกจาก.frameworkไฟล์เนื่องจากคุณต้องการทดสอบทั้ง Simulator และอุปกรณ์ทางกายภาพ หากห้องสมุดไขมันของคุณอยู่ในFrameworksโฟลเดอร์ในโครงการโปรดดูคำตอบที่ยอมรับ


ทางออกที่ง่ายสำหรับผู้ที่ไม่รู้สึกเหมือนสคริปต์

เพียงแค่เรียกใช้คำสั่งด้านบนขนาดโค้งลดลงเหลือครึ่ง หวังว่าจะสร้างความแตกต่าง
showmyroutes

แม้ว่าฉันจะปรับใช้สคริปต์เพื่อให้ทุกอย่างทำงานได้ตามปกติ แต่ต้องเป็นคำอธิบายที่เหมาะสมเกี่ยวกับวิธีการแก้ไขปัญหา
Sharkes Monken

รักธรรมชาติของคำตอบนี้ สะอาดและรัดกุม
Hudi Ilfeld

10

ฉันมีปัญหาเดียวกันแม้หลังจากเพิ่มสคริปต์และอัปเดตเฟรมเวิร์กสองสามครั้ง

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

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: ฉันมี xCode 9.1


สิ่งนี้ใช้ได้สำหรับฉัน ที่สคริปต์ของ @ pAkY88 นั้นเพียงพอครั้งสุดท้ายที่ฉันวางจำหน่ายเกือบหนึ่งปีที่ผ่านมา
RedHotPawn.com

ฉันมีปัญหาเดียวกันและสิ่งนี้ใช้ได้สำหรับฉัน ตรวจสอบให้แน่ใจว่าได้ตรวจสอบตำแหน่งของสคริปต์การทำงานทุกครั้งที่มีการลบเฟรมและเพิ่ม (จำเป็นเฉพาะเมื่อมีเพียงหนึ่งเฟรมเวิร์กที่ถูกลบ)
Baran Emre

คุณบันทึกวันของฉัน เพียงเพิ่มสคริปต์หลังกรอบงานแบบฝัง
Mayuri R Talaviya

8

อัปเดตสำหรับ Xcode 10.1 โซลูชันด้านล่างใช้ได้สำหรับฉัน:

เพียงคุณต้องลบเฟรมเวิร์กออกจาก Embedded Binaries และเพียงเพิ่มมันเข้าไปใน Linked Frameworks และ Libraries

ดูภาพหน้าจอด้านล่าง;

ป้อนคำอธิบายรูปภาพที่นี่


1
วิธีแก้ปัญหาการทำงานสำหรับฉัน (y)
Alok

มันจะลบสิ่งเดียวกันออกจากเฟรมเวิร์กและไลบรารีที่เชื่อมโยง
Ranu Dhurandhar

8

ขอบคุณทุกคำตอบข้างต้น นี่เป็นสคริปต์ทำงานร่วมกับสวิฟท์ 4.2 และ 5 แทนที่ Your_Framework_Name สตริงด้วยชื่อเดิมของ Framework ของคุณ

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
FRAMEWORK_NAME="Your_Framework_Name.framework"
# Check if Framework is present.
FRAMEWORK_LOCATION=$(find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d)
if [ -z $FRAMEWORK_LOCATION ]; then
echo "Couldn't find Your_Framework_Name.framework in $APP_PATH. Make sure 'Embed Frameworks' build phase is listed before the 'Strip Unused Architectures' build phase."
exit 1
fi
# This script strips unused architectures
find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done

ขอบคุณ! สิ่งนี้ใช้ได้สำหรับฉันในขณะที่คำตอบที่ยอมรับไม่ได้
besserwisser

5

ปัญหานี้ได้รับการแก้ไขสำหรับฉันโดยการแก้ไขเล็กน้อยรันสคริปต์จากคำตอบของ pAky88 และดำเนินการหลังจากฝังกรอบ และอย่าลืมทำเครื่องหมายที่ช่องสำหรับ "เรียกใช้สคริปต์เมื่อติดตั้ง" เท่านั้น

/usr/local/bin/carthage copy-frameworks

#!/usr/bin/env bash

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"

if [ ! -f "${FRAMEWORK_EXECUTABLE_PATH}" ]; then
continue
fi

if xcrun lipo -info "${FRAMEWORK_EXECUTABLE_PATH}" | grep --silent "Non-fat"; then
echo "Framework non-fat, skipping: $FRAMEWORK_EXECUTABLE_NAME"
continue
fi

echo "Thinning framework $FRAMEWORK_EXECUTABLE_NAME"

EXTRACTED_ARCHS=()

for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
xcrun lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done

echo "Merging extracted architectures: ${ARCHS}"
xcrun lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"

echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done

4

ฉันลบสถาปัตยกรรม i386 & x64_86 ออกจากการตั้งค่า Build - สถาปัตยกรรมที่ถูกต้อง - นำออกใช้และทุกอย่างทำงานได้ดี

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ปัญหาเดียวคือคุณไม่สามารถเรียกใช้RELEASE build สำหรับการทดสอบบนSIMULATORได้ แต่ง่ายเหมือนกับที่คุณนำส่วนโค้งออกคุณสามารถเพิ่มกลับเข้าไปได้หากต้องการ


1
ใช่ว่าการแก้ปัญหา
Ofir Malachi

3

ทางออกที่ง่ายสำหรับฉันคือ

1- ลบเฟรมเวิร์กออกจากเฟรมเวิร์กที่ฝังอยู่

2- เพิ่มเฟรมเวิร์กเป็นเฟรมเวิร์กที่ลิงก์

ทำ!


1

ข้อผิดพลาดนี้ (ITMS-90240) อาจเกิดจากไลบรารีแบบคงที่ (.a) นี่คือสคริปต์เพื่อตัดสถาปัตยกรรมส่วนเกิน ใน Xcode เพิ่มสิ่งนี้ในเป้าหมาย> BuildPhases> คลิก + และเลือกเรียกใช้สคริปต์ จากนั้นวางสิ่งนี้ลงในกล่องสคริปต์

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

สำหรับ macOS:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="armv7 armv7s arm64"
for t in $STRIPARCHS
do

if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
    find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi

done

exit 0

สำหรับ iOS:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="x86_64 i386"
for t in $STRIPARCHS
do

if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
    find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi

done

exit 0

1

ฉันมีปัญหาเดียวกัน แม้ว่ามันจะไม่ทำงานหลังจากเพิ่ม Run Script ที่กำหนด มันเป็นปัญหาที่เกี่ยวข้องกับ Xcode ฉันใช้ Xcode เวอร์ชัน 9.0 แต่เวอร์ชันล่าสุดคือ 9.2

ดังนั้นฉันจึงติดตั้ง Xcode ล่าสุด (9.2) และใช้งานได้


0

เฟรมเวิร์กของคุณมีทั้งรหัสARMและx86ซึ่งช่วยให้คุณสามารถใช้กับอุปกรณ์หรือในโปรแกรมจำลอง หากคุณต้องการส่งแอพของคุณไปยัง App Store ให้เรียกใช้สคริปต์ต่อไปนี้เพื่อตัดรหัสที่ไม่ทำงานจากไบนารี

1. เลือกเป้าหมายของคุณใน Project Navigator และคลิก Build Phases ที่ด้านบนของตัวแก้ไขโครงการ

2. จากเมนูตัวแก้ไขเลือกเพิ่มเฟสสร้างจากนั้นเพิ่มเรียกใช้สคริปต์บิลด์เฟส (หรือคลิกปุ่ม + ที่มุมบนซ้ายของตัวแก้ไขบิลด์เฟส)

3. ขยายสามเหลี่ยมการเปิดเผยถัดจากเฟสสร้างสคริปต์ใหม่ที่เพิ่งเพิ่มเข้าไป ในกล่องตัวแก้ไขสคริปต์วางต่อไปนี้: bash

$ {BUILT_PRODUCTS_DIR} / $ {FRAMEWORKS_FOLDER_PATH} / "YourframeworkName.framework" /strip-frameworks.sh


นี่สมมติว่าสคริปต์ strip-frameworks.sh เกิดขึ้นที่นั่น ...
Codezy

0

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

# Remove unused Framework architecture from "YourApp" framework.

FRAMEWORK_EXECUTABLE_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}/Frameworks/YourApp.framework/YourApp"

echo "$FRAMEWORK_EXECUTABLE_PATH"

cp "$FRAMEWORK_EXECUTABLE_PATH" "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"

echo "Executing following command to remove x86_64 arch from YourApp framework executable"
echo "lipo -remove x86_64 \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"${FRAMEWORK_EXECUTABLE_PATH}_X86_64\""

lipo -remove x86_64 "${FRAMEWORK_EXECUTABLE_PATH}_X86_64" -o "$FRAMEWORK_EXECUTABLE_PATH"

rm "${FRAMEWORK_EXECUTABLE_PATH}_X86_64"

เพิ่มสคริปต์นี้ในโครงการ "สร้างเฟส" ของเป้าหมายโครงการของคุณ อย่าลืมทำเครื่องหมายในช่อง: "เรียกใช้สคริปต์เมื่อติดตั้งเท่านั้น"

ตัวอย่างของตำแหน่งที่จะแทรกสคริปต์ตัวอย่าง

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