Gửi đến các vấn đề về App Store: Kiến trúc không được hỗ trợ x86


253

Vì vậy, tôi đang cố gắng sử dụng API Shopify. Khi tôi lưu trữ ứng dụng và xác nhận nó thì không có vấn đề gì nhưng khi tôi gửi nó đến cửa hàng ứng dụng thì nó sẽ cho tôi những vấn đề sau.

  1. LRI ITMS-90087: "Kiến trúc không được hỗ trợ. Tệp thực thi của bạn chứa kiến ​​trúc không được hỗ trợ '[x86_64, i386]'."
  2. ERROR ITMS-90209: "Sắp xếp phân khúc không hợp lệ. Nhị phân ứng dụng tại SJAPP.app/Frameworks/Buy.framework/Buy không có căn chỉnh phân khúc phù hợp. Hãy thử xây dựng lại ứng dụng với phiên bản Xcode mới nhất." (Tôi đã sử dụng phiên bản mới nhất.)
  3. ERROR ITMS-90125: "Nhị phân không hợp lệ. Thông tin mã hóa trong lệnh tải LC_ENCRYPTION_INFO bị thiếu hoặc không hợp lệ hoặc nhị phân đã được mã hóa. Nhị phân này dường như không được xây dựng với Trình liên kết của Apple."
  4. CẢNH BÁO ITMS-90080: "Tải trọng thực thi /..../ Mua.framework không phải là một vị trí thực thi độc lập. Hãy đảm bảo rằng các cài đặt xây dựng của bạn được cấu hình để tạo các tệp thực thi PIE."

4
Thông điệp đầu tiên phát ra như thể đó là bản dựng giả lập.
Phillip Mills

Khi tôi tạo một kho lưu trữ để gửi, tôi chọn các thiết bị iOS trong các tùy chọn thiết bị, sau đó tạo một kho lưu trữ, nếu đó là những gì bạn đang hỏi
Saurabh Jain

2
Tôi đồng ý với @PhillipMills. Tập trung vào lỗi đầu tiên của bạn. Tại sao bạn có tệp nhị phân x86_64 trong ứng dụng iOS của mình? Hoặc bạn đã làm điều gì đó kỳ lạ với cài đặt bản dựng của mình ... hoặc bạn đã tải lên bản dựng Trình mô phỏng.
Stephen Darlington

@ pAkY88. Tôi không đủ thẩm quyền để. Gần đây tôi đã đăng trên diễn đàn API Shopify và đang chờ phản hồi. Chắc chắn sẽ đăng một cái gì đó nếu tôi đi qua một
Saurabh Jain

Tôi đã có hành vi này khi tôi tải lên bằng Trình tải ứng dụng 3.5
SudoPlz

Câu trả lời:


395

Vấn đề là khung Mua chứa bản dựng cho cả trình giả lập (x86_64) và thiết bị thực tế (ARM).

Tất nhiên, bạn không được phép gửi tới App Store một tệp nhị phân cho kiến ​​trúc không được hỗ trợ, vì vậy giải pháp là "thủ công" xóa các kiến ​​trúc không cần thiết khỏi tệp nhị phân cuối cùng, trước khi gửi nó.

Daniel Kennett đã đưa ra một giải pháp hay và cung cấp kịch bản này để thêm vào giai đoạn xây dựng:

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

Tôi đã sử dụng nó và nó hoạt động hoàn hảo.

EDIT: đảm bảo bạn xem tập lệnh sửa đổi được đăng bởi Varrry, vì tập lệnh này có một số vấn đề nhỏ.


6
@ pAkY88 Tôi đã sử dụng tập lệnh này trong dự án Xcode của mình để khắc phục các sự cố trong App Store đã đề cập ở trên, nhưng bây giờ khi tôi vào Build, tôi có rất nhiều lỗi nghiêm trọng -> lỗi nghiêm trọng: lipo: tệp đầu vào (/ ... Framework / Bolts.framework / Bolts) phải là một tệp chất béo khi tùy chọn -extract được chỉ định. Bất kỳ ý tưởng làm thế nào để sửa lỗi này?
SamoanProgrammer 5/2/2016

52
Tôi nghĩ điều đó khá ngu ngốc: bạn phải kết hợp arm + x86 để cho phép ứng dụng của bạn chạy trên cả trình giả lập và thiết bị và phải loại bỏ x86 để gửi đến cửa hàng ứng dụng. Tại sao Apple không thực hiện dải trên đầu của họ miễn là x86 được phát hiện? Họ có thể giúp rất nhiều lý do kỹ thuật để bảo vệ điều này, nhưng không có lý do kinh doanh nào vì nó không thân thiện với người dùng.
superarts.org 22/03/2016

