TestFlightのSDKをAppStore申請用ではバイナリに含めなくする方法

最近TestFlightにどっぷりはまってます。便利すぎます。ベータテスターとの距離最高です。テストしてもらいたくてしょうがない毎日。

便利なんですがこのSDK、サイズもそれなりにでかいですし、中で危険なことをしてないか不安。AppStoreに申請するバイナリでは呼び出さないのですから、できたら取り除いておきたいところ。

取り除くためにはターゲットから外してあげればよいのですが、手動でやると何かミスしてしまいそうで怖いです。できたら自動化したい。AdHocの時には追加するけど、Releaseでは追加しない、というきり分けができれば最高です。でもXcodeのプロジェクトはビルド設定ではリンクするかどうかを変更できません。どうしたらいいでしょう?

ということで、@k_katsumiさんに教えてもらった方法を実践してみました。TestFlightに関わらず使える技です。ポイントは、あるビルド設定では指定のライブラリを外す、という考え方の逆をします。以下の手順の通り。

  1. 通常通りlibTestFlight.aを組み込む
  2. ターゲットから一度外す
  3. AdHocビルド設定をReleaseのコピーとして作る
  4. AdHocのpreprocessor macroにUSE_TESTFLIGHT=1 を定義する
  5. AdHocのother linker flagsに-lTestFlightを追加する

これで、AdHocビルドのときにのみTestFlight SDKがリンクされるようになります。コード側では #if USE_TESTFLIGHT でコードを分岐してあげればオッケーです。

一応、ここまでの作業でだいぶミスは減ることになりますが、まだこれだとArchiveするときのビルド設定を手動で切り替えないと行けません。ミスすることはありそうです。ということでもうひと手間。スキームを切り替えることで、開発&AdHoc用とAppStore申請用を切り替えます。

  1. Manage Schemes... を選び、アプリケーションのスキームを複製します。名前はアプリ名+AppStoreがよいかと。
  2. 複製したスキームをダブルクリックで開き、Archiveを選択、ビルド設定をReleaseにします。
  3. アーカイブ名も変えておくとAdHocビルドかAppStore申請かわかりやすいので便利です。アプリ名には影響しません。アーカイブのリストの中だけの話なので、安心して変えましょう。
  4. 元のスキームのArchiveはAdHocになっていることを確認します。なってなかったら変更。
  5. スキーム設定画面は閉じて、プロジェクトのアプリの設定画面でCode Signingを開きます。
  6. バイスを追加するたびに変更する必要があるAdHocのほうを"iPhone Distribution"にして自動で探させます。Releaseの方はAppStore用のDistribution Profileを明示的に選んでおきます。こっちが変わるのは年に1度か2度。

これで、スキームを変更してアーカイブすることで、AppStore用とAdHoc用とうまく切り替えることができます。