Alaznah

Install @alaznah/calling in a React Native or Expo development build.

Installation

@alaznah/calling is published on the public npm registry.

Requirements

  • React Native 0.76+ (see Compatibility for the full matrix)
  • Android compileSdk 35 or 36 · minSdk 24
  • iOS 13+
  • React Native CLI app, or Expo development build
  • Working mic (and camera for video) on a physical device for real call tests

Expo Go will not load the native calling modules.

Full version table (RN ↔ compileSdk ↔ New Architecture): Compatibility.

1. Install the package

@alaznah/calling ships native modules as peer dependencies — they must live in your app (single React Native copy / autolinking). Pick your package manager:

npm install @alaznah/calling

# Required peers
npm install react-native-webrtc react-native-incall-manager @react-native-community/netinfo react-native-svg
ManagerBehavior
npmInstall @alaznah/calling, then run the Required peers command (shown in the npm tab only)
Yarn / pnpmPeers are not auto-installed — use the one-line command above (package + peers together)

That installs @alaznah/calling and its dependency @alaznah/protocol. Required peers:

REQUIRED

PackageRole
react-native-webrtcMedia / peer connections
react-native-incall-managerIn-call audio session / routing
@react-native-community/netinfoNetwork state for calling
react-native-svgBuilt-in call UI icons

These stay as peers on purpose — the SDK does not bundle WebRTC, NetInfo, InCall Manager, or SVG. Your app already has react and react-native. The same peer set is required for voice and video (there is no separate voice-only package).

OPTIONAL

PackageRole
react-native-callkeepCallKeep / second native dialer path — install and configure only if you explicitly choose CallKeep. The SDK’s own native calling path does not require it.

Optional CallKeep (only if you enable that integration):

npm install react-native-callkeep

Without react-native-webrtc, startCall fails with WebRTC adapters not found — see Troubleshooting.

2. iOS

Pods

bash
cd ios && pod install && cd ..

Info.plist (copy-paste)

Edit ios/<AppName>/Info.plist (or Xcode → Info):

xml
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required for audio and video calls.</string>

<!-- Add if you use video calls -->
<key>NSCameraUsageDescription</key>
<string>Camera access is required for video calls.</string>

<key>UIBackgroundModes</key>
<array>
  <string>audio</string>
  <string>voip</string>
  <string>remote-notification</string>
</array>

Xcode → Signing & Capabilities: enable Background Modes (Audio + Voice over IP) and Push Notifications if you need background / kill-state ringing — Push Notifications.

Full matrices: Permissions.

3. Android

Use compileSdk 35 (RN 0.76–0.80) or 36 (RN 0.81+) — Compatibility. You should not need to bump past your RN template default for Alaznah.

AndroidManifest.xml (copy-paste)

In android/app/src/main/AndroidManifest.xml, inside <manifest> (before <application>):

xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

<!-- Video (or apps that offer both voice and video) -->
<uses-permission android:name="android.permission.CAMERA" />

<!-- Recommended: notifications, Bluetooth, incoming UI -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" />

More detail: Permissions.

4. Expo (development build)

Expo Go is not supported. In app.json / app.config:

json
{
  "expo": {
    "plugins": ["@alaznah/calling"]
  }
}

Then:

bash
npx expo prebuild
# or EAS development build
eas build --profile development

Still verify generated plist / manifest after prebuild.

5. Rebuild native binaries

After install or plist/manifest changes, rebuild (Xcode / Gradle / EAS). Metro reload alone is not enough.

bash
# iOS
npx react-native run-ios

# Android
npx react-native run-android

6. Verify import

ts
import {
  CallingProvider,
  CallingScreen,
  requestCallPermissions,
  DEFAULT_HOSTED_SIGNALING_URL,
} from '@alaznah/calling';

UI deep imports (optional):

ts
import { CallingUI } from '@alaznah/calling';
import { IncomingCallScreen, ActiveCallScreen } from '@alaznah/calling/ui';

Next