5
@Skoua Chọn mục tiêu có liên quan, sau đó "Xây dựng giai đoạn" và đặt mục tiêu đó sau hành động "Nhúng khung"
Piotr Tobolski

6
Kịch bản trên là hữu ích nhưng không có đề cập nào về các bước để chạy tập lệnh trong Xcode. Để chạy tập lệnh này, hãy truy cập MỤC TIÊU -> chọn Xây dựng giai đoạn rồi tiêu đề trên trong Xcode, nhấn vào Trình chỉnh sửa -> Thêm giai đoạn xây dựng -> Thêm tập lệnh Chạy giai đoạn Xây dựng và bạn sẽ nhận được một cột trong phần Xây dựng giai đoạn của TARGET. Tại đây bạn có thể sao chép tập lệnh ở trên và tải nó lên Appstore thành công.
shashi Gupta

5
Không hoạt động trong Xcode 11.2 - có ai tìm thấy giải pháp không?
JMIT

180

Câu trả lời được đưa ra bởi pAkY88 hoạt động, nhưng tôi đã gặp phải vấn đề tương tự như Mario A Guzman trong https://stackoverflow.com/a353240555/5272316 : một khi chúng tôi cắt bỏ các kiến ​​trúc không sử dụng, chúng tôi không thể chạy tập lệnh nữa. không phải các lát cắt hiện có, bởi vì xcode không nhúng lại nhị phân mỗi lần. Ý tưởng là - chỉ xóa các lát i386 và x86_64 khi xây dựng để lưu trữ, vì vậy tôi đã sửa đổi tập lệnh:

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

Kịch bản lệnh này chỉ đơn giản là loại bỏ các lát i386 và x86_64 khỏi nhị phân chất béo (nếu chúng tồn tại) nếu chạy không phải để giả lập (điều đó có nghĩa là thư mục đích không giống như "Debug-iphonesimulator").

Xin lỗi, tôi không quen thuộc với các kịch bản shell, vì vậy có thể ai đó có thể viết nó theo cách thanh lịch hơn. Nhưng nó đã có tác dụng)


1
Cảm ơn bạn cho ý tưởng. Tôi chỉ đơn giản là đã thêm một kiểm tra vào mã từ câu trả lời được chấp nhận bên trong vòng lặp while case "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esacvà nó hoạt động như một lá bùa.
Michael Radionov

Tôi đang thêm tập lệnh này vào TARGET -> Build Phases -> [CP] Embedded Pods Frameworksnhưng nó không hoạt động và tôi vẫn tải lên các lỗi iTunesConnect. Làm thế nào để chạy tập lệnh này?
PiterPan

2
PiterPan, thêm nó dưới dạng giai đoạn RunScript riêng
Varrry

1
Tôi chỉ kiểm tra tùy chọn "Chỉ chạy tập lệnh khi cài đặt" và nó bị bỏ qua trừ khi lưu trữ.
Rivera

Đã làm mọi thứ được đề xuất ở đây, quản lý để xóa lỗi Carthage; nhưng cần phải tải lên App Store mà không cần xác thực để có được một số thông tin hữu ích về lý do tại sao nó thất bại. Quản lý để khắc phục điều đó và tiến về phía trước ...
user3069232

90

Nếu bạn đang sử dụng Carthage thì bạn có thể gặp phải sự cố này vì dự án là:

  • Thiếu carthage copy-frameworksgiai đoạn xây dựng.
  • Hoặc giai đoạn xây dựng không bao gồm tất cả các khung (danh sách không đầy đủ).

Hành động này lọc các khung thành một danh sách các kiến ​​trúc hợp lệ (mã) .

Thiết lập giai đoạn xây dựng khung sao chép

Từ tòa nhà Carthage cho các bước iOS :

Trên tab Cài đặt của các mục tiêu trong ứng dụng của bạn, hãy nhấp vào biểu tượng Cài đặt các giai đoạn của ứng dụng của bạn và chọn Tạo Run Script trong đó bạn chỉ định shell của mình (ví dụ: bin / sh), thêm các nội dung sau vào vùng script bên dưới shell:

/usr/local/bin/carthage copy-frameworks

và thêm các đường dẫn vào các khung công tác bạn muốn sử dụng trong Tập tin nhập liệu đầu vào, ví dụ:

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

Tập lệnh này hoạt động xung quanh lỗi gửi của App Store được kích hoạt bởi các nhị phân phổ quát và đảm bảo rằng các tệp và dSYM cần thiết được sao chép khi lưu trữ.


