web-dev-qa-db-ja.com

xcodebuild(Xcode 8)とCI(Travis / Jenkins)環境での自動署名を使用します

Xcode 8のリリースで、Appleは署名設定を管理する新しい方法を導入しました。これで、2つのオプションManualAutomaticがあります。

コード署名に関するWWDC 2016セッション (WWDC 2016-401-Xcodeアプリ署名の新機能) によると、Automatic署名を選択すると、Xcodeは次のようになります:

  • 署名証明書を作成する
  • アプリIDの作成と更新
  • プロビジョニングプロファイルを作成および更新する

しかし、そのセッションでAppleが言ったことによると、Automatic SigningDevelopment signingを使用し、Xcodeで作成されたプロビジョニングプロファイルに制限されます。

問題は、CI環境(Travis CIやJenkinsなど)でAutomatic Signingを使用しようとすると発生します。自動を使用し、Distributionに署名し続ける簡単な方法を見つけることができません(Xcodeでは開発およびXcodeで作成されたプロビジョニングプロファイルを使用する必要があるため)。

新しい「Xcodeで作成されたプロビジョニングプロファイル」は開発者ポータルに表示されませんが、そのマシンで見つけることができます...これらのプロファイルをCIマシンに移動し、Development用にビルドし、Distribution用にエクスポートする必要がありますか? xcodebuildを使用してAutomatic Signingをオーバーライドする方法はありますか?

72
pablobart

いくつかのオプションを試した後、これらはCIサーバーで使用できたソリューションです。

  • 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のビルドを再署名できます

  • CI環境で構築する場合、「自動」を「手動」に置き換えます

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では、xcodebuildAutomaticManualの間で選択する新しいビルド設定パラメーターCODE_SIGN_STYLEがあります。プロジェクトファイルで自動のインスタンスを見つけて手動で置き換える必要はありません。詳細は WWDC 2017 Session 403 What's XcodeおよびXcodeサーバーの署名の新機能

  • 手動署名に切り替える

手動署名により、使用されているコード署名IDとプロビジョニングプロファイルを完全に制御できます。これはおそらく最もクリーンなソリューションですが、自動署名のすべての利点を失うというマイナス面があります。

Xcode 8によるコード署名の詳細については、これをお勧めします 記事 およびWWDC2016セッション 401-Xcodeアプリ署名の新機能

35
pablobart

基本的に、Jenkins CIとXcodeプラグインを使用して同じ問題に遭遇します。 xcodebuildを使用して、自分でビルドとコード署名を行うことになりました。

0.前提条件

次の手順を正常に完了するには、必要なプロビジョニングプロファイルと証明書をインストールする必要があります。つまり、コード署名は既に一般的に機能しているはずです。

1. .xcarchiveの構築

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など)

2. .ipaへのエクスポート

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>
  • methoddevelopmentapp-storead-hocenterpriseのいずれか
  • teamID:10桁の開発者チームID(A1B2C3D4E5など)

とにかく、このプロセスは、たとえばJenkins Xcodeプラグインが実行する処理よりも、Xcodeを手動で実行する処理に近いものです。

注:.xcarchiveファイルは常に開発署名されますが、2番目のステップでメソッドとして「app-store」を選択すると、正しい配布署名が行われ、配布プロファイルが「embedded.mobileprovision」として含まれます。 =

お役に立てれば。

60
d4Rk

私はまだここで言及されていない別のオプションを検討しています。署名設定のみが異なる2つの同一のターゲットをセットアップします。

  • 開発ターゲット自動署名を使用して、新しいデバイス/開発者が追加されたときにこれらの利点をすべて取得します
  • CIターゲット手動署名を使用

欠点は、2つの同一のターゲットを管理する必要があることです。利点は、開発用の自動署名の利点を得ることができ、ビルド時間の直前にプロジェクトを変更する潜在的に脆弱なスクリプトを維持する必要がないことです。

2
Paul Buchanan

CIにXcode 8.xおよびJenkinsを使用している場合。次に、「「YourProjectName」に署名するには開発チームが必要です」という問題に直面するでしょう。プロジェクトエディターで開発チームを選択します。

SDK「iOS 10.1」の製品タイプ「アプリケーション」にはコード署名が必要です。** **ジョブの実行時にビルドに失敗しました**。

解決策は何ですか?.

解決策は次のとおりです。

  1. xcodeプロジェクトのビルド設定でプロビジョニングプロファイルをなしに設定します。

  2. Jenkinsで、Xcode設定の前に実行シェルを作成し、以下のコマンドを記述します

    sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' ProjectName.xcodeproj/project.pbxproj 
    

    覚えておいてください:jenkinsのBuildセクションでXcode設定の前にシェルを実行し続けます。

これは動作します。

2
Ajeet Sharma

私にとっては、何もうまくいきませんでした。次のリンクに示すように、Mac Mini(Jenkinsを備えたCIサーバー)にインストールされているXcodeアプリのファイルを変更することで問題を解決しました。
https://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts/
さらに、Xcodeからの自動署名をオフにしました。

全部できた!最後に動作します!

1

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 "";
}
0
UberGeoff

fastlane と呼ばれるツールがあり、xcodebuildの使用がはるかに簡単になり、維持されているため、新しい更新プログラムは引き続きxcodeの変更をサポートします。サポートしている他の多くのXcode自動化ツールの中で、アプリをビルドしてコード署名するためのスクリプトと設定を簡単に作成できます。調べてみることをお勧めします。

0
lastlink

私のためにそれを修正したのはこれでした: http://code-dojo.blogspot.jp/2012/09/fix-ios-code-signing-issue-when-using.html

...証明書をログインキーチェーンからシステムキーチェーンにコピーしています。また、すべての開発者証明書を「すべてのアプリケーションがこのアイテムにアクセスすることを許可する」に設定することもできます(右クリック/情報の取得/アクセス制御)。

0
BadmintonCat