xcodebuild 可以管理自动签名吗?

Can xcodebuild manage automatic signing?

摘要:

如果您在 Xcode 8 中打开一个项目并启用 "Automatically manage signing" 和一个新的包 ID,它会自动为它创建和下载配置文件。但是我怎样才能让 xcodebuild 发生同样的事情,所以我可以在远程构建服务器上使用它?

详情:

我正在尝试在 Mac 上构建 Cordova 应用程序。 Cordova 将 Xcode 项目配置为使用 "Automatically manage signing",所以我正在尝试使用它。

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

但是当我 运行 cordova build ios --release --device --buildConfig build.json 时,我得到 return 代码 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 企业帐户。

我尝试了什么:

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

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

我也尝试在 Keychain Access 中打开我的私人签名密钥并将其设置为 "Allow all applications to access this item",但没有成功。

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

答案是肯定的。我使用的和我可以确认的是有效的并且很棒:

https://fastlane.tools/

您可以将一切设置为自动:

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

还有许多其他事情

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

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

您可以使用 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

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

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

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

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

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

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

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

  1. 确保您的项目已启用自动配置。
  2. 确保在您的遥控器上 mac 已下载所有唱歌证书和配置。对于这种情况,对于第一座建筑,我总是在我的远程 machine 上打开 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 提醒一下:确保您的 ad-hoc/distribution 配置文件在您的遥控器 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 配置的路径和名称。

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

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

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

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

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

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

Fastlane 服务

Easily sync your certificates and profiles across your team using 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
    )

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

"Can xcodebuild manage automatic signing?" is "YES" but not as per the OP's expectations in lines of "when you haven't created the app ID or provisioning profile yet, and you want to create it automatically the way Xcode does"

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

"If you want to create for example an App Store signed IPA, on the Mac you have to have both a Wildcard, Team / Development AND the App Store distribution certificates and provisioning profiles!"

因此,不会自动创建应用程序 ID 和配置文件。 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 创建 ipa,它将根据您的需要创建 ipa