我们如何使用 App Extensions 为 iOS 应用程序配置 CI

Posted

技术标签:

【中文标题】我们如何使用 App Extensions 为 iOS 应用程序配置 CI【英文标题】:How can we configure CI for the iOS app with App Extensions 【发布时间】:2020-07-07 09:47:59 【问题描述】:

我在 Azure DevOps (VSTS) 中尝试了多种方法来为 ios 应用程序创建 CI,但结果证明 Azure DevOps doesn't support 具有应用程序扩展的应用程序。真的是这样吗?

我在我们的项目中使用OneSignal Notification Service Extension,它依赖于主要目标。因此,当Xcode task 尝试签署应用程序时,会发生与构建标识符相关的错误,因为 Xcode 主目标的构建标识符与 OneSignalNotificationServiceExtension 的构建标识符不同

❌ 错误:配置文件“MainTargetName”的应用 ID“com.xyz.-”与捆绑包 ID“com.xyz.-.OneSignalNotificationServiceExtension”不匹配。 (在项目“ProjectName”的目标“OneSignalNotificationServiceExtension”中)

我正在使用 apple certificate 任务在 Microsoft 托管代理上安装证书,并且类似地使用 provisioning profile 任务来安装配置文件。看起来 Xcode 任务 有一个 limitation,它无法获得多个配置文件,因此它可以满足那些带有 App Extension 的 iOS 应用.

- task: InstallAppleCertificate@2
  displayName: 'Install Certificates'
  inputs:
    certSecureFile: '3Certificates.p12'
    certPwd: '$(P12Password)'
    keychain: 'temp'


- task: InstallAppleProvisioningProfile@1
  displayName: 'Install MainTarget provisioning profile'
  inputs:
    provisioningProfileLocation: 'secureFiles'
    provProfileSecureFile: 'MainTarget.mobileprovision'

- task: InstallAppleProvisioningProfile@1
  displayName: 'Install OneSignal provisioning profile'
  inputs:
    provisioningProfileLocation: 'secureFiles'
    provProfileSecureFile: 'OneSignal.mobileprovision'

- task: CmdLine@2
  displayName: 'CocoaPods install'
  inputs:
    script: |
      cd $(Build.SourcesDirectory)
      echo "Pod installation"
      pod install
- task: Xcode@5
  displayName: 'Xcode Build'
  inputs:
    actions: 'build'
    xcWorkspacePath: 'CICD.xcworkspace'
    scheme: 'CICD'
    xcodeVersion: 'specifyPath'
    xcodeDeveloperDir: '/Applications/Xcode_11.2.1.app'
    packageApp: true
    exportOptions: 'plist'
    exportOptionsPlist: 'CICD/Info.plist'
    signingOption: 'manual'
    signingIdentity: '$(MY_CERTIFICATE_SIGN_IDENTITY)'
    provisioningProfileUuid: '$(MainTarget_ProfileUUID)'
    provisioningProfileName: '$(MainTarget_ProfileName)'

如果我在这里遗漏了什么,请告诉我。

【问题讨论】:

【参考方案1】:

很遗憾,在 Azure 中,对于带有应用扩展的 iOS 应用程序没有直接的方法。

    要使其正常工作,您必须对项目进行一些更改,这些更改在此 link 上推荐。 之后,您将能够使用 xcodebuild Docs. 构建和归档应用程序,因为您将拥有一个指向每个配置文件的变量。 在您的 MAC 上尝试终端中的 xocdebuild 命令并记下完整命令以实现特定文件。 使用管道中的CmdLine@2 任务和这些命令来构建、存档和导出您的 IPA。

注意:我已经发布了Gist,涵盖了此类 iOS 应用程序的管道。

- task: InstallAppleCertificate@2
  displayName: 'Install Certificates'
  inputs:
    certSecureFile: '3Certificates.p12'
    certPwd: '$(P12Password)'
    keychain: 'temp'

- task: InstallAppleProvisioningProfile@1
  displayName: 'Install MainTarget provisioning profile'
  inputs:
    provisioningProfileLocation: 'secureFiles'
    provProfileSecureFile: 'MainTarget.mobileprovision'

