Classic/VPC 환경에서 이용 가능합니다.
채널
Ncloud Chat에서 채널은 사용자들이 그룹으로 소통할 수 있는 가상의 공간입니다. 채널을 통해 사용자는 특정 주제나 목적에 맞게 정보를 공유하고, 팀워크를 강화하며, 커뮤니케이션을 조직화할 수 있습니다. 채널은 업무 효율을 높이고, 특정 그룹 내 커뮤니케이션을 중앙집중화하여 관리할 수 있는 유용한 도구입니다. 아래는 Ncloud Chat의 채널 기능에 대한 자세한 설명입니다.
채널의 주요 기능
- 그룹 커뮤니케이션: 채널을 생성하여 특정 그룹의 멤버들과 소통할 수 있습니다. 이는 프로젝트 팀, 부서, 클럽 등 다양한 형태의 그룹에 적합합니다.
- 메시지 및 파일 공유: 채널 내에서는 텍스트 메시지, 이미지, 동영상, 문서 등 다양한 형태의 파일을 쉽게 공유할 수 있습니다.
- 실시간 업데이트: 채널 내의 모든 활동은 실시간으로 업데이트되어, 모든 참여자가 최신의 정보를 접할 수 있습니다.
- 관리자 제어: 채널의 생성자 또는 관리자는 채널 설정을 변경하거나 사용자를 추가/제거할 권한을 가집니다.
- 통화 및 화상회의 기능: 일부 채널에서는 음성 통화나 화상 회의를 지원하여, 멤버 간의 대화를 더욱 효과적으로 할 수 있습니다.
- 알림 설정: 사용자는 채널별로 알림을 설정하여 중요한 메시지를 놓치지 않도록 할 수 있습니다.
- 검색 기능: 채널 내의 대화나 파일을 쉽게 검색할 수 있어, 필요한 정보를 빠르게 찾을 수 있습니다.
채널 관리
- 채널 생성: 사용자는 목적에 맞는 채널을 새로 생성할 수 있으며, 채널명, 설명, 멤버 등의 정보를 설정할 수 있습니다.
- 채널 초대: 채널의 관리자는 다른 사용자를 채널에 초대할 수 있습니다. 초대받은 사용자는 초대를 수락하거나 거절할 수 있습니다.
- 멤버 관리: 관리자는 채널 멤버의 권한을 설정하거나 멤버를 채널에서 제거할 수 있습니다.
보안
- 데이터 보안: 채널 내의 모든 데이터는 암호화되어 전송되며, 서버에 안전하게 저장됩니다.
- 개인 정보 보호: 채널 내에서 공유되는 정보는 채널 멤버들 사이에서만 접근 가능하며, 외부에 유출되지 않도록 보호됩니다.
Ncloud Chat의 채널 기능을 활용하면 조직 내 또는 개인적인 소통을 원활하게 하고, 정보를 효과적으로 관리할 수 있습니다. 이러한 특성은 특히 대규모 조직이나 다양한 프로젝트를 관리할 때 매우 유용합니다.
채널 생성
모든 대화는 채널을 생성해야 하며 채널에 참여해야 정상적으로 채팅을 할 수 있습니다. 아래는 채널을 생성하고 구독하는 방법을 안내합니다.
Javascript/Typescript
await nc.createChannel({
type: [TYPE],
name: [NAME],
customField: [CUSTOM_FIELD]
});
| ID |
Type |
Description |
Required |
| NAME |
string |
채널 이름 |
O |
| TYPE |
string |
채널 종류 ( PUBLIC or PRIVATE ) |
O |
| CUSTOM_FIELD |
string |
사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 |
X |
Android (Kotlin)
NChat.createChannel([TYPE], [NAME], [CUSTOM_FIELD]) { result, e ->
if (e != null) {
// 실패
} else {
// 성공
}
}
| ID |
Type |
Description |
Required |
| NAME |
String |
채널 이름 |
O |
| TYPE |
String |
채널 종류 ( PUBLIC or PRIVATE ) |
O |
| CUSTOM_FIELD |
String |
사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 |
X |
iOS (Swift)
NChat.createChannel(NCChannel(
name: [NAME],
type: [.publicChannel or .privateChannel]),
customField: [CUSTOM_FIELD])) { result in
switch(result)
{
case .success(let status) :
// 성공
break
case .failure(let error) :
// 오류
break
}
}
| ID |
Type |
Description |
Required |
| NAME |
String |
채널 이름 |
O |
| TYPE |
String |
채널 종류 ( PUBLIC or PRIVATE ) |
O |
| CUSTOM_FIELD |
String |
사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 |
X |
iOS (Objective-C)
NSDictionary *channelDict = @{
@"name": [NAME],
@"type": [TYPE],
@"customField": [CUSTOM_FIELD]
};
[NChatBridge.shared createChannelWithChannel:channelDict :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
| ID |
Type |
Description |
Required |
| NAME |
NSString* |
채널 이름 |
O |
| TYPE |
NSString* |
채널 종류 ( PUBLIC or PRIVATE ) |
O |
| CUSTOM_FIELD |
NSString* |
사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 |
X |
Unity
await nc.createChannel(new NBaseSDK.Channel
{
name = [NAME],
type = [TYPE], // PUBLIC or PRIVATE
customField = [CUSTOM_FIELD]
});
| ID |
Type |
Description |
Required |
| NAME |
string |
채널 이름 |
O |
| TYPE |
string |
채널 종류 ( PUBLIC or PRIVATE ) |
O |
| UniqueID |
string |
고유한 ID |
X |
| push |
boolean |
푸시 알림 여부 |
X |
| linkUrl |
string |
링크 여부 |
X |
| imageUrl |
string |
링크 여부 |
X |
| integrationId |
string |
연동 기능 (번역, 보이스 등) |
X |
| disabled |
string |
채널 사용여부 |
X |
| members |
array |
PRIVATE 일 경우 참여 가능한 아이디 |
X |
| CustomField |
string |
사용자 정의 필드, JSON String으로 넣으면 다양하게 활용 가능 |
X |
참고
- 보안을 위해서 클라이언트에서 채널을 생성하는 것보다는 서버를 통한 채널을 생성을 추천해 드립니다.
채널 구독
원하는 채널에 가입(방 참여)합니다. 참여된 채널에는 구독 해제할 때까지 재접속 시에도 자동으로 참여하게 됩니다.
Javascript/Typescript
await nc.subscribe([CHANNEL_ID], {"language":"en"});
| ID |
Type |
Description |
Required |
| CHANNEL_ID |
string |
채널 ID |
O |
| language |
string |
언어 코드 |
X |
Android (Kotlin)
val options: Map<String, Any?> = mapOf(
"language" to "en",
)
NChat.subscribe([CHANNEL_ID], options) { data, e ->
if (e != null) {
//오류
} else {
// 성공
}
}
| ID |
Type |
Description |
Required |
| CHANNEL_ID |
String |
채널 ID |
O |
| language |
String |
언어 코드 |
X |
iOS (Swift)
let options: [String: Any] = ["language": "en"]
NChat.subscribe(channelId: [CHANNEL_ID], options: [OPTION]) {
result in
switch(result)
{
case .success(let subscription) :
// 성공
break;
case .failure(let error) :
// 오류
break;
}
}
iOS (Objective-C)
[NChatBridge.shared subscribeWithChannelId:[CHANNEL_ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
Hashtable option = new Hashtable
{
{ "language", "en" } // 자동 번역시 필요한 옵션 이외에도 다양한 옵션 추가 가능합니다.
};
await nc.subscribe([CHANNEL_ID], option);
채널 구독 해제
해당 채널에 대한 가입을 해지합니다. 해당 채널에서 더 이상 메시지를 받을 수 없습니다.
Javascript/Typescript
await nc.unsubscribe([CHANNEL_ID]);
Android (Kotlin)
NChat.unsubscribe([CHANNEL_ID]) { data, e ->
if (e != null) {
//오류
} else {
// 성공
}
}
iOS (Swift)
NChat.unsubscribe(channelId: [CHANNEL_ID]) {
result in
switch(result)
{
case .success(let subscription) :
// 성공
break;
case .failure(let error) :
// 오류
break;
}
}
iOS (Objective-C)
[NChatBridge.shared unsubscribeWithChannelId:[CHANNEL_ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
await nc.unsubscribe([CHANNEL_ID]);
참여자 리스트
(특정 채널에 대해) 참여자 리스트를 가져올 수 있습니다.
Javascript/Typescript
const filter = { channel_id: [CHANNEL_ID] };
const sort = { created_at: -1 };
const option = { offset: 0, per_page: 100 };
const subscriptions = await nc.getSubscriptions(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.getSubscriptions(filter, sort, options) { subscriptions, 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.getSubscriptions(filter: filter, option: option, sort: sort) { result in
switch(result)
{
case .success(let subscriptions) :
// 성공
break;
case .failure(let error) :
// 오류
break;
}
}
iOS (Objective-C)
[NChatBridge.shared getSubscriptionsWithCompletion:^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
Hashtable filter = new Hashtable
{
{ "channel_id", channelId }
};
Hashtable sort = new Hashtable
{
{ "created_at", -1 }
};
Hashtable option = new Hashtable
{
{ "offset", 0 },
{ "per_page", 10 }
};
var subscriptions = await nc.getSubscriptions(filter, sort, option);
foreach (var subscription in subscriptions.edges)
{
string id = subscription.node.id.ToString();
Console.WriteLine("[CloudChatSample] id={0}", id);
}
| ID |
Type |
Description |
| filter |
object |
쿼리를 필터 모든 필드에 대해서 검색 가능 |
| sort |
object |
소트하고자 하는 필드의 필터 정의 |
| option |
object |
옵션이 존재할 경우 아래 참고 |
| ID |
Type |
Description |
| project_id |
String |
프로젝트 ID |
| channel_id |
String |
채널 ID |
| user_id |
String |
사용자 ID |
| language |
String |
언어 |
| uniquekey |
String |
유니크 키 |
| online |
Boolean |
온라인 상태 |
| push |
Boolean |
푸시 알림 사용 여부 |
| created_at |
String |
생성 날짜 |
| updated_at |
String |
갱신 날짜 |
| ID |
Type |
Description |
| created_at |
number |
생성 날짜 (오름차순 "1", 내림차순 "-1") |
| ID |
Type |
Description |
| offset |
number |
시작 offset |
| per_page |
number |
리턴하는 개수(최대 100개) |
응용편
특정 채널에 온라인 접속 상태인 접속자 목록만 가져오려면 filter에 online을 true로 추가해 주십시오.
Unity
Hashtable filter = new Hashtable
{
{ "channel_id", [CHANNEL_ID] },
{ "online" , true}
};
Hashtable sort = new Hashtable
{
{ "created_at", -1 }
};
Hashtable option = new Hashtable
{
{ "offset", 0 },
{ "per_page", 10 }
};
var subscriptions = await nc.getSubscriptions(filter, sort, option);
채널 구독
| ID |
Type |
Description |
| id |
string |
유니크 아이디 |
| channel_id |
string |
채널 아이디 |
| user_id |
string |
유저 고유 아이디 |
| created_at |
string |
생성 일자 |
| online |
boolean |
온라인 여부 |
| push |
boolean |
푸시 참여 여부 |
| language |
string |
접속 언어 |
| channel |
string |
채널 정보 |
| mark.user_id |
string |
마지막 메시지 보낸 사용자 |
| mark.message_id |
string |
마지막 메시지 아이디 |
| mark.sort_id |
string |
마지막 메시지 정렬 ID |
| mark.unread |
string |
마지막 메시지 이후 안읽은 메시지 갯수 |
채널 정보
| ID |
Type |
Description |
| totalCount |
Int |
전체 채널 수 |
| channels |
Channel |
채널 데이터 리스트 |
| ID |
Type |
Description |
| id |
string |
채널 아이디 (unique) |
| project_id |
string |
프로젝트 아이디 |
| name |
string |
채널 이름 |
| user_id |
string |
(채널을 생성한) 사용자 아이디 |
| user |
User |
(채널을 생성한) 사용자 정보 |
| unique_id |
string |
개발사에서 설정 가능한 채널 아이디 (unique) |
| type |
string |
채널 종류 ( PUBLIC or PRIVATE ) |
| members |
string |
참여된 사용자 목록 |
| push |
boolean |
푸시 메시지 지원 여부 |
| disabled |
boolean |
채널 상태 |
| customField |
string |
사용자 정의 데이터 |
| subscribed |
boolean |
호출 유저에 대한 채널 구독 여부 |
| unread |
int |
안읽은 메시지 수 |
| created_at |
string |
생성 일자 |
| updated_at |
string |
갱신 일자 |
| last_message |
Message |
마지막 메시지 정보 |
채널 데이터 가져오기
프로젝트의 채널 데이터를 목록 형태로 가져오려면 아래 코드를 사용해 주십시오.
Javascript/Typescript
const filter = { state: true };
const sort = { created_at: -1 };
const option = { offset: 0, per_page: 100 };
const channels = await nc.getChannels(filter, sort, option);
Android (Kotlin)
val filter: Map<String, Any?> = mapOf(
"state" to true
)
val sort: Map<String, Any?> = mapOf(
"created_at" to -1
)
val options: Map<String, Any?> = mapOf(
"per_page" to 10,
"offset" to 0
)
NChat.getChannels(filter, sort, options) { channelData, e ->
if (e != null) {
// 오류
} else {
// 성공
}
}
iOS (Swift)
let filter: [String: Any] = ["state": true]
let option: [String: Any] = ["per_page": 10, "offset": 0]
let sort: [String: Any] = ["created_at": "-1"]
NChat.getChannels(filter: filter, option: option, sort: sort) { result in
switch(result)
{
case .success(let channelData) :
// 성공
break;
case .failure(let error) :
// 실패
break;
}
}
iOS (Objective-C)
[NChatBridge.shared getChannelsWithFilter:@{} option:@{} sort:@{} :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
Hashtable filter = new Hashtable
{
{ "state", true }
};
Hashtable sort = new Hashtable
{
{ "created_at", -1 }
};
Hashtable option = new Hashtable
{
{ "offset", 0 },
{ "per_page", 10 }
};
var channels = await nc.getChannels(filter,sort,option);
foreach (var channel in channels.edges)
{
string id = channel.node.id.ToString();
Console.WriteLine("[CloudChatSample] id={0}", id);
}
| ID |
Type |
Description |
Required |
| filter |
object |
쿼리를 필터 모든 필드에 대해서 검색 가능 |
O |
| sort |
object |
소트하고자 하는 필드의 필터 정의 |
X |
| option |
object |
옵션이 존재할 경우 아래를 참고 |
X |
| ID |
Type |
Description |
| id |
String |
채널 ID |
| project_id |
String |
프로젝트 ID |
| name |
String |
채널 이름 |
| user_id |
String |
사용자 ID |
| unique_id |
String |
유니크 ID |
| type |
String |
채널 타입 |
| push |
Boolean |
푸시 알림 사용 여부 |
| disabled |
Boolean |
비활성화 여부 |
| customField |
String |
사용자 정의 필드 |
| link_url |
String |
링크 URL |
| image_url |
String |
이미지 URL |
| subscribed |
Boolean |
구독 여부 |
| unread |
Int |
읽지 않은 메시지 수 |
| created_at |
String |
생성 날짜 |
| updated_at |
String |
업데이트 날짜 |
| ID |
Type |
Description |
| created_at |
number |
생성 날짜 (오름차순 "1", 내림차순 "-1") |
| ID |
Type |
Description |
| offset |
number |
시작 offset |
| per_page |
number |
리턴하는 개수(최대 100개) |
개별 채널
- 개별 채널에 대한 정보를 가져올 수 있습니다.
Javascript/Typescript
const channel = await nc.getChannel(channelId);
Android (Kotlin)
NChat.getChannel([CHANNEL_ID]) { channel, e ->
if (e != null) {
// 오류
} else {
// 성공
}
}
iOS (Swift)
NChat.getChannel(channelId: [CHANNEL_ID]) { result in
switch(result)
{
case .success(let channel) :
// 성공
break;
case .failure(let error) :
// 실패
break;
}
}
iOS (Objective-C)
[NChatBridge.shared getChannelWithChannelId:[CHANNEL_ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
Channel channel = await nc.getChannel(id);
채널 내 사용자 초대
PRIVATE 채널의 경우 참여하고자 하는 사용자를 초대합니다.
Javascript/Typescript
const channel = await nc.addUsers(channelId, [userIds], {
message: "user joins",
});
Android (Kotlin)
val userIds = listOf("user1", "user2")
NChat.addUsers([CHANNEL_ID],userIds) { channel, e->
if (e != null) {
// 오류
} else {
// 성공
}
}
iOS (Swift)
let userIds = ["userId1", "userId2", "userId3"] // 예제 사용자 ID 배열
NChat.addUsers(channelId: [CHANNEL_ID], userIds: userIds) { result in
switch(result)
{
case .success(let channel) :
// 성공
break;
case .failure(let error) :
// 실패
break;
}
}
iOS (Objective-C)
[NChatBridge.shared addUsersWithChannelId:[CHANNEL_ID] userIds:@[[USER_ID]] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
await nc.addUsers(newChannelId, new string[] { "ID", "ID" });
채널 내 사용자 삭제
PRIVATE 채널의 경우 참여된 사용자를 삭제합니다.
Javascript/Typescript
const channel = await nc.removeUsers(channelId, [user_id], {
message: "user removed",
});
Android (Kotlin)
val userIds = listOf("user1", "user2")
NChat.removeUsers([CHANNEL_ID],userIds) { channel, e->
if (e != null) {
// 오류
} else {
// 성공
}
}
iOS (Swift)
let userIds = ["userId1", "userId2", "userId3"] // 예제 사용자 ID 배열
NChat.removeUsers(channelId: [CHANNEL_ID], userIds: userIds) { result in
switch(result)
{
case .success(let channel) :
// 성공
break;
case .failure(let error) :
// 실패
break;
}
}
iOS (Objective-C)
[NChatBridge.shared removeUsersWithChannelId:[CHANNEL_ID] userIds:@[[USER_ID]] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
await nc.removeUsers(channelId, new string[] { "ID", "ID" });
채널 내 사용자 차단
채널 내에 사용자를 차단합니다. 채널을 생성한 권한을 가지고 있는 유저나 전체 관리자만 사용이 가능합니다.
Javascript/Typescript
const subscribe = await nc.banUser(channelId, id, {
timeout: 60 * 60,
reason: "욕설로 차단되었습니다.",
});
Android (Kotlin)
val options: Map<String, Any?> = mapOf(
"timeout" to [종료시간(초)],
"reason" to "[차단사유]"
)
NChat.banUser([CHANNEL_ID], userId, options) { channel, e->
if (e != null) {
// 오류
} else {
// 성공
}
}
iOS (Swift)
let option: [String: Any] = ["timeout": [종료시간(초)], "reason": "[차단사유]"]
NChat.banUser(channelId: [CHANNEL_ID], userId: userId, options: options) { result in
switch(result)
{
case .success(let channel) :
// 성공
break;
case .failure(let error) :
// 실패
break;
}
}
iOS (Objective-C)
[NChatBridge.shared banUserWithChannelId:[CHANNEL_ID] userId:[USER_ID] options:@{@"timeout": [종료시간(초)], @"reason": [차단사유]} :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
Hashtable option = new Hashtable
{
{ "timeout", [종료시간(초)] },
{ "reason", [차단사유] }
};
await nc.banUser(channelId, userId, options);
| ID |
Type |
Description |
| timeout |
string |
차단 시간 (seconds) |
| reason |
string |
차단 사유 |
채널 내 사용자 차단 해제
채널 내에 차단한 사용자의 차단을 해제합니다. 채널을 생성한 권한을 가지고 있는 유저나 전체 관리자만 사용이 가능합니다.
Javascript/Typescript
const subscribe = await nc.unbanUser(channelId, id);
Android (Kotlin)
NChat.unbanUser([CHANNEL_ID],userId) { channel, e->
if (e != null) {
// 오류
} else {
// 성공
}
}
iOS (Swift)
NChat.unbanUser(channelId: [CHANNEL_ID],userId: userId) { result in
switch(result)
{
case .success(let channel) :
// 성공
break;
case .failure(let error) :
// 실패
break;
}
}
iOS (Objective-C)
[NChatBridge.shared unbanUserWithChannelId:[CHANNEL_ID] userId:userId :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
await nc.unbanUser(channelId, userId);
채널 삭제
해당 채널을 삭제합니다 (한 개 또는 여러 개를 삭제할 수 있습니다).
Javascript/Typescript
const channel = await nc.deleteChannel(channelId);
Android(Kotlin)
NChat.deleteChannel([CHANNEL_ID]) { channel, e->
if (e != null) {
// 오류
} else {
// 성공
}
}
iOS(Swift)
NChat.deleteChannel(channelId: [CHANNEL_ID]) { result in
switch(result)
{
case .success(let channel) :
// 성공
break
case .failure(let error) :
// 실패
break
}
}
iOS (Objective-C)
[NChatBridge.shared deleteChannelWithChannelId:[CHANNEL_ID] :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
Channel channel = await nc.deleteChannel([CHANNEL_ID]);
채널 수정
채널 정보를 업데이트합니다.
Javascript/Typescript
const channel = await nc.updateChannel(channelId, {
name,
type: "PUBLIC",
members: [],
});
Android(Kotlin)
import com.nbase.adpater.cloudchat.model.Channel
val newChannel = Channel(name = "New Channel2")
NChat.updateChannel([CHANNEL_ID], newChannel) { channel, e->
if (e != null) {
// 오류
} else {
// 성공
}
}
iOS(Swift)
var newChannel: NCChannel = NCChannel(name: "New Channel2")
NChat.updateChannel(channelId: [CHANNEL_ID], channel: newChannel) { result in
switch(result)
{
case .success(let channel) :
// 성공
break
case .failure(let error) :
// 실패
break
}
}
iOS (Objective-C)
NSMutableDictionary *channelDict = [NSMutableDictionary dictionary];
channelDict[@"name"] = @"New Channel2";
[NChatBridge.shared updateChannelWithChannelId:[CHANNEL_ID] channel:channelDict :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
if (error) {
// 오류
} else {
// 성공
}
}];
Unity
Channel channel = await nc.updateChannel([CHANNEL_ID],new NBaseSDK.Channel
{
name = "Update Channel",
type =[TYPE], // PUBLIC or PRIVATE
customField = [CUSTOM_FIELD]
});