NCloud Chat Flutter SDK
Classic/VPC 환경에서 이용 가능합니다.
목차
개요
Ncloud Chat은 실시간 채팅 및 메시지 시스템, 여러 사용자가 대화할 수 있는 채널을 구현할 수 있는 서비스입니다. 쉽고 간단하게 채팅 서비스를 구축할 수 있도록 다양한 SDK와 API를 제공합니다.
네이버 클라우드 플랫폼의 Ncloud Chat 서비스를 활용하면 로그인 환경이나 운영 도구를 개발할 필요가 없고, 인프라 관리 및 사용자 관리를 위해 별도의 시스템을 구축하지 않아도 됩니다. 직관적이고 편리한 Ncloud Chat 대시보드에서 통계 분석, 서비스 운영 및 관리가 가능하며 네이버 클라우드 플랫폼의 다양한 서비스와의 연동을 통해 강력한 채팅 환경을 구축할 수 있습니다.
Ncloud Chat이 제공하는 다양한 기능
| 기능 | 설명 |
|---|---|
| 편리한 대시보드 | 모바일에서도 접속할 수 있는 NCloud Chat 대시보드 화면에서 메시지 통계, 채팅 채널 관리, 악성 사용자 차단, 욕설 및 비속어 필터링, 채팅 메시지 다운로드 및 검색 가능 |
| 1:1 채팅 | 특정 사용자에게 알림 메시지 전달 가능, 사용자 간 1:1 채팅 시스템을 안정적으로 지원 |
| 다국어 메시지 실시간 자동 번역 | 다양한 나라의 사람들과 편하게 대화할 수 있도록 네이버의 강력한 AI 번역 솔루션인 파파고와 연동 기능 제공, 자동 번역 기능을 활용하여 글로벌 사용자와 쉽게 커뮤니티 구축 가능 |
| 비속어 차단 및 악성 사용자 차단 | 건강한 채팅 환경 구성을 위해 욕설 및 비속어가 포함된 메시지 필터링 및 삭제 가능, 악성 사용자(플레이어)는 일정 기간 동안 채팅을 이용할 수 없도록 설정 가능 |
| 실시간 분석 지표 | 사용자 접속 현황, 메시지 전달 현황 등을 분석할 수 있도록 다양한 분석 지표 제공 |
| 푸시 알림 | FCM (Android) / APNs (iOS) 지원으로 오프라인 사용자에게도 메시지 알림 전송 |
요구 사양
Flutter
- Flutter 2.0 이상
- Dart 2.12 이상 (Null Safety 지원)
Android
- minSdkVersion 21 이상
- targetSdkVersion 34 권장
iOS
- iOS 12.0 이상
- Xcode 14.0 이상
지원 플랫폼
| 플랫폼 | 지원 상태 |
|---|---|
| Android | ✅ 정식 지원 |
| iOS | ✅ 정식 지원 |
| Web | ⚠️ 제한적 지원 |
| Windows/macOS/Linux | ⚠️ 실험적 지원 |
설치
`pubspec.yaml` 파일에 다음을 추가하세요:
```yaml dependencies: nchat: ^0.0.2 ```
🔔 푸시 알림 설정
Android 설정
1. AndroidManifest.xml 설정
`android/app/src/main/AndroidManifest.xml`에 다음을 추가하세요:
```xml
<application>
<!-- NChat Notification Receiver -->
<!-- SDK에 포함되어 있으므로 별도 추가 불필요 -->
</application>
\`\`\`
2. 알림 권한 요청 (Android 13+)
```dart import 'package:permission_handler/permission_handler.dart';
// Android 13 이상에서 알림 권한 요청 if (Platform.isAndroid) { final status = await Permission.notification.request(); if (status.isGranted) { print('알림 권한 승인됨'); } } ```
3. 알림 아이콘 설정 (선택)
`android/app/src/main/res/drawable/`에 아이콘 파일 추가:
- `ic_stat_nchat_small.png` - 상태바 알림 아이콘 (권장)
- `ic_stat_nbase_small.png` - 대체 아이콘
iOS 설정
1. AppDelegate.swift 설정
```swift import Flutter import UIKit import UserNotifications
@main @objc class AppDelegate: FlutterAppDelegate { private var nchatChannel: FlutterMethodChannel?
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: UIApplication.LaunchOptionsKey: Any?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
// Flutter MethodChannel 설정 (APNs 토큰 전달용)
if let controller = window?.rootViewController as? FlutterViewController {
nchatChannel = FlutterMethodChannel(
name: "io.nbase.nchat/apns",
binaryMessenger: controller.binaryMessenger
)
}
// APNs 권한 요청
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if granted {
DispatchQueue.main.async {
application.registerForRemoteNotifications()
}
}
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
// APNs 토큰 수신
override func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print("AppDelegate APNs token: (token)")
nchatChannel?.invokeMethod("onAPNsToken", arguments: token)
}
// 포그라운드 알림 표시
override func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
) {
completionHandler(.banner, .sound, .badge)
}
}
```
2. Info.plist 설정
```xml ```
3. Capabilities 설정
Xcode에서 `Signing & Capabilities` → `+ Capability` → `Push Notifications` 추가
Flutter 코드에서 푸시 토큰 설정
import 'package:nchat/nchat.dart';
import 'dart:io';
import 'package:flutter/services.dart';
final _nchat = NChat();
// 초기화 후 푸시 설정
Future<void> setupPush() async {
// Android: SDK가 자동으로 FCM 토큰 발급 및 등록
// iOS: AppDelegate에서 APNs 토큰 수신 후 아래와 같이 처리
if (Platform.isIOS) {
const apnsChannel = MethodChannel('io.nbase.nchat/apns');
apnsChannel.setMethodCallHandler((call) async {
if (call.method == 'onAPNsToken') {
final token = call.arguments as String;
_nchat.setPushToken(token);
}
});
}
}
// 푸시 상태 설정
Future<void> configurePush() async {
await _nchat.setPushState(PushState(
push: true, // 푸시 알림 활성화
night: true, // 야간 알림 허용
ad: false, // 광고 알림 비허용
));
}
빠른 시작
import 'package:nchat/nchat.dart';
import 'package:flutter/material.dart';
class ChatScreen extends StatefulWidget {
@override
State<ChatScreen> createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> implements ChatHandler {
final _nchat = NChat();
@override
void initState() {
super.initState();
_nchat.addHandler('main', this);
_initializeChat();
}
Future<void> _initializeChat() async {
// 1. SDK 초기화
await _nchat.initialize(
projectId: 'your-project-id',
region: 'kr',
);
// 2. 사용자 연결
final user = await _nchat.connect(
userId: 'user-001',
name: '홍길동',
);
// 3. 채널 생성
final channel = await _nchat.createChannel(
name: '일반',
type: 'public',
);
// 4. 메시지 전송
await _nchat.sendMessage(
channelId: channel.id,
content: '안녕하세요!',
);
}
// ChatHandler 구현
@override
void onMessageReceived(Message message) {
print('새 메시지: ${message.content}');
setState(() {
// UI 업데이트
});
}
@override
void onConnected() {
print('서버에 연결됨');
}
@override
void onDisconnected(String reason) {
print('연결 해제: $reason');
}
@override
void dispose() {
_nchat.removeHandler('main');
super.dispose();
}
}
```;
}
}
\`\`\`
---
## 리전 설정
| 리전 | 설명 |
|------|------|
| \`kr\` | 한국 프로덕션 서버 |
| \`beta\` | 베타 서버 |
| \`dev\` | 개발 서버 (기본값) |
| \`alpha\` | 알파 서버 |
| \`local\` | 로컬 서버 (localhost:4000) |
---
## 에러 처리
```dart
try {
await nchat.sendMessage(
channelId: 'channel-id',
content: '안녕하세요',
);
} on ChatException catch (e) {
print('에러 코드: ${e.code}');
print('에러 메시지: ${e.message}');
}
파일 업로드
final file = File('/path/to/image.jpg');
final message = await nchat.sendFile(
channelId: 'channel-id',
file: file,
message: '이미지 업로드',
onProgress: (sent, total) {
print('진행률: ${(sent / total * 100).toStringAsFixed(1)}%');
},
);
Troubleshooting
자주 발생하는 문제
| 문제 | 원인 | 해결 방법 |
|---|---|---|
| 연결 실패 | 잘못된 Project ID | 대시보드에서 Project ID 확인 |
| 메시지 전송 실패 | 채널 미구독 | subscribe() 호출 후 메시지 전송 |
| 푸시 알림 미수신 | 토큰 미등록 또는 권한 없음 | setPushToken() 호출 및 알림 권한 확인 |
| iOS 푸시 미동작 | APNs 인증서 미설정 | Apple Developer Console에서 인증서 등록 |
| Android 푸시 미동작 | FCM 설정 누락 | google-services.json 파일 확인 |
디버깅 팁
- 로그 확인:
debugPrint()로 SDK 응답 로그 확인 - 네트워크 상태: 인터넷 연결 및 방화벽 설정 확인
- 리전 설정: 올바른 리전이 설정되었는지 확인
- SDK 버전: 최신 버전 사용 권장
예제
완전한 샘플 앱은 example 디렉토리를 참조하세요.
라이선스
Proprietary License - 자세한 내용은 LICENSE 파일을 참조하세요.
이 소프트웨어는 NBase의 독점 소프트웨어이며 NBase 서비스와 연결해서만 사용할 수 있습니다.