xcodebuild可以管理自动签名吗?

时间:2017-06-09 22:44:28

标签: ios xcode cordova xcode8

概要

如果您在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,我都会收到同样的错误。

9 个答案:

答案 0 :(得分:16)

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

e.g。 cordova run ios --buildFlag="-allowProvisioningUpdates"

答案 1 :(得分:6)

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

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

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

如果您只有一个部署证书,则可以使用名为Fastlane的{​​{1}}服务

  

使用Git

在您的团队中轻松同步您的证书和个人资料

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

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

此处为Match的示例(对我来说,使用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

答案 2 :(得分:5)

答案是肯定的。我使用的和我能确认的是工作,这很棒:

https://fastlane.tools/

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

  1. 签名密钥
  2. 截屏
  3. 在iTunes上载
  4. 和许多其他事情

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

答案 3 :(得分:5)

你可以使用fastlane来做到这一点。

https://fastlane.tools/

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

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

ps:如果您是从CI服务器(例如jenkins)运行它,那么您需要解锁登录密钥链:

let res = [];
for (let key in data) res = res.concat(data[key]);
console.log(res);

fastfile中的示例:

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

这是一个基本Fastfile的例子:

cert(
  development: true,
)

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

答案 4 :(得分:4)

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

如果你不熟悉它,我相信最好的开始就是raywenderlich的fastlane教程。

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

答案 5 :(得分:3)

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

答案 6 :(得分:3)

注意:此答案假定手动创建了捆绑包ID和配置文件。只有使用此方法才能自动构建流程。

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

  1. 确保您的项目已启用自动配置。
  2. 确保在远程mac上下载所有唱歌证书和配置。对于这种情况,我总是,对于第一个建筑,打开Xcode和构建&在我的远程计算机上导出。如果有效则没有遗漏任何东西。但请确保您始终允许访问唱歌证书。 Xcode还要求第一次构建。否则,弹出窗口将显示在远程服务器上,并等待有人允许访问签名证书。
  3. 你需要一个plist文件:
  4. <?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上有ad-hoc /配置配置文件。

    1. xcodebuild将创建一个存档,然后我们可以导出.app。在您的make文件或脚本文件中使用以下行:
    2. 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:如果有什么不清楚请告诉我,我会补充更多解释。

答案 7 :(得分:3)

就我的理解和最近的阅读而言,OP的答案是:

  

&#34; xcodebuild可以管理自动签名吗?&#34;是&#34;是&#34;但是,根据OP的预期,当你还没有创建应用程序ID或配置文件时,你想要按照Xcode的方式自动创建它&#34;

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

  

&#34;如果您想创建一个App Store签名的IPA,在Mac上您必须同时拥有通配符,团队/开发和App Store分发证书和配置文件!&#34;

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

答案 8 :(得分:1)

如果您使用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