AppStoreにリリースしたアプリのコードでもGithubに公開がしたい!(でも秘匿情報は隠したい)
想定の読者
App Storeに公開したアプリのコードをGitHubで管理&公開したいが、APIキーなどのProduction用の情報は隠したいと考えている方々
概要
任意のパブリックなリポジトリをサブモジュールとして参照するProduction用のプライベートリポジトリを作成します。XcodeCloudなどのCI/CD環境にも対応しており、Production用のworkspaceでコードの修正やstaging用のビルドが行えます。
この記事ではパブリックなStaging用リポジトリをStagingRepository,
プライベートなProduction用リポジトリをProductionRepositoryと呼びます。
サンプル
Stagingプロジェクトについて
以下のような様々なプロジェクト構造でも問題ありませんが、Xcodegen
を使用した環境での確認は行っていません。
- デフォルトの
xcodeproj
を使用した構成 -
Cocoapods
,Carthage
を使用した構成 - SPMモジュールを使用した構成
ProductionRepositoryの作成とサブモジュールのセットアップ
ステップ1: Gitで管理される新しいフォルダを作成
$ mkdir ProductionRepository
$ cd ProductionRepository
$ git init
ステップ2: StagingRepositoryをサブモジュールとして追加
$ git submodule add git@github.com:your_username/StagingRepository.git
生成される.gitmodules
ファイルをGitで管理します。
この時点でStagingRepositoryがクローンされ、.git/config
が生成されます。
このStaging用プロジェクトのビルドができることを確認してください。
Production用のプロジェクトを作成
ProductionRepository
に新しいxcodeproj
とworkspace
を作成
ステップ1: Staging用のxcodeproj
とworkspace
をコピーして、ProductionRepository
に配置します。
もともとxcworkspace
を使用していない場合は、新たに作成します。XcodeのメニューからFile > New > Workspace
を選択して作成できます。
Staging.xcodeproj
、Production.xcodeproj
のようにそれぞれ改名するとわかりやすくなります。
xcworkspace
を編集
ステップ2: xcworkspace
の内部にcontents.xcworkspacedata
という以下のようなXMLがあります。このファイルをテキストエディタで開き、Production.xcodeproj
を参照するように修正します。
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:StagingRepository/Pods/Pods.xcodeproj">
</FileRef>
<FileRef
location = "group:Production.xcodeproj">
</FileRef>
<FileRef
location = "group:StagingRepository/Staging.xcodeproj">
</FileRef>
</Workspace>
ステップ3: ファイルパスを解決
Production.xcworkspace
を開くと見つからないファイルが赤く表示されているので、右側のインスペクタのフォルダマークからパスを解決します。
ステップ4: ビルドに必要な設定を調整
ビルドを試すと、Build Settings
で主に以下の項目でパスの不一致によるエラーが発生するのでそれぞれ解決します。
- Code Sign Entitlements
- Info.plist
- Framework Search Path(importエラーが出た場合)
- Development Assets(Production用では不要かもしれないが、無いとエラーが出る)
- PODS_PODFILE_DIR_PATH (
[CP] Check Pods Manifest.lock
でエラーになる) - PODS_ROOT(
[CP] Check Pods Manifest.lock
でエラーになる)
info.plistをProductionとStagingで出し分ける場合は新たなinfo.plistをProductionRepositoryに作成して設定します。
ステップ5: 不要なコンフィグレーションを削除
Production.xcodeproj
ではDebug
コンフィグレーションは不要なので削除します。同様に、Staging.xcodeproj
ではRelease
コンフィグレーションを削除します。
xcworkspace
でStaging
ビルドができるように設定
ステップ6: ProductionRepositoryのxcworkspace
を開いた状態で、staging.xcodeproj
をドラッグ&ドロップしてインポートします。
ステップ7: これまでの変更をGitHubにプッシュ
最後に、これまでの変更をGitHubにプッシュします。
他メンバーの開発の流れ
- ProductionRepositoryをクローンし、サブモジュールをセットアップ。
- ProductionRepositoryの
xcworkspace
を開いてコーディング。 - StagingRepository内の変更は、そのリポジトリに移動してコミット、プッシュ。
- ProductionRepositoryに移動して、StagingRepositoryの最新のコミットIDをコミットプッシュ。
XcodeCloudを使用する場合
-
Primary Project
似ProductionRepositoryに設定し、workspace
もProductionRepositoryのものを使用。 -
ProductionRepository/ci_scripts/ci_post_clone.sh
に以下を記載。
#!/bin/bash
# Initialize the submodule
git submodule init
# Update the submodule
git submodule update
# Pod, Carthage等のセットアップ
Discussion