Unity の iOS ビルド時に Settings.bundle を組み込む

Unity で iOS アプリを作るとき、iOS の設定に設定画面を追加することができる。 こういうの。

f:id:umai_bow:20180928103728p:plain

アプリ上で設定画面を作ってもいいが、簡単なテスト用アプリや、広く公開しないアプリなら、こっちで設定しまったほうが、バグも出ないし楽である。


iOS の設定画面を追加するには、Settings.bundle というファイルを Xcode のプロジェクトに組み込む必要がある。これは、Xcode のメニューから「File > New > File」を開き、「Settings.bundle」を選択することで作成できる。

設定した項目は、plist の Identifier を使って、Unity から PlayerPrefs で引くことができる。

var userId = PlayerPrefs.GetString("userId");

ここで1つ注意なのが、PlayerPrefs には PlayerPrefs.GetIntPlayerPrefs.GetFloat があるが、なぜか機能せず、数値などを入力させたい場合は、自力でパースする必要があることだ。

int.TryParse(PlayerPrefs.GetString("userId"), out userId);

Settings.bundle は Xcode のメニューからも作成できるが、Unity のビルドプロセスに組み込むこともできる。 これは事前に Settings.bundle を用意しておいて、OnPostprocessBuild で呼び出すことで組み込むことができる。

public class XcodeProjectUpdater
{
    [PostProcessBuild]
    static void OnPostprocessBuild(BuildTarget buildTarget, string path)
    {
        if (buildTarget == BuildTarget.iOS)
        {
            AddSettingsBundle(buildTarget, path);
        }
    }

    static void AddSettingsBundle(BuildTarget buildTarget, string path)
    {
        // PBXプロジェクトファイルのフルパス
        string xcodeProjPath = Path.Combine(path, "Unity-iPhone.xcodeproj/project.pbxproj");

        // プロジェクトファイルの読み込み
        PBXProject proj = new PBXProject();
        string file = File.ReadAllText(xcodeProjPath);
        proj.ReadFromString(file);
        string targetGuid = proj.TargetGuidByName("Unity-iPhone");

        string projectPath = "Settings.bundle";
        string copyFrom = Path.Combine(Application.dataPath, "Editor/Settings.bundle"); // コピー元の Settings.bundle のパス
        string copyTo = Path.Combine(path, projectPath); // コピー先の Settings.bundle のパス

        FileUtil.DeleteFileOrDirectory(copyTo);
        FileUtil.CopyFileOrDirectory(copyFrom, copyTo);

        string fileGuid = proj.AddFile(copyTo, projectPath, PBXSourceTree.Source);
        proj.AddFileToBuild(targetGuid, fileGuid); // プロジェクトに追加する

        proj.WriteToFile(xcodeProjPath);
    }
}