가이드
모바일 SDK
수작업으로 만든 iOS, Android, Flutter, React Native 클라이언트.
동일한 API 형태를 공유하는 수작업으로 만든 4 개의 Tier 1 SDK——하나를 익히면 나머지도 알게 됩니다. 각각은 monorepo 의 sdks/<platform>/ 에 있습니다.
iOS — Swift
// Package.swift
.package(url: "https://github.com/singlink/singlink-ios", from: "0.1.0")import AskAIs Customer Service
let client = SingChatClient(baseUrl: URL(string: "https://cs.askais.com")!)
let id = try await client.identify(.init(appId: "ws_abc", email: "ada@example.com"))
try await client.startRealtime { event in
if case .messageNew(let msg) = event { print(msg.content) }
}Android — Kotlin
// build.gradle.kts
implementation("app.singchat:sdk:0.1.0")import app.singchat.sdk.SingChatClient
import app.singchat.sdk.models.IdentifyRequest
val client = SingChatClient("https://cs.askais.com")
client.identify(IdentifyRequest(appId = "ws_abc", email = "ada@example.com"))
client.startRealtime()
client.events.collect { event -> /* ... */ }Flutter — Dart
# pubspec.yaml
dependencies:
singlink_sdk: ^0.1.0import 'package:singlink_sdk/singlink_sdk.dart';
final client = SingChatClient('https://cs.askais.com');
await client.identify(IdentifyRequest(appId: 'ws_abc'));
client.startRealtime();
client.events.listen((e) { /* ... */ });React Native — TypeScript
npm install @singlink/react-nativeimport { useAskAIs Customer Service } from "@singlink/react-native";
const { client, identity, lastEvent } = useAskAIs Customer Service({
baseUrl: "https://cs.askais.com",
identify: { appId: "ws_abc", email: user.email },
});공통 설계
- 앱당 하나의
SingChatClient(동일 바이너리에서 멀티테넌트인 경우 워크스페이스당 하나) identify()는 JWT, 연락처, WS URL 을 반환합니다- WebSocket 은 지수 백오프로 자동 재연결하며, 25 s 마다 ping 합니다
- 이벤트는 타입이 지정된 enum / sealed class 로 표시됩니다——문자열 매칭이 필요 없습니다
- 오류는 타입이 지정되어 있습니다(
SingChatError/SingChatException)
로드맵(모바일 UI 컴포넌트)
현재 SDK 는 로직만 포함합니다——채팅 UI 는 직접 준비하세요. SwiftUI, Jetpack Compose, Flutter 위젯, React Native 컴포넌트로 미리 만들어진 채팅 뷰가 로드맵에 있습니다.