Akata Works

東京エンジニア。主にRuby,Go,たまにAWSとiOS。ゲーム音楽が好きです。連絡はTwitterかakata.onen@gmail.comまで

Deployment TargetとBase SDKと互換性について

XcodeのDeployment TargetとBase SDKがややこしかったのでまとめてみました。なるべくわかりやすく書いたつもりです。「間違っているぞー」とい点があればご指摘いただけると幸いです。

前提

そもそもの話として、Appleは各種OS(Mac OSiOS)とそのバージョンごとに異なるSDKを用意しており、それぞれの端末には対応するSDKが事前に組み込まれています。これにより以下のようなメリットがあります。

  • 同一実行ファイルでありながら、機能が組み込まれていればそれを活用し、組み込まれていくてもそれなりに対処できる
  • Base SDKからある程度の上位・下位バージョンへの互換性が担保できる

で、この「組み込まれているか、組み込まれていないか」を判断する必要があるSDKの範囲を決めるのがDeployment TargetとBase SDKです。

Deployment Target(配布ターゲット)

開発者がソフトウェアの動作を保証する最も古いSDKのバージョンを表します。つまり、これ以上のSDK上では動作を保証する必要があるけど、これより古いSDK上ではクラッシュしても知りませんってことです。

動作を保証する必要がないため、これ以下のバージョンで実装された機能にはがっつりと強リンク(機能がなければクラッシュする)が張られます。

Base SDK

ソフトウェアのコンパイル時に基準とするSDKのバージョンを表します。つまり、これより新しいSDK上で定義された機能は使えません(コンパイルエラー)。

また、このバージョンで廃止予定とされている機能はこれ以降のバージョンでは存在しない可能性があるためさっさと移行したほうがいいです。多分警告が出ると思います。

廃止予定の機能さえ使用していなければ上位互換性はほぼ保証されます。なぜなら、コンパイル時により新しいSDKで定義された機能は使ってないし、廃止予定でない機能が急に消されることはない(はず)だからです。

Deployment Target〜Base SDK

前項までで、Deployment Target以前の機能は気にする必要がないので無視して問題がないこと、Base SDK以上の機能は廃止予定のものを使っていなければほぼ安全であるということがわかりました。

ただ、これらのバージョン間で実装(変更)された機能に関してはユーザの端末に定義されているとは限りません。メソッドが追加されたり、挙動が変更されたりといろいろ考えられます。

故に、これらの機能にはソースコード上で動的に変更が可能なように弱リンク(機能がなければヌルポになる)が張られ、機能が定義されているか事前に確認する必要があります。

具体的な実装方法に関しては省きますが、参考URLにあるAppleの公式ドキュメントが一番まとまっていると思います。

まとめ

まとめると、このあたりをきちんと守っていれば互換性に関しては問題ないと思います。

f:id:akatakun:20180614194429p:plain (参考URL: Appleの公式ドキュメントから)

  • Deployment Target以前: 動作を保証をしない
  • Deployment Target以上〜Base SDK以下: 動作を保証する。追加・変更された機能はフレームワーク読み込み設定やソースコードで順応させる必要がある
  • Base SDK以降: 動作を保証する。廃止予定の機能は極力使わない

おわり。

参考URL

https://developer.apple.com/jp/documentation/cross_development.pdf