# Integrate the Sudo Profiles SDK

## Prerequisites

1. [Complete the Getting Started Guide](https://docs.sudoplatform.com/guides/getting-started)
2. [Integrate the User SDK](https://docs.sudoplatform.com/guides/users/integrate-the-user-sdk)

## Get Started

* [Integrate the iOS SDK](#integrate-the-ios-sdk)
* [Integrate the Android SDK](#integrate-the-android-sdk)
* [Integrate the JS SDK](https://docs.sudoplatform.com/guides/sudos/integrate-the-sudo-sdk#integrate-the-js-sdk)

## Integrate the iOS SDK

To use Sudo Profiles SDK in an iOS app, you need to install the SudoProfiles package via Swift Package Manager

Open your project settings in XCode, and go to the `Package Dependencies` tab. Click on the `+` sign to add a dependency.&#x20;

Enter the repository URL [`https://github.com/sudoplatform/sudo-profiles-ios`](https://github.com/sudoplatform/sudo-profiles-ios) in the top right search box and select the `sudo-profiles-ios` repository.&#x20;

Select the required version and `Add Package`.&#x20;

Sudo Platform SDKs conform to semantic versioning so in most cases you will leave the Dependency Rule as `Up to Next Major Version` to receive regular updates without introducing any breaking changes.

This will resolve the local package dependency and install the latest version of the Sudo Profiles SDK.

> Instantiating and initializing a client:

{% tabs %}
{% tab title="Swift" %}

```swift
do {
    let client: SudoProfilesClient = try DefaultSudoProfilesClient(sudoUserClient: sudoUserClient)
} catch {
    // Handle initialization error. An error might be thrown due to invalid
    // or missing confiugration file.
}
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
You only need one client instance for a given user per device. Instantiating multiple clients with the same configuration and using them at the same time may cause unexpected runtime errors to occur.
{% endhint %}

## Integrate the Android SDK

To use Sudo Profiles SDK in an Android app you need to add `SudoProfiles` library as a dependency to your project.

> Edit the app module Gradle script (build.gradle) and add `SudoProfiles` library as a dependency.

{% tabs %}
{% tab title="gradle" %}

```java
dependencies {
    api 'com.sudoplatform:sudoprofiles:$latest_version'
}
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
The latest version of the SDK can be found at [SDK Releases](https://docs.sudoplatform.com/guides/sudos/sdk-releases).
{% endhint %}

> Edit AndroidManifest.xml to add the following app permissions:

{% tabs %}
{% tab title="Diff" %}

```diff
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+   xmlns:tools="http://schemas.android.com/tools"
    package="com.sudoplatform.sampleapp">

+   <uses-permission android:name="android.permission.INTERNET" />
+   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+   <uses-permission android:name="android.permission.WAKE_LOCK" />
+   <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
+       tools:replace="android:allowBackup"
+       android:allowBackup="false"
```

{% endtab %}
{% endtabs %}

> Instantiating and initializing a client:

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
val client = SudoProfilesClient
            .builder(appContext, sudoUserClient, blobContainerUri)
            .build()
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
You only need one client instance for a given user per device. Instantiating multiple clients with the same configuration and using them at the same time may cause unexpected runtime errors to occur.
{% endhint %}

## Integrate the JS SDK

To use the **Sudo Profiles SDK** in a JS project you must add `@sudoplatform/sudo-profiles` as a dependency to your project

```bash
yarn add '@sudoplatform/sudo-profiles'
# or
npm install --save '@sudoplatform/sudo-profiles'
```

> Instantiating and initializing a Sudo Profiles client:

{% tabs %}
{% tab title="TypeScript" %}

```typescript
import {
  DefaultSudoProfilesClient,
} from '@sudoplatform/sudo-profiles'

// Instantiate and initialize the client
const sudoProfilesClient = new DefaultSudoProfilesClient({
  sudoUserClient: sudoUserClient,
})
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
You only need one client instance for a given user per device. Instantiating multiple clients with the same configuration and using them at the same time may cause unexpected runtime errors to occur.
{% endhint %}

### Symmetric Key Management for JS SDK

Symmetric keys are used in Sudo Profiles JS SDK to encrypt and decrypt Sudo claims. These keys are not stored within our system and need to be loaded into the Sudo Profile Client to be able to encrypt and decrypt your Sudo claims data. These symmetric keys can also be rotated, therefore a potential list of keys will need to be set. The storage and management of these keys will also be the responsibility of the consumer of the Sudo Profiles JS SDK.

> Adding Symmetric keys to Sudo Profiles Client:

{% tabs %}
{% tab title="TypeScript" %}

```typescript
sudoProfilesClient.pushSymmetricKey('1234', '14A9B3C3540142A11E70ACBB1BD8969F')
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
Symmetric keys are loaded into the Sudo Profiles Client after the client has been instantiated and initialized. Any old keys that have been used in the past to encrypt Sudo claims will also need to be set so that those Sudo claims can be decrypted. The last key loaded will be set as the current key for encrypting and decrypting new Sudo claims.

It is a requirement that the Sudo Profiles Client be loaded with at least one symmetric key.
{% endhint %}
