App Storeへの提出に関する問題:サポートされていないアーキテクチャx86


253

だから私はShopify APIを使用しようとしています。アプリをアーカイブして検証すると問題は発生しませんが、アプリストアに送信すると次の問題が発生します。

  1. エラーITMS-90087:「サポートされていないアーキテクチャです。実行可能ファイルにサポートされていないアーキテクチャ '[x86_64、i386]'が含まれています。」
  2. エラーITMS-90209:「無効なセグメントアライメント。SJAPP.app/ Frameworks / Buy.framework / BuyのApp Binaryに適切なセグメントアライメントがありません。最新のXcodeバージョンでアプリを再ビルドしてください。」(すでに最新バージョンを使用しています。)
  3. エラーITMS-90125:「バイナリが無効です。LC_ENCRYPTION_INFOロードコマンドの暗号化情報が見つからないか無効であるか、バイナリがすでに暗号化されています。このバイナリはAppleのリンカで構築されていないようです。」
  4. 警告ITMS-90080:「実行可能ペイロード/..../Buy.frameworkは、位置に依存しない実行可能ファイルではありません。ビルド設定がPIE実行可能ファイルを作成するように構成されていることを確認してください。」

4
最初のメッセージは、シミュレータビルドのように聞こえます。
Phillip Mills

提出用のアーカイブを作成するとき、デバイスオプションでiOSデバイスを選択してから、アーカイブが作成されます。それがuの質問である場合
Saurabh Jain

2
@PhillipMillsに同意します。最初のエラーに集中してください。iOSアプリにx86_64バイナリがあるのはなぜですか?ビルド設定で奇妙なことをしたか、シミュレータビルドをアップロードしたかのいずれかです。
スティーブンダーリントン2015年

@ pAkY88。できませんでした。私は最近Shopify APIフォーラムに投稿し、返答を待っています。私がそれに遭遇した場合、間違いなく何かを投稿します
Saurabh Jain

Application Loader 3.5を使用してアップロードしたときにこの動作が発生しました
SudoPlz

回答:


395

問題は、Buyフレームワークにシミュレータ(x86_64)と実際のデバイス(ARM)の両方のビルドが含まれていることです。

もちろん、サポートされていないアーキテクチャのバイナリをApp Storeに送信することはできません。そのため、解決策は、送信する前に、最終的なバイナリから不要なアーキテクチャを「手動で」削除することです。

ダニエルケネットは素晴らしいソリューションを考え出し、ビルド段階に追加するためにこのスクリプト提供します

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上記のApp Storeの問題を修正するためにXcodeプロジェクトでこのスクリプトを使用しましたが、ビルドに移動すると、多くの致命的なエラーが発生しました->致命的なエラー:脂肪:入力ファイル(/ ... -extractオプションが指定されている場合、Frameworks / Bolts.framework / Bolts)はファットファイルである必要があります。これを修正する方法はありますか?
SamoanProgrammer 2016

52
私はそれはかなり愚かだと思います:シミュレーターとデバイスの両方でアプリが実行できるようにarm + x86を組み合わせる必要があり、アプリストアに送信するためにx86を取り除く必要があります。なぜAppleは、x86が検出されている限り、端でストリップを行わないのですか?彼らはこれを守るために多くの技術的な理由を助けることができますが、それはユーザーフレンドリーではないのでビジネス上の理由はありません。
superarts.org 2016年

5
@Skoua関連するターゲットを選択し、「ビルドフェーズ」を選択して、「
組み込み

6
上記のスクリプトは役に立ちますが、Xcodeでスクリプトを実行する手順についてはどこにも言及されていません。このスクリプトを実行するには、TARGETS-> [Build Phases]を選択し、[Xcode]の上部ヘッダーをエディターでタップします。--> [Add build phases]-> [Run script script]ビルドフェーズを追加すると、TARGETの[Build Phase]セクションに列が表示されます。ここで、上記のスクリプトをコピーして貼り付け、Appstoreに正常にアップロードできます。
shashi Gupta 2018

