如果您在 Linux 或 Windows 上工作,请从这篇文章中了解如何构建和发布 iOS 应用程序。我们将展示如何使用 Flutter 和Codemagic(https://flutterci.com/)实现这一点。

注意!开发 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 入门指南。

请记住,我们可以使用 Linux 或 Windows 仅针对 Android 而非 iOS 进行开发。在本文结束时,我们仍然会获得一个可以部署到 App Store 的 iOS 应用程序,但我们将使用 Codemagic CI/CD 和 macOS 环境来实现这一点。

将应用程序添加到 Codemagic

注册后,您可以通过单击添加应用程序按钮连接您的存储库。

文档链接。如果存储库是自托管的或位于防火墙后面,请参阅此处的文档。

运行你的第一个构建

让我们尝试运行构建并打印“我的第一个绿色构建!”

  1. 打开 Flutter 工作流编辑器并选择仅运行测试。

  2. 确保在测试部分禁用测试。

  3. 在 Distribution 部分之后打开 + 按钮并写入

#!/bin/shecho "我的第一个绿色建筑!"
  1. 保存更改。

  2. 开始构建。

唉……构建失败了。pubspec.yaml错误消息是说克隆存储库的根目录中没有文件。这是真的,因为它是一个单一的仓库。我们如何告诉 Codemagic 使用哪个路径作为工作目录?

  1. 打开工作流编辑器。

  2. 转到 Build 部分并在 Project path 字段中选择 Flutter 演示项目。

  1. 保存更改。

  2. 开始构建。

成功!

构建 iOS 项目

现在您已经完成了第一个绿色构建,让我们尝试构建 iOS 项目。

  1. 打开工作流编辑器。

  2. 选择 iOS 作为构建平台。

  3. 在 Build 部分,选择您想要使用的 Xcode 版本、CocoaPods 和 Flutter 版本。

  4. 保存设置。

  5. 开始构建。

  6. 交叉你的手指。

在撰写本文时,我们使用 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 "添加 Podfile"
git push

请参阅文档以查看如何在此处使用远程访问(https://docs.codemagic.io/troubleshooting/accessing-builder-machine-via-ssh/)

为了将更改推送到您的存储库,您需要在您的 git 提供程序中进行身份验证。这是必要的,因为 Codemagic VM 仅具有对 GitHub 存储库的读取权限。为了通过 GitHub 进行身份验证,您需要使用您的 GitHub 个人访问令牌。查看如何从https://github.com/settings/tokens生成令牌。

您现在离获取文件又近了一步.ipa

.ipa 文件

.ipa是一个二进制文件,就像.apk可以在Android 的物理设备上运行。我们无法在 macOS 以外的任何设备上生成二进制文件

.ipa。克服障碍的方法是在 macOS 环境中使用持续集成和交付服务。我们需要设置我们的 Codemagic CI/CD,以便能够使用 Xcode 进行代码签名并构建.ipa二进制文件,然后将其发布到 App Store Connect。

准备 iOS 项目以在本地计算机上进行代码签名

就像您需要将 Gradle 配置为使用相对路径而不是绝对路径以便在 CI/CD 环境中运行一样,我们也需要对我们的 iOS 项目进行一些更改。

  1. 前往https://developer.apple.com/account/resources/identifiers/list在 Apple Developer Portal 中注册您的捆绑包 ID 。

  2. 在https://appstoreconnect.apple.com/apps中创建一条应用记录,并使用您刚刚创建的捆绑包 ID。

  3. 在编辑器中打开您的 iOS 项目并打开project.pbxproj文件并将应用程序设置为PRODUCT_BUNDLE_IDENTIFIER您刚刚创建的包 ID。这在项目中的多个地方都提到过,因此请确保在任何地方进行更改。您可以在没有 Mac 的情况下编辑文件。

  4. 加分项:为 Codemagic 中的自动构建触发设置 webhook。通过打开工作流编辑器并将构建触发器设置为基于推送到 master 构建。

  5. 从您的本地机器终端,保存您对project.pbxproj文件所做的更改并将更改推送到存储库中的 master。如果您已经配置了webhook(https://docs.codemagic.io/configuration/webhooks/),您还应该看到 Codemagic 构建从此推送中触发。

如果您正在使用风味,我们在此处的单独帖子中介绍了此案例,并且此处(https://blog.codemagic.io/environments-in-flutter-with-codemagic-cicd/)的 GitHub 上提供了示例项目

如果您正在使用一些 Google 服务,例如 Firebase,那么您将需要通过 VNC 远程访问虚拟机并GoogleService-info.plist通过 Xcode 将文件添加到 iOS 项目中。我们的博客上有一篇关于将 Firebase 添加到您的 iOS 项目的文章(https://blog.codemagic.io/practical-guide-flutter-firebase-codemagic/)。

iOS 代码签名入门

从Stackoverflow(https://stackoverflow.com/search?q=ios+code+signing&s=bd2a9347-3cc5-49e1-b872-30a8056f8f08)上与 iOS 代码签名相关的问题数量来看,许多开发人员都在为 iOS 代码签名而苦恼。我们知道设置代码签名可能会让人头疼,尤其是当您试图让它在没有 Mac 的 CI/CD 环境中工作时。

为了对 iOS 应用程序进行代码签名,您需要一个 Apple 开发人员帐户(开头提到的要求之一)、一个开发和分发证书、您的应用程序 ID 和匹配的配置文件。

在 WWDC 2019 之后,可以使用 App Store Connect API 来生成这些签名文件。我们在 API 之上构建了自己的 CLI 工具,Codemagic 在后台使用这些工具来简化代码签名和发布。CLI 工具在GitHub 上(https://github.com/codemagic-ci-cd/cli-tools)是开源的。

在 Codemagic 上设置 App Store Connect 集成

现在您已经成功构建了 iOS 项目并设置了您的 iOS 项目以进行代码签名,让我们在 Codemagic 上也启用 iOS 代码签名。

为此,我们将使用 App Store Connect 集成。这意味着您需要在 Apple Developer Portal 上创建 API 密钥。

  1. 打开工作流编辑器并转到分发 > iOS 代码签名。

  2. 按照提示设置 App Store Connect 集成。

  3. 转到Apple 开发人员门户(https://appstoreconnect.apple.com/)> 用户和访问权限。

  4. 转到 Keys 部分并创建 App Store Connect API 密钥,然后将其上传到 Codemagic 以通过 Apple Developer 门户进行身份验证。

  5. 完整的 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 密钥文件。请注意,密钥只能下载一次。

链接到文档(https://docs.codemagic.io/flutter-code-signing/ios-code-signing/#automatic-code-signing)

构建 .ipa 文件并发布到 App Store Connect

现在您已启用 App Store Connect 集成,您可以使用 Codemagic 生成代码签名文件(证书和配置文件)并生成.ipa.

  1. 打开工作流编辑器。

  2. 导航到分发 > iOS 代码签名。

  3. 选择自动代码签名。

  4. 选择您的 API 密钥。

  5. 选择配置文件类型作为 App Store。

  6. 选择您的捆绑包标识符。

  7. 保存更改。

  8. 打开 App Store Connect 部分并启用 App Store Connect 发布;确保选择我们刚刚创建的 API 密钥。

启动您的新构建。

您也可能面临其他错误。

如果由于这样的错误消息而导致构建失败,则意味着您的帐户中有太多现有的分发证书。您可以删除未使用的或选择手动代码签名并按照此处的文档上传您现有的配置文件和分发证书(https://docs.codemagic.io/flutter-code-signing/ios-code-signing/#manual-code-signing)

如果您选择使用.yaml文件配置而不是 GUI 工作流编辑器,您还可以指定您正在使用的分发证书的私钥。链接到文档(https://docs.codemagic.io/yaml-code-signing/signing-ios/#saving-the-api-key-to-environment-variables)

结论

您可以使用 Flutter 之类的 SDK 在许多平台上开发应用程序。Codemagic CI/CD 允许您与您的团队协作并通过为所有目标平台自动构建和发布应用程序来快速移动——无论是到商店还是在您的团队中共享。

确保在发布之前测试应用程序,并且您可以访问您正在构建的本机操作系统。

如何在没有 Mac 的情况下使用 Flutter 和 Codemagic 构建和分发 iOS 应用相关推荐

  1. 关于 idea 存在情况下的mac 自动重启 解决方式

    本人电脑型号:2018 mbp 13.3  macos 10.15.6 idea 在mac上 导致mac 频繁关机重启解决方式 当然是你去过售后 或者你自认为你的电脑的硬件是完全没有问题的情况下这样做 ...

  2. mac碰到哪些情况下需要重装系统?

    最近有很多朋友问到:Mac 如何重装/降级系统?为了方便大家理解和吸收,mac小编把这个系列文章分成了几篇,主要包括:哪些情况下需要重装系统?重装系统方法有哪些?具体该如何操作?以及我们该如何选择适合 ...

  3. 初代Mac电脑是在什么样的情况下诞生的,Mac电脑的由来

    一提到Mac电脑,相信很多人都知道,但你知道Mac电脑是怎么来的吗?现在我们知道,苹果公司所有电脑产品的命名都和 Mac 相关,比如 Macbook,MacBook Pro,MacBook AIr,i ...

  4. Mac OS X 下连接CMCC无法弹出登陆页面问题

    一般情况下连接中国移动CMCC等其他无线网络的时候,会弹出一个登陆界面,让用户输入账户和密码,然后就可以登陆联网.但是部分童鞋会遇到这样情况:在Mac OS X下连上CMCC的时候无法弹出登陆界面(w ...

  5. Python 学习之中的一个:在Mac OS X下基于Sublime Text搭建开发平台包括numpy,scipy

    1 前言 Python有许多IDE能够用,官方自己也带了一个,Eclipse也能够. 但我在使用各种IDE之后,发现用Sublime Text是最好用的一个.因此.我都是用Sublime Text来编 ...

  6. 涉密电脑痕迹深度清理_Mac空间不足的情况下,该怎么清理呢?

    C盘是win的默认系统盘,存放着很多文件,如果去看看C盘,你会发现里面文件很多,甚至最早的和最晚的文件时间跨度大到了你总共使用了这台电脑的时间. 而且里面的文件有很大一部分是不需要的,这也是导致电脑容 ...

  7. 一个数字可以在不损失精度的情况下达到的JavaScript的最高整数值是多少?

    这是由语言定义的吗? 是否有定义的最大值? 在不同的浏览器中是否有所不同? #1楼 您要用于按位运算的任何值都必须在0x80000000(-2147483648或-2 ^ 31)和0x7fffffff ...

  8. KVM虚拟机内无agent情况下的监控方法

    KVM虚拟机内无agent情况下的监控(ceilometer实现) 今天看到大家在群里讨论KVM虚拟机的监控问题,而且是要求VM内无agent情况下的监控.这方面确实没有深入研究,但尚有些openst ...

  9. mysql 并发避免锁表_MYSQL锁表的用法,防止并发情况下的重复数据

    项目中有些使用的redis存储,当对redis进行rehash的时候感觉是比较麻烦的.于是写了个简单的读取redis到数据库的关键方法.仅供参考. package com.redis.web; imp ...

最新文章

  1. [WARNING] unable to add QUERY_STRING=XXXX to uwsgi packet, consider increasing buffer size
  2. iPhone 隐私新规下的“大地震”:四大平台损失近百亿美元,“连用户是男是女都分不清……”
  3. 14.相同的树另一棵树的子树检查子树二叉树中的列表(教你们使用相同的套路快速解决这四道题)
  4. 关于Apahce服务器安装中遇到的问题
  5. Qt创建Android服务
  6. 【Linux系列】mac终端与服务器连接
  7. iOS 跨平台开发,该用 Flutter 还是 Swift?
  8. RHEL7.0 防火墙入门
  9. vue-cli 2.x 项目优化之:引入本地静态库文件
  10. YYKit-YYModel分析
  11. USB协议详解第17讲(USB事务总结)
  12. linux系统 如何选择题,Linux考证试题选择题
  13. 如何使用 Windows 10 自带的磁盘清理程序?
  14. 中国移动mda移动桌面助手
  15. python里面else什么意思_python中if else和if elif else有什么区别?
  16. 微信小程序之回调函数
  17. 数据库去重,group by、distinct、rowid的用法,oracle和mysql如何数据去重保留一条
  18. 系统学习SSH(一)--SSH
  19. Java开发记事本(完整版)
  20. paddle第十九期3天训练营3.14-day2

热门文章

  1. 网络舆情风险和危机监测解决方案
  2. mysql去掉字段中的中文括号及括号中的内容
  3. CCNA-基础配置(1)
  4. 发那科机器人网段_FANUC机器人以太网通讯手册
  5. 苹果新Apple TV出现Bug如何解决?
  6. Python 图片与pdf相互转换
  7. 【Linux】软件包管理器yum和编辑器vim(部分动图演示)
  8. 为什么outlook不能改成HTML格式,如何解决Outlook 2016中的HTML格式问题
  9. 966SEO学习网:火车头采集器使用教程(入门+高级)
  10. 上交计算机考研专业课,2018上交考研经验贴