Skip to main content

ReactNative项目中命令行编译iOS版的方法

Li Zheng flyskywhy@gmail.com

react-native 的 Android 开发在 Ubuntu 上很方便,至少个人觉得比 macOS 方便。在 Ubuntu 上的开发方法可参见 React使用详解 。偶尔在 macOS 上调试 iOS 版然后在 macOS 上配合 CI 自动编译出 .ipa 文件的方法参见本文。本文可用于 macOS 真机或虚拟机。

Xcode

按照 macOS 弹出的提示升级 macOS 系统,因为运行最新的 Xcode 会需要最新的 macOS 。

按照 macOS 弹出的提示升级 Xcode 软件,因为编译最新的 react-native 会需要最新的 Xcode 。

node

先按照 https://brew.sh 上的提示安装 brew 这个在 macOS 上安装各种开源软件的包管理器,再使用如下命令安装 node :

brew install node

brew 在安装 node 前会先尝试升级 brew 自身,这里可能是中国网络环境的原因而会卡住很久,此时可以直接 CTRL + C 跳过,它就会自动继续去安装 node 了。

react-native

使用如下命令安装 react-native 编译、运行 iOS 版所需的环境:

npm config set registry https://registry.npm.taobao.org --global npm install -g react-native-cli brew install watchman

gitlab-runner

安装一些 CI 脚本中可能用得到的工具:

brew install wget

这里以 gitlab 自带的 CI 为例,按照 Install GitLab Runner on macOS 一文在 macOS 中安装、配置 gitlab-runner ,另可参见 GitLab使用详解 中的“配置 Runner”小节。

需要在 macOS 中设置好开机时用当前账户自动登录,方法是在 macOS 中 System Preferences | Users & Groups | Login Optinos | Automatic Login

gilab-runner 会自动创建两个目录 ~/builds/~/cache/ 进行工作。

远程登录

虚拟机中的 macOS 运行速度较慢,此时有些命令行操作用 ssh 远程登录过去更方便,方法是在 macOS 中 系统偏好设置 | 选择共享 | 点击远程登录

安装证书以进行 xcodebuild

常见的情况是在一台 macOS 真机上调试好了,拿到 CI 用的 macOS 虚拟机中进行编译,此时需要在 macOS 虚拟机中安装从 macOS 真机中导出的证书。

.mobileprovision

从 macOS 真机中导出 .mobileprovision 文件,在 macOS 虚拟机中双击该文件,此时就能在 Xcode 中看到这个 provision 了。

.p12

从 macOS 真机中导出 .p12 文件,在 macOS 虚拟机打开 Applications | Utilities | Keychain Access ,进入 其中的 System | Certificates ,然后将 .p12 文件拖进去,最后在其中确认此刚导入的证书所对应的 private keyAccess ControlAllow all applications to access this item

命令行编译 iOS 版

在参考了使用 xcodebuild 从 archive 导出 ipa 一文后,发现可以用 xcodebuild archive -scheme YourProject -destination generic/platform=iOS -archivePath bin/YourProject.xcarchive -quiet 这个命令来生成 YourProject.xcarchive

按照 Xcode9 xcodebuild export plist 配置 ,先用图形界面的 Xcode 的 Product | Archive 打包完成后执行export操作(其中会需要你手动选择你的相关 provison profile 等信息), Xcode 会自动生成 ExportOptions.plist 文件,然后就可以用 xcodebuild -exportArchive -archivePath bin/YourProject.xcarchive -exportPath bin/YourProject -exportOptionsPlist ExportOptions.plist 这个命令来生成 ipa 文件了。

让 macOS 虚拟机无界面持续运行

用于 CI 的 macOS 虚拟机无需一直显示着图形界面。如果是用普通的 ssh 远程登录到一台 Ubuntu 上再用 virtualbox & 开启的 macOS 虚拟机,此时关闭 ssh 后, virtualbox 也会自动退出。因此理想方式是用 vboxmanage startvm macOS --type headless 命令。这个命令还有一个额外的好处,就是之后再用 virtualbox 打开的图形界面上不是“启动”而是“显示” macOS ,此时“显示”出来的 macOS 图形界面操作起来不会很卡顿。

让 macOS 虚拟机矫正好时间

由于 macOS 在虚拟机中不会时刻矫正时间,所以有时启动虚拟机后时间不正确,这会使一些工具比如阿里云 OSS 的命令行工具 ossutilmac64 运行不正常,解决方法是在 macOS 虚拟机中用 sudo visudo 命令添加 %staff ALL = NOPASSWD: /usr/sbin/ntpdate ,这样就可以在 CI 脚本中用 sudo ntpdate -u time.apple.com 来矫正时间,随后就可以在 CI 脚本中用 /usr/local/bin/ossutilmac64 来将自动编译出来的文件上传到阿里云 OSS 中了。