日常碎碎念最近经常有人问我怎么用 Rust 在 iOS 上开发. 那就完整地讲一下吧.

还有个事, 我的 17 款 MacBook Pro 使用流畅程度居然没有 16 款的好, 17 款动不动就吹鼓风机, 真是见得鬼了.

把工具搞定

在搞事情之前, 我们先把 Rust 环境配好, 这个很简单, 直接用官网的这条命令.

curl https://sh.rustup.rs -sSf | sh

随便装一个版本, 稳定版也好, 变态版(beta) 也罢.

然后装上一些工具链, 在终端输入

rustup target add aarch64-apple-ios x86_64-apple-ios

我个人只装了针对 A7 以上 64 位处理器的工具链, x86_64-apple-ios 这个是给模拟器用的.

还有其他几个工具链, 有需要的也可以装上.

armv7-apple-ios armv7s-apple-ios i386-apple-ios

建个 Rust 项目先

现在先建个 Rust 项目, 只要使用 cargo 就好了, 直接在终端输入

mkdir rust-on-ios && cd rust-on-ios
cargo new rs --lib
mkdir ios

现在可以看到 rust-on-ios 目录下有 ios 和 rs 文件夹.

打开 rs 文件夹 src 目录下的 lib .rs 文件, 先搞个 "hello world" 试一下效果.

usestd::os::raw::{c_char};usestd::ffi::{CString};#[no_mangle]pubexternfn say_hello()-> *mutc_char{CString::new("Hello Rust").unwrap().into_raw()}

姑且就写这个. 这里的 #[no_mangle]必须要写, 这个是保证编译后的函数签名像 C 的一样.

然后我们来建个 header 文件, 因为之后会把 Rust 项目编译成库文件, 所以搞个 header 提供接口.

char *say_hello(void);

还差一步, 我们现在要修改一下 Cargo.toml 文件, 到时候把 Rust 编译成库.

[package]
name = "rs"
publish = false
[lib]
name = "app"
crate-type = ["staticlib"]

现在我们到 rs 目录下编译一下这个项目.

cargo build --target x86_64-apple-ios --release

编译好之后, 你会在 target/x86_64-apple-ios目录下发现一个 libapp.a 文件.

接下来建个 iOS 项目.

建 iOS 项目现在来创建个 iOS Single Page App 项目. 我图个省事, 这里直接建 Objective-C 项目, 要建 Swift 项目也可以, 不过需要搞桥接, 而且我个人用 Rust 搞 iOS 有一半原因是不想写 Swift 代码.

一路 Next 创建了项目, 然后添加 lib 文件

这个 libapp.a 是我们用 Rust 编译好的文件, 这个 libresolv.tbd 是拿来做链接用的.

要想添加 libapp.a, 直接点这个加号, 然后点 Add Other, 然后选中编译好的 libapp.a 文件.

然后把之前写好的头文件放到项目中. 编译的时候发现出错了. 因为我们虽然把 libapp.a 引入到了项目中, 但是编译的时候, 工具并不清楚 lib 文件在哪, 所以我们得手动设置一下 lib 文件的搜索路径.

现在再进行一次编译应该就能成功了.

为了演示效果, 在 ViewControll.m 文件中使用一下这个函数吧.

#import "ViewController.h"#import "libapp.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *from_c_str = @(say_hello());
UILabel *label = [[UILabel alloc]
initWithFrame: (CGRect) {100, 100, 100, 100}];
label.text = from_c_str;
[self.view addSubview:label];
}
@end

然后模拟器上应该显示了 Hello Rust 这段文字.

好吧, 先到这里, 目前这种要每次自己手动编译, 而且每次如果新增了函数 header 文件需要手动修改, 如果 Xcode 自动帮我们搞定就好了.