# Chat Room and Messages - TapCore

If you are using core implementation method, you can use the methods below to manage chat room and messages.

{% hint style="warning" %}
**Note:** Please add **`#import <TapTalk/TAPCoreChatRoomManager.h>`** or \
\&#xNAN;**`#import <TapTalk/TAPCoreMessageManager.h>`** before using these methods.
{% endhint %}

<table data-header-hidden><thead><tr><th width="347">TapTalk Group Chat Method</th><th>Description</th></tr></thead><tbody><tr><td><strong>TapTalk Group Chat Method</strong></td><td><strong>Description</strong></td></tr><tr><td><a href="#get-active-chat-room">Get Active Chat Room</a></td><td>Returns the room model of the currently active chat room.</td></tr><tr><td><a href="#get-personal-chat-room-with-recipient-user">Get Personal Chat Room with Recipient User</a></td><td>Create new personal chat room with recipient user, or obtain chat room data if it already exists.</td></tr><tr><td><a href="#get-personal-chat-room-with-recipient-user-id">Get Personal Chat Room with Recipient User ID</a></td><td>Create new personal chat room with recipient user ID, or obtain chat room data if it already exists</td></tr><tr><td><a href="#get-local-chat-room-data">Get Local Chat Room Data</a></td><td>Obtain locally saved chat room details with a roomID.</td></tr><tr><td><a href="#create-group-chat-room">Create Group Chat Room</a></td><td>Create a new group chat room with selected group name.</td></tr><tr><td><a href="#create-group-chat-room-1">Create Group Chat Room with Picture</a></td><td>Create a new group chat room with selected group name and group picture.</td></tr><tr><td><a href="#get-group-chat-room">Get Group Chat Room</a></td><td>Get group room data from selected group room ID.</td></tr><tr><td><a href="#update-group-chat-room-details">Update Group Chat Room Details</a></td><td>Update existing group chat room data.</td></tr><tr><td><a href="#update-group-image">Update Group Image</a></td><td>Update group picture with current selected image.</td></tr><tr><td><a href="#delete-group-chat-room">Delete Local Group Chat Room</a></td><td>Delete group chat room from the device's local storage.</td></tr><tr><td><a href="#delete-group-chat-room">Delete Group Chat Room</a></td><td>Delete group chat room and clear all chat data and participants.</td></tr><tr><td><a href="#leave-group-chat">Leave Group Chat</a></td><td>Leave from selected group chat.</td></tr><tr><td><a href="#add-members-to-group-chat">Add Members to Group Chat</a></td><td>Add selected member(s) to current group chat room.</td></tr><tr><td><a href="#remove-members-from-group-chat">Remove Members from Group Chat</a></td><td>Remove selected member(s) from current group chat room.</td></tr><tr><td><a href="#promote-group-admin">Promote Group Admin</a></td><td>Promote selected member(s) as admin(s) to the current group chat room.</td></tr><tr><td><a href="#demote-group-admin">Demote Group Admin</a></td><td>Demote selected admin(s) to member(s) to the current group chat room.</td></tr><tr><td><a href="#get-saved-messages-chat-room">Get Saved Messages Chat Room</a></td><td>Obtain Saved Messages chat room data</td></tr><tr><td><a href="#send-start-typing">Start Typing</a></td><td>Notify that the active user has started typing in the selected room.</td></tr><tr><td><a href="#send-stop-typing">Stop Typing</a></td><td>Notify that the active user has stopped typing in the selected room.</td></tr><tr><td><a href="#send-text-message">Send Text Message</a></td><td>Send a new text message to the selected chat room.</td></tr><tr><td><a href="#send-location-message">Send Location Message</a></td><td>Send a new message with location to the selected chat room.</td></tr><tr><td><a href="#send-image-message">Send Image Message</a></td><td>Send a new image message to the selected chat room.</td></tr><tr><td><a href="#send-video-message">Send Video Message</a></td><td>Send a new video message to the selected chat room.</td></tr><tr><td><a href="#send-file-message">Send File Message</a></td><td>Send a new file message to the selected chat room.</td></tr><tr><td><a href="#send-file-message-1">Send Voice message</a></td><td>Send a new voice message to the selected chat room.</td></tr><tr><td><a href="#send-link-message">Send Link Message</a></td><td>Send a new link message to the selected chat room.</td></tr><tr><td><a href="#forward-a-message">Forward Message</a></td><td>Forward existing messages to the selected chat room.</td></tr><tr><td><a href="#construct-taptalk.io-message-model">Construct Message Model</a></td><td>Construct a customized TapTalk.io message model.</td></tr><tr><td><a href="#send-a-custom-message">Send a Custom Message</a></td><td>Send a new custom message to the room defined in the message model.</td></tr><tr><td><a href="#edit-message">Edit Message</a></td><td>Edit the contents of the selected message</td></tr><tr><td><a href="#delete-message-from-local-cache">Delete Message</a></td><td>Delete the selected message from the server.</td></tr><tr><td><a href="#delete-message-from-local-cache">Delete Message from Local Cache</a></td><td>Delete the selected message from local storage.</td></tr><tr><td><a href="#cancel-message-file-upload">Cancel Message File Upload</a></td><td>Cancel image, video, or file upload on the selected pending message.</td></tr><tr><td><a href="#download-message-file">Download Message File</a></td><td>Start a file download from the selected file, image, or video message.</td></tr><tr><td><a href="#cancel-message-file-download">Cancel Message File Download</a></td><td>Cancel image, video, or file download on the selected message.</td></tr><tr><td><a href="#mark-message-as-delivered">Mark Message as Delivered</a></td><td>Mark message as delivered by the active user.</td></tr><tr><td><a href="#mark-message-as-read">Mark Message as Read</a></td><td>Mark message as read by the active user.</td></tr><tr><td><a href="#mark-all-chat-room-messages-as-read">​Mark All Chat Room Messages as Read​</a></td><td>Mark all unread messages in a chat room as read.</td></tr><tr><td><a href="#get-local-messages-from-chat-room">Get Local Messages from Chat Room</a></td><td>Retrieve messages from chat room that are already stored in the device's local storage.</td></tr><tr><td><a href="#get-older-messages-from-chat-room">Get Older Messages from Chat Room</a></td><td>Retrieve messages that are older than the provided timestamp from the server to the selected chat room.</td></tr><tr><td><a href="#get-newer-messages-from-chat-room">Get Newer Messages from Chat Room</a></td><td>Retrieve newer messages from the server to the selected chat room</td></tr><tr><td><a href="#get-all-messages-from-chat-room">Get All Messages from Chat Room</a></td><td>Retrieve all available messages from the selected chat room.</td></tr><tr><td><a href="#get-unread-messages-from-chat-room">Get Unread Messages from Chat Room</a></td><td>Retrieve unread messages from the device's local storage.</td></tr><tr><td><a href="#get-media-messages-from-chat-room">Get Media Messages from Chat Room</a></td><td>Retrieve media messages from the device's local storage.</td></tr><tr><td><a href="#search-local-message">Search Local Message</a></td><td>Call this method to search messages from the device's local storage with a keyword</td></tr><tr><td><a href="#star-unstar-messages">​Star/Unstar Message</a>​</td><td>Set message as starred or remove star from message for the active user.</td></tr><tr><td><a href="#get-starred-messages">Get Starred Messages</a></td><td>Retrieve list of messages marked as starred in a chat room.</td></tr><tr><td><a href="#pin-unpin-message">Pin/Unpin Message</a></td><td>Set message as pinned or remove pin from message for all room participants.</td></tr><tr><td><a href="#get-pinned-messages">Get Pinned Messages</a></td><td>Retrieve list of pinned messages in a chat room.</td></tr><tr><td><a href="#get-shared-content-messages">Get Shared Content Messages</a></td><td>Retrieve image, video, file, and link messages from a chat room.</td></tr><tr><td><a href="#delete-all-chat-room-messages">Delete All Chat Room Messages</a></td><td>Clear all existing messages in a selected chat room for the active user.</td></tr><tr><td><a href="#create-scheduled-message">Create Scheduled Message</a></td><td>Schedule a message to be delivered at a specified time.</td></tr><tr><td><a href="#get-scheduled-messages">Get Scheduled Messages</a></td><td>Retrieve list of created scheduled messages in a chat room.</td></tr><tr><td><a href="#send-scheduled-message-now">Send Scheduled Message Now</a></td><td>Send a previously created scheduled message immediately to the recipient.</td></tr><tr><td><a href="#edit-scheduled-message-time">Edit Scheduled Message Time</a></td><td>Change the deliver time of a previously created scheduled message.</td></tr><tr><td><a href="#edit-scheduled-message-content">Edit Scheduled Message Content</a></td><td>Update the contents of a scheduled message that has not been delivered.</td></tr><tr><td><a href="#delete-scheduled-message">Delete Scheduled Message</a></td><td>Delete a scheduled message that has not been delivered.</td></tr><tr><td><a href="#get-message-details">Get Message Details</a></td><td>Retrieve info about a message's recipients that has read or received the message.</td></tr><tr><td><a href="#get-message-total-read-count">Get Message Total Read Count</a></td><td>Retrieve a message's total read count from a non-personal room.</td></tr></tbody></table>

