我们如何使用 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)? [复制]