概要
如果您在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,我都会收到同样的错误。
答案 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.您需要将Jenkins
与Fastlane
设置为远程计算机。比Jenkins
会检查您的repository thread
或仅仅是您的命令。在Jenkins
之后在远程构建服务器上运行Fastlane
。 Fastlane
将创建您在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)
答案是肯定的。我使用的和我能确认的是工作,这很棒:
您可以将所有内容设置为自动:
和许多其他事情
在后台使用xcodebuild命令行。我怀疑这样的事情是可能的,但只需设置,开始和享受。
答案 3 :(得分:5)
你可以使用fastlane来做到这一点。
证书:获取或生成最新的可用代码签名身份
叹息:生成配置文件。将配置文件存储在当前文件夹中
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-hoc
或appstore
版本。
<?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 /配置配置文件。
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:如果有什么不清楚请告诉我,我会补充更多解释。答案 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