Как исправить проблему, связанную с тем, что ключ знака кода не найден в конвейере Azure в MAUI .net 8.0-iOS?

Я ввел профиль предоставления кода и ключ знака кода в свой проект CS, как показано ниже.

<PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Release|iPhone' "><DebugType>none</DebugType>

<Optimize>true</Optimize>

<OutputPath>bin\iPhone\Release</OutputPath>

<ErrorReport>prompt</ErrorReport>

<WarningLevel>4</WarningLevel>

<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>

<ConsolePause>false</ConsolePause>

<CodesignKey>iPhone Distribution: Companyname, Inc. (USER ID)</CodesignKey>

<CodesignEntitlements>Entitlements.plist</CodesignEntitlements>

<CodesignProvision>MyAppProvision</CodesignProvision>

<CreatePackage>false</CreatePackage> </PropertyGroup>

Но когда я запускаю конвейер Azure под задачей публикации DotNet, он показывает, что в цепочке ключей не найден действительный ключ подписи кода iOS.

Также я добавил такой аргумент в задачу публикации DotNet как -p:CodesignKey="iPhone Distribution: Companyname, Inc. (USER ID)" , но возвращает ошибку как Switch: Distribution или ошибку: Property not valid Switch: Inc. (USER) ИДЕНТИФИКАТОР)

Работал ли ваш конвейер на агенте macOS, размещенном на Microsoft или на локальном сервере, для создания проекта MAUI? При использовании локального агента казалось, что сертификат разработчика Apple не установлен на этом компьютере.

Alvin Zhao - MSFT 24.07.2024 08:25

Привет @AjitK! Есть ли у тебя возможность проверить мой ответ ниже, чтобы установить сертификат .p12 во время сборки конвейера? Надеюсь, что это поможет решить вашу проблему в этом посте. Спасибо, что уделили время и поделились.

Alvin Zhao - MSFT 25.07.2024 08:37

Я попробовал, но мой ключ кодового знака имеет запятую (,) в середине, которая обнаруживает ключ кодового знака, как и перед запятой, и не включает ключ после запятой.

AjitK 25.07.2024 10:59

Проблема не справилась с задачей InstallAppleCertificate@2? Каков будет результат, если вы запустите bash: echo "APPLE_CERTIFICATE_SIGNING_IDENTITY is $(APPLE_CERTIFICATE_SIGNING_IDENTITY)" после установки сертификата?

Alvin Zhao - MSFT 25.07.2024 11:18

Я получаю, что APPLE_CERTIFICATE_SIGNING_IDENTITY — это распространение iPhone: Companyname, Inc. (USER ID) в этой задаче Bash.

AjitK 25.07.2024 11:22

Я думаю, что, если напрямую использовать <CodesignKey>iPhone Distribution: Companyname, Inc. (USER ID)</CodesignKey> в вашем .csproj, не передавая -p:CodesignKey = "$(APPLE_CERTIFICATE_SIGNING_IDENTITY)". Кстати, вы использовали агент, размещенный в Microsoft, для запуска этого конвейера? Воспроизводилась ли проблема, если вы запускали dotnet publish на локальном Mac?

Alvin Zhao - MSFT 25.07.2024 11:28

Да, только в публикации в dotnet, а также, когда я запускал в cs proj, он говорит, что действительный сертификат подписи не найден.

AjitK 25.07.2024 11:31

Таким образом, значение $(APPLE_CERTIFICATE_SIGNING_IDENTITY) в bash было правильным. Казалось необходимым экранировать значение в dotnetCLI. Не могли бы вы попробовать использовать -p:CodesignKey = "\"$(APPLE_CERTIFICATE_SIGNING_IDENTITY)\"", как предложено здесь.

Alvin Zhao - MSFT 25.07.2024 11:37

Привет @AjitK, я обновил ответ в соответствии с моим тестом и вижу, что , экранируется при передаче -p:CodesignKey = "\"$(APPLE_PROV_PROFILE_UUID)\"". Надеюсь, это сработает и для вас. Удачи в предстоящей работе!

Alvin Zhao - MSFT 25.07.2024 12:15

Привет @AlvinZhao-MSFT. Я могу это исправить, перейдя по указанной ссылке, спасибо за ваш ценный ответ и усилия. Большое спасибо

