# First Time Setup Follow this step-by-step guide to set up the Sinch Voice and Video SDK for the first time. ## Register an Application > 1. Register a Sinch Developer account [here](https://dashboard.sinch.com/signup). 2. Setup a new Application using the Dashboard where you can then obtain an *Application Key* and an *Application Secret*. ## Download The Sinch SDK can be downloaded [here](/docs/in-app-calling/sdk-downloads). The SDK is available in both `ObjC` and `Swift`. Both SDK's comes with sample apps. Read more about them [here](/docs/in-app-calling/ios/reference-application) ### Sinch SDK as a CocoaPod CocoaPods provides the Sinch SDK currently only for `ObjC` ## Add the *Sinch.xcframework* (ObjC version) Drag the *Sinch.xcframework* bundle from the SDK distribution package folder into the Frameworks section in the Xcode Project Navigator. ## Add the *SinchRTC.xcframework* (Swift version) Drag the *SinchRTC.xcframework* bundle from the SDK distribution package folder into the Frameworks section in the Xcode Project Navigator. Both versions of Sinch SDKs depends on the following frameworks which must be linked with the application target: > *libc++.dylib* (*libc++.tbd*), *libz.tbd*, *Security.framework*, *AVFoundation.framework*, *AudioToolbox.framework*, *VideoToolbox.framework*, *CoreMedia.framework*, *CoreVideo.framework*, *CoreImage.framework*, *GLKit.framework*, *OpenGLES.framework*, *QuartzCore.framework*, *Metal.framework* ## Info.plist For voice calling functionality, add the following to your *Info.plist*: - *Required background modes* (`UIBackgroundModes`): - App plays audio (or streams audio/video using AirPlay) (`audio`) - App provides Voice over IP services (`voip`) - *Privacy - Microphone Usage Description* (`NSMicrophoneUsageDescription`): [NSMicrophoneUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/nsmicrophoneusagedescription) describes the reason your app accesses the microphone. When the system prompts the user to allow access, this string is displayed as part of the alert, and it *can't* be left empty. In addition to the keys above, if video calling functionality will be enabled and used, add the following to your *Info.plist*: - *Privacy - Camera Usage Description* (`NSCameraUsageDescription`): [NSCameraUsageDescription](https://developer.apple.com/documentation/bundleresources/information_property_list/nscamerausagedescription) describes the reason that your app accesses the camera. When the system prompts the user to allow access, this string is displayed as part of the alert, and it *can't* be left empty. ## Adding the Sinch library to React Native application With an extra layer of ([NativeModule](https://reactnative.dev/docs/native-modules-ios), you can embed the Sinch iOS library into your React Native application. Note, however, that by doing this the SDK will only work on React Native apps running on iOS devices. In order to be able to work with other platforms you'll have to implement a NativeModule for each of these platforms separately (including different platform-specific Sinch SDKs). To add the Sinch library to a React Native application: 1. Open your native iOS ReactiveNative application in xCode. Use the `xcworkspace` file located at ` #import @interface RCTSinchModule : NSObject @property (nonatomic, strong) _Nullable id client; @end #endif /* RCTSinchModule_h */ ``` Implementation: ```objectivec #import "RCTSinchModule.h" #import #pragma mark - SINCallClientDelegate @interface RCTSinchModule (SINCallClientDelegate) @end #pragma mark - SINClientDelegate @interface RCTSinchModule (SINClientDelegate) @end @implementation RCTSinchModule RCT_EXPORT_MODULE(); RCT_EXPORT_METHOD(createClient:(NSString *)userId) { dispatch_async(dispatch_get_main_queue(), ^{ RCTLogInfo(@"Creating iOS client for userId %@", userId); NSError *error; self.client = [Sinch clientWithApplicationKey:@"" environmentHost:@"ocra.api.sinch.com" userId:userId error:&error]; self.client.delegate = self; self.client.callClient.delegate = self; [self.client start]; }); } @end @implementation RCTSinchModule (SINClientDelegate) - (void)client:(id)client requiresRegistrationCredentials:(id)registrationCallback { [registrationCallback registerWithJWT:@"user-jwt"]; } - (void)clientDidStart:(id)client { NSLog(@"Client did start"); } - (void)clientDidFail:(id)client error:(NSError *)error { NSLog(@"Client did fail"); } @end ``` After [registering that module](https://reactnative.dev/docs/native-modules-android#register-the-module-android-specific) you will be able to call `createClient` method from your JavaScript code like this: ```javascript const { SinchModule } = NativeModules; const MainScreen = ({ navigation }) => { const onPress = () => { SinchModule.createClient('myUserId'); }; return (