【问题标题】:Can xcodebuild manage automatic signing?xcodebuild 可以管理自动签名吗?
【发布时间】:2017-11-12 01:13:44
【问题描述】:

总结:

如果您在 Xcode 8 中打开一个启用了“自动管理签名”并使用新的捆绑包 ID 的项目,它将自动为其创建和下载配置文件。但是我怎样才能使xcodebuild 发生同样的事情,以便我可以在远程构建服务器上使用它?

详情:

我正在尝试在 Mac 上构建 Cordova 应用程序。 Cordova 将 Xcode 项目配置为使用“自动管理签名”,所以我正在尝试使用它。

我经常更改捆绑包 ID,因此我希望 Cordova 能够使用以前从未使用过的新捆绑包 ID 构建它。

但是当我运行 cordova build ios --release --device --buildConfig build.json 时,我得到一个返回码 65 和以下错误:

Check dependencies
No profiles for 'com.my.bundle.id' were found:  Xcode couldn't find a provisioning profile matching 'com.my.bundle.id'.
Code signing is required for product type 'Application' in SDK 'iOS 10.3'

** ARCHIVE FAILED **

The following build commands failed:
    Check dependencies
(1 failure)
Error: Error code 65 for command: xcodebuild with args: -xcconfig,/cordova-project/platforms/ios/cordova/build-debug.xcconfig,-workspace,MyApp.xcworkspace,-scheme,MyApp,-configuration,Debug,-destination,generic/platform=iOS,-archivePath,MyApp.xcarchive,archive,CONFIGURATION_BUILD_DIR=/cordova-project/platforms/ios/build/device,SHARED_PRECOMPS_DIR=/cordova-project/platforms/ios/build/sharedpch

(我可以手动运行那个 xcodebuild 命令并得到相同的错误,所以这可能不是 Cordova 问题。)

我的 build.json 文件如下所示:

{
    "ios": {
        "debug": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "MY_TEAM_ID",
            "packageType": "development"
        },
        "release": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "MY_TEAM_ID",
            "packageType": "enterprise"
        }
    }
}

我使用的是 cordova 7.0.1、cordova-ios 4.4.0、Xcode 8.3.3 和 MacOS 10.12.5。我有一个 Apple Enterprise 帐户。

我尝试了什么:

如果我在 Xcode 中打开生成的项目,它会修复自动签名,然后我可以使用该捆绑 ID 成功运行 cordova。但如果我尝试使用不同的捆绑 ID 运行它,它会再次失败。

我首先尝试使用security unlock-keychain ~/Library/Keychains/login.keychain-db,因为这在过去有效,但没有帮助。

我还尝试在 Keychain Access 中打开我的私人签名密钥并将其设置为“允许所有应用程序访问此项目”,但没有任何运气。

无论我将--debug 还是--release 传递给cordova,我都会收到相同的错误。

【问题讨论】:

标签: ios xcode cordova xcode8


【解决方案1】:

答案是肯定的。我使用的和我可以确认的东西是有效的,它很棒:

https://fastlane.tools/

您可以将所有内容设置为自动:

  1. 签名密钥
  2. 截屏
  3. 在 iTunes 上上传

还有很多其他的

在后台它使用 xcodebuild 命令行。我怀疑这样的事情是否可行,但只需设置、开始和享受。

