前言

阅读耗时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移动开发体验

目录

Rust在IOS端的入门开发

一、环境准备

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-iosx86_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 函数都在这里有定义。

Rust在IOS端的入门开发
第三步
构建咱们的代码,让它能正常运行。需要在Cargo.toml增加以下代码,然后cargo为咱们创立一个静态库和C动态库

[lib]
name = "iosdemo"
crate-type = ["staticlib", "cdylib"]

第四步
编译得到产品

cargo lipo --release

Rust在IOS端的入门开发

可以看到得到的产品在target目录的universal里。

Rust在IOS端的入门开发

二、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产品,

Rust在IOS端的入门开发
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

Rust在IOS端的入门开发

第一个是之前写的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()
  }
}

效果

Rust在IOS端的入门开发