5
Xcode 11.2で動作しません-誰かが解決策を見つけましたか?
JMIT

180

pAkY88による回答は機能しますが、私はhttps://stackoverflow.com/a/35240555/5272316で Mario A Guzmanと同じ問題に直面しました:使用されていないアーキテクチャを切り捨てると、削除しようとするため、スクリプトを実行できなくなります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
アイデアありがとうございます。whileループ内の受け入れられた回答からのコードにチェックを追加しただけでcase "${TARGET_BUILD_DIR}" in *"iphonesimulator") echo "Skip simulator target"; continue ;; esac、それは魅力のように機能しました。
Michael Radionov 2017年

このスクリプトを追加していますTARGET -> Build Phases -> [CP] Embedded Pods Frameworksが、機能せず、iTunesConnectへのアップロードエラーがあります。このスクリプトを実行する方法は?
PiterPan 2017年

2
PiterPan、別のRunScriptフェーズとして追加
Varrry

1
[インストール時にのみスクリプトを実行する]オプションをオンにしたところ、アーカイブ以外の場合はスキップされました。
2017

ここですべてが提案され、カルタゴのエラーをクリアすることができました。しかし、なぜ失敗したのかについての有用な情報を得るために、検証なしでApp Storeにアップロードする必要がありました。...その修正と前進にマネージド
user3069232

90

Carthageを使用している場合、プロジェクトが次の理由でこの問題が発生する可能性があります。

  • carthage copy-frameworksビルドフェーズがありません。
  • または、ビルドフェーズにすべてのフレームワークが含まれていません(不完全なリスト)。

このアクションは、有効なアーキテクチャ(コード)のリストにフレームワークをフィルタリングします

フレームワークのコピービルドフェーズの設定

iOSのステップのカルタゴの建物

