Как я могу настроить Azure Pipelines для создания проекта iOS, в котором используется OneSignal? - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь заставить Azure Pipelines работать с нашим iOS проектом. Я создал более простой проект, и все работает нормально в более простом проекте, но наше основное приложение использует OneSignal для уведомлений. Это означает, что есть дополнительная цель и другой профиль обеспечения. Прочитав все, что я могу найти о профилях подготовки и о том, как настроить файл yaml, я в растерянности.

Лучшая информация, которую я смог найти, это здесь

Мой файл YAML в настоящее время выглядит так:

pool:
  vmImage: 'macOS-10.14'

variables:
  - group: ios-pipeline
  - name: configuration
    value: 'Release'
  - name: sdk
    value: 'iphoneos'


steps:

- task: InstallAppleCertificate@2
  inputs:
   certSecureFile: '$(p12FileName)'
   certPwd: '$(p12Password)'
   keychain: 'temp'
   deleteCert: true

- task: InstallAppleProvisioningProfile@1
  inputs:
   provisioningProfileLocation: 'secureFiles'
   provProfileSecureFile: '$(oneSignalProvProfile)'

- task: InstallAppleProvisioningProfile@1
  inputs:
   provisioningProfileLocation: 'secureFiles'
   provProfileSecureFile: '$(provisioningProfile)'

- task: CocoaPods@0
  inputs:
    forceRepoUpdate: false

- task: Xcode@5
  inputs:
    actions: 'build'
    xcWorkspacePath: '**/PROJECT_NAME.xcworkspace'
    scheme: 'SCHEME_NAME'
    packageApp: true
    exportOptions: 'plist'
    exportOptionsPlist: '**/DevOpsOptions.plist'
    signingOption: 'auto'
    teamId: 'OUR_TEAM_ID'

Ссылка на файл 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>provisioningProfiles</key>
        <dict>
            <key>APP_BUNDLE_ID.OneSignalNotificationServiceExtension</key>
            <string>THE UUID FOR THIS PROFILE</string>
            <key>APP_BUNDLE_ID</key>
            <string>THE UUID FOR THIS PROFILE</string>
        </dict>
        <key>signingCertificate</key>
        <string>iOS Distribution</string>
        <key>signingStyle</key>
        <string>manual</string>
        <key>method</key>
        <string>app-store</string>
        <key>teamID</key>
        <string>OUR_TEAM_ID</string>
    </dict>
    </plist>

Когда я пытаюсь запустить эту конфигурацию, я получаю следующую ошибку:

❌  error: No profiles for 'MAIN_APP_BUNDLE_ID' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'MAIN_APP_BUNDLE_ID'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild. (in target 'MAIN_APP_BUNDLE_ID' from project 'PROJECT_NAME')



❌  error: No profiles for 'OneSignalNotificationServiceExtension_BUNDLE_ID' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'OneSignalNotificationServiceExtension_BUNDLE_ID'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild. (in target 'OneSignalNotificationServiceExtension_BUNDLE_ID' from project 'PROJECT_NAME')

Я также пробовал использовать параметр подписи вручную, используя:

- task: Xcode@5
  inputs:
    actions: 'build'
    xcWorkspacePath: '**/WORKSPACE_NAME.xcworkspace'
    scheme: 'SCHEME_NAME'
    packageApp: true
    signingOption: 'manual'
    signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
    provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'

Когда я использую эту задачу сборки, я получаю сообщение об ошибке о том, что для OneSignalExtension не установлен профиль подготовки. Я здесь порчу дохлую лошадь или кому-нибудь удалось заставить это (или что-то подобное) работать? Спасибо за любую помощь, которую может мне дать!

1 Ответ

2 голосов
/ 27 мая 2020

