Alaznah

Microphone, camera, and notification permissions for Alaznah Calling.

Permissions

Two layers:

  1. Native configInfo.plist / AndroidManifest.xml (required before the OS will prompt)
  2. RuntimerequestCallPermissions before the first call

Rebuild the native app after changing plist or manifest.

Which permissions do you need?

App offersNative micNative cameraRuntime call
Voice onlyYesNorequestCallPermissions('audio')
Video onlyYesYesrequestCallPermissions('video')
Voice and videoYesYes'audio' or 'video' for the upcoming call (or 'video' at startup for mic + camera)

Runtime (JavaScript)

ts
import { requestCallPermissions } from '@alaznah/calling';

// for audio call
const audio = await requestCallPermissions('audio');
if (!audio.microphone) {
  // show UI — mic denied
}

// for video call (mic + camera)
const video = await requestCallPermissions('video');
if (!video.microphone || !video.camera) {
  // show UI — denied
}

'audio' | 'video'. Returns { microphone, camera, bluetooth }.

On iOS, system prompts often appear on first getUserMedia; plist strings must still be present or the app can crash.

iOS — Info.plist

Add usage descriptions (edit ios/<AppName>/Info.plist or Xcode → Info):

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

<!-- Required if your app places or accepts video calls -->
<key>NSCameraUsageDescription</key>
<string>Camera access is required for video calls.</string>

Background modes (calling)

Xcode → Signing & Capabilities → Background Modes, enable at least:

  • Audio, AirPlay, and Picture in Picture (audio) — keep call audio in background
  • Voice over IP (voip) — VoIP / PushKit wake

Or in plist:

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

Also enable Push Notifications capability. CallKit / PushKit setup: Push Notifications.

Voice-only vs video (iOS)

Key / capabilityVoice onlyVideo / both
NSMicrophoneUsageDescriptionRequiredRequired
NSCameraUsageDescriptionOptionalRequired
Background Modes → AudioRecommendedRecommended
Background Modes → VoIPFor kill/background ringFor kill/background ring

Android — AndroidManifest.xml

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

Minimum (voice)

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" />

Add for video (or voice + video app)

xml
<uses-permission android:name="android.permission.CAMERA" />
xml
<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" />

@alaznah/calling already declares several of these in its library manifest; merging usually picks them up. If a permission is missing after install, add it explicitly in the app manifest as above.

Voice-only vs video (Android)

PermissionVoice onlyVideo / both
INTERNETRequiredRequired
RECORD_AUDIORequiredRequired
CAMERARequired
MODIFY_AUDIO_SETTINGSRecommendedRecommended
POST_NOTIFICATIONSAPI 33+ notifyAPI 33+ notify
BLUETOOTH_CONNECTHeadsetsHeadsets
Full-screen / FGS phone callNative incomingNative incoming

Expo

Expo Go is not supported. Use a development build with the @alaznah/calling config plugin — Installation. Still verify the generated plist / manifest after prebuild.

Checklist

  1. Add Info.plist / AndroidManifest entries for the features you ship
  2. Rebuild the native app (Metro reload is not enough)
  3. Call requestCallPermissions('audio') or requestCallPermissions('video') before the first call
  4. Re-check after the user revokes permission in system Settings