XcodeのCapabilityの各種設定をPostProcessBuild
で行う方法です。
Pushの設定などを有効にするアレです。
ざっくり流れ
In-App Purchaseなどentitlementsファイルが不要なcapabilityの場合
- Unityのリポジトリから, 最新のXcode Manipulation API(以下Xcode API)を持ってくる
- 既存のプロジェクトにインポートできるように修正する
- 最新のAPIで
PostProcessBuild
のScriptを書く
iCloudなどentitlementsファイルが必要なcapabilityの場合
- 一旦先にビルドしてXcodeProjectを作成する
- capabilityを設定し, entitlementsファイルを作成する
-
PostProcessBuild
でentitlementsファイルとビルドプロパティを追加する - 以後entitlements file不要な場合に合流する
詳細な流れ
entitlementsファイルのいらないcapabilityの場合
Unityのリポジトリから, 最新のXcode APIを持ってくる
- https://bitbucket.org/Unity-Technologies/xcodeapi のリポジトリに行きます。
- ライセンスファイルを読みライセンスを理解します
- ブランチ
stable
を取得しますRevision 102
- リポジトリ内のXcodeフォルダをデスクトップなど作業環境にコピーします
- ターミナルでXcodeディレクトリに移動し, 下記のコマンドでC#のソースコードのnamespaceを変更します.仮に変更後のnamespaceを
Unity2017.iOS.Xcode
とします
$ pwd
Users/fullcorder/Desktop/Xcode
$ find . -name '*.cs' | xargs sed -i "" 's/UnityEditor.iOS.Xcode/Unity2017.iOS.Xcode/g'
- Xcode/Propertiesディレクトリをは不要なので削除します
- UnityプロジェクトのEditorディレクトリにXcodeフォルダごとインポートします
PostProcessBuild
スクリプトを作成し下記のようにPBXProject#AddCapability
を使って追加します
Unity2017.1のリファレンス
https://docs.unity3d.com/2017.1/Documentation/ScriptReference/iOS.Xcode.PBXProject.AddCapability.html
[PostProcessBuild]
public static void AddCapability(BuildTarget buildTarget, string path)
{
if(EditorUserBuildSettings.activeBuildTarget != BuildTarget.iOS)
{
return;
}
string projPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";
var proj = new PBXProject();
proj.ReadFromString(File.ReadAllText(projPath));
string target = proj.TargetGuidByName(TargetGroup);
proj.AddCapability(target, PBXCapabilityType.PushNotifications);
proj.AddCapability(target, PBXCapabilityType.InAppPurchase);
File.WriteAllText(projPath, proj.WriteToString());
}
- 以上ですあとはビルドすればOKです
entitlementsファイルが必要なcapabilityの場合
entitlementsファイルが必要な場合は, entitlementsファイルを作成したものをPostProcessBuild
で追加し、あとはentitlementsファイルが不要な場合に合流します
entitlementsファイルを作成
- UnityでiOSビルドしてXcodeProjectを吐き出します
- Capabilityタブに行き, Pushなどをこうなりたい状態,
PostProcessBuild
後で設定後の形にします - entitlementsファイルがXcodeプロジェクト内に作成されるので取り出してUnityProjectにインポートします
- Unityフォーラムの下記ポストから
EntitlementsPostProcess.cs
をDLしてUnityにインポートします
-
EntitlementsPostProcess.cs
のSerializeField
であるEntitlements Fileにentitlementsファイルを設定します - 以上でentitlementsファイル追加が完了します
以後、前述の手順と合わせてビルドすると無事, 設定反映したになっていると思います
(Plist編集は別途スクリプト書いてください)
その他
Unity2017からは多分使えるAPIなので、長いプロジェクトの場合, プラットフォーム依存コンパイルでUnity5のみ限定して今回変更したnamespaceを使うようにすると良いと思います。
環境
macOS Sierra
Unity 5.5.3f1
Xcode 8.3.2
参考
https://bitbucket.org/Unity-Technologies/xcodeapi
https://forum.unity3d.com/threads/how-to-put-ios-entitlements-file-in-a-unity-project.442277/