# Authentication - iOS

TapTalk.io Omnichannel SDK provides some essential methods to handle user authentication.

### Authenticate User (Optional)

You can authenticate the user that is currently logged in before calling **`navigateToOneTalk`**. To do this, you can add an authentication method in the previously created module file. (See [Get Started - iOS](https://docs.taptalk.io/onetalk-omnichannel-documentation/onetalk-channel-integration/live-chat/onetalk-live-chat-for-react-native/pages/-MQV25u4ATdW02mvTwhv#configure-and-initialize-taptalk.io-omnichannel-ios-sdk-for-react-native-project)). We will add a `RCT_EXPORT_METHOD` named **`authenticateUser`**.

You can start by adding an authentication method in **AppDelegate.m**.

{% code title="AppDelegate.m" %}

```csharp
@interface AppDelegate () <TapTalkLiveDelegate>

...

// Method to authenticate user
- (void)authenticateUserWithFullName:(NSString *)fullName 
                               email:(NSString *)email 
                             success:(void (^)(NSString *message))success 
                               error:(void (^)(NSString *message))error {

    [[TapTalkLive sharedInstance] authenticateUserWithFullName:fullName 
                                                         email:email 
    success:^(NSString *message) {
        success(message);
    } 
    failure:^(NSError *error) {
        error(error.localizedDescription);
    }];
}

@end
```

{% endcode %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`fullName`**: (NSString \*) current user's full name\
\&#xNAN;**`email`**: (NSString \*) current user's email address\
\&#xNAN;**`success`**: (void (^)(NSString \*message)) success callback containing a message\
\&#xNAN;**`error`**: (void (^)(NSString \*message)) success callback containing the error message
{% endhint %}

Then open your **AppDelegate.h** file and add the following lines to enable the previously created method to be called from another file.

{% code title="AppDelegate.h" %}

```csharp
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>

...

- (void)authenticateUserWithFullName:(NSString *)fullName 
                               email:(NSString *)email 
                             success:(void (^)(NSString *message))success 
                               error:(void (^)(NSString *message))error;

@end
```

{% endcode %}

Then open the previously created **OneTalkStarterModule.m** and add a method to bridge the authentication method from AppDelegate to JavaScript.

{% code title="OneTalkStarterModule.m" %}

```csharp
...

RCT_EXPORT_METHOD(authenticateUser:(NSString *)fullName
                             email:(NSString *)email
                   successCallback:(RCTResponseSenderBlock)successCallback
                     errorCallback:(RCTResponseSenderBlock)errorCallback)
{
    dispatch_async(dispatch_get_main_queue(), ^{
        AppDelegate *appDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
        [appDelegate authenticateUserWithFullName:fullName 
                                            email:email 
        success:^(NSString *message) {
            successCallback(@[message]);
        }
        failure:^(NSString *message) {
            errorCallback(@[message]);
        ];
    });
}
```

{% endcode %}

You can then call the method from JavaScript as such:

```csharp
NativeModules.OneTalkStarter.authenticateUser(
    'USER_NAME', 
    'USER_EMAIL',
    (successMessage) => {
        // Successfully authenticated user
    },
    (errorMessage) => {
       // An error occurred during authentication
    }
);
```

After successfully authenticated, user will no longer be required to fill name and email to create a case.

### Logout and Clear TapTalkLive Data

You may also add another method when you need to logout and clear all local cached data from Omnichannel SDK. We will name this method **`clearAllTapLiveData`**.

Start by adding an authentication method in **AppDelegate.m** and **AppDelegate.h**.

{% code title="AppDelegate.m" %}

```csharp
@interface AppDelegate () <TapTalkLiveDelegate>

...

// Method to clear all live chat data
- (void)clearAllTapLiveData {
    [[TapTalkLive sharedInstance] clearAllTapLiveData];
}

@end
```

{% endcode %}

{% code title="AppDelegate.h" %}

```csharp
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>

...

- (void)clearAllTapLiveData;

@end
```

{% endcode %}

Then add the method to **OneTalkStarterModule.m**.

{% code title="OneTalkStarterModule.m" %}

```csharp
...

RCT_EXPORT_METHOD(clearAllTapLiveData)
{
    dispatch_async(dispatch_get_main_queue(), ^{
        AppDelegate *appDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
        [appDelegate clearAllTapLiveData];
    });
}
```

{% endcode %}

You can then call the method from JavaScript when needed.

```javascript
NativeModules.OneTalkStarter.clearAllTapLiveData();
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.taptalk.io/onetalk-omnichannel-documentation/onetalk-channel-integration/live-chat/onetalk-live-chat-for-react-native/authentication-ios.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