Một lưu ý nữa, gần đây tôi gặp phải vấn đề này khi chuyển từ sử dụng phiên bản cũ, được biên dịch sẵn của khung bên thứ ba sang phiên bản mới của cùng một khung được cài đặt bằng Carthage. Ngay cả khi Carthage đã được thiết lập đầy đủ, tôi vẫn tiếp tục gặp lỗi này. Đối với tôi, cách khắc phục là loại bỏ hoàn toàn khung công tác khỏi dự án và thêm lại. Nếu bạn đang sử dụng Carthage và câu trả lời này không khắc phục được cho bạn, hãy thử làm điều đó.
Tro

1
Thật vậy, một bài viết tuyệt vời. Lưu ý, thường thì đặt cược tốt nhất của bạn chỉ đơn giản là xóa tất cả các khung và bắt đầu lại thêm tất cả các khung của bạn khỏi Carthage. Chúc mừng
Fattie

Tôi đang sử dụng Carthage và Marshal và thêm vào $(SRCROOT)/Carthage/Build/iOS/Marshal.frameworkđã làm việc
Ricardo Mutti

trong iOS hiện đại, 99% đây là vấn đề - bạn chỉ quên các khung sao chép. (100% các dự án hiện sử dụng Carthage.)
Fattie

41

Tôi đã giải quyết lỗi ITMS-90080 bằng cách xóa một khung (SVProTHERHUD xuất sắc) khỏi phần Binaries nhúng (mục tiêu Xcode -> tab Chung).

nhập mô tả hình ảnh ở đây


5
Câu trả lời này nên có nhiều upvote hơn. Tôi nghi ngờ đó là nguyên nhân sâu xa đối với nhiều người sử dụng Carthage.
mm2001

15
Nếu bạn đang cố gắng nhúng khung động thì loại bỏ nó sẽ dẫn đến thông báo lỗi này cho tôi: "Lý do: không tìm thấy hình ảnh"
electronix384128

1
Điều này làm việc cho tôi. Bạn phải xóa khung công tác khỏi các nhị phân nhúng và chỉ cần thêm nó vào các thư viện và khung liên kết. Ngoài ra, bạn phải làm những việc khác như chạy tập lệnh mà bạn tìm thấy trong các câu trả lời khác.
cườiBot

33

Nếu bạn đang sử dụng, Carthagehãy chắc chắn rằng bạn Embed Frameworks Build Stepđang ở trướcCarthage copy-frameworks


Trong một số trường hợp bất thường (ví dụ: khung Lottie-iOS):

  • bạn sẽ có nó đơn giản trong "Thư viện liên kết" như bình thường.

  • Tuy nhiên bạn phải còn thêm một cách rõ ràng trong phần "Nhúng Khung" (mặc dù điều đó dường như vô nghĩa, vì nó hoạt động hoàn hảo khi bạn có nó chỉ trong "Nhúng Khung"),

  • đặt nó trong các khung sao chép

  • đảm bảo các khung sao chép nằm sau "Khung nhúng"


Đây là vấn đề của tôi. Cảm ơn bạn.
DookieMan

15

Xóa [x86_64, i386] khỏi khung bằng bước bên dưới. [x86_64, i386] được sử dụng cho trình giả lập.

  1. Mở Terminal

  2. mở đường dẫn kéo dự án của khung tương ứng đến Terminal

    thí dụ : cd /Users/MAC/Desktop/MyProject/Alamofire.framework

  3. Đặt tên khung của bạn trong lệnh bên dưới và chạy

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

  1. Bây giờ hãy mở lại dự án của bạn, Dọn dẹp, Xây dựng & Chạy và Tạo Lưu trữ ...

@mahipal Singh .. sau khi xóa bằng lệnh lipo. ứng dụng không hoạt động trong trình giả lập. bị lỗi như x84_64 bị thiếu cho trình giả lập iphone. nhưng hoạt động tốt trong thiết bị thực.
Hitarth

Đó là bởi vì khung hỗ trợ giả lập chỉ gỡ lỗi
MAhipal Singh

14

Tôi sẽ thêm 2 xu của mình vào đây (theo cách ít đáng sợ hơn :-). Tôi đã gặp khá nhiều thư viện béo từ các Nhà cung cấp mà (vì một số lý do) không hoạt động theo cách thông thường bằng cách thêm chúng vào Frameworksthư mục như tài liệu của Apple. Cách duy nhất chúng tôi có thể làm cho chúng hoạt động là kéo .framekworkquyền vào thư mục dự án và liên kết Embedded FrameworksLink Binary with Librariesthủ công trong Cài đặt bản dựng. Điều này dường như đã hoạt động mà không có bất kỳ vấn đề nào, tuy nhiên, như với bất kỳ thư viện béo nào họ đi kèm với Kiến trúc mô phỏng bên ngoài i386 x86_64cùng với các armkiến trúc.

