发布于 2026-01-05 4 阅读
0

如何使用 Docker 在 Linux 上模拟 iOS DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

如何使用 Docker 在 Linux 上模拟 iOS

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

笔记

我目前正在寻找全栈工程师或后端工程师的工作机会。如果您知道有任何空缺职位,请随时通过 LinkedIn 联系我,我的用户名是Iaan Mesquita :)。


经过多次失败的尝试,我终于成功地虚拟化了一个 macOS 系统,以便在我正在开发的 iOS 应用上运行测试。

但在继续之前,必须知道这不是一个稳定的解决方案,并且存在一些性能问题,但是,就我的目的而言,我设法实现了我想要的目标。

我们将使用 QEMU 来模拟 Mac,然后在 QEMU 内部使用 Xcode 来模拟 iOS。这个过程不会很轻量级。

Docker OSX在 GitHub 上的代码库里解释了如何通过 USB 连接 iPhone 而不是使用模拟器,但我没有 iPhone。xD

概括

什么是 Docker OSX?

Docker OSX 是一个使用 QEMU 的 Docker 镜像,以便我们可以模拟操作系统。

阅读更多:什么是 Docker?

硬件规格

我的电脑配置应该足够运行这个项目,但是,在使用 Docker OSX + Xcode + Visual Studio Code + 开发服务器时,我仍然注意到了一些卡顿现象。(这么多东西甚至都能把房间暖和起来了)

  • 操作系统: Manjaro Linux x86_64
  • 内核: 4.19.220-1-MANJARO
  • Shell: zsh 5.8
  • 分辨率: 1440x900
  • DE: GNOME 41.2
  • WM:穆特
  • WM主题: Orchis-orange-compact
  • 图标: Win11-紫色-深色 [GTK2/3]
  • 终端: gnome-terminal
  • CPU: Intel i7-3770 (8) @ 3.900GHz
  • GPU: NVIDIA GeForce GTX 1050 Ti
  • 内存: 4105MiB / 15985MiB
  • 固态硬盘: Crucial BX500 240GB(强烈推荐的固态硬盘

安装

首先,你需要在电脑上安装 Docker。我用的是 Manajaro 系统,所以我直接打开终端并输入:

安装 Docker
pacman -S docker

启动 Docker 服务
systemctl start docker.service

启用 Docker 服务以随系统启动
systemctl enable docker.service

测试 Docker:
docker run hello-world

Docker 运行 hello-world

好了,现在我们将下载 Docker OSX 并使用以下命令运行:

docker run -it --device /dev/kvm -p 50922:10022 -e DEVICE_MODEL="iMacPro1,1" -e WIDTH=1440 -e HEIGHT=900 -e RAM=8 -e INTERNAL_SSH_PORT=23 -e AUDIO_DRIVER=alsa -e CORES=2 -v /tmp/.X11-unix:/tmp/.X11-unix -e "DISPLAY=${DISPLAY:-:0.0}" -e GENERATE_UNIQUE=true -e MASTER_PLIST_URL=https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist sickcodes/docker-osx:big-sur
你可以在docker osx 的 GitHub 仓库 中查看每个标志的含义
简而言之,我指定了分辨率、内存、处理器核心数、版本和其他一些参数。

然后,Docker OSX 将被下载并初始化。

模拟器打开后,选择选项macOS Base System

Docker OSX 模拟器

系统启动时,选择Disk Utility

Docker OSX 模拟器

现在,我们将搜索存储空间最大的分区并选择该选项Erase

Docker OSX apagando 系统

为了确保格式正确,所选选项必须与以下内容完全一致:

Formatação opções

点击Erase,等待过程完成,然后即可关闭磁盘工具窗口。

接下来,选择该选项Reinstall macOS Big Sur,接受条款,然后选择我们刚刚创建的分区macOS并开始安装。(此过程可能需要 30 分钟到 1 小时)。
Docker OSX 安装

所以,系统必须重启(或者不重启),就我而言,我不得不手动重启,因为它没有自动重启。在这种情况下,请关闭 QEMU 窗口。

Qemu错误

在终端中,我们将输入:

docker ps -a

要知道我们容器的 ID,接下来我们将开始输入以下命令:

docker start ID

Docker IDS

选中macOS Installer后,安装将继续。

Docker OSX 安装

然后,系统将自动重启(也可能不会),因此请再次关闭 QUEMU 并重新启动容器。

Docker OSX 安装

系统启动时,选择该选项macOS Installer并等待过程完成。完成后,系统将重新启动。(现在确实如此)。

macOS 已成功安装。请选择该选项macOS

Docker OSX 初始化

完成后,程序将再次重启,您选择相同的macOS选项。

完成!欢迎界面已出现。配置过程比较慢,但完成后系统就能正常运行了。

Tela de bem vindo macOS

配置系统,但目前不要登录您的 Apple ID。

当该过程完成后,我们的桌面将会出现,我们将等待 Dock 出现,因为在此之后,系统将最为稳定。

mac OS Sem 扩展坞安装电话

Mac OS Com 扩展坞安装电话

现在,我们将使用它来brew更快地安装软件包。

在 macOS 系统中打开终端,并使用以下命令安装 brew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

请输入密码并等待过程完成。

现在,我们将xcode在苹果商店进行安装。

Apple Store Xcode

现在,我们可以使用 Apple ID 登录了。

登录苹果商店

之后,请等待安装完成。

然后,打开xcode并接受条款,等待安装依赖项。

现在,Preferences -> Locations -> Command-Line Tools它会显示空白,请选择带有 Xcode 版本的选项。

安装完成后,我们将再次打开终端并cocoapods使用以下命令进行安装。它用作 Xcode 的打包管理器。

brew install cocoapods

完成上述步骤后,我们的macOS程序将被安装并配置以运行项目。

使用 React Native 运行应用程序

好的,让我们从 React Native 的 Hello World 开始,看看我们之前所做的一切是否都能正常工作。

我只会查看 iOS 版本。

打开终端并输入:

安装节点:
brew install node

安装 yarn(可选):
npm install -g yarn

使用 RN 创建项目:
npx react-native init teste

如果系统提示您再次安装 CocoaPods,请选择使用 brew 的选项。

进入项目目录:
cd teste

进入 ios 目录:
cd ios

安装依赖项:
pod install

返回根目录:
cd ..

列出所有可用的模拟选项:(可选)
xcrun simctl list devices

使用 Xcode 运行项目:
npx react-native run-ios --simulator="iPhone 13"
App rodando react native

为了获得更好的体验,请参阅“通过 SSH 创建文件夹连接”部分。

使用 Cordova 运行应用程序

好的,让我们先用 Quasar 的 Hello World 程序来检查一下之前所做的一切是否都能正常工作。

我只会查看 iOS 版本。

Quasar 使用 Cordova/Capacitor 开发 iOS 和 Android 版本。

安装节点:
brew install node

安装 yarn(可选):
npm install -g yarn

安装 quasar:
yarn global add @quasar/cli

安装 Cordova:
yarn global add cordova

*使用 Quasar 创建项目:
quasar create teste

进入项目目录:
cd teste

在项目中添加 Cordova:
quasar mode add cordova

进入 cordova 目录:
cd src-cordova

在项目中添加 iOS 版本:
cordova platform add ios

确认一切是否正常:
cordova requirements

列出所有可用的模拟选项:(可选)
cordova emulate iOS --list

安装依赖项:
yarn

返回根目录:
cd ..

安装依赖项:
yarn

在 iOS 上以开发模式运行 Quasar:
quasar dev -m iOS -e "iPhone 8, 15.2"
macOS 类星体

为了获得更好的体验,请参阅“通过 SSH 创建文件夹连接”部分。

通过 SSH 创建文件夹连接

现在我们的应用已经在 macOS 上运行了,但是遇到了一个问题:在 macOS 系统内打开代码编辑器或 IDE 的体验非常糟糕,经常出现卡顿、崩溃、键盘映射问题等等。所以我研究了使用 SSH 创建文件连接的解决方案。

此外,我可以在 macOS 系统中打开开发服务器,并建立连接,这样我就可以直接从我的 Linux 或 macOS 系统中修改文件,从而实现双向更新。这确保我们能够利用开发模式下的一些功能,例如快速刷新。

Linux 到 Mac 的连接

首先,我们需要允许通过 Mac 登录 SSH 连接。为此,我们将打开终端并输入:

打开并编辑 SSH 配置文件的命令:
sudo nano /etc/ssh/sshd_config

在开头查找PasswordAuthentication、放置yes和删除。#

SSHD配置

保存文件。

前往System Preferences -> Sharing -> Remote Login并对所有用户启用:

macOS 配置

重启 SSH 的命令:
sudo launchctl stop com.openssh.sshd && sudo launchctl start com.openssh.sshd

现在,在 Linux 终端中:

安装 sshfs:
sudo pacman -S sshfs

获取容器 IP
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ID_CONTAINER

创建文件夹:
mkdir projeto

使用以下命令打开与 Mac 的新连接:
sudo sshfs USER_MAC@IP_CONTAINER:/PATH/OF/PROJECT/ON/MAC /PATH/ON/LINUX -p 23

例子:

连接示例

好了,现在我们可以在 Linux 系统上打开 VSCode,直接在 Mac 上更新文件。

如果你有另一台电脑,你可以进行这种连接,让你的电脑上的模拟器只进行模拟。

Mac 到 Linux 的连接

安装过程与之前相同,但Mac上的sshfs软件包可以使用以下命令安装:

安装 sshfs
brew install --cask macfuse && brew install gromgit/fuse/sshfs-mac

在Linux系统上:

编辑 SSH 配置文件的命令:
sudo nano /etc/ssh/sshd_config

在开头查找PasswordAuthentication、放置yes和删除。#

SSHD配置

保存文件。

在 Manjaro 系统上重启 SHH 的命令:
sudo systemctl restart sshd.service

在 Mac 上,我们将创建一个文件夹来打开连接。

创建文件夹:
mkdir projeto

用于打开新 Linux 连接的命令
sudo sshfs USER_LINUX@IP_HOST:/PATH/LINUX /PATH/MAC -p 23

输入该命令时,会发生错误。

错误 MAC

打开首选项并点击Allow

MacOS 首选项

重启你的Mac电脑。

现在,我们可以打开连接了:(我的 SSH 连接使用的是不同的端口,但默认端口是 22)

SSH 连接正常

完成之后,我们可以从任一端进行更新,更新内容也会反映在双方身上。

最后考虑因素

非常感谢您阅读这篇教程,顺便说一下,这是我多年来发表的第一篇教程。欢迎提出任何问题或建议(主要是关于我的英语)。

哦,千万别更新你的Mac电脑。

:)

文章来源:https://dev.to/ianito/how-to-emulate-ios-on-linux-with-docker-4gj3