Classic/VPC環境で利用できます。
メッセージ
Ncloud Chatが提供するメッセージ機能は、ユーザー間の効果的なコミュニケーションをサポートする様々なサービスを含みます。このプラットフォームは、個人的な会話だけでなくグループでの会話にも適しており、メッセージの送受信を簡単かつ迅速に行うことができます。以下は Ncloud Chatの主なメッセージ機能とその特徴です。
1. 即時メッセージング
- リアルタイムコミュニケーション : ユーザーはリアルタイムでメッセージを送受信でき、コミュニケーションの遅延を最小限に抑えます。
- マルチデバイス対応 : ユーザーはスマートフォン、タブレット、PCなど様々なデバイスでメッセージを送受信できます。
2. グループチャット
- 複数の参加者 : ユーザーは複数の人が参加するグループチャットを作成して情報を共有し、チーム内のコミュニケーションを容易にすることができます。
- チャンネル管理 : 管理者はグループチャットを介してメンバーを追加したり削除し、グループの設定を調整できます。
3. ファイル共有
- 様々なファイル形式をサポート : テキスト、画像、動画、文書など様々な形式のファイルをチャットで簡単に共有できます。
- 安全なファイル保存 : Ncloud Chatはお客様所有の Object Storage内にファイルを保存管理するため、外部への情報流出を防ぎます。
4. メッセージ検索
- キーワード検索 : チャット内で特定のキーワードを使って過去の会話内容を検索できます。
- 高度なフィルタオプション : 日付、参加者、ファイルタイプなど様々なフィルタを適用して、目的のメッセージを素早く検索できます。
5. 通知とその調整
- プッシュ通知 : 新しいメッセージや重要なアップデートがあるときにユーザーに通知を送信し、情報の漏れを防ぎます。
- 通知設定 : ユーザーは通知の種類と頻度を調整でき、希望する方法で情報を受け取ることができます。
6. セキュリティと個人情報保護
- データ暗号化 : すべてのメッセージは送信と保存の過程で暗号化され、外部からのデータ漏洩を防止します。
- 個人情報保護 : ユーザーの個人情報や会話内容は厳重に保護され、ユーザーの同意なしに第三者に開示されることはありません。
Ncloud Chatのメッセージ機能はユーザーのコミュニケーションを円滑かつ効率的にし、仕事や日常生活において重要な役割を果たします。これらの機能によりユーザーはより簡単にコミュニケーションできるようになり、チームワークの強化に大きく貢献します。
メッセージ転送
チャンネルを作成して登録したら、以下のように呼び出して新しいメッセージを転送します。
Javascript/Typescript
const message = 'Hello !!!';
await nc.sendMessage([CHANNEL_ID], {
type: "text",
message: message
});
// 特定ユーザーをメンションするためのメンションを使用する場合
await nc.sendMessage(CHANNEL_ID, {
type: "text",
mentions: [USER_ID, USER_ID]
message: message
});
// メンションを送る他の方法として、メッセージ内に「@[ID]」のように入力すると、自動的にメンションに保存される。
// メッセージにコメントを送る場合
await nc.sendMessage(CHANNEL_ID, {
type: "text",
parent_message_id: MESSAGE_ID
message: message
});
// 新規メッセージから下記のように parent_messageに親メッセージの内容を補強して送ります。
{
"id": "message_id",
"text": "Message",
"parent_message_id": "first_message_id",
"parent_message": {
"id": "message_id",
"text": "message_name",
"sender" : {
"id" : "Sender",
"name" : "Sender Nickname",
"profile" : "profile url",
}
}
}
Android(Kotlin)
NChat.sendMessage([CHANNEL_ID], messageText) { message, e ->
if (e != null) {
// エラー
} else {
// 成功
}
}
iOS(Swift)
NChat.sendMessage(channelId: [CHANNEL_ID], message: messageText) { result in
switch(result)
{
case .success(let message) :
// 成功
break;
case .failure(let error) :
// 失敗
break;
}
}
iOS(Objective-C)
[NChatBridge.shared sendMessageWithChannelId:[CHANNEL _ID] message:[MESSAGE] type:@"TEXT" parentMessageId:@"" translate:NO :^(NSDictionary * _ Nullable result, NSError * _Nullable error) {
if (error) {
// エラー処理
} else {
// 成功処理
}
}];
Unity
const message = 'Hello !!!';
await nc.sendMessage(
channelId: CHANNEL_ID,
type:"text",
content: message
);
// メッセージにコメントを送る場合
await nc.sendMessage(
channelId: CHANNEL_ID,
type:"text",
content: message,
parentMessageId: [MESSAGE_ID]
);
// メッセージに自動翻訳をする場合
await nc.sendMessage(
channelId: CHANNEL_ID,
type:"text",
content: message,
translate: true
);
// 新規メッセージから下記のように parent_messageに親メッセージの内容を補強して送ります。
{
"id": "message_id",
"text": "Message",
"parent _message_ id": "first _message_ id",
"parent_message": {
"id": "message_id",
"text": "message_name",
"sender" : {
"id" : "Sender",
"name" : "Sender Nickname",
"profile" : "profile url"
}
}
}
messageは JSON形式で送信/受信すると、様々なユーザー定義の値を使用できます。
Javascript/Typescript
const message = {
{ "text", "Text" },
{ "state", 1 },
{ "desc" , "Desc" }
};
// メッセージを文字列に変換します。
const jsonString = JSON.stringify(message);
// 受信したメッセージを Arrayに変換します。
const messageArray = JSON.parse(jsonString);
Unity
Hashtable messageArray = new Hashtable
{
{ "channel_id", "channelId" },
{ "state", 1 },
{ "desc" , "Desc" }
};
// メッセージをプレーンテキストに変換します。
const jsonString = JsonConvert.SerializeObject(messageArray);
// 受信したメッセージを Arrayに変換します。
Hashtable hashtable = JsonConvert.DeserializeObject<Hashtable>(jsonString);
| ID | Type | Description |
|---|---|---|
| CHANNEL_ID | string | チャンネル ID |
| type | string | 送信するメッセージの種類(text、image) |
| MESSAGE | string | 送信メッセージのテキスト、JSON Stringを活用すると、様々な用途で使用可能 |
| MENTIONS | array | メンションするユーザー ID |
- Express Messageを使用する: 高速でメッセージを送信するための関数です。時間がかかる可能性のある部分をすべてスキップし、従来より10倍速くメッセージを送信できます。一般 sendMessageとの違いは、次の通りです。
| Function | Description | フィルタリング | ブロック | 翻訳 |
|---|---|---|---|---|
| sendMessage | 一般メッセージの送信 | O | O | O |
| sendExpressMessage | クイックメッセージの送信 | X | X | X |
ゲーム内でリアルタイム PvPを制作したり、高速の Broadcastingが必要なすべてのサービスに利用できます。
ファイルアップロード
- 特定チャンネルにファイルを送信できます。
- ダッシュボード > 設定 > セキュリティ > 許可されたファイルタイプのみアップロードできます。
Javascript/Typescript
await nc.sendFile([CHANNEL_ID], file);
Android (Kotlin)
import android.app.Activity
import android.content.Intent
import android.net.Uri
...
private val PICK _FILE_ REQUEST_CODE = 1009
fun fileUpload() {
val intent = Intent(Intent.ACTION _GET_ CONTENT)
intent.type = " */* "
startActivityForResult(intent, PICK _FILE_ REQUEST_CODE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PICK _FILE_ REQUEST _CODE && resultCode == Activity.RESULT_ OK) {
val fileUri: Uri? = data?.data
fileUri?.let {
// 選択したファイル URIを使用してファイルをアップロード
NChat.sendFile(this, [CHANNEL_ID], it) { response,e ->
if (e != null) {
// エラー
} else {
// 成功
}
}
}
}
}
iOS (Swift)
ファイルアップロード機能を使用するために、下記の例のように DocumentPickerを追加します。
import SwiftUI
import UniformTypeIdentifiers
struct DocumentPicker: UIViewControllerRepresentable {
class Coordinator: NSObject, UIDocumentPickerDelegate {
var parent: DocumentPicker
init(parent: DocumentPicker) {
self.parent = parent
}
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
guard let selectedFileURL = urls.first, selectedFileURL.startAccessingSecurityScopedResource() else { return }
parent.selectedFileURL = selectedFileURL
parent.isPresented = false
}
}
@Binding var selectedFileURL: URL?
@Binding var isPresented: Bool
func makeCoordinator() -> Coordinator {
return Coordinator(parent: self)
}
func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
let picker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.item])
picker.delegate = context.coordinator
return picker
}
func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: Context) {
}
}
View内のファイルアップロード機能を以下の例のように実装します。
@State private var selectedFileURL: URL?
@State private var isDocumentPickerPresented = false
if let selectedFileURL = selectedFileURL {
Text("選択したファイル: \(selectedFileURL.lastPathComponent)")
Button(action: {
NChat.sendFile(channelId: channelId, fileUrl: selectedFileURL) { result in
switch(result) {
case .success(let result):
// 成功
case .failure(let error):
// 失敗
}
}
}) {
Text("ファイルアップロード")
}
} else {
Text("ファイルを選択してください")
}
// ファイルのアップロード完了後に呼び出します。
selectedFileURL?.stopAccessingSecurityScopedResource()
var body: some View {
VStack {
Button(action: {
isDocumentPickerPresented = true
}) {
Text("ファイル選択")
}
.sheet(isPresented: $isDocumentPickerPresented) {
DocumentPicker(selectedFileURL: $selectedFileURL, isPresented: $isDocumentPickerPresented)
}
- ファイル以外の画像アップロードを実装したい場合は、UIImagePickerControllerを使用します。
- 画像アップロードのために、Targets > Info > Custom iOS Target Properties内の Privacy - Photo Library Usage Descriptionを定義します。
iOS(Objective-C)
ファイルアップロード機能を使用するには、UIImagePickerControllerまたは UIDocumentPickerViewControllerの実装後、fileUrlを介してファイルをアップロードします。
NSURL *fileUrl = [NSURL URLWithString:[FILEURL]];
if (fileUrl) {
[NChatBridge.shared sendFileWithChannelId:channelId fileUrl:fileUrl :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
[self inAppLog:[NSString stringWithFormat:@"Send File Error: %@", error.localizedDescription]];
} else {
[self inAppLog:[NSString stringWithFormat:@"Send File succeeded with result: %@", result]];
}
[self.tableView reloadData];
}];
}
Unity
await nc.sendFile([CHANNEL_ID],file);
| ID | Type | Description |
|---|---|---|
| CHANNEL_ID | string | チャンネル ID |
| file | string | ファイル情報 |
- オブジェクトストレージが有効になっている必要があります。
- Object Storage サービスと連携すると使用できます。
- アップロード時にダッシュボードのプロジェクト設定 > セキュリティ設定でアップロードタイプと容量などを設定します。
- サポートファイルタイプ: 画像、動画、ドキュメント、圧縮などの一般的なタイプをすべてサポートし、追加でサポートが必要な拡張子は、お問い合わせからご連絡いただければ、セキュリティ検討後に追加いたします。
- ファイルリンクを利用する場合、Endpointアドレスは https://apps.ncloudchat.naverncp.comです。
例) https://apps.ncloudchat.naverncp.com/archive/[archiveId]
メッセージ情報
- Message Data Class
| ID | Type | Description |
|---|---|---|
| id | string | メッセージ送信 ID(unique) |
| message_id | string | メッセージ ID |
| sort_id | string | メッセージソートのための識別子 |
| message_type | string | メッセージ種類 |
| sender.id | string | 送信したユーザー ID |
| sender.name | string | 送信したユーザー名 |
| sender.profile | string | 送信したユーザーのプロファイル画像 |
| attachment_filenames | string | 添付ファイル |
| parent_message_id | string | コメントメッセージ ID |
| parent_message | Message | コメントメッセージ |
| isExpress | boolean | クイックメッセージの有無 |
| metions | string | メンションされたリスト |
| content | string | メッセージの内容 |
| sended_at | string | 送信日 |
| created_at | string | 作成日 |
個別メッセージ情報
個別メッセージに関する情報を取得できます。
Javascript/Typescript
var message = await nc.getMessage(channel _id, message_ id);
Android (Kotlin)
NChat.getMessage([MESSAGE_ID]) { message, e -> {
if (e != null) {
// エラー
} else {
// 成功
}
}
iOS (Swift)
NChat.getMessage(channelId: [CHANNEL _ID], messageId: [MESSAGE_ ID]) { result in
switch(result)
{
case .success(let message) :
// 成功
break;
case .failure(let error) :
// 失敗
break;
}
}
iOS(Objective-C)
[NChatBridge.shared getMessageWithChannelId:[CHANNEL _ID] messageId:[MESSAGE_ ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// エラー処理
} else {
// 成功処理
}
}];
Unity
NBaseSDK.Message message = await nc.getMessage([CHANNEL _ID], [MESSAGE_ ID]);
全体メッセージ情報
全体メッセージ情報を取得できます。
- MessageData data class
| ID | Type | Description |
|---|---|---|
| totalCount | Int | メッセージの総数 |
| messages | Message | メッセージのデータリスト |
Javascript/Typescript
const filter = { channel_id: channelId };
const sort = { created_at: -1 };
const option = { offset: 0, per_page: 100 };
const messages = nc.getMessages(filter, sort, option);
Android (Kotlin)
- フィルタ設定
val filter: Map<String, Any?> = mapOf(
"channel _id" to [CHANNEL_ ID],
)
- ソート設定
val sort: Map<String, Any?> = mapOf(
"created_at" to -1
)
- オプション設定
val options: Map<String, Any?> = mapOf(
"per_page" to 10,
"offset" to 0
)
NChat.getMessages(filter, sort, options) { data, e ->
if (e != null) {
// エラー
} else {
// 成功
}
}
iOS (Swift)
let filter: [String: Any] = ["channel _id": [CHANNEL_ ID]]
let option: [String: Any] = ["per_page": 10, "offset": 0]
let sort: [String: Any] = ["created_at": "-1"]
NChat.getMessages(filter: filter, option: option, sort: sort) { result in
switch(result)
{
case .success(let messagesData) :
// 成功
break;
case .failure(let error) :
// 失敗
break;
}
}
iOS(Objective-C)
NSMutableDictionary *filter = [NSMutableDictionary dictionary];
NSMutableDictionary *option = [NSMutableDictionary dictionary];
NSMutableDictionary *sort = [NSMutableDictionary dictionary];
filter[@"channel _id"] = @"[CHANNEL_ ID]";
[NChatBridge.shared getMessagesWithChannelId:[CHANNEL _ID] filter:filter option:option sort:sort :^(NSDictionary * _ Nullable result, NSError * _Nullable error) {
if (error) {
// エラー処理
} else {
// 成功処理
}
}];
Unity
Hashtable filter = new Hashtable
{
{ "channel _id", [CHANNEL_ ID] }
};
Hashtable sort = new Hashtable
{
{ "sort_id", -1 }
};
Hashtable option = new Hashtable
{
{ "offset", 0 },
{ "per_page", 10 }
};
var messages = await nc.getMessages(filter, sort, option);
if (messages != null)
{
foreach (var message in messages.edges)
{
string id = message.Node.message_id.ToString();
Console.WriteLine("[CloudChatSample] id={0}", id);
}
}
- Parameters
| ID | Type | Description | Required |
|---|---|---|---|
| filter | object | クエリをフィルタ。すべてのフィールドに対して検索可能 | O |
| sort | object | ソートしたいフィールドのフィルタを定義 | X |
| option | object | オプションが存在する場合、以下を参照 | X |
- Filter
| ID | Type | Description |
|---|---|---|
| message_id | String | メッセージ ID |
| channel_id | String | チャンネル ID |
| sort_id | String | ソート ID |
| message_type | String | メッセージタイプ |
| embedProviders | String | エンベッドのプロバイダ |
| isExpress | Boolean | クイックメッセージの有無 |
| bytes | Int | メッセージのバイトサイズ |
| content | String | メッセージの内容 |
| sended_at | String | メッセージの送信時間 |
| created_at | String | メッセージの作成時間 |
- Sort
| ID | Type | Description |
|---|---|---|
| created_at | number | 作成日(昇順「1」、降順「-1」) |
- Options
| ID | Type | Description |
|---|---|---|
| offset | number | 開始 offset |
| per_page | number | リターン数(最大100個) |
未読メッセージ
未読メッセージ数をリターンします。最初に markReadから最後に読んだメッセージ情報を転送します。
Javascript/Typescript
nc.markRead(channelId, {
user_id: message.sender.id,
message _id: message.message_ id,
sort _id: message.sort_ id
});
const unread = await nc.unreadCount([CHANNEL_ID]);
Android (Kotlin)
NChat.unreadCount([CHANNEL_ID]) { data, e ->
if (e != null) {
// エラー
} else {
// 成功
}
}
iOS (Swift)
NChat.unreadCount(channelId: [CHANNEL_ID]) { result in
switch(result)
{
case .success(let mark) :
// 成功
break;
case .failure(let error) :
// 失敗
break;
}
}
Unity
nc.markRead([CHANNEL_ID], new NBaseSDK.MarkInput
{
user _id = USER_ ID,
message _id = MESSAGE_ ID,
sort _id = SORT_ ID
});
// マークした以降の未読メッセージの総数をリターンします。
var unread = nc.unreadCount([CHANNEL_ID]);
| ID | Type | Description |
|---|---|---|
| USER_ID | string | メッセージに含まれた user_idを入力 |
| MESSAGE_ID | string | メッセージに含まれた message_idを入力 |
| SORT_ID | string | メッセージに含まれた sort_idを入力 |
メッセージ削除
当該チャンネル内に自分が送ったメッセージを削除できます。
Javascript/Typescript
await nc.deleteMessage([CHANNEL _ID], [MESSAGE_ ID]);
Android (Kotlin)
NChat.deleteMessage([CHANNEL _ID], [MESSAGE_ ID]) { data, e ->
if (e != null) {
// エラー
} else {
// 成功
}
}
iOS (Swift)
NChat.deleteMessage(channelId: [CHANNEL _ID], messageId: [MESSAGE_ ID]) { result in
switch(result)
{
case .success(let message) :
// 成功
break;
case .failure(let error) :
// 失敗
break;
}
}
iOS(Objective-C)
[NChatBridge.shared deleteMessageWithChannelId:[CHANNEL _ID] messageId:[MESSAGE_ ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// エラー処理
} else {
// 成功処理
}
}];
Unity
await nc.deleteMessage([CHANNEL _ID], [MESSAGE_ ID]);
- Parameters
| ID | Type | Description |
|---|---|---|
| CHANNEL_ID | string | チャンネル ID |
| MESSAGE_ID | string | メッセージ ID |
特定メッセージの未読のユーザー数
チャンネルに参加したユーザーリストから未読ユーザーリストを除外し、残りのユーザーは未読ユーザーとみなします。
Javascript/Typescript
await nc.getMessageReadCount([CHANNEL _ID], [MESSAGE_ ID]);
- Parameters
| ID | Type | Description |
|---|---|---|
| CHANNEL_ID | string | チャンネル ID |
| MESSAGE_ID | string | メッセージ ID |
特定メッセージの未読のユーザー数
このメソッドは指定されたチャンネル内で特定メッセージの未読のユーザー数を返します。
Javascript/Typescript
await nc.getMessageUnreadCount(CHANNEL _ID, MESSAGE_ ID);
- Parameters
| Parameter | Type | Description |
|---|---|---|
| CHANNEL_ID | string | チャンネルの固有 IDです。この値で特定チャンネルを指定します。 |
| MESSAGE_ID | string | メッセージの固有 IDです。未読のユーザー数を照会したいメッセージを指定します。 |
- Returns
getMessageUnreadCountメソッドは、以下のような形式のオブジェクトを返します。
{
"totalCount": 34,
"count": 34
}
| Parameter | Type | Description |
|---|---|---|
| totalCount | number | 指定されたチャンネルに参加したユーザーの総数を示します。 |
| count | number | 指定されたメッセージの未読のユーザー数を示します。 |
- 使用例
const result = await nc.getMessageUnreadCount("123456789", "987654321");
console.log(result.totalCount); // 例: チャンネルに参加したユーザーの総数: 34
console.log(result.count); // 例: メッセージの未読のユーザー数: 10
上記のユースケースではチャンネル IDが「123456789」であり、メッセージ IDが「987654321」の特定メッセージに対して、そのメッセージの未読のユーザー数を照会しています。result.totalCountはチャンネルに属しているユーザーの総数を示し、 result.countは指定されたメッセージの未読のユーザー数を示します。
この機能を通じてチャンネル内で特定メッセージをどれくらい多くのユーザーが未読しているか簡単に把握できます。