如何在没有 Mac 的情况下使用 Flutter & Codemagic 开发和分发 iOS 应用
如果您在 Linux 或 Windows 上工作,请从这篇文章中了解如何构建和发布 iOS 应用程序。我们将展示如何使用 Flutter 和 Codemagic 实现这一点。
注意!开发 iOS 应用程序与使用 Codemagic 构建和发布它们是有区别的。
很难想象在没有 Mac 电脑的情况下为 iOS 开发应用程序。没有迹象表明这种情况会很快发生变化,但即使您没有 Mac,仍然有办法为 iOS 构建应用程序并将其发布到 App Store。使用Flutter和Codemagic,您无需自己购买 Mac 计算机即可构建和分发 iOS 应用程序。
在这篇文章中,我们将引导您了解如何在 Linux 或 Windows 上创建 Flutter 应用程序,并使用 Codemagic CI/CD 为您的 iOS 项目设置代码签名并将应用程序发布到 App Store。在此示例中,我们将使用来自Codemagic 示例项目的 Flutter iOS 应用程序。
要求
-
您需要购买 Apple Developer Program 许可证才能对应用程序进行代码签名和发布
-
您还应该有一个 iOS 设备来对应用程序进行烟雾测试
在没有 Mac 的情况下使用 Flutter 和 Codemagic 构建和分发 iOS 应用程序开始使用
在开始之前,重要的是要明确我们要解决的问题。没有 Mac 计算机就无法开发 iOS 应用程序。本文介绍如何构建 iOS 应用并将其发布给您的用户。但是有什么区别呢?
在进入可能的解决方案之前,让我们仔细看看问题陈述和示例用例。在开始功能开发之前,将其视为一个用户故事以了解上下文。
什么时候可以不用Linux或Windows机器开发iOS应用?
您可能已经猜到,在 macOS 上拥有 iOS 模拟器或调试 iOS 特定问题是非常宝贵的。此外,当用户记录错误时,您需要能够重现问题,并且报告的问题很可能是特定于平台的。
我想说的是,在您必须处理的所有应用程序中普遍存在的最臭名昭著的功能之一就是推送通知。虽然 iOS 模拟器在大多数情况下就足够了,但在某些情况下,您还应该在真实设备上测试您的应用程序,推送通知就是其中之一。
什么时候可以在没有 Mac 电脑的情况下构建和发布 iOS 应用程序?
Flutter 的一大优势是不必为 iOS 或任何其他操作系统构建全新的应用程序,而是使用现有项目为所有平台发布。
您可以购买一台二手 Mac 并设置您的开发环境,或者您可以使用 Codemagic 等免费服务来构建您可以在 iOS 设备上进行烟雾测试或与您的第一批用户共享的 iOS 二进制文件。这是快速移动并让您的应用程序推出的好方法。
如果您是 macOS 用户并考虑将您的应用程序的桌面版本发布到 Microsoft 合作伙伴中心,请尝试扭转局面。您可以出去购买一台 Windows 机器来构建应用程序,或者您可以使用现有的 CI/CD 工具并将实例类型切换到 Windows。
我见过的第二个最常见的情况是当你在一个团队中工作时,一些团队成员拥有 Mac 电脑,而其他人拥有 Linux 或 Windows 机器。一旦您准备好合并 CI 将为所有平台构建的 PR 并自动与 QA 团队共享二进制文件,而不是要求其他人构建二进制文件或让 QA 做,那就太好了。
在 Linux 或 Windows 上开发 Flutter 应用
Flutter 是一个多平台应用程序开发框架,使您能够在其他平台中使用相同的源代码开发 iOS 和 Android 应用程序。但是,您需要使用 Xcode 来构建 iOS 应用程序,而 Xcode 只能在 macOS 上运行。你无法摆脱 Linux 或 Windows。但是,我们可以使用 Codemagic 等 CI/CD 产品构建应用程序并将其分发到 Google Play Store 或 Apple App Store。
Flutter 与 Codemagic 一起为使用 Linux 或 Windows 的开发人员发布 iOS 应用程序成为可能。
搭建Flutter开发环境
让我们从安装Android SDK和Flutter开始吧。之后,您可以从GitHub克隆 Codemagic 示例项目存储库,我们可以立即开始处理它。我们将使用 Flutter Android 和 iOS 演示项目。 Flutter 入门指南也可在Flutter docs的官方网站上找到。
请记住,我们可以使用 Linux 或 Windows 仅针对 Android 而不是 iOS 进行开发。在本文结束时,我们仍然会获得一个可以部署到 App Store 的 iOS 应用程序,但我们将使用 Codemagic CI/CD 和 macOS 环境来实现这一点。
将应用程序添加到 Codemagic
注册后,您可以通过单击添加应用程序按钮连接您的存储库。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--bBvUuHoB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.codemagic .io/_hu6fc93772c9c2484e3435b3ae7fbc4008_0_86790278da157cde123462bd8b49e266.png)
文档链接。如果存储库是自托管的或位于防火墙后面,请参阅此处的文档。
运行你的第一个构建
让我们尝试运行构建并打印“我的第一个绿色构建!”
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--TWAIXgEV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog. codemagic.io/_hu52fe4824508ff1c859232e5d73e3f723_0_9fbc75b99b3b58a8bf20626ba61a850a.png)
-
打开 Flutter 工作流编辑器并选择仅运行测试。
-
确保在“测试”部分禁用测试。
-
打开分发部分后的 + 按钮并写入
#!/bin/sh
echo "My first green build!"
进入全屏模式 退出全屏模式
-
保存更改。
-
开始构建。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--zuI-nR2b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog .codemagic.io/_hudc2c30e3b56e34621ada2c2730a6de53_0_a367466c42deeade72e9bbdf70c79a5c.png)
唉......构建失败了。错误消息是说克隆存储库的根目录中没有pubspec.yaml文件。这是真的,因为它是一个单一的仓库。我们如何告诉 Codemagic 使用哪个路径作为工作目录?
-
打开工作流编辑器。
-
转到 Build 部分并在 Project path 字段中选择 Flutter 演示项目。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--2u55EwGR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.codemagic .io/_hu4cf1bc52804ee9a00a9646d5d3b1d49c_0_e0a277b4938e40b6d63a13abb9449fe5.png)
-
保存更改。
-
开始构建。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--8kh4uDNt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.codemagic .io/_hu1a2e2f33b0a1b982ce871d52e7dd2ad8_0_98e11c3454559d46aabbacd0adc56276.png)
成功!
构建iOS项目
现在您已经完成了第一个绿色构建,让我们尝试构建 iOS 项目。
-
打开工作流编辑器。
-
选择 iOS 作为构建平台。
-
在 Build 部分,选择您要使用的 Xcode 版本、CocoaPods 和 Flutter 版本。
-
保存设置。
-
开始构建。
-
交叉你的手指。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--HYW74QBK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog .codemagic.io/_hud6fbdc764a7a7e5c3e59868977bf5fef_0_8d7ea6d77f677f8b5c73a7800e341bd8.png)
在撰写本文时(2022 年 2 月 3 日),我们使用 Xcode 13.2.1 和 Flutter 2.8.1
如果您在自己的应用程序上遵循本指南,那么您可能会遇到另一个失败的构建。
我们看到的一个常见问题是,如果您之前从未构建过 iOS 项目,那就是生成 Podfile 或对 Xcode 图形用户界面 (GUI) 进行小幅更改。您可以远程访问 Codemagic macOS 虚拟机并初始化一个新文件并将更改推送到您的存储库。连接后,从终端运行这些命令。例如,这就是初始化 pod 的方式。
cd iOS
pod init
gh auth login --with-token YOUR_GITHUB_PAT_TOKEN
git add .
git commit -m "Added Podfile"
git push
进入全屏模式 退出全屏模式
请参阅文档以了解如何使用远程访问此处
为了将更改推送到您的存储库,您需要在您的 git 提供程序中进行身份验证。这是必要的,因为 Codemagic VM 仅具有对 GitHub 存储库的读取权限。为了通过 GitHub 进行身份验证,您需要使用您的 GitHub 个人访问令牌。了解如何从https://github.com/settings/tokens生成令牌。
您现在离获得.ipa文件又近了一步!
.ipa 文件
.ipa是一个二进制文件,您可以在类似于 Android 的.apk的物理设备上运行。我们无法在 macOS 以外的任何设备上生成.ipa二进制文件。克服障碍的方法是在 macOS 环境中使用持续集成和交付服务。我们需要设置我们的 Codemagic CI/CD,以便能够使用 Xcode 进行代码签名并构建.ipa二进制文件,然后将其发布到 App Store Connect。
准备 iOS 项目以在本地计算机上进行代码签名
就像您需要将 Gradle 配置为使用相对路径而不是绝对路径以便在 CI/CD 环境中运行一样,我们也需要对我们的 iOS 项目进行一些更改。
-
前往https://developer.apple.com/account/resources/identifiers/list在 Apple Developer Portal 中注册您的捆绑包 ID。
-
在https://appstoreconnect.apple.com/apps中创建应用记录,并使用您刚刚创建的捆绑包 ID。
-
在编辑器中打开您的 iOS 项目并打开
project.pbxproj文件并将应用程序PRODUCT_BUNDLE_IDENTIFIER设置为您刚刚创建的包 ID。这在项目中的多个地方都提到过,因此请确保在任何地方进行更改。您可以在没有 Mac 的情况下编辑文件。 -
加分项:在 Codemagic 中为自动构建触发设置 webhook。通过打开工作流编辑器并将构建触发器设置为基于推送到 master 构建。
-
从本地机器终端,保存对
project.pbxproj文件所做的更改,并将更改推送到存储库中的 master。如果您已经配置了webhook,您还应该会看到 Codemagic 构建从这个推送中触发。
如果您正在使用风味,我们在单独的帖子此处中介绍了此案例,示例项目可在 GitHub此处
如果您使用 Firebase 等 Google 服务,则需要通过 VNC 远程访问虚拟机,并通过 Xcode 将GoogleService-info.plist文件添加到 iOS 项目中。在我们的博客此处上有一篇关于将 Firebase 添加到您的 iOS 项目的文章。
iOS 代码签名入门
从Stackoverflow上与 iOS 代码签名相关的问题数量来看,许多开发人员都在为 iOS 代码签名而苦恼。我们知道设置代码签名可能会让人头疼,尤其是当您试图让它在没有 Mac 的 CI/CD 环境中工作时。
为了对 iOS 应用程序进行代码签名,您需要一个 Apple 开发人员帐户(开头提到的要求之一)、一个开发和分发证书、您的应用程序 ID 和匹配的配置文件。
在 WWDC 2019 之后,可以使用 App Store Connect API 来生成这些签名文件。我们在 API 之上构建了自己的 CLI 工具,Codemagic 在后台使用这些工具来简化代码签名和发布。 CLI 工具在GitHub上是开源的。
在 Codemagic 上设置 App Store Connect 集成
现在您已经成功构建了 iOS 项目并设置了您的 iOS 项目以进行代码签名,接下来让我们在 Codemagic 上启用 iOS 代码签名。
为此,我们将使用 App Store Connect 集成。这意味着您需要在 Apple Developer Portal 上创建一个 API 密钥。
-
打开工作流编辑器并转到分发 > iOS 代码签名。
-
按照提示设置 App Store Connect 集成。
-
转到Apple 开发者门户> 用户和访问权限。
-
转到 Keys 部分并创建 App Store Connect API 密钥,然后将其上传到 Codemagic 以通过 Apple Developer 门户进行身份验证。
-
完成 Codemagic App Store Connect 集成。
我们建议创建用于 Codemagic 的专用密钥。对于自动代码签名,创建具有开发者角色的密钥。要将集成也用于发布到 App Store Connect,需要 App Manager 角色。在此示例中,我们将发布到 App Store Connect,并将创建具有 App Manager 角色的密钥。
-
App Store Connect API 密钥名称是帮助您在 Codemagic 中区分密钥的名称。
-
颁发者 ID 是 API 密钥表上方的字母数字值,用于标识创建身份验证令牌的人员。
-
您可以从 API 密钥表中找到密钥 ID。
-
API 密钥是可以从 App Store Connect 下载的 .p8 密钥文件。请注意,密钥只能下载一次。
链接到文档
构建 .ipa 文件并发布到 App Store Connect
现在您已启用 App Store Connect 集成,您可以使用 Codemagic 生成代码签名文件(证书和配置文件)并生成.ipa。
-
打开工作流编辑器。
-
导航至分发 > iOS 代码签名。
-
选择自动代码签名。
-
选择您的 API 密钥。
-
将配置文件类型选择为 App Store。
-
选择您的捆绑包标识符。
-
保存更改。
-
打开 App Store Connect 部分并启用 App Store Connect 发布;确保选择我们刚刚创建的 API 密钥。
开始您的新构建。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--6xB8URur--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog .codemagic.io/_hu9a5a1a2b337ac6e0e33fdc7df4fbe80a_0_f1dca86a11344c2d3a51532eea3eb7f3.png)
您也可能面临其他错误。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--LRjTky3L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog .codemagic.io/Screen%2520Shot%25202022-02-04%2520at%252011.36.37-min_5996709950593172591_hu9be712d410707c3bab26f870dc8030aa_0_1280x1800_fit_linear_3.png)
如果由于这样的错误消息而导致构建失败,则意味着您的帐户中有太多现有的分发证书。您可以删除未使用的那些或选择手动代码签名并按照文档此处上传您现有的配置文件和分发证书
如果您选择使用.yaml文件配置而不是 GUI 工作流编辑器,您还可以指定您正在使用的分发证书的私钥。链接到文档
结论
您可以使用 Flutter 之类的 SDK 在许多平台上开发应用程序。 Codemagic CI/CD 允许您与您的团队协作并通过为所有目标平台自动构建和发布应用程序来快速行动——无论是到商店还是在您的团队中共享。
确保在发布之前测试应用程序,并且您可以访问您正在构建的本机操作系统。
更多推荐




所有评论(0)