### Get Active Chat Room

Returns the room model (TAPRoomModel) of the currently active chat room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

TAPRoomModel *activeRoom = [[TAPCoreChatRoomManager sharedManager] getActiveChatRoom];
```

{% endtab %}
{% endtabs %}

### Get Local Chat Room Data

Obtain locally saved chat room details with a roomID. Returns the saved room model or nil if it does not exist.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

TAPRoomModel *room = [[TAPCoreChatRoomManager sharedManager] getLocalChatRoomData:roomID];
```

{% endtab %}
{% endtabs %}

### Create Group Chat Room

Create a new group chat room with selected group name.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] createGroupChatRoomWithGroupName:GROUP_NAME listOfParticipantUserIDs:PARTICIPANTS_USERID_ARRAY success:^(TAPRoomModel * _Nonnull room) {
    // Successfully created group chat room
}
failure:^(NSError * _Nonnull error) {
    // Failed to create group chat room
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`GROUP_NAME`**: (String) your group name\
\&#xNAN;**`PARTICIPANTS_USERID_ARRAY`**: (Array) list of participant userIDs
{% endhint %}

### Get Personal Chat Room with Recipient User

Create new personal chat room with recipient user, or obtain chat room data if it already exists.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] getPersonalChatRoomWithRecipientUser:RECIPIENT_USER success:^(TAPRoomModel * _Nonnull room) {
    // Successfully obtained chat room data
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`RECIPIENT_USER`**: (TAPUserModel) recipient user data
{% endhint %}

### Get Personal Chat Room with Recipient User ID

Create new personal chat room with recipient user ID, or obtain chat room data if it already exists.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] getPersonalChatRoomWithRecipientUserID:RECIPIENT_USER_ID success:^(TAPRoomModel * _Nonnull room) {
    // Successfully obtained chat room data
}
failure:^(NSError * _Nonnull error) {
    // Failed get chat room data
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`RECIPIENT_USER_ID`**: (String) user ID of recipient
{% endhint %}

### Create Group Chat Room

Create a new group chat room with selected group name and group picture.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] createGroupChatRoomWithGroupName:GROUP_NAME profilePicture:PROFILE_PICTURE listOfParticipantUserIDs:PARTICIPANTS_USER_ID_ARRAY success:^(TAPRoomModel * _Nonnull room, BOOL isSuccessUploadGroupPicture) {
    // Successfully created group chat room
}
failure:^(NSError * _Nonnull error) {
    // Failed to create group chat room
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`GROUP_NAME`**: (String) your group name\
\&#xNAN;**`PARTICIPANTS_USERID_ARRAY`**: (Array) list of participant userIDs\
\&#xNAN;**`PROFILE_PICTURE`**: (UIImage) group picture image
{% endhint %}

### Get Group Chat Room

Get group room data from selected group room ID.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] getGroupChatRoomWithGroupRoomID:GROUP_ROOM_ID success:^(TAPRoomModel * _Nonnull room) {
    // Successfully obtained group chat room
}
failure:^(NSError * _Nonnull error) {
    // Failed to fetch data
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group
{% endhint %}

### Update Group Chat Room Details

Create a new Update existing group chat room data.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>
  
[[TAPCoreChatRoomManager sharedManager] updateGroupChatRoomDetailsWithGroupRoomID:GROUP_ROOM_ID groupName:GROUP_NAME success:^(TAPRoomModel * _Nonnull room) {
    // Successfully updated group chat room    
}
failure:^(NSError * _Nonnull error) {
    // Failed to update group chat room    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group\
\&#xNAN;**`GROUP_NAME`**: (String) name of group
{% endhint %}

### Update Group Image

Update group picture with current selected image.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>
  
[[TAPCoreChatRoomManager sharedManager] updateGroupPicture:GROUP_IMAGE roomID:GROUP_ROOM_ID successBlock:^(TAPRoomModel * _Nonnull room) {
    // Successfully updated group profile image
}
progressBlock:^(CGFloat progress, CGFloat total) {
    // Handle upload image progress
}
failureBlock:^(NSError * _Nonnull error) {
    // Failed to update group profile image
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`GROUP_IMAGE`**: (UIImage) image of group profile\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group
{% endhint %}

### Delete Local Group Chat Room

Delete group chat room from the device's local storage and clear all chat data and participants. Locally deleted room data will still be accessible from the server if the user remains a participant in the room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] deleteLocalGroupChatRoom:ROOM_ID success:^{
    // Successfully deleted group chat room locally
}
failure:^(NSError * _Nonnull error) {
    // Failed to delete group chat room
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) group room ID to be deleted
{% endhint %}

### Delete Group Chat Room

Delete group chat room and clear all chat data and participants.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] deleteGroupChatRoom:GROUP_ROOM success:^{
    // Successfully deleted group chat room
}
failure:^(NSError * _Nonnull error) {
    // Failed to delete group chat room
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`GROUP_ROOM`**: (TAPRoomModel) group room to be deleted
{% endhint %}

### Leave Group Chat

Leave from selected group chat.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>
  
[[TAPCoreChatRoomManager sharedManager] leaveGroupChatRoomWithRoomID:GROUP_ROOM_ID success:^{
    // Successfully left group chat room
}
failure:^(NSError * _Nonnull error) {
    // Failed to leave group chat room
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group
{% endhint %}

### Add Members to Group Chat

Add selected member(s) to current group chat room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>
  
[[TAPCoreChatRoomManager sharedManager] addGroupChatMembersWithUserIDArray:PARTICIPANTS_USER_ID_ARRAY roomID:GROUP_ROOM_ID success:^(TAPRoomModel * _Nonnull room) {
    // Successfully added members to group
}
failure:^(NSError * _Nonnull error) {
    // Failed to add members to group
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`PARTICIPANTS_USER_ID_ARRAY`**: (Array ) list of participant userIDs\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group
{% endhint %}

### Remove Members from Group Chat

Remove selected member(s) from current group chat room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>
  
[[TAPCoreChatRoomManager sharedManager] removeGroupChatMembersWithUserIDArray:PARTICIPANTS_USER_ID_ARRAY roomID:GROUP_ROOM_ID success:^(TAPRoomModel * _Nonnull room) {
    // Successfully removed members from group
}
failure:^(NSError * _Nonnull error) {
    // Failed to remove members from group
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`PARTICIPANTS_USER_ID_ARRAY`**: (Array ) list of participant userIDs\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group
{% endhint %}

### Promote Group Admin

Promote selected member(s) as admin(s) to the current group chat room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>
  
[[TAPCoreChatRoomManager sharedManager] promoteGroupAdminsWithUserIDArray:USER_ID_ARRAY roomID:GROUP_ROOM_ID success:^(TAPRoomModel * _Nonnull room) {
    // Successfully promoted member to admin
}
failure:^(NSError * _Nonnull error) {
    // Failed to promote member to admin
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`USER_ID_ARRAY`**: (Array ) list of userIDs\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group
{% endhint %}

### Demote Group Admin

Demote selected admin(s) to member(s) to the current group chat room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>
  
[[TAPCoreChatRoomManager sharedManager] demoteGroupAdminsWithUserIDArray:USER_ID_ARRAY roomID:GROUP_ROOM_ID success:^(TAPRoomModel * _Nonnull room) {
    // Successfully demoted admin to member
}
failure:^(NSError * _Nonnull error) {
    // Failed to demote admin to member
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`USER_ID_ARRAY`**: (Array ) list of userIDs\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group
{% endhint %}

### Get Saved Messages Chat Room

Obtain Saved Messages chat room data.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] getSavedMessagesChatRoom:^(TAPRoomModel * _Nonnull room) {
   // Successfully obtained chat room data
}
failure:^(NSError * _Nonnull error) {
   // Failed to get chat room data
}];
```

{% endtab %}
{% endtabs %}

### Send Start Typing

Notify that the active user has started typing in the selected room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] sendStartTypingEmitWithRoomID:GROUP_ROOM_ID];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group
{% endhint %}

### Send Stop Typing

Notify that the active user has stopped typing in the selected room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] sendStopTypingEmitWithRoomID:GROUP_ROOM_ID];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`GROUP_ROOM_ID`**: (String) room ID of group
{% endhint %}

### Send Text Message

To send a text message to a chat room, use the `sendTextMessage:room:start:success:failure:` method from the **TapCoreMessageManager** class.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send text message
[[TAPCoreMessageManager sharedManager] sendTextMessage:MESSAGE_BODY
                                                  room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

Use the `sendTextMessage:quotedMessage:room:start:success:failure:` method to send a text message with quote.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send text message with quote
[[TAPCoreMessageManager sharedManager] sendTextMessage:MESSAGE_BODY
                                         quotedMessage:QUOTED_MESSAGE
                                                  room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_BODY`**: (String) content of the message\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be sent\
\&#xNAN;**`QUOTED_MESSAGE`**: (TAPMessageModel) quote containing another existing message
{% endhint %}

### Send Location Message

You can send a location embedded in a chat message using `sendLocationMessageWithLatitude:longitude:address:room:start:success:failure:`. This method takes latitude, longitude, and address text as parameters.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send location message
[[TAPCoreMessageManager sharedManager] sendLocationMessageWithLatitude:LATITUDE
                                                             longitude:LONGITUDE
                                                               address:ADDRESS
                                                                  room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed  
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

Use the `sendLocationMessageWithLatitude:longitude:quotedMessage:address:room:start:success:failure:` method to send a location message with quote.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send location message with quote
[[TAPCoreMessageManager sharedManager] sendLocationMessageWithLatitude:LATITUDE
                                                             longitude:LONGITUDE
                                                         quotedMessage:QUOTED_MESSAGE
                                                               address:ADDRESS
                                                                  room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed  
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`LATITUDE`**: (Float) latitude of the shared location\
\&#xNAN;**`LONGITUDE`**: (Float) longitude of the shared location\
\&#xNAN;**`ADDRESS`**: (String) text data containing the location address\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be sent\
\&#xNAN;**`QUOTED_MESSAGE`**: (TAPMessageModel) quote containing another existing message
{% endhint %}

### Send Image Message

To send an image to a chat room, you can use `sendImageMessage:` or `sendImageMessageWithAsset:` method by providing either `UIImage`, `PHAsset` , `IMAGE_ASSET_URL`, or  `IMAGE_URL` as parameter.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send image using UIImage
[[TAPCoreMessageManager sharedManager] sendImageMessage:IMAGE
                                                caption:CAPTION
                                                  room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Image upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send image using PHAsset
[[TAPCoreMessageManager sharedManager] sendImageMessageWithAsset:IMAGE_ASSET
                                                         caption:CAPTION
                                                            room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Image upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send image using image asset URL
[[TAPCoreMessageManager sharedManager] sendImageMessageWithURL:IMAGE_ASSET_URL
                                                       caption:CAPTION
                                                          room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Image upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send image using remote image URL
[[TAPCoreMessageManager sharedManager] sendImageMessageWithRemoteUrl:IMAGE_URL
                                                             caption:CAPTION
                                                                room:ROOM
                                                       fetchMetadata:FETCH_METADATA
temporaryMessageCreated:^(TAPMessageModel * _Nonnull message) {
    // Temporary message was created while fetching metadata
    // This callback will be called when FETCH_METADATA is true
}
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

Use the `sendImageMessage:` or `sendImageMessageWithAsset:` or `sendImageMessageWithRemoteUrl:` method with extra parameter to send an image message with quote.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send image using UIImage with quote
[[TAPCoreMessageManager sharedManager] sendImageMessage:IMAGE
                                          quotedMessage:QUOTED_MESSAGE
                                                caption:CAPTION
                                                  room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Image upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send image using PHAsset with quote
[[TAPCoreMessageManager sharedManager] sendImageMessageWithAsset:IMAGE_ASSET
                                                   quotedMessage:QUOTED_MESSAGE
                                                         caption:CAPTION
                                                            room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Image upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send image using image asset URL with quote
[[TAPCoreMessageManager sharedManager] sendImageMessageWithURL:IMAGE_ASSET_URL
                                                 quotedMessage:QUOTED_MESSAGE
                                                       caption:CAPTION
                                                          room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Image upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send image using remote image URL with quote
[[TAPCoreMessageManager sharedManager] sendImageMessageWithRemoteUrl:IMAGE_URL
                                                             caption:CAPTION
                                                                room:ROOM
                                                       quotedMessage:QUOTED_MESSAGE
                                                       fetchMetadata:FETCH_METADATA
temporaryMessageCreated:^(TAPMessageModel * _Nonnull message) {
    // Temporary message was created while fetching metadata
    // This callback will be called when FETCH_METADATA is true
}
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`IMAGE`**: (UIImage) selected image with **`UIImage`** type\
\&#xNAN;**`IMAGE_ASSET`**: (PHAsset) selected image asset data\
\&#xNAN;**`IMAGE_ASSET_URL`**: (NSURL) local URL of the image asset\
\&#xNAN;**`IMAGE_URL`**: (String) remote URL of the image\
\&#xNAN;**`CAPTION`**: (String) caption for the image\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be sent\
\&#xNAN;**`QUOTED_MESSAGE`**: (TAPMessageModel) quote containing another existing message\
\&#xNAN;**`FETCH_METADATA`**: (BOOL) inserts metadata from remote URL to the constructed message when true
{% endhint %}

### Send Video Message

To send a video to a chat room, you can use `sendVideoMessageWithAsset:` method by providing the `VIDEO_ASSET`, `VIDEO_ASSET_URL`, or a remote `VIDEO_URL` as parameter.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send video using video asset (PHAsset)
[[TAPCoreMessageManager sharedManager] sendVideoMessageWithAsset:VIDEO_ASSET
                                                         caption:CAPTION
                                                            room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Video upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send video using video asset URL
[[TAPCoreMessageManager sharedManager] sendVideoMessageWithVideoAssetURL:VIDEO_ASSET_URL
                                                                 caption:CAPTION
                                                                    room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Video upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send video using remote video URL
[[TAPCoreMessageManager sharedManager] sendVideoMessageWithRemoteUrl:VIDEO_URL
                                                             caption:CAPTION
                                                                room:ROOM 
                                                       fetchMetaData:FETCH_METADATA
temporaryMessageCreated:^(TAPMessageModel * _Nonnull message) {
    // Temporary message was created while fetching metadata
    // This callback will be called when FETCH_METADATA is true
}
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

Use the send video method with extra parameter to send a video message with quote.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send video using video asset (PHAsset) with quote
[[TAPCoreMessageManager sharedManager] sendVideoMessageWithAsset:VIDEO_ASSET
                                                   quotedMessage:QUOTED_MESSAGE
                                                         caption:CAPTION
                                                            room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Video upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send video using video asset URL with quote
[[TAPCoreMessageManager sharedManager] sendVideoMessageWithVideoAssetURL:VIDEO_ASSET_URL
                                                           quotedMessage:QUOTED_MESSAGE
                                                                 caption:CAPTION
                                                                    room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Video upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send video using remote video URL with quote
[[TAPCoreMessageManager sharedManager] sendVideoMessageWithRemoteUrl:VIDEO_URL
                                                             caption:CAPTION
                                                                room:ROOM
                                                       quotedMessage:QUOTED_MESSAGE
                                                       fetchMetaData:FETCH_METADATA
temporaryMessageCreated:^(TAPMessageModel * _Nonnull message) {
    // Temporary message was created while fetching metadata
    // This callback will be called when FETCH_METADATA is true
}
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`VIDEO_ASSET`**: (PHAsset) selected videos asset data\
\&#xNAN;**`VIDEO_ASSET_URL`**: (NSURL) local URL of the video asset\
\&#xNAN;**`VIDEO_URL`**: (String) remote URL of the video\
\&#xNAN;**`CAPTION`**: (String) caption for the video\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be sent\
\&#xNAN;**`QUOTED_MESSAGE`**: (TAPMessageModel) quote containing another existing message\
\&#xNAN;**`FETCH_METADATA`**: (BOOL) inserts metadata from remote URL to the constructed message when true
{% endhint %}

### Send File Message

You can also send a file to a chat room using `sendFileMessageWithFileURI:` or `sendFileMessageWithRemoteUrl:`.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send file using file asset URL
[[TAPCoreMessageManager sharedManager] sendFileMessageWithFileURI:FILE_ASSET_URL
                                                             room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
} 
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // File upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send file using remote file URL
[[TAPCoreMessageManager sharedManager] sendFileMessageWithRemoteUrl:FILE_URL
                                                            caption:CAPTION
                                                               room:ROOM
                                                      fetchMetadata:FETCH_METADATA
temporaryMessageCreated:^(TAPMessageModel * _Nonnull message) {
    // Temporary message was created while fetching metadata
    // This callback will be called when FETCH_METADATA is true
}
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send file using remote file URL, file name, and mime type
[[TAPCoreMessageManager sharedManager] sendFileMessageWithRemoteUrl:FILE_URL
                                                            caption:CAPTION
                                                               room:ROOM
                                                           fileName:FILE_NAME
                                                           mimeType:MIME_TYPE
                                                      fetchMetadata:FETCH_METADATA
temporaryMessageCreated:^(TAPMessageModel * _Nonnull message) {
    // Temporary message was created while fetching metadata
    // This callback will be called when FETCH_METADATA is true
}
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

Use the send file method with extra parameter to send a file message with quote.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send file using file asset URL with quote
[[TAPCoreMessageManager sharedManager] sendFileMessageWithFileURI:FILE_ASSET_URL
                                                    quotedMessage:QUOTED_MESSAGE
                                                             room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
} 
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // File upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send file using remote file URL with quote
[[TAPCoreMessageManager sharedManager] sendFileMessageWithRemoteUrl:FILE_URL
                                                            caption:CAPTION
                                                               room:ROOM
                                                      quotedMessage:QUOTED_MESSAGE
                                                      fetchMetadata:FETCH_METADATA
temporaryMessageCreated:^(TAPMessageModel * _Nonnull message) {
    // Temporary message was created while fetching metadata
    // This callback will be called when FETCH_METADATA is true
}
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send file using remote file URL, file name, and mime type with quote
[[TAPCoreMessageManager sharedManager] sendFileMessageWithRemoteUrl:FILE_URL
                                                            caption:CAPTION
                                                               room:ROOM
                                                      quotedMessage:QUOTED_MESSAGE
                                                           fileName:FILE_NAME
                                                           mimeType:MIME_TYPE
                                                      fetchMetadata:FETCH_METADATA
temporaryMessageCreated:^(TAPMessageModel * _Nonnull message) {
    // Temporary message was created while fetching metadata
    // This callback will be called when FETCH_METADATA is true
}
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`FILE_ASSET_URL`**: (NSURL) file path of the selected file\
\&#xNAN;**`FILE_URL`**: (String) remote URL of the video\
\&#xNAN;**`CAPTION`**: (String) caption for the video\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be sent\
\&#xNAN;**`QUOTED_MESSAGE`**: (TAPMessageModel) quote containing another existing message\
\&#xNAN;**`FILE_NAME`**: (String) file name to be included in message data\
\&#xNAN;**`MIME_TYPE`**: (String) mime type to be included in message data, set to empty to fetch default mime type from the provided URL\
\&#xNAN;**`FETCH_METADATA`**: (BOOL) inserts metadata from remote URL to the constructed message when true
{% endhint %}

### Send Voice Message

You can also send a voice note to a chat room using the `sendVoiceMessageWithFileURI:` method with a provided `FILE_URI` (`NSURL`).

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] sendVoiceMessageWithFileURI:AUDIO_ASSET_URL
                                                              room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // File upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

Use the `sendVoiceMessageWithFileURI:` method with extra parameter to send a voice message with quote.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] sendVoiceMessageWithFileURI:AUDIO_ASSET_URL
                                                     quotedMessage:QUOTED_MESSAGE
                                                              room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // File upload is in progress
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`AUDIO_ASSET_URL`**: (NSURL) file path of the selected audio\
\&#xNAN;**`CAPTION`**: (String) caption for the video\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be sent\
\&#xNAN;**`QUOTED_MESSAGE`**: (TAPMessageModel) quote containing another existing message
{% endhint %}

### Send Link Message

You can send a link message, which is usually composed of a text message with URL on the body, using the `sendLinkMessage:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send link message
[[TAPCoreMessageManager sharedManager] sendLinkMessage:MESSAGE_BODY
                                                  room:ROOM
                                                  urls:URLS
                                                 title:TITLE
                                           description:DESCRIPTION
                                                 image:IMAGE
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    //Failed send link message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send link message with additional metadata parameters
[[TAPCoreMessageManager sharedManager] sendLinkMessage:MESSAGE_BODY
                                                  room:ROOM
                                                  urls:URLS
                                                 title:TITLE
                                           description:DESCRIPTION
                                                 image:IMAGE
                                              siteName:SITE_NAME
                                                  type:TYPE
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

Use the `sendLinkMessage:` method with extra parameters to send a link message with quote.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send link message with quote
[[TAPCoreMessageManager sharedManager] sendLinkMessage:MESSAGE_BODY
                                         quotedMessage:QUOTED_MESSAGE
                                                  room:ROOM
                                                  urls:URLS
                                                 title:TITLE
                                           description:DESCRIPTION
                                                 image:IMAGE
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send link message with quote and additional metadata parameters
[[TAPCoreMessageManager sharedManager] sendLinkMessage:MESSAGE_BODY
                                         quotedMessage:QUOTED_MESSAGE
                                                  room:ROOM
                                                  urls:URLS
                                                 title:TITLE
                                           description:DESCRIPTION
                                                 image:IMAGE
                                              siteName:SITE_NAME
                                                  type:TYPE
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was sent successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_BODY`**: (String) content of the message\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be sent\
\&#xNAN;**`QUOTED_MESSAGE`**: (TAPMessageModel) quote containing another existing message\
\&#xNAN;**`URLS`**: (NSArray\<String>) list of URLs contained in the message\
\&#xNAN;**`TITLE`**: (String) `og:title` metadata of the specified URL\
\&#xNAN;**`DESCRIPTION`**: (String) `og:description` metadata of the specified URL\
\&#xNAN;**`IMAGE`**: (String) `og:image` metadata of the specified URL\
\&#xNAN;**`SITE_NAME`**: (String) `og:site_name` metadata of the specified URL\
\&#xNAN;**`TYPE`**: (String) `og:type` metadata of the specified URL
{% endhint %}

### Forward Message

To forward existing messages to chat room, call the `sendForwardedMessage:` method. You may also use `sendForwardedMessageWithMessageArray:` to forward multiple messages at once, or `sendForwardedMessage:toMultipleRooms:` or `sendForwardedMessageWithMessageArray:toMultipleRooms:` to forward messages to multiple rooms at once.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Forward a message
[[TAPCoreMessageManager sharedManager] sendForwardedMessage:MESSAGE_TO_FORWARD 
                                                       room:ROOM
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
} 
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {

} 
success:^(TAPMessageModel * _Nonnull message) {
    // Message was forwarded successfully
} 
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to forward message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Forward multiple messages at once
[[TAPCoreMessageManager sharedManager] sendForwardedMessageWithMessageArray:MESSAGES_TO_FORWARD
                                                                       room:ROOM 
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
} 
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {

} 
success:^(TAPMessageModel * _Nonnull message) {
    // Message was forwarded successfully
} 
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to forward message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Forward a message to multiple chat rooms
[[TAPCoreMessageManager sharedManager] sendForwardedMessage:MESSAGE_TO_FORWARD 
                                            toMultipleRooms:ROOMS
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
} 
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {

} 
success:^(TAPMessageModel * _Nonnull message) {
    // Message was forwarded successfully
} 
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to forward message
}];
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Forward multiple messages to multiple chat rooms at once
[[TAPCoreMessageManager sharedManager] sendForwardedMessageWithMessageArray:MESSAGES_TO_FORWARD 
                                                            toMultipleRooms:ROOMS
start:^(TAPMessageModel * _Nonnull message) {
    // Message was constructed
} 
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Progress forward message
} 
success:^(TAPMessageModel * _Nonnull message) {
    // Message was forwarded successfully
} 
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to forward message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_TO_FORWARD`**: (TAPMessageModel) existing message to be forwarded\
\&#xNAN;**`MESSAGES_TO_FORWARD`**: (NSArray\<TAPMessageModel>) array of messages to be forwarded\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be forwarded\
\&#xNAN;**`ROOMS`**: (NSArray\<TAPRoomModel>) list of destination rooms where the message will be forwarded
{% endhint %}

### Construct TapTalk.io Message Model

You can construct your own customized message model to be used in chat as shown below.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

TAPMessageModel *constructedMessage = [[TAPCoreMessageManager sharedManager] constructTapTalkMessageModelWithRoom:ROOM messageBody:MESSAGE_BODY messageType:MESSAGE_TYPE messageData:MESSAGE_DATA];
```

{% endtab %}
{% endtabs %}

To construct a custom message with quote, use the `constructTapTalkMessageModelWithRoom:quotedMessage:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

TAPMessageModel *constructedMessage = [[TAPCoreMessageManager sharedManager] constructTapTalkMessageModelWithRoom:ROOM quotedMessage:QUOTED_MESSAGE messageBody:MESSAGE_BODY messageType:MESSAGE_TYPE messageData:MESSAGE_DATA];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_BODY`**: (String) content of the message\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be sent\
\&#xNAN;**`MESSAGE_TYPE`**: (Integer) type of your custom message, check the [Message Type page](https://docs.taptalk.io/powertalk-chat-sdk-documentation/powertalk-ios/message-type) for more information\
\&#xNAN;**`MESSAGE_DATA`**: (NSDictionary) custom data for the message (optional)\
\&#xNAN;**`QUOTED_MESSAGE`**: (TAPMessageModel) quote of the new message model containing another existing message
{% endhint %}

{% hint style="info" %}
**Note**: you are free to put any data that you need for your custom message in the **`MESSAGE_DATA`** parameter, to obtain message data from a **`TAPMessageModel`**, look into the **`data`** property of **`TAPMessageModel`** (message.data).
{% endhint %}

### Send a Custom Message

To send a custom message that you just created above, call the `sendCustomMessageWithMessageModel:` method with the custom message as a parameter.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] sendCustomMessageWithMessageModel:CUSTOM_MESSAGE start:^(TAPMessageModel * _Nonnull message) {
    // Returns constructed custom message
}
success:^(TAPMessageModel * _Nonnull message) {
    // Successfully sent custom message
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to send custom message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`CUSTOM_MESSAGE`**: (TAPMessageModel) the message to be sent, see the [Construct TapTalk.io Message Model](#construct-taptalk-io-message-model) section to construct a custom message
{% endhint %}

### Edit Message

To update the contents of a message, you may use the `editMessage:` method from **TapCoreMessageManager** class. Editing is currently available for text message and image or video message caption.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] editMessage:self.currentEditingMessage
                                       updatedText:currentMessage
start:^(TAPMessageModel * _Nonnull message) {
    // Message is being processed
}
success:^(TAPMessageModel * _Nonnull message) {
    // Message was edited successfully
}
failure:^(TAPMessageModel * _Nullable message, NSError *error) {
    // Failed to edit message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_MODEL`**: (TAPMessageModel) the message to be updated\
\&#xNAN;**`UPDATED_TEXT`**: (NSString) new text to replace the body and caption of the message
{% endhint %}

### Delete Message

To delete a message permanently from the server, call `deleteMessage:` from **TapCoreMessageManager** class. When the message is successfully deleted, **TapCoreMessageManagerDelegate** will invoke `tapTalkDidDeleteMessage:` delegate.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>
  
[[TAPCoreMessageManager sharedManager] deleteMessage:MESSAGE_MODEL success:^{
    // Successfully deleted message    
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to delete message
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_MODEL`**: (TAPMessageModel) the message to be deleted
{% endhint %}

### Delete Message from Local Cache

To delete a message from local cache, call `deleteLocalMessageWithLocalID:` from **TapCoreMessageManager** class.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>
  
[[TAPCoreMessageManager sharedManager] deleteLocalMessageWithLocalID:MESSAGE_LOCAL_ID success:^{
    // Successfully deleted message
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to delete message    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_LOCAL_ID`**: (String) local ID of the message to delete
{% endhint %}

### Cancel Message File Upload

Messages such as **Image**, **Video**, and **File** messages requires a file upload completion before the message is sent. To cancel an ongoing file upload of a message, call the `cancelMessageFileUpload:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>
  
[[TAPCoreMessageManager sharedManager] cancelMessageFileUpload:MESSAGE success:^{
    // Successfully cancelled upload    
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to cancel upload
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE`**: (TAPMessageModel) pending message with ongoing file upload
{% endhint %}

### Download Message File

To start a file download from a **File**, **Image**, or **Video** message, you can use these methods below based on what type of message you wish to download.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Download file from a message
[[TAPCoreMessageManager sharedManager] downloadMessageFile:MESSAGE
start:^{
    // File download started
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // File download in progress
}
success:^(NSData * _Nonnull fileData) {
    // Successfully downloaded file
    // Returns NSData
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to download file    
}];


// Download image from a message
[[TAPCoreMessageManager sharedManager] downloadMessageImage:MESSAGE
start:^{
    // Image download started
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Image download in progress
}
success:^(UIImage * _Nonnull fullImage) {
    // Successfully downloaded image
    // Returns UIImage
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to download image    
}];


//Download video from a message
[[TAPCoreMessageManager sharedManager] downloadMessageVideo:MESSAGE start:^{
    // Video download started
}
progress:^(TAPMessageModel * _Nullable message, CGFloat progress, CGFloat total) {
    // Video download in progress    
}
success:^(NSData * _Nonnull fileData) {
    // Successfully downloaded video
    // Returns NSData
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to download video    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE`**: (TAPMessageModel) existing message to download the file from
{% endhint %}

### Cancel Message File Download

You can cancel download message with type such as **Image**, **Video**, and **File** by calling the `cancelMessageFileDownload:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>
  
[[TAPCoreMessageManager sharedManager] cancelMessageFileDownload:MESSAGE success:^{
    // Successfully cancelled file download    
}
failure:^(TAPMessageModel * _Nullable message, NSError * _Nonnull error) {
    // Failed to cancel file download
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE`**: (TAPMessageModel) selected message with ongoing file download
{% endhint %}

### Mark Message as Delivered

To manually mark a message as delivered, call the `markMessageAsDelivered:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] markMessageAsDelivered:MESSAGE];
```

{% endtab %}
{% endtabs %}

### Mark Message as Read

To manually mark a message as read, call the `markMessageAsRead:` method. You can also mark multiple messages as read at once using `markMessagesAsRead:`.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Mark single message as read
[[TAPCoreMessageManager sharedManager] markMessageAsRead:MESSAGE];

// Mark multiple messages as read
[[TAPCoreMessageManager sharedManager] markMessageAsRead:MESSAGE_ARRAY];

// Mark multiple messages as read with completion handler
[[TAPCoreMessageManager sharedManager] markMessageAsRead:MESSAGE_ARRAY 
success:^(NSArray<NSString *> *updatedMessageIDs){
    // updatedMessageIDs contains message IDs that were successfully marked as read
} 
failure:^(NSError *error) {
             
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE`**: (TAPMessageModel) existing message to be marked as read\
\&#xNAN;**`MESSAGE_ARRAY`**: (NSArray\<TAPMessageModel>) array of message models to be marked as read
{% endhint %}

### Mark All Chat Room Messages as Read

To quickly mark all unread messages in a chat room as read, call `markAllMessageInRoomAsRead:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Mark all unread messages in specified chat room as read
[[TAPCoreMessageManager sharedManager] markAllMessagesInRoomAsReadWithRoomID:ROOM_ID];


// Mark all unread messages in specified chat room as read with completion listener
[[TAPCoreMessageManager sharedManager] markAllMessagesInRoomAsReadWithRoomID:ROOM_ID
success:^(NSArray<NSString *> *updatedMessageIDs){
    // updatedMessageIDs contains message IDs that were successfully marked as read
} 
failure:^(NSError *error) {
             
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) room ID of the messages to be marked as read
{% endhint %}

### Get Local Messages from Chat Room

In a chat room, you can retrieve messages that are already stored in the device's local storage by calling `getLocalMessagesWithRoomID:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
// import TapTalk Message Manager
#import <TapTalk/TAPCoreMessageManager.h>

[TAPCoreMessageManager sharedManager] getLocalMessagesWithRoomID:ROOM_ID
success:^(NSArray<TAPMessageModel *> * _Nonnull messageArray) {
    // Successfully obtained messages
}
failure:^(NSError * _Nonnull error) {
    // Failed to get messages
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) the room ID to retrieve the messages for
{% endhint %}

Retrieving local messages is fast and reliable, but may not contain all messages available in the selected chat room. To obtain more messages that are available from the server, you may use `getOlderMessagesBeforeTimestamp:` and `getNewerMessagesAfterTimestamp:` methods.

### Get Older Messages from Chat Room

To retrieve older messages in a chat room from the server, use the `getOlderMessagesBeforeTimestamp:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getOlderMessagesBeforeTimestamp:MAX_CREATED_TIMESTAMP
                                                                roomID:ROOM_ID
                                                         numberOfItems:NUMBER_OF_ITEMS
success:^(NSArray<TAPMessageModel *> * _Nonnull messageArray, BOOL hasMoreData) {
    // hasMoreData will return true if more messages that have not been retrieved remain in the chat room
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) the room ID to retrieve the messages for\
\&#xNAN;**`MAX_CREATED_TIMESTAMP`**: (NSNumber) the maximum created time of the messages to retrieve, in milliseconds\
\&#xNAN;**`NUMBER_OF_ITEMS`**: (NSNumber) maximum limit of the number of messages to retrieve
{% endhint %}

### Get Newer Messages from Chat Room

To retrieve newer messages in a chat room from the server, use the `getNewerMessagesAfterTimestamp:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getNewerMessagesAfterTimestamp:MIN_CREATED_TIMESTAMP
                                                 lastUpdatedTimestamp:LAST_UPDATE_TIMESTAMP
                                                               roomID:ROOM_ID
                                                        numberOfItems:NUMBER_OF_ITEMS
success:^(NSArray<TAPMessageModel *> * _Nonnull messageArray) {
  
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

You can also call `getNewerMessagesWithRoomID:` without providing `MIN_CREATED_TIMESTAMP` and `LAST_UPDATE_TIMESTAMP`, only providing `ROOM_ID` as the parameter. With this method, `MIN_CREATED_TIMESTAMP` will automatically be set to the oldest existing message's created time in the room, and `LAST_UPDATE_TIMESTAMP` will be obtained from local cache.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getNewerMessagesWithRoomID:ROOM_ID
success:^(NSArray<TAPMessageModel *> * _Nonnull messageArray) {
  
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) the room ID to retrieve the messages for\
\&#xNAN;**`MIN_CREATED_TIMESTAMP`**: (NSNumber) the minimum created time of the messages to retrieve, in millisecond\
\&#xNAN;**`LAST_UPDATE_TIMESTAMP`**: (NSNumber) the minimum updated time of the messages to retrieve, in milliseconds\
\&#xNAN;**`NUMBER_OF_ITEMS`**: (NSNumber) maximum limit of the number of messages to retrieve<br>
{% endhint %}

### Get All Messages from Chat Room

You may also retrieve all available messages from a chat room using the `getAllMessagesWithRoomID:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[TAPCoreMessageManager sharedManager] getAllMessagesWithRoomID:ROOM_ID
successLocalMessages:^(NSArray<TAPMessageModel *> * _Nonnull messageArray) {
    // Retrieved local messages from room
}
successAllMessages:^(NSArray<TAPMessageModel *> * _Nonnull allMessagesArray, NSArray<TAPMessageModel *> * _Nonnull olderMessagesArray, NSArray<TAPMessageModel *> * _Nonnull newerMessagesArray) {
    // Successfully retrieved all messages from room 
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) the room ID to retrieve the messages for
{% endhint %}

`getAllMessagesWithRoomID:` is convenient to obtain all existing chat room messages since the beginning of the room creation, but the process **will take longer** depending on the number of messages contained in the selected room.\
\
This method will trigger two success blocks sequentially during the process of retrieving messages:\
• `successLocalMessages:` will be triggered first once local messages are retrieved, the process will then continue to retrieve more messages from the server.\
• `successAllMessages:` will be triggered after all messages from the server are successfully retrieved, this callback contains three parameters containing **all messages**, **older messages** (that did not exist in local storage), and **newer messages** that have recently been updated, the latter two parameters might be empty depending on the situation.

### Get Unread Messages from Chat Room

You can retrieve unread messages from the device's local storage by calling `getUnreadMessagesFromRoom:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[TAPCoreMessageManager sharedManager] getUnreadMessagesFromRoom:ROOM_ID
success:^(NSArray<TAPMessageModel *> * _Nonnull unreadMessageArray) {
        
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) the room ID to retrieve the messages from
{% endhint %}

### Get Media Messages from Chat Room

You can also retrieve media messages from the device's local storage, which consists of **image**, **video**, and **documents**, by calling `getMediaMessagesFromRoom:` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[TAPCoreMessageManager sharedManager] getMediaMessagesFromRoom:ROOM_ID 
                                                 lastTimestamp:LAST_TIMESTAMP 
                                                  numberOfItem:NUMBER_OF_ITEM 
success:^(NSArray<TAPMessageModel *> * _Nonnull unreadMessageArray) {
        
} 
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) the room ID to retrieve the messages from\
\&#xNAN;**`LAST_TIMESTAMP`**: (NSNumber)  the maximum created time of the messages to retrieve, in milliseconds\
\&#xNAN;**`NUMBER_OF_ITEMS`**: (NSNumber) maximum limit of the number of messages to retrieve
{% endhint %}

### Search Local Message

Call this method to search messages from the device's local storage with a keyword. Provided keyword will be used to filter **message body** in the search result.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[TAPCoreMessageManager sharedManager] searchLocalMessageWithKeyword:KEYWORD
success:^(NSArray<TAPMessageModel *> * _Nonnull messageArray) {
    // Returns filtered messages obtained from local storage    
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`KEYWORD`**: (String) search keyword to filter message body
{% endhint %}

### Star/Unstar Messages

You may use these methods to mark a message or multiple messages as starred, or remove messages from the starred list. Only the active user can retrieve his/her own starred messages.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Star single message
[[TAPCoreMessageManager sharedManager] starMessageWithMessageID:MESSAGE_ID 
                                                         roomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull starredMessagesIDs) {
    // Returns list of messageID of starred messages
} 
failure:^(NSError * _Nonnull error) {
                            
}];


// Star multiple messages
[[TAPCoreMessageManager sharedManager] starMessagesWithMessageIDs:MESSAGE_IDS 
                                                           roomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull starredMessagesIDs) {
    // Returns list of messageID of starred messages
} 
failure:^(NSError * _Nonnull error) {
                            
}];


// Unstar single message
[[TAPCoreMessageManager sharedManager] unstarMessageWithMessageID:MESSAGE_ID 
                                                           roomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull unstarredMessagesIDs) {
    // Returns list of messageID of unstarred messages
} 
failure:^(NSError * _Nonnull error) {
                            
}];


// Unstar multiple messages
[[TAPCoreMessageManager sharedManager] unstarMessagesWithMessageIDs:MESSAGE_IDS 
                                                             roomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull unstarredMessagesIDs) {
    // Returns list of messageID of unstarred messages
} 
failure:^(NSError * _Nonnull error) {
                            
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) room ID, can be obtained from the message's room model\
\&#xNAN;**`MESSAGE_ID`**: (NSString) unique server ID from the message\
\&#xNAN;**`MESSAGE_IDS`**: (NSArray\<NSString>) list containing message IDs to be starred/unstarred
{% endhint %}

### Get Starred Messages

You can use the method below get a list of message IDs marked as starred by the user.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getStarredMessageIDsWithRoomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull starredMessagesIDs) {
    // Returns list of messageID of starred messages
} 
failure:^(NSError * _Nonnull error) {
        
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) ID of the target room
{% endhint %}

A method to obtain the full message model list of the starred messages with pagination is also provided.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getStarredMessagesWithRoomID:ROOM_ID 
                                                         pageNumber:PAGE_NUMBER
                                                      numberOfItems:NUMBER_OF_ITEMS 
success:^(NSArray<TAPMessageModel *> * _Nonnull starredMessagesArray, BOOL hasMoreData) {
    // hasMoreData will return YES if the room has remaining starred messages that have not been retrieved
} 
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) ID of the target room\
\&#xNAN;**`PAGE_NUMBER`**: (NSInteger) the number of page to retrieve the items\
\&#xNAN;**`NUMBER_OF_ITEMS`**: (NSInteger) number of items to be retrieved
{% endhint %}

### Pin/Unpin Message

You may use these methods to pin or unpin a message or multiple messages in a chat room. Every participant in the room can retrieve the chat room's pinned messages.&#x20;

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Pin single message
[[TAPCoreMessageManager sharedManager] pinMessageWithMessageID:MESSAGE_ID 
                                                        roomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull pinnedMessagesIDs) {
    // Returns list of messageID of pinned messages
} 
failure:^(NSError * _Nonnull error) {
                            
}];


// Pin multiple messages
[[TAPCoreMessageManager sharedManager] pinMessagesWithMessageIDs:MESSAGE_IDS 
                                                          roomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull pinnedMessagesIDs) {
    // Returns list of messageID of pinned messages
} 
failure:^(NSError * _Nonnull error) {
                            
}];


// Unpin single message
[[TAPCoreMessageManager sharedManager] unpinMessageWithMessageID:MESSAGE_ID 
                                                          roomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull unpinnedMessagesIDs) {
    // Returns list of messageID of unpinned messages
} 
failure:^(NSError * _Nonnull error) {
                            
}];


// Unpin multiple messages
[[TAPCoreMessageManager sharedManager] unpinMessagesWithMessageIDs:MESSAGE_IDS 
                                                            roomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull unpinnedMessagesIDs) {
    // Returns list of messageID of unpinned messages
} 
failure:^(NSError * _Nonnull error) {
                            
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) room ID, can be obtained from the message's room model\
\&#xNAN;**`MESSAGE_ID`**: (NSString) unique server ID from the message\
\&#xNAN;**`MESSAGE_IDS`**: (NSArray\<NSString>) list containing message IDs to be pinned/unpinned
{% endhint %}

### Get Pinned Messages

You can use the method below get a list of message IDs of pinned messages in a chat room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getPinnedMessageIDsWithRoomID:ROOM_ID 
success:^(NSArray<NSString *> * _Nonnull pinnedMessagesIDs) {
    // Returns list of messageID of pinned messages
} 
failure:^(NSError * _Nonnull error) {
        
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) ID of the target room
{% endhint %}

A method to obtain the full message model list of the pinned messages with pagination is also provided.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getPinnedMessagesWithRoomID:ROOM_ID 
                                                        pageNumber:PAGE_NUMBER
                                                     numberOfItems:NUMBER_OF_ITEMS 
success:^(NSArray<TAPMessageModel *> * _Nonnull pinnedMessagesArray, BOOL hasMoreData) {
    // hasMoreData will return YES if the room has remaining pinned messages that have not been retrieved
} 
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) ID of the target room\
\&#xNAN;**`PAGE_NUMBER`**: (NSInteger) the number of page to retrieve the items\
\&#xNAN;**`NUMBER_OF_ITEMS`**: (NSInteger) number of items to be retrieved
{% endhint %}

### Get Shared Content Messages

You can retrieve media-type messages, consisting of image, video, file, and link messages from a chat room by using `getSharedContentMessages` method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getSharedContentMessagesWithRoomID:ROOM_ID 
                                                               maxCreated:MAX_CREATED_TIMESTAMP
                                                               minCreated:MAX_CREATED_TIMESTAMP
success:^(NSArray<TAPMessageModel *> * mediaMessagesArray, NSArray<TAPMessageModel *> * fileMessagesArray, NSArray<TAPMessageModel *> * linkMessagesArray) {
    // mediaMessagesArray contains image and video messages
    // fileMessagesArray contains file/document messages
    // linkMessagesArray contains link messages
} 
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) ID of the target room\
\&#xNAN;**`MIN_CREATED_TIMESTAMP`**: (long) smallest created time of the messages to retrieve, use 0L to retrieve up to the oldest message in the room\
\&#xNAN;**`MAX_CREATED_TIMESTAMP`**: (long) largest created time of the messages to retrieve, use current timestamp to retrieve up to the newest message in the room
{% endhint %}

### Delete All Chat Room Messages

Use the **`deleteAllChatRoomMessages:`** method from the **TapCoreChatRoomManager** class to clear all existing messages in a selected chat room for the active user. The selected messages will only be deleted for the active user, and will not affect the other participants in the selected room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TapCoreChatRoomManager.h>

[[TAPCoreChatRoomManager sharedManager] deleteAllChatRoomMessages:ROOM_ID success:^(NSArray * _Nonnull deletedRoomIDs) {
    // Successfully deleted all messages in the chat room
}
failure:^(NSError * _Nonnull error) {
        
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) ID of the target room
{% endhint %}

### Create Scheduled Message

You can schedule a constructed message model to be delivered at a specified time to a chat room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Construct a TapTalk message model to be scheduled
TAPMessageModel *constructedMessage = [[TAPCoreMessageManager sharedManager] constructTapTalkMessageModelWithRoom:ROOM 
                                                                                                      messageBody:MESSAGE_BODY 
                                                                                                      messageType:MESSAGE_TYPE 
                                                                                                      messageData:MESSAGE_DATA];

// Schedule the constructed message
[[TAPCoreMessageManager sharedManager] createScheduleMessage:constructedMessage
                                                scheduleTime:TIMESTAMP
success:^(TAPMessageModel * _Nonnull message) {
    // Successfully created a scheduled message
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_BODY`**: (String) content of the message\
\&#xNAN;**`ROOM`**: (TAPRoomModel) the destination room where the message will be sent\
\&#xNAN;**`MESSAGE_TYPE`**: (Integer) type of your custom message, check the [Message Type page](https://docs.taptalk.io/powertalk-chat-sdk-documentation/powertalk-ios/message-type) for more information\
\&#xNAN;**`MESSAGE_DATA`**: (NSDictionary) custom data for the message (optional)\
\&#xNAN;**`QUOTED_MESSAGE`**: (TAPMessageModel) quote of the new message model containing another existing message\
\&#xNAN;**`TIMESTAMP`**: (NSNumber) time when the message will be delivered to the destination room (long value)
{% endhint %}

### Get Scheduled Messages

You may then retrieve the list of created scheduled messages that have not yet been delivered in a chat room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getScheduledMessagesWithRoomID:ROOM_ID
success:^(NSArray<TAPScheduledMessageModel *> * _Nonnull scheduleMessageArray) {
    // Successfully retrieved scheduled messages
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`ROOM_ID`**: (NSString) ID of the destination chat room
{% endhint %}

### Send Scheduled Message Now

You may also send a previously created scheduled message immediately to the recipient.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

// Send a scheduled message immediately
[[TAPCoreMessageManager sharedManager] sendScheduledMessageNow:SCHEDULED_MESSAGE_ID
                                                        roomID:ROOM_ID
success:^(NSArray<NSNumber *> * _Nonnull sentIDs) {
    // Successfully sent scheduled message
}
failure:^(NSError * _Nonnull error) {
    
}];

// Send multiple scheduled messages immediately
[[TAPCoreMessageManager sharedManager] sendScheduledMessagesNow:SCHEDULED_MESSAGE_IDS
                                                         roomID:ROOM_ID
success:^(NSArray<NSNumber *> * _Nonnull sentIDs) {
    // Successfully sent scheduled messages
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`SCHEDULED_MESSAGE_ID`**: (NSNumber) ID of the previously created scheduled message\
\&#xNAN;**`SCHEDULED_MESSAGE_IDS`**: (NSArray\<NSNumber>) array of scheduled message IDs\
\&#xNAN;**`ROOM_ID`**: (NSString) ID of the destination chat room
{% endhint %}

### Edit Scheduled Message Time

To change the deliver time of a previously created scheduled message, use the **`editScheduledMessageTime:`** method from **TAPCoreMessageManager**.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] editScheduledMessageTime:SCHEDULED_MESSAGE_ID 
                                                  scheduledTime:TIMESTAMP
success:^(BOOL isEditTimeSuccess) {
    // Successfully edited scheduled message
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`SCHEDULED_MESSAGE_ID`**: (NSNumber) ID of the previously created scheduled message\
\&#xNAN;**`TIMESTAMP`**: (NSNumber) time when the message will be delivered to the destination room (long value)
{% endhint %}

### Edit Scheduled Message Content

You may also update the contents of a scheduled message that was previously created before it is delivered to the recipient.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] editScheduledMessageContent:SCHEDULED_MESSAGE_ID
                                                    updatedMessage:MESSAGE
success:^(BOOL isEditContentSuccess) {
    // Successfully edited scheduled message
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`SCHEDULED_MESSAGE_ID`**: (NSNumber) ID of the previously created scheduled message\
\&#xNAN;**`MESSAGE`**: (TAPMessageModel) message model with updated values
{% endhint %}

### Delete Scheduled Message

To cancel sending a scheduled message that has not been delivered, you can delete it using **`deleteScheduledMessage`** method.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] deleteScheduledMessage:SCHEDULED_MESSAGE_ID
                                                       roomID:ROOM_ID
success:^(NSArray<NSNumber *> * _Nonnull deletedIDs) {
    // Successfully deleted scheduled message
}
failure:^(NSError * _Nonnull error) {
    
}];

[[TAPCoreMessageManager sharedManager] deleteScheduledMessages:SCHEDULED_MESSAGE_IDS
                                                        roomID:ROOM_ID
success:^(NSArray<NSNumber *> * _Nonnull deletedIDs) {
    // Successfully deleted scheduled messages
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`SCHEDULED_MESSAGE_ID`**: (NSNumber) ID of the previously created scheduled message\
\&#xNAN;**`SCHEDULED_MESSAGE_IDS`**: (NSArray\<NSNumber>) array of scheduled message IDs\
\&#xNAN;**`ROOM_ID`**: (NSString) ID of the destination chat room
{% endhint %}

### Get Message Details

You can retrieve info about a message's recipients that has read or received the message.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getMessageDetails:MESSAGE_ID
success:^(TAPMessageModel *message, NSArray<TapMessageRecipientModel *> *deliveredTo, NSArray<TapMessageRecipientModel *> *readBy) {
    // Successfully retrieved message info
    // message: the message model
    // deliveredTo: list of recipients that has received the message
    // readBy: list of recipients that has read the message
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_ID`**: (String) unique server ID from the message
{% endhint %}

### Get Message Total Read Count

You can also retrieve a message's total read count from a non-personal room.

{% tabs %}
{% tab title="Objective-C" %}

```csharp
#import <TapTalk/TAPCoreMessageManager.h>

[[TAPCoreMessageManager sharedManager] getMessageTotalRead:MESSAGE_ID
success:^(NSInteger readCount) {
    // Successfully retrieved message read count
}
failure:^(NSError * _Nonnull error) {
    
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**Parameters**\
\&#xNAN;**`MESSAGE_ID`**: (String) unique server ID from the message
{% endhint %}
