脱力駆動開発記

ゲームアプリを作るエンジニアの技術メモ

MENU

【Unity/Xcode】Xcode14ビルド時にライブラリ側の「Select a development team 」エラーが出た際の対応

エラー内容

Xcode13からXcode14.2を使うようになって以下のエラーがでるようになった

Signing for "gRPC-C++-gRPCCertificates-Cpp" requires a development team. Select a development team in the Signing & Capabilities editor.

Firebaseのパッケージを使用していると起きるはず

とりあえずビルドが通るようにするには,SigningのTeamから任意のTeamを選択すればOK。

Podfileに追記して解決

毎回手動でやるのはめんどくさいのでPodfileに処理を追記する方法もあります。

そもそもdevelopment teamの設定を必須じゃないようにする場合

まずPodfileに以下を追記します。

post_install do |installer|
  installer.generated_projects.each do |project|
      project.targets.each do |target|
          if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
            target.build_configurations.each do |config|
                config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
            end
          end
      end
    end
end

参考*1

その後 pod installを実行します。

これは

config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'

の行でやっているように、code signingを求めないようにしています。

手動でやったdevelopment teamの設定を自動化する場合

逆に手動でやっているdevelopment teamの設定を自動でやる場合は以下のようにする必要があります

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if config.build_settings['WRAPPER_EXTENSION'] == 'bundle'
        config.build_settings['DEVELOPMENT_TEAM'] = 'YOUR_TEAM_ID' // 自分のチームID
      end
    end
  end
end

参考*2

Unity側のPostProcecssでPodfileへの追記も自動化する

podfileに追記する方法だと、結局毎回のビルドごとにpodfileを開いて編集する必要があります。それだと結局手間がかかってしまうので、UnityのPostProcessBuildを使って上でやったPodfileへの追記も自動でやると完全に自動化できます。

UnityのPostProcessBuild*3は引数に数字を指定できますが、これは処理の順番です。

podfileはExternlDependencyManagerのIOSResolverで生成されているわけですが、その処理を見てみると https://github.com/googlesamples/unity-jar-resolver/blob/master/source/IOSResolver/src/IOSResolver.cs

    // Order of post processing operations.
    private const int BUILD_ORDER_REFRESH_DEPENDENCIES = 10;
    private const int BUILD_ORDER_CHECK_COCOAPODS_INSTALL = 20;
    private const int BUILD_ORDER_PATCH_PROJECT = 30;
    private const int BUILD_ORDER_GEN_PODFILE = 40;
    private const int BUILD_ORDER_INSTALL_PODS = 50;
    private const int BUILD_ORDER_UPDATE_DEPS = 60;

このようにPostProcessBuildの引数が定義されているので、

    private const int BUILD_ORDER_GEN_PODFILE = 40;
    private const int BUILD_ORDER_INSTALL_PODS = 50;

の間でPodfileに追記してあげれば動きそうです。

適当なクラスに以下のように記述します。

private const string AddPodfileContent = @"
post_install do |installer|
  installer.generated_projects.each do |project|
      project.targets.each do |target|
          if target.respond_to?(:product_type) and target.product_type == ""com.apple.product-type.bundle""
            target.build_configurations.each do |config|
                config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
            end
          end
      end
    end
end
";
/// <summary>
/// Post-processing build step to generate the podfile for ios.
/// </summary>
[PostProcessBuild(45)] // 40が生成で50がpod install実行
public static void OnPostProcessGenPodfile(BuildTarget buildTarget, string pathToBuiltProject) {
    if (buildTarget != BuildTarget.iOS)
    {
        return;
    }
    var podFilePath = GetPodfilePath(pathToBuiltProject);
    File.AppendAllText(podFilePath,AddPodfileContent);
}
/// <summary>
/// Get the path to the generated Podfile.
/// </summary>
private static string GetPodfilePath(string pathToBuiltProject) {
    return Path.Combine(pathToBuiltProject, "Podfile");
}

これでビルドを実行すると、Podfileの記述も更新され、更新されたPodfileでpod installが実行されました。

おわり

公式の対応はよ