This is a binding to the Signal client code in rust/, implemented on top of the C FFI produced by rust/bridge/ffi/. It's set up as a CocoaPod for integration into the Signal iOS client and as a Swift Package for local development.
-
Make sure you are using
use_frameworks!
in your Podfile. SignalClient is a Swift pod and as such cannot be compiled as a plain library. -
Add 'SignalClient' as a dependency in your Podfile:
pod 'SignalClient', git: 'https://github.com/signalapp/libsignal-client.git'
-
Use
pod install
orpod update
to build the Rust library for both iOS simulator and iOS device -
Build as usual. The Rust library will automatically be linked into the built SignalClient.framework.
Instead of a git-based dependency, use a path-based dependency to treat SignalClient as a development pod. Since prepare_command
s are not run for path-based dependencies, you will need to build the Rust library yourself. (Xcode should prompt you to do this if you forget.)
CARGO_BUILD_TARGET=x86_64-apple-ios swift/build_ffi.sh --release
The CocoaPod is configured to use the release build of the Rust library.
If validating SignalClient locally, use the following invocation:
XCODE_XCCONFIG_FILE=swift/PodLibLint.xcconfig pod lib lint \
--platforms=ios \
--include-podspecs=../SignalCoreKit/SignalCoreKit.podspec \
--skip-import-validation \
--verbose
You will also need to have SignalCoreKit checked out; the above command assumes you have checked it out as a sibling directory to libsignal-client.
When exposing new APIs to Swift, you will need to add the --generate-ffi
flag to your
build_ffi.sh
invocation.
-
Build the Rust library using
swift/build_ffi.sh
. The Swift Package.swift is configured to use the debug build of the Rust library. -
Use
swift build
andswift test
as usual from within theswift/
directory.
When exposing new APIs to Swift, you will need to add the --generate-ffi
flag to your
build_ffi.sh
invocation.
...is not supported. In theory we could make this work through the use of a custom pkg-config file and requiring clients to set PKG_CONFIG_PATH
(or install the Rust build products), but since Signal itself does not use this configuration it's considered extra maintenance burden. Development as a package is supported as a lightweight convenience (as well as a cross-platform one), but the CocoaPods build is considered the canonical one.
Rust targets for both the M1 Simulator and Catalyst are still in tier 3 support, so we use xargo
to build the standard library.
In order to compile for these platforms you will need to:
- Install Xargo with
cargo install xargo
- Install the standard library component with
rustup component add rust-src
- If not using Cocoapods, add the
--use-xargo
flag to yourbuild_ffi.sh
invocation