如何使用 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 系统,所以我直接打开终端并输入:
安装 Dockerpacman -S docker
启动 Docker 服务systemctl start docker.service
启用 Docker 服务以随系统启动systemctl enable docker.service
测试 Docker:docker run 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
系统启动时,选择Disk Utility
现在,我们将搜索存储空间最大的分区并选择该选项Erase。
为了确保格式正确,所选选项必须与以下内容完全一致:
点击Erase,等待过程完成,然后即可关闭磁盘工具窗口。
接下来,选择该选项Reinstall macOS Big Sur,接受条款,然后选择我们刚刚创建的分区macOS并开始安装。(此过程可能需要 30 分钟到 1 小时)。
所以,系统必须重启(或者不重启),就我而言,我不得不手动重启,因为它没有自动重启。在这种情况下,请关闭 QEMU 窗口。
在终端中,我们将输入:
docker ps -a
要知道我们容器的 ID,接下来我们将开始输入以下命令:
docker start ID
选中macOS Installer后,安装将继续。
然后,系统将自动重启(也可能不会),因此请再次关闭 QUEMU 并重新启动容器。
系统启动时,选择该选项macOS Installer并等待过程完成。完成后,系统将重新启动。(现在确实如此)。
macOS 已成功安装。请选择该选项macOS。
完成后,程序将再次重启,您选择相同的macOS选项。
完成!欢迎界面已出现。配置过程比较慢,但完成后系统就能正常运行了。
配置系统,但目前不要登录您的 Apple ID。
当该过程完成后,我们的桌面将会出现,我们将等待 Dock 出现,因为在此之后,系统将最为稳定。
现在,我们将使用它来brew更快地安装软件包。
在 macOS 系统中打开终端,并使用以下命令安装 brew:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
请输入密码并等待过程完成。
现在,我们将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"
为了获得更好的体验,请参阅“通过 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"
为了获得更好的体验,请参阅“通过 SSH 创建文件夹连接”部分。
通过 SSH 创建文件夹连接
现在我们的应用已经在 macOS 上运行了,但是遇到了一个问题:在 macOS 系统内打开代码编辑器或 IDE 的体验非常糟糕,经常出现卡顿、崩溃、键盘映射问题等等。所以我研究了使用 SSH 创建文件连接的解决方案。
此外,我可以在 macOS 系统中打开开发服务器,并建立连接,这样我就可以直接从我的 Linux 或 macOS 系统中修改文件,从而实现双向更新。这确保我们能够利用开发模式下的一些功能,例如快速刷新。
Linux 到 Mac 的连接
首先,我们需要允许通过 Mac 登录 SSH 连接。为此,我们将打开终端并输入:
打开并编辑 SSH 配置文件的命令:sudo nano /etc/ssh/sshd_config
在开头查找PasswordAuthentication、放置yes和删除。#
保存文件。
前往System Preferences -> Sharing -> Remote Login并对所有用户启用:
重启 SSH 的命令:sudo launchctl stop com.openssh.sshd && sudo launchctl start com.openssh.sshd
现在,在 Linux 终端中:
安装 sshfs:sudo pacman -S sshfs
获取容器 IPdocker 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软件包可以使用以下命令安装:
安装 sshfsbrew install --cask macfuse && brew install gromgit/fuse/sshfs-mac
在Linux系统上:
编辑 SSH 配置文件的命令:sudo nano /etc/ssh/sshd_config
在开头查找PasswordAuthentication、放置yes和删除。#
保存文件。
在 Manjaro 系统上重启 SHH 的命令:sudo systemctl restart sshd.service
在 Mac 上,我们将创建一个文件夹来打开连接。
创建文件夹:mkdir projeto
用于打开新 Linux 连接的命令sudo sshfs USER_LINUX@IP_HOST:/PATH/LINUX /PATH/MAC -p 23
输入该命令时,会发生错误。
打开首选项并点击Allow
重启你的Mac电脑。
现在,我们可以打开连接了:(我的 SSH 连接使用的是不同的端口,但默认端口是 22)
完成之后,我们可以从任一端进行更新,更新内容也会反映在双方身上。
最后考虑因素
非常感谢您阅读这篇教程,顺便说一下,这是我多年来发表的第一篇教程。欢迎提出任何问题或建议(主要是关于我的英语)。
哦,千万别更新你的Mac电脑。
:)
文章来源:https://dev.to/ianito/how-to-emulate-ios-on-linux-with-docker-4gj3





















