前言
阅读耗时30秒
和之前Android
完成相似,根本便是一模相同,rust写完,编译拿到产品集成就行,双端接入成本而言,几乎很小。
参阅资料
Building and Deploying a Rust library on iOS
cross-platform-rust example
Rust on iOS and Mac Catalyst: A Simple, Updated Guide
Rust移动开发体验
目录
一、环境准备
XCode安装
我的电脑是
MacBook Pro (13-inch, M1, 2020) macOs BigSur
挑选下载了 Version 12.1 (12A7403)
, 没有更新
xcode-select --install
or go to xocde site XCode Download
版别支撑情况见 XCode下载支撑
Rustup装备
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
or you can see 安装Rust
or you can see 二、Rust入门之Hello World introduce
增加东西链
rustup target add aarch64-apple-ios armv7-apple-ios armv7s-apple-ios x86_64-apple-ios i386-apple-ios
当然没必要什么架构都编译,否则空间都不行,毕竟我的电脑只要256G
,我只挑选了aarch64-apple-ios
和 x86_64-apple-ios
rustup target add aarch64-apple-ios x86_64-apple-ios
Rust项目创立及编译
第一步
库crate
创立
cargo new iosdemo --lib
第二步
cd iosdemo
进入到项目目录,然后开始完成代码
主要是在项目的src/lib.rs
中完成rust
代码,并且在目录下增加一个greetings.h
头文件,作用:C
桥接文件,在这个文件中,咱们定义C
接口,保证 iOS
调用的每个 Rust
函数都在这里有定义。
第三步
构建咱们的代码,让它能正常运行。需要在Cargo.toml
增加以下代码,然后cargo
为咱们创立一个静态库和C
动态库。
[lib]
name = "iosdemo"
crate-type = ["staticlib", "cdylib"]
第四步
编译得到产品
cargo lipo --release
可以看到得到的产品在target
目录的universal
里。
二、Rust完成
Cargo.toml
让cargo
帮咱们创立一个静态库和C
动态库
[package]
name = "iosdemo"
version = "0.1.0"
edition = "2021"
publish = false
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
[lib]
name = "iosdemo"
crate-type = ["staticlib", "cdylib"]
lib.rs
其间 extern
告诉 Rust
编译器这个办法将要在 Rust
以外的当地调用,保证其依照 C
的调用规则编译。
use std::os::raw::{c_char};
use std::ffi::{CString, CStr};
//no_mangle 来告诉编译器不要损坏函数名,保证咱们的函数称号被导入到 C 文件
#[no_mangle]
pub extern fn rust_greeting(to: *const c_char) -> *mut c_char {
let c_str = unsafe { CStr::from_ptr(to) };
let recipient = match c_str.to_str() {
Err(_) => "there",
Ok(string) => string,
};
CString::new("Hello ".to_owned() + recipient).unwrap().into_raw()
}
#[no_mangle]
pub extern fn rust_greeting_free(s: *mut c_char) {
unsafe {
if s.is_null() { return }
CString::from_raw(s)
};
}
greetings.h
#include <stdint.h>
const char* rust_greeting(const char* to);
void rust_greeting_free(char *);
三、IOS 集成
集成运用
第一步
创立IosDemo
工程,并导入咱们之前用Rust
生成的libiosdemo.a
产品,
not detailed enough ? see Building and Deploying a Rust library on iOS
第二步
接下来需要创立一个bridging header
来访问咱们创立的 C
文件
-
挑选
Header File
选项,创立一个bridging header
,命名为IosDemo-Bridging-Header.h
,内容如下// IosDemo-Bridging-Header.h // IosDemo // // Created by xxxx on 2022/12/4. // #ifndef Iosdemo_Bridging_Header_h #define Iosdemo_Bridging_Header_h #import "greetings.h" #endif /* IosDemo_Bridging_Header_h */
-
再导入咱们之前创立的
greetings.h
文件
第三步
再然后便是装备编译选项了
Build your xcode project and everything should compile
第一个是之前写的IosDemo-Bridging-Header.h
,第二个是
iosdemo/target/universal/release
目录。(iosdemo
是之前创立的rust
项目根目录)
版别不相同,可能选项文案不太相同,可以参阅 Building and Deploying a Rust library on iOS
第四步
完成
RustGreetings.swift
// RustGreetings.swift
// IosDemo
// Created by xxx on 2022/12/4.
import Foundation
class RustGreetings {
func sayHello(to: String) -> String {
let result = rust_greeting(to)
let swift_result = String(cString: result!)
rust_greeting_free(UnsafeMutablePointer(mutating: result))
return swift_result
}
}
ContentView.swift
// ContentView.swift
// IosDemo
// Created by xxx on 2022/12/4.
import SwiftUI
struct ContentView: View {
var body: some View {
let rustGreetings = RustGreetings()
Text("\(rustGreetings.sayHello(to: "Rust!!"))")
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
效果