メッセージ

Prev Next

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は指定されたメッセージの未読のユーザー数を示します。

この機能を通じてチャンネル内で特定メッセージをどれくらい多くのユーザーが未読しているか簡単に把握できます。