新しいAPIが存在する場合、後方互換性のあるOS Xアプリを構築しますか?
-
05-07-2019 - |
質問
10.6互換性を提供するためにアプリ( Clarke )をアップグレードしようとしています。
使用するOSXのバージョンに応じて、2つの異なるコードパスを使用する予定です。
10.5では、特定のCocoa APIに依存しない完全にカスタムコードで構成される1つのコントローラーを使用します。 10.6では、別のコントローラーを使用します。このコントローラーは、同じ抽象クラスに基づいて、新しいCoreLocation APIを同一のインターフェイスにラップします。実行時に、アプリはOSバージョンを検出することでコントローラーを切り替えます。
これは、10.6 SDK用にビルドされた10.6で正常に動作しますが、同じビルドが10.5で次のように爆発します。
10/09/2009 18:30:50 [0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575] dyld: unknown required load command 0x80000022
10/09/2009 18:30:51 com.apple.launchd[403] ([0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575]) Exited abnormally: Trace/BPT trap
10.5 SDK向けにビルドした場合、明らかにCoreLocationのものをコンパイルできません。
このアプリケーションに単一のバイナリを提供できることを望んでいました。 CoreLocation APIを10.5から「隠す」方法はありますか?
解決
ターゲットのビルド設定を変更することにより、この問題を解決できるはずです:
- Base SDKを10.6に設定します
- Deployment SDKを10.5に設定します
他のヒント
Deployment SDKのトリックは、両方のプラットフォームで同じフレームワークを使用しているが、新しいプラットフォームで新しい呼び出しを行っている場合にのみ機能します。 CoreLocationの場合、10.5ではフレームワーク全体が欠落しているため、フレームワークに動的にバインドできないため、アプリの読み込みに失敗します。
上記を実行し、CoreLocationを脆弱なフレームワークとして追加する必要があります。リンクフレームワークとバイナリのビルドフェーズを選択し、詳細ビューでCoreLocationを見つけ、中央の列で「必須」を変更します。 「弱い」に。
アプリをビルドすると、Xcodeは-weak_framework CoreLocationをリンカーに渡し、CoreLocationが存在するかどうかに関係なく、アプリはすべての10.5および10.6システムにロードされます。ただし、実際に10.6で実行している場合を除き、CoreLocationメソッドを呼び出さないようにしてください。