14

いつものように、Apple が OS X を更新するとき、最新の XCode 4.4 は古い (10.6) SDK をダンプします。互換性を維持するために、10.7 SDK (または 10.8 だと思います) を使用し、デプロイ ターゲットを 10.6 に設定する必要があります。

まだ存在していない API への呼び出しを誤って導入することはできないことを知っているため、古い SDK にリンクすることを好みます。最後に逆のアプローチを試みたときに定期的に行っていることに気づきました。

私がやっていることは、XCode のコード補完機能を使用して、NSWorkspace のような単純なクラスの「正しい」呼び出しを選択することです。その後、開発中にすべてが正常に機能し、それを忘れて、新しいバージョンをリリースすると、Kaboum! 以前の OS X リリースでは、実行時にアプリケーション全体が爆発します。多くの場合、手の届きにくい場所にあります:-)

または、少なくともこれは、数年前の私にとっての状況でした。

確かに、今では次のいずれかの方法があります。

  • SDK で定義されている場合でも、デプロイ ターゲットでまだ使用できない API 呼び出しを導入しないようにします。

  • ビルド時または静的解析時にそのような呼び出しを検出する

私はどこかで何かを見逃していると確信しています..私を啓発してください!

よろしくお願いします、

フランク

4

6 に答える 6

8

確かに、今では次のいずれかの方法があります。

  • SDK で定義されている場合でも、デプロイ ターゲットでまだ使用できない API 呼び出しを導入しないようにします。

  • ビルド時または静的解析時にそのような呼び出しを検出する

いいえ、ありません。はい、それに対してレーダー (bugreport.apple.com) を開く必要があります。必要に応じて、私のものをだますことができます: rdar://11985733

はい、Apple の推奨にもかかわらず、実行可能な唯一の解決策は、古い SDK をコピーしてそれらにリンクすることです。

WWDC 2012 で、まさにこの問題について Xcode チームとかなりの時間をかけて話し合いました。現在、修正する予定はありません。レーダーをエスカレートさせることは、これらのことについて Apple に影響を与える方法です。

于 2012-07-30T14:22:36.013 に答える
2

私はiOSでもこの厄介な問題を抱えています。ユーザーがデバイスをiTunesと同期し、クラッシュレポートが送信される前にクラッシュレポートの送信を有効にする必要があるため、iOSでは実際にはさらに厄介です。MacOSXでは、すべてを行う必要はありません。最近、APIを古いバージョンのSDKと照合するためのコンパイル時チェックを追加することができました。最初にiOSでどのように行ったかを説明し、次にこの手法をMac OS Xに適応させる方法を説明します。Macatmにはあまりコーディングしないので、私の経験から正しい方向に導くことしかできません。 iOSを使用していますが、仕事から戻って明確な答えが出たら、今日の後半に提案をテストします。


それで、これが私がiOSのためにしたことです:

最初に、入手したい古いSimulatorSDKを入手する必要がありました。必要なSDKを含む古いXcode3(4ではない)バージョンをダウンロードすることで、これを簡単に入手できました。

次に、SDKをインストールする必要がありました。これはそれほど難しいことではなかったので、ここではあまり説明しません。ただし、SDKはPackagesフォルダーに保存されます。このフォルダは、以前のXcode 3バージョンでははっきりと表示されますが、それ以降のバージョンでは非表示になります。ターミナルからとにかく簡単に開くことができます。また、フォルダがXcode.app内に移動したXcode 4.3での変更後、DeveloperSDKをtmpフォルダにインストールし、SDKをXcode.appに自分で移動する必要がありました。Xcodeを開いていたら、再起動する必要があります。

その後、debugプロジェクトで構成を複製し、名前を付けました。私の場合は、そのような名前を付けましたが、iOS 4.3 API Check実際には問題ではありません。次に、この新しい構成のベースSDKを、インストールした古いSDKに変更しました。インストールしたSDKがリストに表示されなかったためother、この場合も、を選択して入力する必要がありましたiphonesimulator4.3

最後に、古いバージョンのSDKと照合する必要がある場合はRun <appname>.app、プロジェクトスキームの構成を自分の構成に変更しましたiOS 4.3 API Check。次に、iOS4.3に対するコンパイル時のチェックを行います。


Mac OS Xに関しては、これと同じ方法で同じ目標を達成できると確信しています。Mac SDK用のシミュレーターはないので、通常のSDKで動作すると思います。古いSDKの入手に関しては、Xcode 4.2がまだインストールされている場合(Xcode 4.3が変更した後、DeveloperフォルダーがXcode.app内にあるように)、そこに10.6SDKがあります。そうでない場合は、AppleがiOSに似たものを持っていると思います。そこでは、SDKのダウンロードがDevCenterまたはインターネット上のどこかで利用可能です...

Base SDKの設定に関しては、リストにない場合は、名前MacOSX10.6またはそれ以降のバージョンだと思います。

他のすべては同じである必要がありますが、前述のように、今日の後半にこのメソッドをテストし、答えを編集してより明確な答えを出しますが、このメソッドはMacSDKで機能すると思います。

于 2012-07-31T09:42:09.590 に答える
2

私は通常、SDK を古いバージョンから新しいバージョンにコピーして、サポートされていないものを使用するとコンパイラが私を怒らせるようにしています。

また、スクリーンショットのように、不明なメソッドを呼び出すときにクイック ヘルプを参照するだけで、 launchApplicationAtURLメソッドは 10.6 以降でのみ使用可能であることがわかります。

ここに画像の説明を入力

于 2012-07-30T14:07:43.167 に答える
0

私は、Availability.h をハッキングしてコードをチェックし、コンパイラーが弱いリンクのシンボルに警告/エラーとしてフラグを立てるようにします。現在の (Xcode 5/llvm) 化身では、以下のコードを使用しています。iOS 6.0 以降で導入されたシンボルを使用すると警告が表示されます。かなり自明だと思います。マクロは、SDK の更新ごとに更新する必要があるようですので、慎重に行ってください。ああ、あなたは非推奨の警告も失っているので、私は条件付きコードを再確認するためにたまにしかこれを使用しません.

#undef __NSi_6_0
#define __NSi_6_0 deprecated=1.0
#undef __NSi_6_1
#define __NSi_6_1 deprecated=1.0
#undef __NSi_7_0
#define __NSi_7_0 deprecated=1.0

#undef __NSd_6_0
#define __NSd_6_0
#undef __NSd_6_1
#define __NSd_6_1
#undef __NSd_7_0
#define  __NSd_7_0

http://iphone.m20.nl/wp/2013/10/xcode-5-and-flagging-weak-linked-unavailable-symbols-from-a-newer-sdk/も参照してください

于 2013-10-24T13:40:37.420 に答える