iOS使用Rust调研

这篇具有很好参考价值的文章主要介绍了iOS使用Rust调研。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编辑已恢复
我们已与您断开连接。尝试重连时会保存您所做的变更。尝试重连

标题 1

已保存
Bin Song
B

要发布此内容,请选择键盘上的 ⌘Enter。
发布

关闭

Rust技术空间


跨平台使用调研
iOS使用Rust调研

添加表情符号

添加标题图像

添加状态

一、iOS 项目接入 Rust Library
约定:
iOS 项目目录 DemoApp
Rust Library:demo-library-ffi
1.1、Rust Library
将 Rust Library 代码 Clone 到 iOS 项目根目录下: DemoApp/demo-library-ffi;
修改 DemoApp/rust-library/Cargo.toml,将 Rust Library 修改为静态库
[lib]
crate-type = [“staticlib”]
在 DemoApp 目录下创建一个新的顶层 Cargo.toml 文件:
[workspace]
members = [
“demo-library-ffi”
]
现在可以直接使用 cargo build 来生成 rust 静态库了:
DemoApp/target/debug/demo-library-ffi.a
1.2、iOS Project
1.2.1
打开 Xcode target configuration → Build Phases → Link Binary with Libraries 选项卡,选择 Add files,将前面生成的 DemoApp/target/debug/demo-library-ffi.a 文件添加进去;
是的,这个不是最终我们需要的正确静态库文件,因为它只有当前打包机器的架构,不要紧,我们会在下面步骤中修复它;
1.2.2
用文本编辑器打开 project.pbxproj,搜索并替换 Debug 和 Release 两处 LIBRARY_SEARCH_PATHS
LIBRARY_SEARCH_PATHS = (
( i n h e r i t e d ) " , " (inherited)", " (inherited)","(PROJECT_DIR)/target/debug”,
);
Debug 替换为:
“LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]” = “ ( P R O J E C T D I R ) / t a r g e t / a a r c h 64 − a p p l e − i o s / d e b u g " ; " L I B R A R Y S E A R C H P A T H S [ s d k = i p h o n e s i m u l a t o r ∗ ] [ a r c h = a r m 64 ] " = " (PROJECT_DIR)/target/aarch64-apple-ios/debug"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = " (PROJECTDIR)/target/aarch64appleios/debug";"LIBRARYSEARCHPATHS[sdk=iphonesimulator][arch=arm64]"="(PROJECT_DIR)/target/aarch64-apple-ios-sim/debug”;
“LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]” = “ ( P R O J E C T D I R ) / t a r g e t / x 8 6 6 4 − a p p l e − i o s / d e b u g " ; R e l e a s e 替换为: " L I B R A R Y S E A R C H P A T H S [ s d k = i p h o n e o s ∗ ] [ a r c h = a r m 64 ] " = " (PROJECT_DIR)/target/x86_64-apple-ios/debug"; Release 替换为: "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = " (PROJECTDIR)/target/x8664appleios/debug";Release替换为:"LIBRARYSEARCHPATHS[sdk=iphoneos][arch=arm64]"="(PROJECT_DIR)/target/aarch64-apple-ios/release”;
“LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]” = “ ( P R O J E C T D I R ) / t a r g e t / a a r c h 64 − a p p l e − i o s − s i m / r e l e a s e " ; " L I B R A R Y S E A R C H P A T H S [ s d k = i p h o n e s i m u l a t o r ∗ ] [ a r c h = x 8 6 6 4 ] " = " (PROJECT_DIR)/target/aarch64-apple-ios-sim/release"; "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=x86_64]" = " (PROJECTDIR)/target/aarch64appleiossim/release";"LIBRARYSEARCHPATHS[sdk=iphonesimulator][arch=x8664]"="(PROJECT_DIR)/target/x86_64-apple-ios/release”;
1.2.3
再次打开 Build Phases 选项卡,添加一个 Script,并移动到 Compile Sources 上方,可以命名为: Build Rust library :
bash ${PROJECT_DIR}/bin/compile-rust-lib.sh demo-library-ffi $RUSTBUILDCONF
第二个参数 RUSTBUILDCONF是传递给脚本的环境变量,我们先定义它们:
打开 Build Settings 选项卡,点击 + 添加 User-Defined Setting,为其命名 RUSTBUILDCONF 并根据构建变量选择一个值:Debug 中填写 DEBUG,Release 中填写 RELEASE。
1.2.4
构建脚本 bin/compile-rust-lib.sh
#!/usr/bin/env bash

