xcodebuild能pipe理自动签名吗?

概要:

如果您在Xcode 8中打开了一个启用了“自动pipe理签名”function的项目以及一个新的软件包ID,它将自动为它创build并下载一个供应configuration文件。 但是我怎样才能使xcodebuild发生同样的事情,所以我可以在远程构build服务器上使用它?

细节:

我试图在Mac上构build一个Cordova应用程序。 CordovaconfigurationXcode项目使用“自动pipe理签名”,所以我试图使用它。

我经常更改软件包ID,所以我希望Cordova能够用一个新的软件包ID来构build它,以前没有使用过。

但是当我运行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。 我有一个苹果企业帐户。

我试过了什么:

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

我试着先使用security unlock-keychain ~/Library/Keychains/login.keychain-db ,因为这是过去的工作,但没有帮助。

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

无论是否将--debug--release传递给cordova,我都会得到同样的错误。

这在Xcode 8中并不直接支持。然而,在Xcode 9中,您可以将-allowProvisioningUpdates传递给xcodebuild,自动签名就像在Xcode UI中一样工作,而不需要任何额外的工具。

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

答案是肯定的。 我用什么,我能确认的是工作,这是伟大的:

https://fastlane.tools/

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

  1. 签署密钥
  2. 截图
  3. 在iTunes上传

和许多其他的事情

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

你可以用fastlane来做。

https://fastlane.tools/

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

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

ps:如果你是从CI服务器上运行它(例如jenkins),那么你需要解锁login钥匙串:

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

快速文件内的示例:

 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 

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

如果你不熟悉它,我相信最好的上手地点是raywenderlich的fastlane教程。

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

对于Automatically manage signing您可以使用Fastlane 。 这很容易安装和设置。

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

这里的例子。 您需要使用FastlaneJenkins安装到您的远程机器上。 Jenkins将检查您的repository thread或只是由您的命令。 之后, Jenkins在远程构build服务器上运行FastlaneFastlane将创build您在Fastfile编写的所有证书和其他设置。

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

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

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

希望它能帮助你,祝你好运!

这里是beta部署的例子:

  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 ) 

使用xcodebuild无法自动pipe理签名。 您必须使用像前面提到的Fastlane这样的第三方,或者使用这里提到的手动代码签名。

注意 :这个答案假定手动创build捆绑ID和configuration文件。 只有构build过程可以使用这种方法自动化。

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

  1. 确保您的项目已启用自动configuration。
  2. 请确保在您的远程Mac上下载了所有歌唱证书和configuration。 对于这种情况,我总是为第一个build筑打开Xcode,然后在远程机器上构build和导出。 如果这样的话,那么没有什么是不可 但请确保您始终允许访问演唱证书。 Xcode也首先要求这个版本。 否则,popup窗口将显示在远程服务器上,等待有人允许访问签名证书。
  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> 

您应该将plistconfiguration保存在可访问的地方,例如,options.plist只是一个提示:请确保您在远程Mac上具有特定/分发设置configuration文件。

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

4.1。 首先我们创build档案文件。

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

derivedDataPath参数只是一个可以在构build应用程序后被删除的文件夹。 你知道派生数据中产生了多less垃圾。 project名称是您的项目名称, scheme名称在Xcode的play|stopbutton后是正确的。 您必须为下一步select存档名称和path。

4.2成功创build存档后,使用以下代码创build应用程序:

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

这里使用上一步中使用的存档名称和path。 exportOptionsPlist需要知道我们在步骤3中创build的plistconfiguration的path和名称。

而就是这样! 您可以在terminal窗口中运行这些命令,它也会构build您的应用程序。 你可以把这两行放在一个脚本文件/ makefile中,并使用variables作为项目名称,path和options.plist,然后你可以使用它来构build所有的应用程序。

PS:如果有什么不清楚的地方,请让我知道,我会添加更多的解释。

就我的理解和最近的解读,OP的问题的答案是:

xcodebuild能pipe理自动签名吗?” 是“是”,但不是根据OP的预期,“当你还没有创build应用程序ID或configuration文件,并且你想要自动创buildXcode的方式”

根据这个关于xcode8和自动代码签名的博客 ,它明确指出:

“如果你想创build一个App Store签名的IPA,在Mac上你必须同时拥有通配符,团队/开发和App Store分发证书和configuration文件!”

因此,应用程序ID和configuration文件将不会被自动创build。 Fastlane可能是解决这个问题的方法,但我想这不是OP的期望。 希望这是有道理的。

如果您正在使用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创buildipa,并根据需要创buildipa