react-native-pitel-voip v1.0.26
react-native-pitel-voip
Integrate Voip call to your project
react-native-pitel-voip
is package support for voip call. Please contact pitel
Demo
Pitel Flow
When user make call from Pitel app, Pitel Server pushes a notification for all user login (who receives the call). When user "Accept" call, extension will re-register to receive call.
Features
- Register Extension
- Call
- Hangup
- Turn on/off micro
- Turn on/of speaker
Installation
- Install Packages Add pubspec.yaml:
yarn add react-native-pitel-voip
- Installing dependencies into a bare React Native project
yarn add react-native-callkeep@4.3.9 @react-native-firebase/app@18.1.0 @react-native-firebase/messaging@18.1.0 react-native-background-timer@2.4.1 react-native-get-random-values@1.9.0 react-native-incall-manager@4.1.0 react-native-voip-push-notification@3.3.1 uuid@9.0.0 pitel-react-native-webrtc pitel-sdk-for-rn @react-native-async-storage/async-storage@1.19.1 react-native-permissions@4.0.4
- Pod install
cd ios
pod install
Pushkit/ Push notification - Received VoIP and Wake app from Terminated State. Note Please check PUSH_NOTIF.md. setup Pushkit (for IOS), push notification (for Android).
Configure Project
Android:
- In file
android/app/src/main/AndroidManifest.xml
. Example
<manifest...>
...
// Request permission
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
...
// show when lock screen
<application
...
>
<activity
...
android:showOnLockScreen="true"
android:showWhenLocked="true"
android:turnScreenOn="true"
>
...
</activity>
</application>
</manifest>
- In file
android/gradle.properties
android.enableDexingArtifactTransform.desugaring=false
IOS
- Request permission in file
Info.plist
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Need Bluetooth access for voip call</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Need Bluetooth access for voip call</string>
<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for voip call</string>
<array>
<string>fetch</string>
<string>processing</string>
<string>remote-notification</string>
<string>voip</string>
</array>
- Make sure platform ios
12.0
inPodfile
...
require_relative '../node_modules/react-native-permissions/scripts/setup'
...
platform :ios, min_ios_version_supported
prepare_react_native_project!
setup_permissions(['Bluetooth'])
...
target 'rn_pitel_demo' do
config = use_native_modules!
// Add this
pod 'Firebase', :modular_headers => true
pod 'FirebaseCoreInternal', :modular_headers => true
pod 'GoogleUtilities', :modular_headers => true
pod 'FirebaseCore', :modular_headers => true
...
post_install do |installer|
react_native_post_install(
installer,
# Set `mac_catalyst_enabled` to `true` in order to apply patches
# necessary for Mac Catalyst builds
:mac_catalyst_enabled => false
)
# NOTE: Change IPHONEOS_DEPLOYMENT_TARGET to 12.4.
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.4'
end
end
__apply_Xcode_12_5_M1_post_install_workaround(installer)
end
Example
Please checkout repo github to get example
Usage
- In file index.js
import { NotificationBackground } from 'react-native-pitel-voip'; // Add this line
const options = {
ios: {
appName: 'app_name',
},
android: {
alertTitle: 'Permissions required',
alertDescription: 'This application needs to access your phone accounts',
cancelButton: 'Cancel',
okButton: 'ok',
foregroundService: {
channelId: 'package_id',
channelName: 'Foreground service for my app',
notificationTitle: 'My app is running on background',
notificationIcon: 'Path to the resource icon of the notification',
},
additionalPermissions: [],
},
};
NotificationBackground(options); // Add this line
AppRegistry.registerComponent(appName, () => App);
- In file App.jsx
// Import this
import { PitelSDKProvider } from 'react-native-pitel-voip';
import BackgroundTimer from 'react-native-background-timer';
import { LogBox } from 'react-native';
LogBox.ignoreAllLogs();
BackgroundTimer.start();
export default function App() {
return (
// Wrap your app with PitelSDKProvider
<PitelSDKProvider>...</PitelSDKProvider>
);
}
- In file
src/screens/home_screen/index.js
Please follow example
Config sdkOption
const ext = `${EXTENSION}`;
const sipPass = `${EXTENSION_SIP_PASSWORD}`;
const appId = `${BUNDLE_ID}`;
const domainUrl = `${DOMAIN}`;
const sdkOptionsInit = {
sipDomain: `${DOMAIN}:${PORT}`,
wssServer: `${WSS_URL}`,
sipPassword: sipPass,
bundleId: appId, // Bundle id for IOS
packageId: appId, // Package id for Android
teamId: `${TEAM_ID}`, // Team id of Apple developer account
};
- Register device token & remove device token
const _registerDeviceToken = async () => {
const fcmToken = await getFcmToken();
const deviceToken = Platform.OS == 'android' ? fcmToken : iosPushToken;
await registerDeviceToken({
pn_token: deviceToken,
pn_type: Platform.OS == 'android' ? 'android' : 'ios',
app_id: appId,
domain: domainUrl,
extension: ext,
app_mode: __DEV__ ? 'dev' : 'production',
fcm_token: fcmToken,
});
};
const _removeDeviceToken = async () => {
const fcmToken = await getFcmToken();
const deviceToken = Platform.OS == 'android' ? fcmToken : iosPushToken;
removeDeviceToken({
pn_token: deviceToken,
domain: domainUrl,
extension: ext,
});
};
- Wrap your hone screen component with PitelSDK
return (
<PitelSDK
sdkOptionsInit={sdkOptionsInit}
iosPushToken={iosPushToken}
setSdkOptions={setSdkOptions}
>
<HomeScreenComponent
navigation={navigation}
sdkOptions={sdkOptions}
handleRegisterToken={_registerDeviceToken}
handleRemoveToken={_removeDeviceToken}
setIOSPushToken={setIOSPushToken}
/>
</PitelSDK>
);
Properties
Prop | Description | Type | Default |
---|---|---|---|
sdkOptionsInit | your extension info use to login | Object | Required |
iosPushToken | ios device voip push token | String | Required |
setSdkOptions | set sdkOption when your extension login success | Function | Required |
- In file
src/screens/home_screen/home_screen.js
Example
// Register your extension to PBX
const {
callState,
receivedPhoneNumber,
registerState,
setCallState,
registerFunc,
} = useRegister({
sdkOptions: sdkOptions,
setPitelSDK: setPitelSDK,
extension: ext,
});
return (
<PitelCallNotif
callkitSetup={callkitSetup}
pitelSDK={pitelSDK}
setCallState={setCallState}
callState={callState}
isLogin={isLogin}
isCallOut={isCallOut}
setCallID={setCallID}
sdkOptions={sdkOptions}
registerFunc={registerFunc}
setIsCallOut={setIsCallOut}
onCreated={handleCreated}
onReceived={handleReceived}
onHangup={handleHangup}
onIOSToken={(iosToken) => {
setIOSPushToken(iosToken);
}}
>
...
</PitelCallNotif>
);
Properties
Prop | Description | Type | Default |
---|---|---|---|
pitelSDK | pitelSDK get from params of route | Object | Required |
callkitSetup | set information for callkit request permission | Object | Required |
setCallState | set call status | () => void | Required |
isLogin | app login/logout status | bool | Required |
isCallOut | call direction status | bool | Required |
setCallID | set call direction | () => void | Required |
sdkOptions | received sdkOptions when extension login success | Object | Required |
registerFunc | register extension | () => void | Required |
setIsCallOut | set call direction is call out | () => void | Required |
onCreated | make outgoing call | () => void | Required |
onReceived | received incoming call | () => void | Required |
onHangup | set hang up | () => void | Required |
onIOSToken | ios voip push notification | String | Required |
- In file
src/screens/call_screen/index.js
Example
import React, { useState, useContext } from 'react';
import { PitelCallKit, PitelSDKContext } from 'react-native-pitel-voip';
export const CallScreen = ({ route, navigation }) => {
const [mute, setMute] = useState(false);
const [speaker, setSpeaker] = useState(false);
const { pitelSDK } = useContext(PitelSDKContext);
const { phoneNumber, direction, callState, callID } = route.params;
return (
<PitelCallKit
pitelSDK={pitelSDK}
callState={callState}
phoneNumber={phoneNumber}
direction={direction}
callID={callID}
onHangup={() => {
pitelSDK.hangup();
}}
/>
);
};
Prop | Description | Type | Default |
---|---|---|---|
pitelSDK | pitelSDK when extension login success | Object | Required |
callState | call status | String | Required |
direction | call direction | String | Required |
callID | incoming call id | String | Required |
onHangup | hang up when end call | Function | Required |
How to test
Using tryit to test voip call connection & conversation Link: https://tryit.jssip.net/ Setting:
- Access to link https://tryit.jssip.net/
- Enter extension: example 102
- Click Setting icon
- Enter information to input field
- Save
- Click icon -> to connect
2 months ago
2 months ago
2 months ago
2 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
9 months ago
11 months ago
11 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago