【问题标题】:How can I configure Azure Pipelines to build an iOS project which uses OneSignal?如何配置 Azure Pipelines 以构建使用 OneSignal 的 iOS 项目?
【发布时间】:2020-05-28 03:35:43
【问题描述】:

我正在尝试让 Azure Pipelines 与我们的 iOS 项目一起工作。我已经建立了一个更简单的项目,并且在更简单的项目上一切正常,但是我们的主应用程序使用 OneSignal 进行通知。这意味着有一个额外的目标和不同的配置文件。在阅读了我能找到的与配置文件以及如何配置 yaml 文件有关的所有内容后,我不知所措。

我能找到的最好的信息是here

我的 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 安装配置文件。我是在这里鞭打一匹死马还是有人设法让这个(或类似的东西)工作?感谢任何人都可以给我的任何帮助!

【问题讨论】:

  • 嗨,有没有最小的可重复样本?在使用托管代理之前,请尝试它是否适用于您的 private agent 和您的本地环境。
  • 我将尝试设置一个私人代理并在 GitHub 上创建一个最小示例。感谢您的建议 - 我会告诉您我的进展情况!
  • 你好朋友,这个问题有更新吗?它在本地运行良好但只发生在管道中吗?
  • 我创建了一个最小的项目来尝试重新创建问题,但我还没有设置私人代理(我需要做更多的阅读,因为我是 Azure 的新手)。不幸的是,我仍然没有找到问题的根源。我会坚持的!
  • 如果此问题有任何更新,请随时告诉我 :) 这是否意味着它在 Xcode 本地运行良好,源文件 100% 相同?

标签: ios xcode azure-devops azure-pipelines


【解决方案1】:

我认为我最好发布我的问题解决方案,因为这是一段漫长的旅程!我尝试了很多不同的配置,但最后我学到了:

  1. 当完成构建/签名过程需要不同的配置文件时,我无法让 Xcode 托管配置文件工作。

  2. 我从我们的 Apple Dev 帐户中清除了所有过期的配置文件/证书,并确保只有一个 Apple Developer 证书和一个 Apple Distribution 证书。我这样做是为了确保只有一种可能的方式来签署我们的应用程序,虽然不是绝对必要的,但它允许我消除证书作为问题的一部分。

  3. 我导出了两个证书并给了它们一个密码,稍后将添加到 Azure 上的库中。

  4. 我为包含 Apple 分发证书的主应用程序创建了手动配置文件。我为 OneSignal 应用 ID 创建了另一个配置文件,同样包括分发证书。

  5. 我获得了每个配置文件的 UUID,并将每个文件名更改为 UUID.mobileprovision。

  6. 按照here 的建议,我创建了一个 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. 在 Azure Pipelines 上,我将两个证书和两个配置文件都上传到了库的安全文件部分。我还上传了 provs.plist 文件。

  8. 我在名为 ios-pipeline 的库中创建了一个变量组,其中包含配置文件和证书的变量名称,以及证书的密码。

  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。我按照here 的建议创建了一个具有开发人员权限的单独 Apple ID 和一个带有两步验证建议的复杂密码,以避免令牌问题。

希望这将至少对一个人有所帮助 - 或者如果我将来遇到同样的问题,也许只是我!

【讨论】:

  • 我只是一步一步地完成了每一步,但我收到以下消息:签署“MyAppName”需要一个开发团队。在 Signing & Capabilities 编辑器中选择一个开发团队。甚至定义我的团队 ID 和我的分发配置文件:DEVELOPMENT_TEAM=XXXX APP_PROFILE="uuid" EXTENSION_PROFILE="extension-uuid" 作为构建标志,并包括我的 exportOptions.plist 具有相同的值。会是什么?
猜你喜欢
  • 1970-01-01
  • 2019-07-13
  • 2020-05-25
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2020-06-04
  • 2019-02-24
  • 2015-09-21
相关资源
最近更新 更多