AjitK 25.07.2024 13:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлять

Согласно последующей проблеме, аргумент CodesignKey не был передан правильно из-за запятой , в удостоверении сертификата,

мы могли бы избежать значения, добавив \" к $(APPLE_CERTIFICATE_SIGNING_IDENTITY). Вот пример синтаксиса задачи DotNetCoreCLI@2.

- task: DotNetCoreCLI@2
  displayName: Build iOS App
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/*.sln'
    arguments: >
      -f net8.0-ios -c Release
      -p:ApplicationDisplayVersion=${{ parameters.ApplicationDisplayVersion }} -p:ApplicationVersion=$(Build.BuildId)
      -p:ArchiveOnBuild=true -p:RuntimeIdentifier=ios-arm64
      -p:CodesignKey = "\"$(APPLE_PROV_PROFILE_UUID)\"" -p:CodesignProvision = "$(APPLE_PROV_PROFILE_UUID)"
    zipAfterPublish: false
    modifyOutputPath: false


Я мог воспроизвести ту же ошибку, когда сертификат разработчика Apple не был установлен в агенте сборки, например, в агенте, размещенном в Microsoft.

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

  1. Экспортируйте сертификат разработчика Apple .p12 из приложения Keychain Access на Mac пользователя; запомните пароль при сохранении macOS-14 сертификата;
  2. Загрузите сертификат через Pipelines -> Library — Secure file;
  3. Добавьте секретную переменную конвейера для безопасности .p12;
  4. Добавьте задачу .p12 для получения и установки сертификата во время сборки конвейера; вам также может потребоваться загрузить и установить профиль обеспечения с помощью задачи $(P12PWD);
stages:
- stage: BuildiOS
  dependsOn: []
  jobs:
  - job: BuildiOS
    pool:
      vmImage: macOS-14
    steps:
    - task: InstallAppleCertificate@2
      inputs:
        certSecureFile: 'appledeveloper.p12'
        certPwd: '$(P12PWD)'
        keychain: 'temp'

    - task: InstallAppleProvisioningProfile@1
      inputs:
        provisioningProfileLocation: 'secureFiles'
        provProfileSecureFile: 'DotNetMauiAppDemoProfile.mobileprovision'
    
    - bash: |
        echo "APPLE_CERTIFICATE_SIGNING_IDENTITY is $(APPLE_CERTIFICATE_SIGNING_IDENTITY)"
        echo "APPLE_PROV_PROFILE_UUID is $(APPLE_PROV_PROFILE_UUID)"
      displayName: Check profile
        
    - task: UseDotNet@2
      displayName: .NET Version
      inputs:
        packageType: 'sdk'
        version: '${{ parameters.DotNetVersion }}'
    - task: Bash@3
      displayName: Install MAUI
      inputs:
        targetType: 'inline'
        script: |
          dotnet nuget locals all --clear 
          dotnet workload install maui --source https://api.nuget.org/v3/index.json
    - task: DotNetCoreCLI@2
      displayName: Build iOS App
      inputs:
        command: 'publish'
        publishWebProjects: false
        projects: '**/*.sln'
        arguments: >
          -f net8.0-ios -c Release
          -p:ApplicationDisplayVersion=${{ parameters.ApplicationDisplayVersion }} -p:ApplicationVersion=$(Build.BuildId)
          -p:ArchiveOnBuild=true -p:RuntimeIdentifier=ios-arm64
          -p:CodesignKey = "$(APPLE_CERTIFICATE_SIGNING_IDENTITY)" -p:CodesignProvision = "$(APPLE_PROV_PROFILE_UUID)"
        zipAfterPublish: false
        modifyOutputPath: false
  1. Мы можем проверить значения двух переменных InstallAppleCertificate@2 и InstallAppleProvisioningProfile@1, сгенерированных двумя задачами на предыдущем шаге, и передать их в качестве аргументов $(APPLE_CERTIFICATE_SIGNING_IDENTITY) из $(APPLE_PROV_PROFILE_UUID);
  2. Более подробную информацию вы найдете в этом документе, чтобы подписать свое приложение Apple iOS, macOS, tvOS или watchOS.

Другие вопросы по теме