Một cách nhanh chóng để kiểm tra kiến ​​trúc trên thư viện chất béo là

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

Mà nên nhổ một đầu ra như thế này

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

Điều này xác nhận rằng bạn sẽ cần "cắt giảm chất béo" (cụ thể là i386& x86_64) khỏi khung của bạn trước khi tải lên iTunesConnect Archival, điều này không cho phép các kiến ​​trúc này (vì chúng không được hỗ trợ cho iOS).

Bây giờ, tất cả các câu trả lời (hoặc ít nhất một số câu trả lời) ở đây cung cấp các Run Script tuyệt vời này mà tôi chắc chắn hoạt động rất tốt, nhưng chỉ khi Framework của bạn nằm trong Frameworksthư mục. Bây giờ trừ khi bạn là người nghiện kịch bản shell, các tập lệnh không có sửa đổi, sẽ không hoạt động cho kịch bản tôi giải thích ở trên. Tuy nhiên, có một cách rất đơn giản để loại bỏ i386& các x86_64kiến trúc khỏi khung.

  1. Mở terminal trong thư mục dự án của bạn.

  2. Thay đổi thư mục trực tiếp vào .framekwork, như

    cd YourProjectDir/YourProject/YourLibrary.framework

  3. Chạy chuỗi lệnh như hình dưới đây-

$ 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

Một vài điều cần lưu ý ở đây - lipo -removephải được thực hiện một lần cho mỗi kiến ​​trúc để loại bỏ. lipokhông sửa đổi tệp đầu vào, nó chỉ tạo ra một tệp để bạn phải chạy lipo -removemột lần cho x86_64i386. Các lệnh trên chỉ đơn giản là thực hiện điều đó bằng cách trước tiên đổi tên tệp thực thi và sau đó loại bỏ các vòm mong muốn, sau đó dọn sạch các tệp còn lại. Và đó là, bây giờ bạn sẽ thấy dấu kiểm màu xanh lục trong Tải lên ứng dụng lưu trữ ứng dụng lên iTunesConnect.

Những điều cần lưu ý : Các bước trên chỉ nên được thực hiện trong khi xây dựng sản xuất, vì .frameworksẽ bị loại bỏ các kiến ​​trúc mô phỏng, các bản dựng trên trình giả lập sẽ ngừng hoạt động (dự kiến). Trong môi trường phát triển, không cần phải loại bỏ các kiến ​​trúc khỏi .frameworktệp vì bạn muốn có thể kiểm tra trên cả Trình mô phỏng và thiết bị vật lý. Nếu thư viện chất béo của bạn nằm trong Frameworksthư mục trong dự án thì hãy xem câu trả lời được chấp nhận.


Giải pháp đơn giản cho những người không cảm thấy thích kịch bản.

Chỉ cần chạy lệnh trên, kích thước vòm giảm xuống còn một nửa. hy vọng làm cho một số khác biệt.
showmyroutes

Mặc dù tôi đã triển khai kịch bản để làm cho mọi thứ hoạt động như bình thường nhưng đây phải là một mô tả thích hợp về cách giải quyết vấn đề.
Cá mập Monken

yêu bản chất của câu trả lời này sạch sẽ và súc tích
Hudi Ilfeld

10

Tôi đã có vấn đề tương tự ngay cả sau khi thêm tập lệnh và cập nhật khung một vài lần.

Đảm bảo trong xCode tập lệnh được thêm vào cuối, sau khi nhúng. Tôi nghĩ rằng tôi đã vô tình di chuyển tập lệnh trước khung nhúng.

nhập mô tả hình ảnh ở đây

Lưu ý: Tôi có xCode 9.1


Điều này làm việc cho tôi. Trường hợp chỉ cần kịch bản của @ pAkY88 là đủ lần trước tôi đã phát hành gần một năm trước.
RedHotPawn.com 29/03/18

Tôi đã có cùng một vấn đề và điều này làm việc cho tôi. Đảm bảo kiểm tra vị trí của tập lệnh chạy mỗi khi một khung được gỡ bỏ và thêm vào (chỉ cần thiết khi chỉ có một khung được loại bỏ).
Baran Emre

Bạn tiết kiệm ngày của tôi. Chỉ cần thêm tập lệnh sau khi nhúng khung.
Mayuri R Talaviya

