Apple は、長年にわたって命令セットを変更してきました。1 つのプログラムを複数の種類のマシンで実行する必要がある場合があるため、Apple では「lipo」というツールによって構築された「ファット バイナリ」を使用しています。マシンの種類ごとに 1 回ずつ、プログラムを複数回コンパイルするように Xcode に指示すると、lipo がそれらをバインドします。
Apple は最近、iOS 向けの 4 番目の命令セットを発表しました。最初の電話は Armv6 を使用し、3GS からは Armv7 があり、Armv7 用にいくつかの新しい命令が追加され、現在、5S には Arm64 が追加されています。
私は自分のプログラムをさまざまなオペレーティング システムで実行したいので、MIN_DEPLOYMENT_TARGET を 5.0 に設定して、Apple が 5.0 以降のマシンにプログラムをロードするようにします。しかし、Xcode の現在のバージョンでそれを試みると、Arm64 では不可能であるというエラー メッセージが表示されます。
OK、条件付きビルド設定を設定しました。MIN_DEPLOYMENT_TARGET は、Arm64 以外のアーキテクチャでは 5.0 ですが、Arm64 では 7.0 に設定されています。これで、プログラムがコンパイル、リンク、およびリポされます。しかし今、コンパイルの 1 つが iOS 7.0 のみであるため、私のプログラムには古いオペレーティング システムの呼び出しが含まれているという警告がたくさん表示されます。そんなこと知ってる。これは意図的なものです - そのため、プログラムはそれらの古いシステムで実行されます。iOS 7 システムでは、これらの古いルーチンは呼び出されません。代わりに、プログラムは実行時に最新の代替ルーチンを呼び出します。コンパイラに文句を言うのをやめさせることができます:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// old code here.
#pragma clang diagnostic pop
プログラムは、Armv7 と Arm64 の両方の iOS 7 デバイスで正常に動作します。Arm64 デバイスで実行すると、Arm64 フォークが実際に使用されていることを確認する診断コードが少しあります。
バイナリでlipoを実行すると、予想されるアーキテクチャが含まれていることが報告されます。
しかし、これは大きな問題です。iOS 5 デバイスにアプリをインストールしようとすると、Xcode が「内部 API エラーが発生しました」という警告を表示するだけです。
iOS 5 と iOS 6 にはバグがあり、将来からのフォークを無視しないようになっていると思います。ローダーは、認識できないフォークを単純に無視する必要があります。しかし、それはそれが機能する方法ではありません。
Apple が iOS 5 を修正することはありません。私は、アプリがデバイスに読み込まれるときに、Apple が問題を回避する可能性があると考えました。Xcode で不要なフォークを削除し、(現在変更されている) バイナリに再署名します。同様に、iTunes からダウンロードすると、不要なフォークが取り除かれ、再署名される可能性があります。しかし、Apple がこれを行う可能性は低いです。Apple は、iOS7 にアップグレードできるすべての人を望んでいます。アップグレードできない人のための Apple の解決策は、新しいハードウェアを購入することです。
だから、私たちは立ち往生しています。アプリ ストアで 5 と 6 をサポートする 1 つのタイトルを保持し、7 用のファット armv7 と arm64 のアップデートを発行することができます。これにより、iOS7 を使用しているユーザーはファット 1 を取得し、5 または 6 を使用しているユーザーは古いものですが、一度しかできません。7 の更新を投稿すると、5 & 6 の更新を二度と更新することはできません。
これを回避する方法はありますか?Armv7 と Arm64 で実行される単一のプログラムと、armv7 側の iOS 5&6、arm64 ではないよりハードな armv7 の iOS 7、およびサポートされている iOS 7 arm64 が必要です。