在CI(Travis/Jenkins)环境中使用xcodebuild(Xcode 8)和自动签名

tf7tbtn2  于 2022-11-21  发布在  Jenkins
关注(0)|答案(9)|浏览(231)

随着Xcode 8的发布,Apple引入了一种管理签名配置的新方法,现在你有两个选项ManualAutomatic
根据WWDC 2016关于代码签名(WWDC 2016 - 401 - What's new in Xcode app signing)的会议,当您选择Automatic签名时,Xcode将:

  • 创建签名证书
  • 创建和更新应用程序ID
  • 创建和更新预置描述文件

但根据苹果在那次会议上所说的,Automatic Signing将使用Development signing,并将仅限于Xcode创建的配置文件。
当您尝试在CI环境(如Travis CI或Jenkins)中使用Automatic Signing时,就会出现此问题。我无法找到一种简单的方法来继续使用Automatic和sign for Distribution(因为Xcode强制您使用Development和Xcode创建的预置配置文件)。
新的“Xcode创建的预置描述文件”没有显示在开发者门户中,尽管我可以在我的机器中找到它...我是否应该将这些描述文件移动到CI机器,为Development构建并为Distribution导出?是否有办法使用xcodebuild覆盖Automatic Signing

wsewodh2

wsewodh21#

我在使用Jenkins CI和Xcode插件时基本上遇到了同样的问题。我最终使用X1 M0 N1 X自己做了构建和代码设计的工作。

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(类似于A1 B2 C3 D4 E5)

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>
  • method:是developmentapp-storead-hocenterprise中的一个
  • teamID:10位数的开发团队ID(类似于A1 B2 C3 D4 E5)

这个过程无论如何都更接近于你手动使用Xcode所做的,而不是Jenkins Xcode插件所做的。

注意:.xcarchive文件将始终进行开发签名,但在第2步中选择“app-store”作为方法将执行正确的分发签名,并将分发配置文件包括为“embedded.mobileprovision”。

希望这对你有帮助。

t1qtbnec

t1qtbnec2#

在尝试了几个选项后,我可以在CI服务器上使用以下解决方案:

  • ####在CI环境中包括开发人员证书和私钥以及自动生成的预置配置文件:

使用Automatic signing会强制您使用Developer证书和auto-generated provisioning profiles。(应用程序-〉实用程序-〉钥匙串访问)和自动生成的配置文件到CI计算机。找到自动生成的配置文件的方法是导航到~/Library/MobileDevice/Provisioning\ Profiles/,将所有文件移动到备份文件夹,打开Xcode并归档项目。Xcode将创建自动生成的开发预置描述文件,并将它们复制到Provisioning Profiles文件夹。
xcodebuild archive ...将创建一个为Development签名的.xcarchivexcodebuild -exportArchive ...然后可以为Distribution重新生成

  • ####在CI环境上构建时,将“自动”替换为“手动”

在调用xcodebuild之前,解决方法是在项目文件中将ProvisioningStyle = Automatic的所有示例替换为ProvisioningStyle = Manualsed可用于在pbxproj文件中进行简单的查找和替换:
x1米15英寸
@thelvis还使用xcodeproj gem创建了一个Ruby script来实现这一点。
然后,xcodebuild将使用项目中设置的代码签名标识(CODE_SIGN_IDENTITY)以及预置描述文件(PROVISIONING_PROFILE_SPECIFIER)。这些设置也可以作为参数提供给xcodebuild,它们将覆盖项目中设置的代码签名标识和/或预置描述文件。
编辑:在Xcode 9中,xcodebuild有一个新的构建设置参数CODE_SIGN_STYLE,可在AutomaticManual之间进行选择,因此无需在项目文件中查找自动示例并将其替换为手动示例,更多信息请参见WWDC 2017 Session 403 What's New in Signing for Xcode and Xcode Server

  • ####切换到手动签名

手动签名将提供对正在使用的代码签名身份和预置描述文件的完全控制。这可能是最干净的解决方案,但缺点是失去了自动签名的所有优点。
要了解更多关于Xcode 8的代码签名,我强烈推荐这个article以及WWDC2016会话401 - What's new in Xcode app signing

omvjsjqw

omvjsjqw3#

我正在考虑另一个我还没有在这里看到的选项。设置两个相同的目标,只是在他们的签名设置不同。

*开发目标在添加新设备/开发人员时使用自动签名来获得所有这些好处
*CI目标使用手动签名

缺点是您必须管理两个相同的目标。优点是可以获得开发自动签名的好处,并且不必维护在生成时间之前修改项目的潜在脆弱脚本。

mbskvtky

mbskvtky4#

如果您正在使用Xcode 8.x和Jenkins for CI,那么您可能会遇到“为“YourProjectName”签名需要开发团队“的问题。请在项目编辑器中选择一个开发团队。
SDK“iOS 10.1”中的产品类型“应用程序”需要代码签名“。运行作业时生成失败
解决办法是什么?
解决的办法是:
1.在Xcode项目构建设置中将预置描述文件设置为“无”。
1.在jenkins中,在Xcode设置之前创建一个执行shell,并编写以下命令

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

记住:在Jenkins的Build部分中,在Xcode设置之前保留执行shell。
这很管用。

ryevplcw

ryevplcw5#

对我来说,什么都不起作用。我解决了我的问题,改变了一个文件在Xcode应用程序安装在您的Mac Mini(CI服务器与Jenkins),如图所示,在这个链接:
https://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts/
此外,我还关闭了Xcode的自动签名功能。
好了!终于成功了!

des4xlb0

des4xlb06#

我注意到我的Unity构建从来没有向我的XCode项目添加ProvisioningStyle键。然后我找到了一种方法,通过使用“PostProcessBuild”构建脚本手动添加ProvisioningStyle。即Unity构建IOS XCode项目后调用的代码单元。
首先,我看了一下项目.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项目:(第10页)

[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 "";
}
dced5bon

dced5bon7#

对我来说,解决问题的方法是:http://code-dojo.blogspot.jp/2012/09/fix-ios-code-signing-issue-when-using.html
...正在将证书从“登录”钥匙串复制到“系统”钥匙串。您可能还想要将所有开发证书设定为“允许所有应用程序访问此项目”(右键单击/显示简介/访问控制)。

y1aodyip

y1aodyip8#

当目标(或项目)中指定的签名失败时,还有一种方法可以解决CI/CD管道中的非功能性签名。
我们为应用程序使用自动签名,以获得良好的开发者体验,而在CI/CD中,只有在生成.ipa时的最后一步才进行签名。
1.生成未签名的.xcarchive

xcodebuild -workspace Runner.workspace  CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO <more parameters follow>

1.使用exportOptions.plist中的配置签署最终的.ipa文件

xcodebuild -exportArchive -archivePath <.xcarchive> -exportOptionsPlist <exportOptions.plist> -exportPath <output-path>
qq24tv8q

qq24tv8q9#

有一个叫做fastlane的工具可以让xcodebuild的使用变得更容易,并且它的维护意味着新的更新将继续支持xcode的更改。它可以让你更容易地创建脚本和配置来构建和代码设计你的应用程序,以及它支持的许多其他xcode自动化工具。我建议你看看它。

相关问题