【问题标题】:Setting a provisioning profile from within xcodebuild when making iPhone apps制作 iPhone 应用程序时从 xcodebuild 中设置配置文件
【发布时间】:2023-04-10 17:02:01
【问题描述】:

我正在使用xcodebuild 从命令行编译我的 iPhone 应用程序。有没有办法通过某种选项来设置配置文件?总的来说,关于 xcodebuild 的信息似乎并不多。

【问题讨论】:

    标签: iphone xcode xcodebuild provisioning


    【解决方案1】:

    其实,你应该可以将它添加到 XCode 命令行设置中。

    xcodebuild [无论您有什么其他选项] PROVISIONING_PROFILE="[您的个人资料唯一 ID]"

    命令行中的构建设置应该覆盖所有内容,因此这应该胜过项目或目标中定义的任何内容。

    【讨论】:

    • 一件事让我很吃惊:您在 XCode 界面中看到的设置实际上是两个设置 - PROVISIONING_PROFILE 和 CODE_SIGN_IDENTITY。如果您从事客户端工作并拥有多个签名身份,请注意从命令行正确设置这两个身份。
    • 如何找到PROVISIONING_PROFILE的名字和CODE_SIGN_IDENTITY的名字?
    • PROVISIONING_PROFILE 的 UDID 来自配置文件本身。配置文件在技术上是二进制文件,因为它们包含签名数据,但您仍然可以在文本编辑器中打开它们并查找 UDID:UUIDlongstring。 CODE_SIGN_IDENTITY 是您可以在钥匙串访问中看到的证书的“通用名称”字段。
    • 另外,当您在 xcode 中选择了正确的配置文件时,打开配置文件选择的东西并在底部选择“其他...”。您将获得一个带有所选配置文件 ID 的文本字段
    【解决方案2】:

    我的解决方案并不优雅,但它确实完成了工作,让我可以自动化构建服务器上的所有内容:

    #!/bin/bash
    
    TARGET="Your App"
    CONFIGURATION="Release"
    SDK="iphoneos"
    PROFILE_PATH="/Users/jkp/Desktop/foo.mobileprovision"
    IDENTITY="iPhone Distribution: Your Company Ltd"
    KEYCHAIN="/Users/jkp/Desktop/keychain"
    PASSWORD="foobar"
    
    open "${PROFILE_PATH}"
    sleep 5
    osascript -e "tell application \"Xcode\" to quit"
    security unlock-keychain -p ${PASSWORD} ${KEYCHAIN}
    xcodebuild \
      -target "${TARGET}" \
      -configuration ${CONFIGURATION} \
      -sdk iphoneos \
      CODE_SIGN_IDENTITY="${IDENTITY}" \    
      OTHER_CODE_SIGN_FLAGS="--keychain ${KEYCHAIN}"
    

    这里的关键是我不需要先安装配置文件。实际上,我还有另一个脚本,它使用 mechanize 在每次构建之前下载配置文件的最新副本,这意味着我们可以远程更新配置文件(例如添加新设备),并让我们的 CI 服务器接收这些更改,而无需任何额外的工作。

    注意:我已经找到了一种安装或更新配置文件的方法,而根本不需要涉及 Xcode - 更简洁!详情请参阅here

    【讨论】:

    【解决方案3】:

    供应配置文件必须由 UUID 提供,在我的情况下,供应配置文件已签入源代码控制系统,因此由开发人员/构建服务器/CI 系统与代码一起签出。在源代码树中,配置文件具有人类可读的名称,例如 MyApp.mobileprovison,并且位于名为“ProvisioningProfiles”的目录中。要创建 xcode 存档,必须重命名配置文件并将其复制到 ~/Library/MobileDevice/Provisioning Profiles 目录,然后 xcodebuild 才能识别它们。这是一个可以在 CI 构建脚本中使用的代码 sn-p。

    # The keychain needs to be unlocked for signing, which requires the keychain
    # password. This is stored in a file in the build account only accessible to
    # the build account user
    if [ ! -f $HOME/.pass ] ; then
        echo "no keychain password file available"
        exit 1
    fi
    
    case `stat -L -f "%p" $HOME/.pass`
    in
        *400) ;;
        *)
            echo "keychain password file permissions are not restrictive enough"
            echo "chmod 400 $HOME/.pass"
            exit 1
            ;;
    esac
    
    #
    # unlock the keychain, automatically lock keychain on script exit
    #
    security unlock-keychain -p `cat $HOME/.pass` $HOME/Library/Keychains/login.keychain
    trap "security lock-keychain $HOME/Library/Keychains/login.keychain" EXIT
    
    #
    # Extract the profile UUID from the checked in Provisioning Profile.
    #
    uuid=`/usr/libexec/plistbuddy -c Print:UUID /dev/stdin <<< \
            \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``
    
    #
    # Copy the profile to the location XCode expects to find it and start the build,
    # specifying which profile and signing identity to use for the archived app
    #
    cp -f ProvisioningProfiles/MyApp.mobileprovision \
            "$HOME/Library/MobileDevice/Provisioning Profiles/$uuid.mobileprovision"
    xcodebuild -workspace MyApp.xcworkspace -scheme MyScheme \
            -archivePath build/MyApp.xcarchive archive \
            PROVISIONING_PROFILE="$uuid" CODE_SIGN_IDENTITY="iOS Distribution"
    

    必须解锁钥匙串,并且必须允许“/usr/bin/codesign”工具访问与签名身份相关的私钥才能工作 - 以下参考用于解锁 https://stackoverflow.com/a/21327591/2351246Add codesign to private key ACL without Keychain并分别为协同设计添加钥匙串访问权限。

    如果随后要使用 xcodebuild 将存档导出到 IPA,则必须考虑以下问题 (xcodebuild not copying file from .app)。需要再次提供配置文件。创建IPA的脚本sn-p是

    profileName=`/usr/libexec/plistbuddy -c Print:Name /dev/stdin <<< \
            \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``
    
    xcodebuild \
            -exportArchive \
            -exportFormat IPA \
            -archivePath build/MyApp.xcarchive \
            -exportPath $IPADIR/MyApp.ipa \
            -exportProvisioningProfile "$profileName"
    

    此命令运行时必须解锁钥匙串。

    更新

    在 OSX Mavericks (v10.9.5) 和 OSX Yosemite 上,我们开始看到代码签名错误:

    Codesign check fails : ...../MyApp.app: resource envelope is obsolete
    

    在此处查看此帖子以了解原因xcodebuild - codesign -vvvv says"resource envelope is obsolete"

    要实施 Apple 支持在引用的帖子中建议的更改,请运行以下命令:

     sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication`
    

    【讨论】:

    • 为我们工作!感谢您的想法!
    • 我最喜欢的 SO 答案之一,这里有很多适用于 iOS 构建脚本的优秀技术。特别喜欢从 *.mobileprovision 中提取 UUID 的方法。
    • 在生成存档时尝试此方法给了我一个错误——第一个代码块中的最后一个命令。我不得不用 APP_PROFILE 替换 PROVISIONING_PROFILE 以防止使用应用程序配置文件构建 cocoapods pod。我遇到的错误:在您的构建设置中指定的配置文件(“PROVISIONING PROFILE NAME”)的 AppID 为“APP_ID”,与您的包标识符“org.cocoapods.Alamofire”不匹配。
    【解决方案4】:

    我意识到这可能有点偏离 OP 主题,但是在搜索如何让 Xcode 构建在 Jenkins 上运行时,首先会出现这个问题。在此处发布一些其他信息以供后代使用。和积分。如果你觉得这个有用,请给分:)

    无论如何,最近几次在这个上进行了几轮。发现这个:

    http://code-dojo.blogspot.co.uk/2012/09/fix-ios-code-signing-issue-when-using.html

    似乎有效。确保:

    1. 首先将 Xcode 构建设置为普通 OSX 用户;让它从那里构建您的可分发文件,通过 Xcode 修复任何配置文件问题;

    2. 以普通 OSX 用户的身份使用 xcodebuild 进行命令行构建;

    3. 然后按照上面帖子中的说明操作,将所有 iOS 证书从 Login Keychain 复制到 System 并将 ~/Library/MobileDevice/Provisioning Profiles 复制到 Jenkins 用户的 ~jenkins/Library/MobileDevice/Provisioning Profiles 文件夹。

    下一个 Jenkins 构建,使用上面第 2 步中的命令,应该可以完美运行。

    【讨论】:

      【解决方案5】:

      Documentation

      从文档看来,您无法设置配置文件,但您可以指定目标:

      [-target 目标名称]

      因此,如果您为每个配置文件创建一个目标,您可以从命令行中选择正确的目标。

      这基本上可以满足您的要求。

      【讨论】:

      • 谢谢。我已经看到了,这并不像我想要的那样优雅,但我认为它仍然会按照我想要的方式工作。
      • 您应该取消选中此选项作为正确答案。罗布的回答是正确的。一秒钟前刚刚尝试过,我可以很好地覆盖配置文件。
      【解决方案6】:

      您可以创建 ExportOption.plist 文件,在其中设置所有参数,例如: compileBitcode、teamID、证书和配置文件。

      然后进入终端中的项目文件夹并使用命令创建存档,例如:

      xcodebuild -quiet -workspace <ProjectName>.xcworkspace -scheme <ProjectScheme> -sdk iphoneos -configuration Release -destination generic/platform=iOS clean archive -archivePath <PathForArchive>/<ProjectName>.xcarchive
      

      接下来将 ExportOption.plist 放到当前文件夹(PathForArchive)并运行:

      xcodebuild -quiet -exportArchive -archivePath <ProjectName>.xcarchive -exportOptionsPlist ExportOptions.plist -exportPath <PathForExport>
      

      您将在文件夹中拥有一个 .ipa,其设置来自 ExportOptions.plist

      Example of ExportOption.plist

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多