paint-brush
读取入口:当我们怎么建立便用 Rust 的 Swift 软件环节 通过@ockam
10,751 讀數
10,751 讀數

加密门户:我们如何创建使用 Rust 的 Swift 应用程序

Ockam5m2024/01/01
Read on Terminal Reader

太長; 讀書

使用 Swift 构建的 Portals for Mac 应用程序如何使用 Ockam Rust 库通过端到端加密门户与您的朋友私下共享服务。
featured image - 加密门户:我们如何创建使用 Rust 的 Swift 应用程序
Ockam HackerNoon profile picture
0-item
1-item

应用程序。它是开源的,并使用 Rust 库通过端到端加密的 Ockam 门户与您的朋友私下共享 Mac 上的 TCP 或 HTTP 服务。共享服务出现在他们的本地主机上!


在这篇句子中,让我们将深入到讨论 SwiftUI macOS 软件程度怎么样与 Rust 码交互性。


倘若您有求知欲试过 Mac 版 Portals。您可询问多产品信息,并食用 Homebrew 展开安装程序,如下如图如图:


 brew install build-trust/ockam/portals


下类是该运用程序流程实践进行的 2 钟头短视频:

斯威夫特<>铁锈

Portals 实用功能已在 Ockam Rust 表中保持。让我们着力推进于打照经验丰富的 macOS 原生态经历。


人们都整合该运用系统软件的第二点次试穿是施用 Tauri。就是有哲理的,担心人们都想施用 Ockam rust 库,有时人们都队伍中的半数以上是数人都喜欢用 Rust 整合商品。第二点个传奇很轻松整合,或者还具有人们都如果想的所有基本性实用功能。然后,施用该运用系统软件的经历并不佳。 Tauri 只想人们都作为了对莱单凸显策略包括微信用户与莱单等交互时发生的具体情况的不大有效控制。与 macOS Sonoma 中默认设置的全新有利于施用的莱单栏项目流程相较于,一个传奇的运用系统软件总觉与 10 年以前的 macOS 传奇。


我门察觉到,要得到 我门需要的充足感受,我门一定要食用 SwiftUI 建立软件应用子程序。


不小心的是,咱们找还不到做成的解决处理设计来智能家居控制 Swift 和 Rust,这将为咱们面临两全其美的结果; Rust 的很安全问题同时 SwiftUI 多样的 macOS 安卓原生系统体验式。路经更好开采后,咱们观念到可能用 C-89 将俩者接连看起来。 Rust 与 C 资源调用补充协议兼容,Swift 与 Objective-C(C-89 的超集)可互操作步骤。


Swift 和 Rust 如何通信



各位创作了需对 Swift 看不见多次的 Rust 数据分析分析成分。这之中一些的安卓版本的是 Rust 惯用的有时候有利便用。另外一只些的安卓版本的与 C 兼容,便用构造体游标和能够 malloc 清理重新分配的内存条。各位还公开化一堆些 C 兼容的 API,两者都不平安的 rust 中便用原史构造体游标将惯用的数据分析分析成分准换为其 C 兼容的安卓版本的。最后的,各位在 cbindgen 库的让下自動生产一堆些 C 头zip文件。


在 Swift 方面,我们可以直接调用 C API,但 C 数据结构并不是 Swift 中的一等公民。这使得它们更难在 SwiftUI 代码中惯用地使用。相反,我们选择复制 Swift 中的数据结构并在 C 和 Swift 之间进行转换。这可能看起来很麻烦,但实际上,共享状态不会经常改变。使用if let ...ForEachenum等结构在 SwiftUI 中快速构建组件的能力非常有用,并且值得权衡。


如下是具备着 4 种风格的同组成部分的样例:


 // Rust idiomatic structure #[derive(Default, Clone, Debug, Eq, PartialEq)] pub struct LocalService { pub name: String, pub address: String, pub port: u16, pub shared_with: Vec<Invitee>, pub available: bool, } // Rust C-compatible structure #[repr(C)] pub struct LocalService { pub(super) name: *const c_char, pub(super) address: *const c_char, pub(super) port: u16, pub(super) shared_with: *const *const Invitee, pub(super) available: u8, } // Generated C header structure typedef struct C_LocalService { const char *name; const char *address; uint16_t port; const struct C_Invitee *const *shared_with; uint8_t available; } C_LocalService; // Swift idiomatic structure class LocalService { let name: String @Published var address: String? @Published var port: UInt16 @Published var sharedWith: [Invitee] @Published var available: Bool }


Swift 应运系统软件在编译时静态式的链接搜索到我们都的 Rust 库。统计数据流很比较简单:UI 数据交互进行传参 C API 算作进行操作从 Swift 送至 Rust,改换活动仅由 Rust 传出去,还有就是应用造成 UI 游戏更新的调整通知函 Swift。


SwiftUI 视下图的太占多数源代码看下来像是一切相关 SwiftUI APP小程序。


 VStack(alignment: .leading, spacing: 0) { Text(service.sourceName).lineLimit(1) HStack(spacing: 0) { Image(systemName: "circle.fill") .font(.system(size: 7)) .foregroundColor( service.enabled ? (service.available ? .green : .red) : .orange) if !service.enabled { Text(verbatim: "Not connected") } else { if service.available { Text(verbatim: service.address.unsafelyUnwrapped + ":" + String(service.port)) } else { Text(verbatim: "Connecting") } } } ...


若果您想分析其他消息,请查到 crate 和的码。 swift 系统文件名中的也是探索世界整个东西怎么建立和链接转换在一切的好好玩的地方。


若果您有需求为的 Swift 或 Rust 编号进行突出分享,我门每周的星期一定会增加新的,因此乐意于帮住新的突出分享者。倒入我门的。


也产生。


바카라사이트 바카라사이트 온라인바카라