8

Đã cập nhật cho Xcode 10.1, Giải pháp bên dưới hoạt động với tôi:

Chỉ cần bạn phải loại bỏ khung công tác khỏi các nhị phân nhúng và chỉ cần thêm nó vào Thư viện và khung công tác được liên kết.

Tham khảo ảnh chụp màn hình bên dưới;

nhập mô tả hình ảnh ở đây


1
Giải pháp làm việc cho tôi (y)
Alok

nó loại bỏ tương tự khỏi các khung và thư viện được liên kết
Ranu Dhurandhar

8

Cảm ơn tất cả các câu trả lời trên. Đây là một kịch bản làm việc với swift 4.2 và 5 . Thay thế chuỗi Your_Framework_Name bằng tên gốc của Framework của bạn.

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

Cảm ơn bạn! Điều này làm việc cho tôi, trong khi câu trả lời được chấp nhận thì không.
besserwisser

5

Vấn đề này đã được giải quyết cho tôi bằng cách sửa đổi một chút kịch bản chạy từ câu trả lời của pAky88 và thực thi sau khi nhúng các khung. Ngoài ra hãy chắc chắn bỏ chọn hộp cho "Chỉ chạy Script khi cài đặt".

/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

Tôi đã xóa kiến ​​trúc i386 & x64_86 khỏi Cài đặt bản dựng - Kiến trúc hợp lệ - Bản phát hành và mọi thứ đều hoạt động tốt.

nhập mô tả hình ảnh ở đây

Bây giờ vấn đề duy nhất sẽ được rằng bạn không thể chạy một CHÍ xây dựng cho mục đích thử nghiệm trên một SIMULATOR . Nhưng dễ dàng như bạn đã loại bỏ các vòm, bạn có thể thêm chúng trở lại nếu bạn muốn.


1
CÓ, đó là giải pháp.
Ofir Malachi

3

giải pháp đơn giản hiệu quả với tôi là

1- loại bỏ khung từ các khung nhúng.

2- thêm khung làm khung liên kết

làm xong!


1

Lỗi này (ITMS-90240) cũng có thể do thư viện tĩnh (.a) gây ra. Đây là một kịch bản để loại bỏ các kiến ​​trúc dư thừa. Trong Xcode, thêm phần này vào Target> BuildPhase> Nhấp vào + và chọn Run Script. Sau đó dán cái này vào hộp script.

Tập lệnh tìm kiếm các tệp .a, kiểm tra xem liệu nó có chứa kiến ​​trúc vi phạm hay không, sau đó nếu nó tạo một tệp .a mới mà không có kiến ​​trúc đó.

Đối với 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

Dành cho 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

Tôi đã có vấn đề tương tự. Thậm chí nó không hoạt động sau khi thêm Run Script đã cho. Đó là vấn đề liên quan đến Xcode. Tôi đã sử dụng phiên bản Xcode 9.0 nhưng phiên bản mới nhất là 9.2.

Vì vậy, tôi đã cài đặt Xcode mới nhất (9.2) và nó đã hoạt động.


0

Khung của bạn chứa cả mã ARMx86mã, cho phép bạn sử dụng nó trên thiết bị hoặc trong trình giả lập. Nếu bạn có ý định gửi ứng dụng của mình đến App Store, hãy chạy đoạn mã sau để tách mã không hoạt động khỏi tệp nhị phân.

1. Chọn mục tiêu của bạn trong Trình điều hướng dự án và nhấp vào Xây dựng giai đoạn ở đầu trình soạn thảo dự án.

2.Từ menu Editor, chọn Add Build Phase, sau đó Add Run Script Build Phase (hoặc nhấp vào nút + ở góc trên bên trái của trình chỉnh sửa Build Ph Phase).

3. Mở rộng tam giác tiết lộ bên cạnh giai đoạn xây dựng Run Script mới vừa được thêm vào. Trong hộp soạn thảo tập lệnh, dán phần sau: bash

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


Điều này giả định rằng tập lệnh dải -frameworks.sh xảy ra ở đó ...
Codezy

0

Đây là một tập lệnh mà tôi đã sử dụng để loại bỏ cụ thể chỉ một kiến ​​trúc của khung công tác khỏi tệp thực thi.

# 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"

Thêm tập lệnh này vào dự án "Xây dựng giai đoạn" của mục tiêu dự án của bạn. Hãy chắc chắn kiểm tra hộp: "Chỉ chạy tập lệnh khi cài đặt"

Xem trước nơi chèn tập lệnh mẫu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.