React Native SDK
Native mobile SDK for React Native applications on iOS and Android.
Status
🔄 Coming Q2 2025 - Currently in development
Join the waitlist to be notified when available.
Planned Features
Core Features
- âś… Wallet-to-wallet calls (audio/video)
- âś… Push notifications
- âś… Messaging
- âś… Voicemail
- âś… Call history
- âś… Background call support
Mobile-Specific
- âś… CallKit integration (iOS)
- âś… ConnectionService integration (Android)
- âś… Picture-in-Picture mode
- âś… Native audio routing
- âś… Bluetooth headset support
- âś… Proximity sensor support
Planned Installation
npm install @dial/react-native
# or
yarn add @dial/react-native
# iOS specific
cd ios && pod installPlanned API
Setup
import { DialClient } from '@dial/react-native';
const dial = new DialClient({
apiKey: process.env.DIAL_API_KEY,
walletAddress: '0x...'
});Making Calls
const call = await dial.calls.start({
to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
type: 'video',
displayName: 'Alice.eth'
});React Hooks
import { useDialCall, useDialMessages } from '@dial/react-native';
function CallScreen() {
const { call, answer, decline, end } = useDialCall();
if (!call) return null;
return (
<View>
<Text>Incoming call from {call.from}</Text>
<Button title="Answer" onPress={answer} />
<Button title="Decline" onPress={decline} />
</View>
);
}Push Notifications
import { DialNotifications } from '@dial/react-native';
// Setup push notifications
await DialNotifications.requestPermissions();
await DialNotifications.register();
// Handle incoming call notifications
DialNotifications.onIncomingCall((call) => {
// Show call UI
});CallKit Integration (iOS)
import { DialCallKit } from '@dial/react-native';
// Automatic CallKit integration
// Calls will appear in native iOS call UI
await DialCallKit.enable({
appName: 'MyApp',
ringtoneSound: 'ringtone.mp3'
});Planned Example App
import React, { useEffect } from 'react';
import { View, Text, Button } from 'react-native';
import {
DialProvider,
useDial,
useDialCall
} from '@dial/react-native';
function App() {
return (
<DialProvider apiKey={process.env.DIAL_API_KEY}>
<MainScreen />
</DialProvider>
);
}
function MainScreen() {
const { dial, isConnected } = useDial();
const { call, answer, decline, end } = useDialCall();
const makeCall = async () => {
await dial.calls.start({
to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
type: 'video'
});
};
if (call) {
return (
<View>
<Text>
{call.status === 'ringing'
? `Incoming call from ${call.from}`
: 'In call'
}
</Text>
{call.status === 'ringing' ? (
<>
<Button title="Answer" onPress={answer} />
<Button title="Decline" onPress={decline} />
</>
) : (
<Button title="End Call" onPress={end} />
)}
</View>
);
}
return (
<View>
<Button
title="Make Call"
onPress={makeCall}
disabled={!isConnected}
/>
</View>
);
}Requirements
iOS
- iOS 13.0 or higher
- Xcode 14 or higher
- CocoaPods
Android
- Android 8.0 (API 26) or higher
- Kotlin 1.8 or higher
Permissions
iOS (Info.plist)
<key>NSCameraUsageDescription</key>
<string>We need camera access for video calls</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need microphone access for calls</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>We need photo library access to share images</string>Android (AndroidManifest.xml)
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />Platform-Specific Features
iOS-Specific
- CallKit integration
- Siri shortcuts
- App Clips support
- CarPlay integration (planned)
Android-Specific
- ConnectionService integration
- Android Auto support (planned)
- Material Design components
Roadmap
Q2 2025 - Alpha Release
- Core calling features
- Messaging
- Push notifications
- CallKit/ConnectionService integration
Q3 2025 - Beta Release
- Video conferencing
- Group calls
- Screen sharing
- Performance optimizations
Q4 2025 - Stable Release
- Full feature parity with web SDK
- Production-ready
- Complete documentation
Get Notified
Want early access? Join the waitlist:
Contributing
We’re looking for contributors! If you’re interested in helping build the React Native SDK:
Current Alternative
While the React Native SDK is in development, you can use our TypeScript SDK in React Native with WebView for web-based calling:
import { WebView } from 'react-native-webview';
function DialWebView() {
return (
<WebView
source={{ uri: 'https://dial.wtf/embed/call' }}
mediaPlaybackRequiresUserAction={false}
allowsInlineMediaPlayback={true}
/>
);
}Next Steps
- TypeScript SDK - Available now
- iOS SDK - Coming Q3 2025
- Android SDK - Coming Q3 2025
Last updated on