Installation
Prerequisites
Rust Toolchain
The ZCAM SDK packages include Rust bindings built via UniFFI. You need Rust installed with the targets for your target platform(s):
# Install Rust (if not already installed)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Add iOS targets
rustup target add aarch64-apple-ios aarch64-apple-ios-sim
# Add Android targets
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-androidXcode
Xcode is required for iOS development. Install it from the Mac App Store.
Android Studio
Android Studio is required for Android development. Install it from developer.android.com.
Development Environment
- Node.js 18+
- React Native 0.81+
- Expo SDK 54+ (if using Expo)
Installing Packages
The ZCAM SDK is available as a single package:
npm i @succinctlabs/react-native-zcam1
# iOS: install native dependencies
cd ios && pod install
# Android: native JNI libraries are downloaded automatically during the Gradle buildThe package provides the following functionality:
| Import path | Purpose |
|---|---|
@succinctlabs/react-native-zcam1 | Camera capture, verification, image picker, and C2PA utilities |
@succinctlabs/react-native-zcam1/proving | ZK proof generation |
iOS Configuration
Bundle Identifier
Configure your app's bundle identifier in your project. For Expo apps, set it in app.json:
{
"expo": {
"ios": {
"bundleIdentifier": "com.yourcompany.yourapp"
}
}
}App ID for App Attest
You'll need your Apple Team ID combined with your bundle identifier. The format is:
<TEAM_ID>.<BUNDLE_IDENTIFIER>For example: NLS5R4YCGX.com.yourcompany.yourapp
To find your Team ID:
- Open Keychain Access on your Mac
- Find a certificate named "Apple Development"
- The Team ID is the "Organizational Unit" field
Required Permissions
Add these keys to your Info.plist (or app.json for Expo):
{
"expo": {
"ios": {
"infoPlist": {
"NSCameraUsageDescription": "This app uses your camera to capture photos.",
"NSPhotoLibraryUsageDescription": "This app needs access to save photos."
}
}
}
}Android Configuration
Package Name
Configure your app's package name in app.json for Expo apps:
{
"expo": {
"android": {
"package": "com.yourcompany.yourapp"
}
}
}Required Permissions
Add camera and storage permissions to your app.json:
{
"expo": {
"android": {
"permissions": [
"android.permission.CAMERA",
"android.permission.READ_MEDIA_IMAGES",
"android.permission.RECORD_AUDIO"
]
}
}
}Enabling Proving (optional)
ZK proof generation on Android is opt-in due to the large binary size. To enable it, add the following to your android/gradle.properties:
enableProving=trueRunning on Device
iOS
App Attest requires a physical iOS device—it does not work in the simulator (the SDK falls back to mock mode for development).
# Expo
npx expo prebuild
npx expo run:ios --device
# React Native CLI
npx react-native run-ios --deviceOn first run, you may need to trust the developer certificate on your device: Settings → General → Device Management → Trust
Android
# Expo
npx expo prebuild
npx expo run:android --device
# React Native CLI
npx react-native run-androidThe SDK detects Android emulators and generates a test gradient image in place of a real camera capture, allowing UI development without a physical device.