Xcode 8のリリースで、Appleは署名設定を管理する新しい方法を導入しました。これで、2つのオプションManual
とAutomatic
があります。
コード署名に関するWWDC 2016セッション (WWDC 2016-401-Xcodeアプリ署名の新機能) によると、Automatic
署名を選択すると、Xcodeは次のようになります:
しかし、そのセッションでAppleが言ったことによると、Automatic Signing
はDevelopment signing
を使用し、Xcodeで作成されたプロビジョニングプロファイルに制限されます。
問題は、CI環境(Travis CIやJenkinsなど)でAutomatic Signing
を使用しようとすると発生します。自動を使用し、Distributionに署名し続ける簡単な方法を見つけることができません(Xcodeでは開発およびXcodeで作成されたプロビジョニングプロファイルを使用する必要があるため)。
新しい「Xcodeで作成されたプロビジョニングプロファイル」は開発者ポータルに表示されませんが、そのマシンで見つけることができます...これらのプロファイルをCIマシンに移動し、Development
用にビルドし、Distribution
用にエクスポートする必要がありますか? xcodebuild
を使用してAutomatic Signing
をオーバーライドする方法はありますか?
いくつかのオプションを試した後、これらはCIサーバーで使用できたソリューションです。
Automatic signing
を使用すると、Developer
証明書とauto-generated provisioning profiles
を使用する必要があります。 1つのオプションは、開発証明書と秘密キー(アプリケーション->ユーティリティ->キーチェーンアクセス)および自動生成されたプロビジョニングプロファイルをCIマシンにエクスポートすることです。自動生成されたプロビジョニングプロファイルを見つける方法は、~/Library/MobileDevice/Provisioning\ Profiles/
に移動し、すべてのファイルをバックアップフォルダーに移動し、Xcodeを開いてプロジェクトをアーカイブすることです。 Xcodeは自動生成された開発プロビジョニングプロファイルを作成し、Provisioning Profiles
フォルダーにコピーします。
xcodebuild archive ...
は、Development
に署名された.xcarchive
を作成します。 xcodebuild -exportArchive ...
は、Distribution
のビルドを再署名できます
xcodebuild
を呼び出す前に、回避策は、プロジェクトファイル内のProvisioningStyle = Automatic
のすべてのインスタンスをProvisioningStyle = Manual
に置き換えることです。 sed
は、pbxproj
ファイル内の単純な検索置換に使用できます。
sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' <ProjectName>.xcodeproj/project.pbxproj
@thelvisは、xcodeproj
gemを使用してこれを行う Rubyスクリプト も作成しました。スクリプトを使用すると、変更内容をより適切に制御できます。
xcodebuild
は、プロジェクトに設定されたコード署名ID(CODE_SIGN_IDENTITY
)とプロビジョニングプロファイル(PROVISIONING_PROFILE_SPECIFIER
)を使用します。これらの設定は、xcodebuild
のパラメーターとして提供することもでき、プロジェクトで設定されたコード署名IDやプロビジョニングプロファイルを上書きします。
編集:Xcode 9では、
xcodebuild
にAutomatic
とManual
の間で選択する新しいビルド設定パラメーターCODE_SIGN_STYLE
があります。プロジェクトファイルで自動のインスタンスを見つけて手動で置き換える必要はありません。詳細は WWDC 2017 Session 403 What's XcodeおよびXcodeサーバーの署名の新機能
手動署名により、使用されているコード署名IDとプロビジョニングプロファイルを完全に制御できます。これはおそらく最もクリーンなソリューションですが、自動署名のすべての利点を失うというマイナス面があります。
Xcode 8によるコード署名の詳細については、これをお勧めします 記事 およびWWDC2016セッション 401-Xcodeアプリ署名の新機能
基本的に、Jenkins CIとXcodeプラグインを使用して同じ問題に遭遇します。 xcodebuild
を使用して、自分でビルドとコード署名を行うことになりました。
次の手順を正常に完了するには、必要なプロビジョニングプロファイルと証明書をインストールする必要があります。つまり、コード署名は既に一般的に機能しているはずです。
xcodebuild -project <path/to/project.xcproj> -scheme <scheme-name> -configuration <config-name> clean archive -archivePath <output-path> DEVELOPMENT_TEAM=<dev-team-id>
DEVELOPMENT_TEAM
:10桁の開発者チームID(A1B2C3D4E5など)xcodebuild -exportArchive -archivePath <path/to/your.xcarchive> -exportOptionsPlist <path/to/exportOptions.plist> -exportPath <output-path>
exportOptions.plist
の例:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>development</string>
<key>teamID</key>
<string> A1B2C3D4E5 </string>
</dict>
</plist>
method
:development
、app-store
、ad-hoc
、enterprise
のいずれかteamID
:10桁の開発者チームID(A1B2C3D4E5など)とにかく、このプロセスは、たとえばJenkins Xcodeプラグインが実行する処理よりも、Xcodeを手動で実行する処理に近いものです。
注:.xcarchiveファイルは常に開発署名されますが、2番目のステップでメソッドとして「app-store」を選択すると、正しい配布署名が行われ、配布プロファイルが「embedded.mobileprovision」として含まれます。 =
お役に立てれば。
私はまだここで言及されていない別のオプションを検討しています。署名設定のみが異なる2つの同一のターゲットをセットアップします。
欠点は、2つの同一のターゲットを管理する必要があることです。利点は、開発用の自動署名の利点を得ることができ、ビルド時間の直前にプロジェクトを変更する潜在的に脆弱なスクリプトを維持する必要がないことです。
CIにXcode 8.xおよびJenkinsを使用している場合。次に、「「YourProjectName」に署名するには開発チームが必要です」という問題に直面するでしょう。プロジェクトエディターで開発チームを選択します。
SDK「iOS 10.1」の製品タイプ「アプリケーション」にはコード署名が必要です。** **ジョブの実行時にビルドに失敗しました**。
解決策は何ですか?.
解決策は次のとおりです。
xcodeプロジェクトのビルド設定でプロビジョニングプロファイルをなしに設定します。
Jenkinsで、Xcode設定の前に実行シェルを作成し、以下のコマンドを記述します
sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' ProjectName.xcodeproj/project.pbxproj
覚えておいてください:jenkinsのBuildセクションでXcode設定の前にシェルを実行し続けます。
これは動作します。
私にとっては、何もうまくいきませんでした。次のリンクに示すように、Mac Mini(Jenkinsを備えたCIサーバー)にインストールされているXcodeアプリのファイルを変更することで問題を解決しました。
https://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts/
さらに、Xcodeからの自動署名をオフにしました。
全部できた!最後に動作します!
UnityビルドがXCodeプロジェクトにProvisioningStyleキーを追加しないことに気付きました。その後、「PostProcessBuild」ビルドスクリプトを使用して、ProvisioningStyleを手動で追加する方法を見つけました。つまり、UnityによってIOS XCodeプロジェクトがビルドされた後に呼び出されるコードの単位です。
最初に、project.pbxprojファイルがどのように見えるかを確認しました-手動プロビジョニングに設定されている場合:
/* Begin PBXDictionary section */
29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
attributes = {
TargetAttributes = {
1D6058900D05DD3D006BFB54 /* Unity-iPhone */ = {
ProvisioningStyle = Manual;
};
5623C57217FDCB0800090B9E /* Unity-iPhone Tests */ = {
TestTargetID = 1D6058900D05DD3D006BFB54 /* Unity-iPhone */;
};
};
};
次に、上記のファイルの「構造」を複製するコードを作成しました。 (ここにあるXCodeEditorプロジェクトを使用: XCodeEditor )
[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget target, string path)
{
// Create a new project object from build target
XCProject project = new XCProject(path);
if (target == BuildTarget.iOS)
{
//Add Manual ProvisioningStyle - this is to force manual signing of the XCode project
bool provisioningSuccess = AddProvisioningStyle(project, "Manual");
if (provisioningSuccess)
project.Save();
}
}
private static bool AddProvisioningStyle(XCProject project, string style)
{
var pbxProject = project.project;
var attr = pbxProject.data["attributes"] as PBXDictionary;
var targetAttributes = attr["TargetAttributes"] as PBXDictionary;
var testTargetIDGuid = FindValue(targetAttributes, "TestTargetID");
if (!string.IsNullOrEmpty(testTargetIDGuid))
{
var settings = new PBXDictionary();
//here we set the ProvisioningStyle value
settings.Add("ProvisioningStyle", style);
targetAttributes.Add(testTargetIDGuid, settings);
var masterTest = FindValue(targetAttributes, "ProvisioningStyle");
if (masterTest == style)
{
return true;
}
}
return false;
}
private static string FindValue(PBXDictionary targetAttributes, string key)
{
foreach (var item in targetAttributes)
{
var ma = item.Value as PBXDictionary;
foreach (var di in ma)
{
var lookKey = di.Key;
if (lookKey == key)
{
return di.Value.ToString();
}
}
}
return "";
}
fastlane と呼ばれるツールがあり、xcodebuildの使用がはるかに簡単になり、維持されているため、新しい更新プログラムは引き続きxcodeの変更をサポートします。サポートしている他の多くのXcode自動化ツールの中で、アプリをビルドしてコード署名するためのスクリプトと設定を簡単に作成できます。調べてみることをお勧めします。
私のためにそれを修正したのはこれでした: http://code-dojo.blogspot.jp/2012/09/fix-ios-code-signing-issue-when-using.html
...証明書をログインキーチェーンからシステムキーチェーンにコピーしています。また、すべての開発者証明書を「すべてのアプリケーションがこのアイテムにアクセスすることを許可する」に設定することもできます(右クリック/情報の取得/アクセス制御)。