if [ “$#” -ne 2 ]
then
echo “Usage (note: only call inside xcode!):”
echo “compile-rust-lib.sh <FFI_TARGET> ”
exit 1
fi

what to pass to cargo build -p, e.g. rust_lib_ffi

FFI_TARGET=$1

RUSTBUILDCONF from our xcconfigs

RUSTBUILDCONF=$2

RELFLAG=
if [[ “$RUSTBUILDCONF” != “DEBUG” ]]; then
RELFLAG=–release
fi

set -euvx

if [[ -n “${DEVELOPER_SDK_DIR:-}” ]]; then

Assume we’re in Xcode, which means we’re probably cross-compiling.

In this case, we need to add an extra library search path for build scripts and proc-macros,

which run on the host instead of the target.

(macOS Big Sur does not have linkable libraries in /usr/lib/.)

export LIBRARY_PATH=“ D E V E L O P E R S D K D I R / M a c O S X . s d k / u s r / l i b : {DEVELOPER_SDK_DIR}/MacOSX.sdk/usr/lib: DEVELOPERSDKDIR/MacOSX.sdk/usr/lib:{LIBRARY_PATH:-}”
fi

IS_SIMULATOR=0
if [ “${LLVM_TARGET_TRIPLE_SUFFIX-}” = “-simulator” ]; then
IS_SIMULATOR=1
fi

for arch in A R C H S ; d o c a s e " ARCHS; do case " ARCHS;docase"arch" in
x86_64)
if [ $IS_SIMULATOR -eq 0 ]; then
echo “Building for x86_64, but not a simulator build. What’s going on?” >&2
exit 2
fi

  # Intel iOS simulator
  export CFLAGS_x86_64_apple_ios="-target x86_64-apple-ios"
  $HOME/.cargo/bin/cargo build -p $FFI_TARGET --lib $RELFLAG --target x86_64-apple-ios
  ;;

arm64)
  if [ $IS_SIMULATOR -eq 0 ]; then
    # Hardware iOS targets
    $HOME/.cargo/bin/cargo build -p $FFI_TARGET --lib $RELFLAG --target aarch64-apple-ios
  else
    $HOME/.cargo/bin/cargo build -p $FFI_TARGET --lib $RELFLAG --target aarch64-apple-ios-sim
  fi

esac
done
二、问题调研

  1. Rust访问网络是否需要原生语言的干预?需支持协议如:gRPC/RESTful/WebSocket/UDP
    Rust 可以直接访问网络,并不需要原生语言的干预
  2. Rust与原生语言的协作方式,FFI/JNI or 其他?
    FFI
    cbindgen
    rsbind
  3. 如何接收Rust发起的回调?
    使用函数指针,可以参考这个人的代码:​https://github.com/thombles/dw2019rust/blob/master/modules/07%20-%20Swift%20callbacks.md
    或者使用 rsbind
  4. Rust是否可以直接访问本地(图片/文件)/沙箱文件?
    ​https://docs.rs/cacao/latest/cacao/index.html
  5. Rust是否可以直接访问本地数据库?本地支持哪些常用数据库并且Rust有相应的封装?
    可以直接使用 sqlite,如果要用 CoreData,需要通过 FFI
  6. 构建时各平台的构建步骤以及命令
    参考 1.2.4
    或者使用 rsbind
  7. Android/iOS端异常调用栈的分析方法,是否有工具/框架可以配合
  8. 打包后包大小的变化
    1.网络
    方案1: reqwest, 关闭bitcode的情况下,包增加7.6MB