【讨论】:

    【解决方案2】:

    无法使用xcodebuild 自动管理签名。您必须使用前面提到的Fastlane 之类的第三方,或者使用here 中提到的手动代码签名。

    【讨论】:

      【解决方案3】:

      您可以使用 fastlane 来完成。

      https://fastlane.tools/

      cert:获取或生成最新的可用代码签名身份

      sigh:生成配置文件。将配置文件存储在当前文件夹中

      ps:如果您是从 CI 服务器(例如 jenkins)运行它,则需要解锁登录钥匙串:

      security unlock-keychain -p PASSWORD /Users/YOUR-USER/Library/Keychains/login.keychain
      

      fastfile 中的示例:

      cert(
        development: true,
      )
      
      sigh(
        development: true,
        app_identifier: "YOUR_APP_IDENTIFIER"
      )
      

      这是一个基本的 Fastfile 示例:

      fastlane_version "2.27.0"
      default_platform :ios
      
      platform :ios do
      
      lane :beta do
         cert
         sigh
         gym
      end
      
      error do |lane, exception|
        puts "Got an error! #{exception.error_info.to_s}"
      end
      
      end
      

      【讨论】:

        【解决方案4】:

        这在 Xcode 8 中不直接支持。但是,在 Xcode 9 中,您可以将 -allowProvisioningUpdates 传递给 xcodebuild,自动签名将像在 Xcode UI 中一样工作,无需任何其他工具。

        例如cordova run ios --buildFlag="-allowProvisioningUpdates"

        【讨论】:

        • 我认为这在技术上是我所问问题的唯一答案,即使这意味着要等到 Xcode 9。所以恭喜!
        • 如何使用cordova build 命令传递这个参数?我试过--buildFlag="-allowProvisioningUpdates",但似乎被忽略了
        • @itai195 你似乎遗漏了一个非常重要的难题。一个人实际上是如何将该标志传递给 xcodebuild 命令的。我试过cordova build ios .... -- -allowProvisioningUpdates,但没用。
        • 这将在下一版本的 Cordova-iOS 中提供,并将通过在命令行中指定 --automaticProvisioning 或在 build.json 中指定 "automaticProvisioning": true 来启用。
        • 我正在做cordova run ios --buildFlag="-allowProvisioningUpdates",它工作正常。我正在使用全新安装的 Cordova 7.1.0。
        【解决方案5】:

        正如其他一些答案已经提到的,您正在寻找的是一个名为 Fastlane 的发布自动化工具。 https://fastlane.tools/

        如果您不熟悉它,我相信最好的入门地点是 raywenderlich 的 fastlane 教程。

        https://www.raywenderlich.com/136168/fastlane-tutorial-getting-started-2

        【讨论】:

          【解决方案6】:

          注意:此答案假定捆绑 ID 和配置文件是手动创建的。使用此方法只能自动化构建过程。

          是的,即使不使用第三方工具也可以。您应该习惯于使用脚本文件或 make 文件。我在工作时在 Mac Mini 上的 makefile 中使用了 2 行代码。这为我们提供了 ad-hocappstore 版本,可以根据我们的配置进行上传。

          1. 确保您的项目已启用自动配置。
          2. 确保在您的远程 Mac 上下载了所有唱歌证书和配置。对于这种情况,对于第一个构建,我总是在我的远程机器上打开 Xcode 并构建和导出。如果这行得通,那么什么都不会丢失。但请确保您始终允许访问歌唱证书。 Xcode 还要求第一个构建。否则,您的远程服务器上会显示一个弹出窗口,并等待有人允许访问签名证书。
          3. 您需要一个 plist 文件:
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
          <plist version="1.0">
          <dict>  
            <key>teamID</key>  
            <string>MY_TEAM_ID_XXYY</string> //put your iPhone distribution team ID. in my case developer team ID is different than my distribution team ID. just wondering.
            <key>method</key>  
            <string>app-store</string> // for appstore upload or use <string>ad-hoc</string> for ad-hoc  
            <key>uploadSymbols</key>  
            <true/>  
            <key>uploadBitcode</key>  
            <true/>  
          </dict>  
          </plist>
          

          您应该将 plist 配置保存在可访问的位置,例如,作为 options.plist 只是提醒一下:确保您的远程 Mac 上有临时/分发配置文件。

          1. xcodebuild 将创建一个存档,然后我们可以导出 .app。在您的 make 文件或脚本文件中使用这些行:

          4.1。首先我们创建存档文件。

          xcodebuild archive -derivedDataPath build/ -project myProject.xcodeproj -scheme myScheme -archivePath build/ios/myProject.xcarchive
          

          derivedDataPath 参数只是一个文件夹,可以在构建应用程序后删除。您知道派生数据中产生了多少垃圾。 project 名称是您的项目名称,scheme 名称紧跟在 Xcode 中的 play|stop 按钮之后。您必须为下一步选择存档名称和路径。

          4.2 成功构建存档后,使用此代码创建应用程序:

          xcodebuild -exportArchive -archivePath build/ios/myProject.xcarchive -exportPath build/ios/ -exportOptionsPlist build/ios/options.plist
          

          在这里,您使用上一步中使用的存档名称和路径。 exportOptionsPlist 需要知道我们在步骤 3 中创建的 plist 配置的路径和名称。

          就是这样!您可以在终端窗口中运行这些命令,它也会构建您的应用程序。您可以将这两行放在脚本文件/makefile 中,并为项目名称、路径和 options.plist 使用变量,然后您可以使用它来构建所有应用程序。

          PS:如果有什么不清楚的地方请告诉我,我会补充更多的解释。

          【讨论】:

          • 这很有用,但 Cordova 几乎做同样的事情。当您还没有创建应用程序 ID 或配置文件并且您想像 Xcode 那样自动创建它时,它并不能完全解决我的情况。
          • 正如其他人所发布的,fastlane 和其他一些工具可以做到这一点。但这意味着他们需要你登录到开发者门户,或者他们知道如何操纵 Xcode 来做到这一点。我还不知道任何 Xcode 命令行,但我会调查它。就您而言,fastlane 的答案之一是您想要的,而不是我的答案。
          • 仅供参考,我查看了 fastlane 源代码,发现他们正在发送带有 JSON 对象的 Web 请求,例如用于创建捆绑 ID。所以可能没有 Xcode 命令行,这可能就是他们利用“web api”的原因。我不会依赖那个“非官方的 web api”。苹果可以随时更改它们。
          【解决方案7】:

          对于Automatically manage signing,您可以使用Fastlane。它易于安装和设置。

          要在远程构建服务器上使用它 - 您可以使用 Jenkins

          Here example. 您需要将JenkinsFastlane 设置到您的远程计算机。比Jenkins 会检查你的repository thread 或只是由你命令它。在它之后Jenkins 在远程构建服务器上运行FastlaneFastlane 将创建您在 Fastfile 中编写的所有证书和其他设置。

          如果您只有一个部署证书,则可以使用名为MatchFastlane 服务

          使用 Git 在团队中轻松同步您的证书和配置文件

          或者只是在本地发送和设置。

          希望对你有帮助,祝你好运!

          这里是beta deploy 的示例(我使用Xcode 9):

           desc "Build devFoo and upload it to Fabric"
                lane :uploadToFabric do
                  cocoapods
                  cert(
                  development: true,
                  output_path: "./fastlane"
                  )
                  sigh(
                  development: true,
                  output_path: "./fastlane"
                  )
                  clear_derived_data
                  gym(
                  scheme: "Foo",
                  configuration: "Debug",
                  clean: true,
                  output_directory: "./fastlane",
                  )
                  crashlytics(
                  api_token: "foofoofoofoo",
                  build_secret: "foofoofoofoo",
                  emails: ["foo@foo.com"],
                  notifications: true
                  )
                  slack(
                  message: "New build for test successfully deployed in Fabric",
                  success: true
                  )
                end
          

          这里是发布部署的示例:

          desc "Build and upload it to the AppStore and TestFlight"
            lane :uploadToAppStore do
              cocoapods
          
              cert(
              development: false,
              output_path: "./fastlane"
              )
              sigh(
              development: false,
              app_identifier: "foofoo",
              output_path: "./fastlane"
              )
              clear_derived_data
              gym(
              scheme: "Foo",
              configuration: "Release",
              clean: false,
              output_directory: "./fastlane",
              )
              deliver(
              force: true,
              app_identifier: "foo",
              skip_metadata: true,
              skip_screenshots: true,
              submit_for_review: false,
              skip_binary_upload: false
              )
              slack(
              message: "New build successfully deployed to AppStore",
              success: true
              )
              upload_symbols_to_crashlytics(dsym_path: "./fastlane/foo.app.dSYM.zip")
              slack(
              message: "dSYM symbolication files uploaded to Crashlytics",
              success: true
              )
          

          【讨论】:

            【解决方案8】:

            据我的理解和最近的阅读,OP 问题的答案:

            "xcodebuild 可以管理自动签名吗?"是“是”,但不符合 OP 的预期,即“当您尚未创建应用 ID 或配置文件,并且您希望以 Xcode 的方式自动创建它时”

            根据 xcode8 上的 informative blog 和自动代码签名,它明确指出:

            “如果您想创建例如 App Store 签名的 IPA,在 Mac 上您必须同时拥有通配符、团队/开发以及 App Store 分发证书和配置文件!”

            因此,不会自动创建应用 ID 和配置文件。 Fastlane 可能是解决此问题的方法,但我想这不是 OP 的期望。希望有道理。

            【讨论】:

              【解决方案9】:

              如果您使用 xcodebuild 归档 xCode 项目并且安装了 xCode 9,则可以向编译命令提供以下 FLAGS:

              CODE_SIGN_STYLE="Manual" \
              DEVELOPMENT_TEAM="" \
              

              它会将自动签名设置为 false 并将开发团队设置为空。您可以设置所需的值。例如:

              xcodebuild \
              -scheme "your_scheme" \
              -sdk iphoneos \
              -archivePath "/Users/youruser/Developer/Jenkins/Home/customWorkspace/folder/platforms/ios/build/device/yourproject.xcarchive" \
              -configuration Release \
              -allowProvisioningUpdates \
              CONFIGURATION_BUILD_DIR="/Users/youruser/Developer/Jenkins/Home/customWorkspace/folder/platforms/ios/build/device" \
              CODE_SIGN_IDENTITY="your code sign identity" \
              PROVISIONING_PROFILE="your provisioning profile" \
              CODE_SIGN_STYLE="Manual" \
              DEVELOPMENT_TEAM="" \
              archive
              

              然后您可以使用 -exportArchive 创建 ipa,它会根据需要创建 ipa

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-10-28
                • 1970-01-01
                • 1970-01-01
                • 2017-05-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-14
                相关资源
                最近更新 更多