アプリケーションターゲットの[ビルドフェーズ]設定タブで、[+]アイコンをクリックし、[新しい実行スクリプトフェーズ]を選択します。シェル(例: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送信のバグを回避し、アーカイブ時に必要なビットコード関連のファイルとdSYMが確実にコピーされるようにします。


追加のメモとして、私は最近、この問題に出会い、古いコンパイル済みバージョンのサードパーティフレームワークの使用から、Carthageを使用してインストールされた同じフレームワークの新しいバージョンに切り替えました。Carthageが完全にセットアップされた後でも、このエラーが発生し続けました。私にとっての修正は、プロジェクトからフレームワークを完全に削除し、再度追加することでした。Carthageを使用していて、この回答で問題が解決しない場合は、それを試してください。
アッシュ

1
確かに、素晴らしい投稿です。多くの場合、最善策は単にすべてのフレームワークを削除し、Carthageからすべてのフレームワークを再度追加することです。乾杯
Fattie

私はCarthageとMarshalを使用$(SRCROOT)/Carthage/Build/iOS/Marshal.frameworkして、作業を追加しました
Ricardo Mutti

最近のiOSでは、99%の確率でこれが問題になります。コピーフレームワークを忘れただけです。(プロジェクトの100%が現在カーセージを使用しています。)
Fattie

41

埋め込みバイナリセクション(Xcodeターゲット->全般タブ)からフレームワーク(優れたSVProgressHUD)を削除することにより、エラーITMS-90080を解決しました。

ここに画像の説明を入力してください


5
この回答には、さらに多くの賛成票が必要です。Carthageを使用している多くの人々の根本的な原因だと思います。
mm2001

15
動的フレームワークを埋め込もうとしている場合、それを削除すると、次のエラーメッセージが表示されます。「理由:画像が見つかりません」
electronix384128

1
これでうまくいきました。組み込みバイナリからフレームワークを削除し、リンクされたフレームワークとライブラリに追加するだけです。また、他の回答で見つけたスクリプトを実行するなど、他のことも行う必要があります。
smileBot

33

使用しCarthageている場合Embed Frameworks Build Stepは、前にあることを確認してくださいCarthage copy-frameworks


いくつかの異常な場合(例:Lottie-iOSフレームワーク):

  • あなたはいつものように単に「リンクライブラリ」にそれを持っています。

  • しかし、あなたがしなければならないまた、(あなただけの「埋め込みフレームワーク」でそれを持っている場合、それは完璧に動作するので、それは無意味と思われるにもかかわらず)、明示的に「埋め込みフレームワーク」でそれを追加します

  • そしてコピー枠組みに入れて

  • そしてコピー枠組みを確保された後、「埋め込みフレームワーク」


このように私の問題。ありがとうございました。
DookieMan

15

以下の手順を使用して、フレームワークから[x86_64、i386]を削除します。[x86_64、i386]はシミュレータに使用されます。

  1. 開いた Terminal

  2. 各フレームワークのプロジェクトドラッグパスをターミナルに開きます

    例: cd /Users/MAC/Desktop/MyProject/Alamofire.framework

  3. 以下のコマンドでフレームワーク名を設定して実行します

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

  1. 次に、プロジェクトを再度開き、クリーンアップ、ビルド、実行、アーカイブの作成...

@mahipal Singh .. lipoコマンドを使用して削除した後。アプリがシミュレータで動作していません。iPhoneシミュレーターでx84_64が見つからないなどのエラーが発生しました。実際のデバイスでは問題なく動作しています。
Hitarth

これは、シミュレータがデバッグフレームワークのみをサポートしているためです
MAhipal Singh

14

ここに2セントを追加します(それほど怖くない方法で:-)。私はベンダーからのかなりの数の脂肪ライブラリーに遭遇しましたが、(何らかの理由で)FrameworksAppleによって文書化されているようにそれらをディレクトリに追加することによって通常の方法で機能しません。私たちがそれらを機能させることができた唯一の方法は.framekwork、プロジェクトディレクトリに権利をプルし、ビルド設定でEmbedded FrameworksとをLink Binary with Libraries手動でリンクすることです。これは、彼らが余分なシミュレータアーキテクチャが付属して任意の脂肪のライブラリと同じように、しかし、何の問題もなく働いているように見える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

これは、iTunesConnectアーカイブのアップロード前にフレームワークから「脂肪を取り除く」(つまりi386x86_64)必要があることを示しています。これにより、これらのアーキテクチャは許可されません(iOSではサポートされていないため)。

さて、ここでのすべての回答(または少なくともいくつかの回答)は、これらのすばらしい実行スクリプトを提供します。これらのスクリプトは、フレームワークがFrameworksディレクトリにある場合にのみ、非常にうまく機能します。さて、あなたがシェルスクリプトの中毒者でない限り、変更のないスクリプトは、上で説明したシナリオでは機能しません。ただし、フレームワークからi386x86_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削除するアーキテクチャごとに1回実行する必要があります。lipoは入力ファイルを変更せず、ファイルを生成するだけなのでlipo -removex86_64およびに対して1回実行する必要がありi386ます。上記のコマンドは、最初に実行可能ファイルの名前を変更し、最終的に目的のアーチを削除してから、残りのファイルをクリーンアップすることで単純に実行しています。以上で、Application Loader ArchivalのiTunesConnectへのアップロードに緑色のチェックマークが表示されます。

注意事項:上記の手順は、製品のビルド中にのみ行う必要.frameworkがあります。シミュレーターアーキテクチャーから削除されるため、シミュレーターでのビルドは機能しなくなります(これは予想されます)。開発環境では、.frameworkシミュレータと物理デバイスの両方でテストできるようにするため、ファイルからアーキテクチャを取り除く必要はありません。ファットライブラリFrameworksがプロジェクトのフォルダにある場合は、受け入れられた回答を確認してください。


スクリプトのように感じない人のためのシンプルなソリューション。

上記のコマンドを実行するだけで、アーチのサイズが半分に減少します。うまくいけば、いくつかの違いを生む。
showmyroutes 2018

すべてを正常に機能させるためにスクリプトを展開しましたが、これは問題を解決する方法に関する適切な説明でなければなりません。
Sharkes Monken 2018

この答えの性質が大好きです。クリーンで簡潔
Hudi Ilfeld

10

スクリプトを追加してフレームワークを数回更新した後でも、同じ問題が発生しました。

埋め込み後のxCodeの最後にスクリプトが追加されていることを確認してください。埋め込みフレームワークの前に誤ってスクリプトを移動したと思います。

ここに画像の説明を入力してください

注:xCode 9.1を持っています


これでうまくいきました。@ pAkY88のスクリプトだけで十分でしたが、私が1年近く前にリリースしたときは十分でした。
RedHotPawn.com 2018年

私は同じ問題を抱えていましたが、これでうまくいきました。フレームワークが削除および追加されるたびに、実行スクリプトの位置を必ず確認してください(削除されたフレームワークが1つしかない場合にのみ必要です)。
Baran Emre

あなたは私の日を救います。埋め込みフレームワークの後にスクリプトを追加するだけです。
Mayuri R Talaviya

8

Xcode 10.1用に更新されました。以下の解決策が私にとってうまくいきました:

組み込みバイナリからフレームワークを削除して、リンクされたフレームワークとライブラリに追加するだけです。

以下のスクリーンショットを参照してください。

ここに画像の説明を入力してください


1
私のための
実用的な

リンクされたフレームワークとライブラリから同じものを削除します
Ranu Dhurandhar

8

上記のすべての回答に感謝します。以下は、swift 4.2および5で動作するスクリプトです。Your_Framework_Name文字列をフレームワークの元の名前に置き換えます。

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を削除しましたが、すべてうまくいきました。

ここに画像の説明を入力してください

唯一の問題は、SIMULATORでテスト目的でリリースビルドを実行できないことです。ただし、アーチを削除するのと同じくらい簡単に、必要に応じてアーチを元に戻すことができます。


1
はい、そのソリューション。
Ofir Malachi

3

私のために働いた簡単な解決策は

1-組み込みフレームワークからフレームワークを削除します。

2-リンクされたフレームワークとしてフレームワークを追加する

できた!


1

このエラー(ITMS-90240)は、静的(.a)ライブラリが原因である場合もあります。過剰なアーキテクチャを取り除くためのスクリプトです。Xcodeで、これを[ターゲット]> [ビルドフェーズ]> [+]に追加し、[スクリプトの実行]を選択します。次に、これをスクリプトボックスに貼り付けます。

スクリプトは.aファイルを検索し、問題のあるアーキテクチャが含まれているかどうかを確認し、含まれている場合はそのアーキテクチャなしで新しい.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

同じ問題がありました。指定された実行スクリプトを追加した後でも機能しませんでした。Xcode関連の問題でした。Xcodeバージョン9.0を使用していましたが、最新バージョンは9.2でした。

だから私は最新のXcode(9.2)をインストールし、それは働いた。


0

フレームワークにはARMx86コードの両方が含まれているため、デバイスまたはシミュレーターで使用できます。アプリをApp Storeに送信する場合は、次のスクリプトを実行して、非アクティブなコードをバイナリから削除します。

1.プロジェクトナビゲーターでターゲットを選択し、プロジェクトエディターの上部にある[ビルドフェーズ]をクリックします。

2. [エディター]メニューから[ビルドフェーズの追加]を選択し、[実行スクリプトビルドフェーズの追加]を選択します(またはビルドフェーズエディターの左上隅にある[+]ボタンをクリックします)。

3.追加されたばかりの新しいRun Scriptビルドフェーズの横にある開閉用三角ボタンを展開します。スクリプトエディターボックスに、以下を貼り付けます。bash

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


これは、strip-frameworks.shスクリプトが偶然そこにあると想定しています...
Codezy

0

以下は、実行可能ファイルから1つのフレームワークのアーキテクチャのみを明確に削除するために使用したスクリプトです。

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