2.数据库
方案1:rusqlite, 关闭bitcode的情况下,包增加3.6MB文章来源地址https://www.toymoban.com/news/detail-621448.html

到了这里,关于iOS使用Rust调研的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust编程语言入门之cargo、crates.io

    通过 release profile 来自定义构建 在https://crates.io/上发布库 通过 workspaces 组织大工程 从 https://crates.io/来安装库 使用自定义命令扩展 cargo release profile: 是预定义的 可自定义:可使用不同的配置,对代码编译拥有更多的控制 每个 profile 的配置都独立于其它的 profile cargo 主要的

    2023年04月09日
    浏览(53)
  • 【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月11日
    浏览(49)
  • rust crate.io 配置国内源(cargo 国内源) warning: spurious network error (2 tries remainin...

    rust 笔记 Crate 国内源配置 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/130758057 Rust 官方默认的 Cargo 源服务器为 crates.io,其同时也是 Rust 官方的 crate 管理仓库,但是由于官方服

    2024年02月05日
    浏览(43)
  • iOS14 Widget 小组件调研

    桌面小组件是iOS14推出的一种新的桌面内容展现形式。 根据苹果的统计数据,“一般用户每天进入主屏幕的次数超过90次”,如果有一个我们应用的小组件在桌面,每天都有超过90次曝光在用户眼前的机会,这绝对是一个顶级的流量入口。 “但停留的总时长不过几分钟”,通

    2024年01月25日
    浏览(37)
  • 【iOS自动化测试】第一章:方案调研

    目前Android端已完成了相应的框架搭建,并实际落地产出了,由于Android使用的是Unittest+HtmlTestRunner产出报告,需要增加新功能的话需要改动到底层框架,所以目前在负责的iOS端打算采用Pytest+Allure方式来进行,优点是更好的插件支持,报告也会更好看(装逼)点 PS:Android端自动

    2024年02月09日
    浏览(44)
  • 选择Rust,并在Ubuntu上使用Rust

    在过去的 8 年里,Rust 一直是开发人员最喜欢的语言,并且越来越被各种规模的软件公司采用。然而,它的许多高级规则和抽象创造了一个陡峭的初始学习曲线,这可能会给人留下 Rust 是少数人的保留的印象,但这与事实相去甚远。让我们来看看为什么 Rust 通常是一个很好的

    2024年02月11日
    浏览(37)
  • 【Rust 基础篇】Rust Rc 智能指针的使用

    在 Rust 中,Rc(Reference Counting)是一种智能指针,用于实现多所有权共享数据的引用计数。Rc 智能指针允许多个所有者共享相同的数据,并在没有任何所有者时自动释放数据。 本篇博客将详细介绍 Rust 中 Rc 智能指针的使用方法和相关概念,以及它在代码中的应用场景。 Rc 智

    2024年02月16日
    浏览(40)
  • 【Rust 基础篇】Rust Deref Trait 的使用

    在 Rust 中,Deref trait 是一种特殊的 trait,用于重载解引用操作符 * 。通过实现 Deref trait,我们可以定义类型的解引用行为,使其在使用 * 运算符时表现得像引用类型。 本篇博客将详细介绍 Rust 中如何实现和使用 Deref trait,以及它在代码中的应用场景。 Deref trait 的定义如下:

    2024年02月17日
    浏览(37)
  • 【跟小嘉学 Rust 编程】三十、Rust 使用 Slint UI

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月04日
    浏览(42)
  • 【Rust 基础篇】Rust 早期释放(2-Phase Drop)的使用

    在 Rust 中,早期释放(2-Phase Drop)是一种特殊的机制,用于在析构函数中提前释放资源。通过使用早期释放机制,我们可以控制资源的释放顺序,避免资源泄漏和不一致的状态。 本篇博客将详细介绍 Rust 中早期释放的使用方法和相关概念,以及它在代码中的应用场景。 早期

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包