Я подумал, что мне лучше опубликовать свое решение моей проблемы, поскольку это был настоящий путь! Я перепробовал так много разных конфигураций, но в итоге узнал вот что:

  1. Я не мог заставить работать управляемые профили Xcode, когда для завершения сборки необходимы разные профили подготовки. / подписать процесс.

  2. Я удалил все просроченные профили / сертификаты из нашей учетной записи Apple Dev и убедился, что существует только один сертификат Apple Developer и один сертификат Apple Distribution. Я сделал это, чтобы убедиться, что существует только один способ подписать наше приложение, и хотя это не является строго необходимым, он позволил мне исключить сертификаты, являющиеся частью проблемы.

  3. Я экспортировал оба сертификата и дал им пароль, который будет добавлен в библиотеку Azure позже.

  4. Я создал руководство профиль обеспечения для основного приложения, который включает сертификат Apple Distribution. Я создал еще один профиль подготовки для идентификатора приложения OneSignal, снова включая сертификат распространения.

  5. Я получил UUID для каждого профиля и изменил каждое имя файла на UUID.mobileprovision.

  6. Следуя совету здесь , я создал файл provs.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>provisioningProfiles</key>
        <dict>
            <key>YOUR_APP_ID.OneSignalNotificationServiceExtension</key>
            <string>UUID_FOR_ONE_SIGNAL_PROV_PROFILE</string>
            <key>YOUR_APP_ID</key>
            <string>UUID_FOR_APP_PROV_PROFILE</string>
        </dict>
        <key>signingCertificate</key>
        <string>iOS Distribution</string>
        <key>signingStyle</key>
        <string>manual</string>
        <key>method</key>
        <string>app-store</string>
        <key>teamID</key>
        <string>YOUR_TEAM_ID</string>
    </dict>
    </plist>
    
  7. On Azure Pipelines, я загрузил оба сертификата и оба профиля в раздел «Защищенные файлы» библиотеки. Я также загрузил файл provs.plist.

  8. Я создал группу переменных в библиотеке под названием ios -pipeline, которая содержит имена переменных для профилей и сертификатов, а также пароль для сертификатов.

    Screenshot of Library variables group

  9. Вернувшись в XCode, в главном инспекторе проекта я изменил подпись как для основной цели, так и для цели OneSignal к руководству. Для этого мне пришлось импортировать профили, которые я создал ранее.

  10. Затем я отредактировал файл YAML конвейера, чтобы он выглядел так:

    pool:
      vmImage: 'macOS-10.14'
    
    variables:
      - group: ios-pipeline
      - name: configuration
        value: 'Release'
      - name: sdk
        value: 'iphoneos'
    
    
    steps:
    
    - task: InstallAppleCertificate@2
      inputs:
       certSecureFile: '$(p12FileName)'
       certPwd: '$(p12Password)'
       keychain: 'temp'
       deleteCert: true  
    
    
    - task: InstallAppleCertificate@2
      inputs:
       certSecureFile: '$(p12DevFileName)'
       certPwd: '$(p12Password)'
       keychain: 'temp'
       deleteCert: true  
    
    
    - task: InstallAppleProvisioningProfile@1
      inputs:
       provisioningProfileLocation: 'secureFiles'
       provProfileSecureFile: '$(oneSignalProvProfile)'
       removeProfile: true
    
    
    - task: InstallAppleProvisioningProfile@1
      inputs:
       provisioningProfileLocation: 'secureFiles'
       provProfileSecureFile: '$(appProvProfile)'
       removeProfile: true
    
    
    - task: CocoaPods@0
      inputs:
        forceRepoUpdate: false
    
    
    - task: DownloadSecureFile@1
      inputs:
        secureFile: $(provsPlist)
    
    
    - task: Xcode@5
      inputs:
        actions: 'build'
        xcWorkspacePath: '**/YOUR_WORKSPACE_NAME.xcworkspace'
        scheme: 'YOUR_SCHEME_NAME'
        packageApp: true
        exportOptions: 'plist'
        exportOptionsPlist: $(provsPlist)
        signingOption: 'default'
    
    
    - task: AppStoreRelease@1
      inputs:
        authType: 'UserAndPass'
        username: 'YOUR_APPLE_ID_USERNAME'
        password: 'YOUR_APPLE_ID_PASSWORD'
        appIdentifier: 'YOUR_APP_IDENTIFIER'
        appType: 'iOS'
        ipaPath: '**/*.ipa'
        releaseTrack: 'TestFlight'
        shouldSkipSubmission: true
    

Я сохранил файл YAML и успешно запустил конвейер. Между прочим, последняя задача сборки отправляет сборку в TestFlight. Я последовал совету здесь , чтобы создать отдельный идентификатор Apple ID с правами разработчика и сложный пароль с рекомендациями по двухэтапной проверке, чтобы избежать проблем с токенами.

Надеюсь, это поможет хотя бы одному человеку - или, возможно, только я, если у меня когда-нибудь возникнет такая же проблема в будущем!

...