Подтвердить что ты не робот

Может ли xcodebuild управлять автоматической подпиской?

РЕЗЮМЕ:

Если вы откроете проект в Xcode 8 с включенным "Автоматическое управление подписью" и новым идентификатором пакета, он автоматически создаст и загрузит для него профиль подготовки. Но как я могу сделать то же самое с xcodebuild, поэтому я могу использовать его на удаленном сервере сборки?

ПОДРОБНОСТИ:

Я пытаюсь создать приложение Кордовы на Mac. Кордова настраивает проект Xcode для использования "Автоматическое управление подписью", поэтому я пытаюсь использовать его.

Я часто меняю идентификатор пакета, поэтому хочу, чтобы Кордова смогла построить его с новым идентификатором пакета, который ранее не использовался.

Но когда я запускаю 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 и получить ту же ошибку, поэтому, вероятно, это не проблема Кордовы.)

Мой файл 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, он фиксирует автоматическое подписание, и с этого момента я могу успешно запустить cordova с этим идентификатором пакета. Но если я попытаюсь запустить его с другим идентификатором пакета, он снова не сработает.

Сначала я попытался использовать security unlock-keychain ~/Library/Keychains/login.keychain-db, так как это работало в прошлом, но это не помогло.

Я также попытался открыть свой закрытый ключ подписи в Keychain Access и установить для него "Разрешить всем приложениям доступ к этому элементу" без везения.

Я получаю ту же ошибку, независимо от того, передаю ли я --debug или --release кордове.

4b9b3361

Ответ 1

Это не поддерживается напрямую в Xcode 8. Однако в Xcode 9 вы можете передать -allowProvisioningUpdates в xcodebuild, и автоматическое подписание будет работать так же, как и в интерфейсе Xcode, без каких-либо дополнительных инструментов.

например. cordova run ios --buildFlag="-allowProvisioningUpdates"

Ответ 2

Ответ - да. То, что я использовал и что я могу подтвердить, работает, и это здорово:

https://fastlane.tools/

Вы можете настроить все для автоматического:

  • Подписывающие клавиши
  • Съемка снимков
  • Загрузка в iTunes

и многое другое

В фоновом режиме используется командная строка xcodebuild. Я скептически заметил, что что-то подобное возможно, но просто настроиться, начать и наслаждаться.

Ответ 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

Как уже упоминалось в некоторых других ответах, то, что вы ищете, - это инструмент автоматизации выпуска под названием Fastlane. https://fastlane.tools/

Если вы не знакомы с этим, я считаю, что лучшим местом для начала станет учебник по стрельбе Raywenderlich.

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

Ответ 5

Для Automatically manage signing вы можете использовать Fastlane. Он прост в установке и настройке.

Для использования на удаленном сервере сборки вы можете использовать Jenkins.

Здесь пример. Вам нужно настроить Jenkins на Fastlane на ваш удаленный компьютер. Затем Jenkins проверит вашу команду repository thread или просто по вашей команде. После этого Jenkins запустите Fastlane на удаленном сервере сборки. И Fastlane создаст все сертификаты и другие настройки, которые вы пишете в Fastfile.

Если у вас есть только один сертификат развертывания, вы можете использовать службу Fastlane с именем Match

Простая синхронизация сертификатов и профилей в вашей команде с помощью Git

или просто отправить и настроить его локально.

Надеюсь, вам это поможет, удачи!

Здесь пример бета-развертывания:

 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: ["[email protected]"],
        notifications: true
        )
        slack(
        message: "New build for test successfully deployed in Fabric",
        success: true
        )
      end

Здесь пример развертывания release:

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
    )

Ответ 6

Нет возможности автоматического управления подпиской с помощью xcodebuild. Вы должны использовать третьи стороны, такие как Fastlane, как упоминалось ранее, или использовать ручную подпись кода, упомянутую здесь.

Ответ 7

Уведомление. Этот ответ предполагает, что идентификаторы пакетов и профили подготовки создаются вручную. С помощью этого метода можно автоматизировать только процесс сборки.

Да, это возможно даже без использования сторонних инструментов. вам должно быть удобно использовать файл script или файл make. Я использую 2 строки кода в make файле на Mac Mini на работе. И это дает нам либо ad-hoc, либо appstore версию, готовую к загрузке в соответствии с нашей конфигурацией.

  • убедитесь, что ваш проект включил автоматическую настройку.
  • убедитесь, что на вашем удаленном компьютере Mac загружены все сертификаты и настройки для пения. для этого случая я всегда, для первого здания, открываю Xcode и строю и экспортирую на удаленную машину. Если это работает, ничего не пропадает. Но убедитесь, что вы всегда разрешаете доступ к сертификату пения. Xcode также запрашивает это для первой сборки. В противном случае всплывающее окно будет отображаться на вашем удаленном сервере и ждет, пока кто-то разрешит доступ к сертификату подписи.
  • вам нужен файл 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/распределения ресурсов на вашем удаленном Mac.

  1. xcodebuild создаст архив, тогда мы сможем экспортировать .app. В файле make или файле script используйте следующие строки:

4,1. Сначала мы создаем файл архива.

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

derivedDataPath параметр - это просто папка, которую можно удалить позже, после создания приложения. вы знаете, сколько мусора производится в производных данных. project имя - это имя вашего проекта, а scheme - имя сразу после кнопки play|stop в Xcode. Вы должны выбрать имя и путь к архиву для следующего шага.

4.2 После успешного создания вашего архива используйте этот код для создания приложения:

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

Здесь вы используете имя и путь к архиву, которые использовались на предыдущем шаге. exportOptionsPlist должен знать путь и имя для вашей конфигурации plist, которые мы создали на шаге 3.

И это! Вы можете запускать эти команды в окне терминала, и оно также создаст ваше приложение. Вы можете поместить эти 2 строки в файл /makefile script и использовать переменные для имени проекта, пути и options.plist. Тогда вы можете использовать это для создания всех своих приложений.

PS: Если что-то неясно, сообщите мне, и я добавлю больше объяснений.

Ответ 8

Насколько я понимаю и последние чтения, ответ на вопрос OP:

" Может ли xcodebuild управлять автоматической подпиской?" это "ДА", но не в соответствии с ожиданиями OP в строках "когда вы еще не создали идентификатор приложения или профиль подготовки, и вы хотите создать его автоматически, как это делает Xcode"

В соответствии с этим информативным блогом на xcode8 и автоматической подписью кода он четко заявляет, что:

"Если вы хотите создать, например, подписанный IPA App Store, на Mac вы должны иметь как сертификаты распространения подстановочных знаков, Team/Development и App Store, так и профили подготовки!"

Следовательно, идентификатор приложения и профиль подготовки не будут автоматически созданы. Fastlane может быть обходным решением этой проблемы, но я думаю, что это не ожидание OP. Надеюсь, что это имеет смысл.

Ответ 9

Если вы архивируете проект xCode с помощью xcodebuild и у вас установлен 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

Затем вы можете создать ipa с помощью -exportArchive и создать ipa по мере необходимости