- task: InstallAppleProvisioningProfile@1
  displayName: 'Install OneSignal provisioning profile'
  inputs:
    provisioningProfileLocation: 'secureFiles'
    provProfileSecureFile: 'OneSignal.mobileprovision'

- task: CmdLine@2
  displayName: 'CocoaPods install'
  inputs:
    script: |
      cd $(Build.SourcesDirectory)
      echo "Pod installation"
      pod install

- task: CmdLine@2
  inputs:    
    script: |
      echo "Build iOS app"
      cd $(Build.SourcesDirectory)
      
      /usr/bin/xcodebuild -sdk $(sdkOption) -configuration $(configurationOption) -workspace $(workspaceName) -scheme "$(schemeName)" build -allowProvisioningUpdates CODE_SIGN_STYLE=Manual CODE_SIGN_IDENTITY="$(signingIdentity)" APP_PROFILE="$(APP_PROFILE_ID)"  EXTENSION_PROFILE="$(APP_EXT_PROFILE_ID)"
  displayName: 'Xcode Buid'

- task: CmdLine@2
  inputs:    
    script: |
      echo "Archive the iOS app"
      cd $(Build.SourcesDirectory)
      
      /usr/bin/xcodebuild -sdk $(sdkOption) -configuration $(configurationOption) -workspace $(workspaceName) -scheme "$(schemeName)" archive -allowProvisioningUpdates CODE_SIGN_STYLE=Manual CODE_SIGN_IDENTITY="$(signingIdentity)" APP_PROFILE="$(APP_PROFILE_ID)"  EXTENSION_PROFILE="$(APP_EXT_PROFILE_ID)" -archivePath $(ArchivePath)
  displayName: 'Xcode Archive'

- task: CmdLine@2
  inputs:    
    script: |
      /usr/bin/xcodebuild -exportArchive -archivePath $(ArchivePath) -exportOptionsPlist $(Build.SourcesDirectory)/MyApplication-Info.plist  -exportPath $(ExportIpaPath)
  displayName: 'Xcode Export'

【讨论】:

【参考方案2】:

我设法用一种简单的方式让它工作。

使用 XCode 在本地编译您的项目 存档并导出以供您使用(对我来说是 Testflight 上传) 在您导出 .ipa 的文件夹中,您会找到一个“export-options.plist” 在Pipeline Azure, XCode build Task中指定这个文件:“export option plist”

(你必须在你的仓库中添加文件并提交/推送它)

还有多田! 将我带到那里的来源:https://blog.bitrise.io/new-export-options-plist-in-xcode-9

【讨论】:

【参考方案3】:

请查看this issue,您可以尝试在command-line中构建ios App,并将扩展应用名称作为参数传递。

类似:xcodebuild ... -scheme "YourExtension" -CODE_SIGN_IDENTITY=xxx PROVISIONING_PROFILE=xxx CONFIGURATION_BUILD_DIR=xxx

有关如何从命令行构建项目的更多详细信息,请参阅here。

【讨论】:

嗨@LanceLi-MSFT,我已经尝试过您建议的命令行方法,但它不适合命令中设置的多个配置文件。而且我认为目前这种iOS应用的CI只能通过命令行来实现。 @Shakaib this link 可以帮到你吗?并且由于官方任务不建议构建带有扩展的ios应用程序,我们可以使用CI管道中的CMD任务/Bash任务来构建应用程序。 是的!该链接对我很有帮助,前几天我找到了。感谢分享。目前,我在我的项目中使用 Max Chuquimia 建议的推荐配置以及沿途的一些其他配置。我已经使用 命令行 成功构建了 Xcode 应用程序。完成后将发布我的管道配置。 太好了,很高兴知道我的回答会有所帮助。一旦完成,您可以考虑将您的解决方案添加为答案。见can I...

以上是关于我们如何使用 App Extensions 为 iOS 应用程序配置 CI的主要内容,如果未能解决你的问题,请参考以下文章

safari app extensions:从swift后台进程向所有选项卡广播消息

App Extensions篇之Sticker Pack Extension

App Extensions篇之Share Extension

Extensions in UWP Community Toolkit - WebViewExtensions

如何使用 Serilog 和 AutoFac 在控制台应用程序中获取 Microsoft.Extensions.Logging<T>?

Flutter:是不是有可能创建 App Widgets (Android) 和 Today Extensions (iOS)? [复制]