channel_talk_flutter

Channel Talk Android·iOS·Web SDK를 연결하는 비공식 Flutter 플러그인입니다.

RC 버전 설치

4.3.0-rc.1은 SDK 호환성 변경을 실제 앱에서 확인하기 위한 사전 배포 버전입니다. 테스트할 앱의 pubspec.yaml에서 버전을 명시하세요.

dependencies:
  channel_talk_flutter: 4.3.0-rc.1

설정 후 flutter pub get을 실행합니다. 필요한 환경 변경은 Upgrade Notes, 검증된 기능과 남은 범위는 현재 SDK 대응 범위를 확인하세요.

*******************************************************************************************************
ANDROID
Please should change the bottom part when change version from v2.x.x to above of v3.0.0.

In AndroidManifest.xml file,
AS-IS

    <service
        android:name="ai.deepnatural.channel_talk.PushInterceptService"
        ...

TO-BE

    <service
        android:name="com.kuku.channel_talk_flutter.PushInterceptService"
        ...

*******************************************************************************************************

Compatibility

  • Flutter 3.19 / Dart 3.3 or later is required by the Web JS interop implementation.
  • Bundled SDKs: Android 13.5.0 and iOS 13.3.0 (실제 SDK 연결 확인: 2026-09-29).
  • Channel Talk APIs are implemented for Android, iOS, and Web. The registered macOS plugin is a placeholder and does not implement those APIs.
  • iOS 15.0 or later is required.
  • Android minSdkVersion 21 or later is required.
  • The Android plugin module currently builds with compileSdkVersion 35.
  • Android 13 (API 33) or later requires POST_NOTIFICATIONS permission for system push notifications.
  • The Android plugin still depends on com.google.firebase:firebase-messaging:20.1.0. If your app pins Firebase BOM or messaging versions directly, verify the resolved dependency graph.

현재 SDK 대응 범위

현재 패키지는 위 SDK 버전의 기존 공개 API 호환성 유지에 초점을 맞춥니다. 각 SDK의 모든 기능을 Flutter API로 제공하는 것은 아닙니다. Web은 호스트가 로드한 Channel.io JavaScript SDK를 사용하며, 모바일과 지원 범위가 다릅니다.

iOS의 onChatCreated 등 SDK 이벤트는 메인 스레드에서 Flutter로 전달하도록 수정했습니다. 이미 메인 스레드에서 발생한 이벤트는 즉시 전달하며, 이벤트명·데이터와 URL 차단 반환값을 유지합니다. 이 수정에서 기존 boot·updateUser 등의 반환형·오류 처리나 receivePushNotification·shutdown의 응답 완료 시점은 변경하지 않았습니다. 이전 버전에서 올릴 때 필요한 변경은 아래 Upgrade Notes를 확인하세요.

다음 6개 확장은 현재 추가하지 않습니다. 기존 사용 방식은 유지하며, 해당 기능이 필요한 앱은 아래 제한을 확인해야 합니다.

확장 항목 현재 제공 범위와 제한
사용자 객체·상세 오류 반환 bool 응답·bootWithStatus 상태 enum 유지. 사용자 객체·상세 오류를 함께 반환하는 API 없음.
전체 프로필·Web 태그 초기화 전용 API 없음. 개별 필드 null 전달과 다르며 Web의 tags: [] 초기화는 보장하지 않음.
Android 푸시 클릭 기본 동작 차단 클릭 이벤트는 제공하지만 차단 설정은 없습니다. SDK 기본 동작을 허용합니다.
Web 추가 언어 코드 기존 Language enum을 유지하며 Web 전용 추가 언어 코드는 노출하지 않습니다.
iOS 기본 테마 위임·푸시 완료 대기 system/light/dark 유지. SDK 기본 테마 위임·푸시 처리 완료 대기 API 없음.
네이티브 리스너 완전 해제 모바일 removeListener()는 Dart 콜백만 해제. SDK 네이티브 리스너 제거 기능 없음.

검증 결과와 남은 범위

2026-09-29에 Android 에뮬레이터, iOS 시뮬레이터, Web에서 실제 SDK를 연결해 확인했습니다. 자동 회귀 266개가 통과했고, 후속 iOS 이벤트 수정에서는 네이티브 회귀 5개와 관련 Dart 검사 68개가 통과했습니다. 수정 후 실제 iOS 상담 생성도 3회 모두 이벤트가 한 번씩 도착했고 기존 플랫폼 채널 스레드 오류가 발생하지 않았습니다.

실제 푸시 수신·클릭, 정상 워크플로, 팝업·URL 차단 효과, 프로필·태그·track의 서버 반영은 미검증 범위가 남아 있습니다. API의 true 반환만으로 서버 작업 완료까지 보장하지 않습니다.

Upgrade Notes

  • 3.x -> 4.x
    • Raise the iOS deployment target to 15.0 or later before upgrading.
  • 4.1.x -> 4.2.x
    • Raise Android minSdkVersion to 21 or later before upgrading.
    • If your project uses an older Android Gradle Plugin, verify it is compatible with compileSdkVersion 35.
  • 4.2.x -> 4.3.0
    • Raise Flutter to 3.19 / Dart to 3.3 or later.
    • ChannelTalk.setPage(page: ...) still works and now also accepts profile. Web requires a non-null page; use resetPage() to reset it.
    • Custom ChannelTalkFlutterPlatform implementations must change their setPage override to setPage({String? page, Map<String, dynamic>? profile}).
    • Web now supports setListener, removeListener, and hidePopup.
    • Web의 URL 클릭 콜백은 관찰용입니다. setPreventDefaultUrlClick(true)는 비동기 UnsupportedError이며, false는 기본 동작을 유지하고 성공합니다.
    • Web boot, updateUser, addTags, and removeTags now wait for the SDK callback and return false on SDK failure. JS invocation errors complete the Future with an error.
    • Native updateUser preserves omitted language, tags, and marketing preferences.
    • boot와 bootWithStatus에 customAttributes, channelButtonOption, bubbleOption을 추가했습니다. 배치 옵션을 생략하면 기존 플랫폼별 배치를 유지합니다.
    • bootForWeb도 customAttributes를 지원하며, updateUser에 profileOnce를 추가했습니다.

See SDK compatibility audit for findings and validation.

프로젝트 내부 문서

⚡ Usage

import 'package:channel_talk_flutter/channel_talk_flutter.dart';

void main() async {
    await ChannelTalk.boot(
        pluginKey: 'pluginKey', // Required
        memberId: 'memberId',
        memberHash: 'memberHash',
        email: 'email',
        name: 'name',
        mobileNumber: 'mobileNumber',
        avatarUrl: 'avatarUrl',
        unsubscribeEmail: false,
        unsubscribeTexting: false,
        trackDefaultEvent: false,
        hidePopup: false,
        language: Language.korean,
        appearance: Appearance.dark,
    );

    ChannelTalk.setListener((event, arguments) {
      switch(event){
        case ChannelTalkEvent.onShowMessenger:
          print('ON_SHOW_MESSENGER');
          break;
        case ChannelTalkEvent.onHideMessenger:
          print('ON_HIDE_MESSENGER');
          break;
        case ChannelTalkEvent.onChatCreated:
          print('ON_CHAT_CREATED:\nchatId: $arguments');
          break;
        case ChannelTalkEvent.onBadgeChanged:
          print('ON_BADGE_CHANGED:\n$arguments');
          break;
        case ChannelTalkEvent.onFollowUpChanged:
          print('ON_FOLLOW_UP_CHANGED\ndata: $arguments');
          break;
        case ChannelTalkEvent.onUrlClicked:
          print('ON_URL_CLICKED\nurl: $arguments');
          break;
        case ChannelTalkEvent.onPopupDataReceived:
          print('ON_POPUP_DATA_RECEIVED\nevent: $arguments}');
          break;
        case ChannelTalkEvent.onPushNotificationClicked:
          print('ON_PUSH_NOTIFICATION_CLICKED\nevent: $arguments}');
        default:
          break;
      }
    });

    runApp(App());
}

class App extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return FlatButton(
            child: Text('Open Channel Talk'),
            onPressed: () async {
                await ChannelTalk.showMessenger();
            },
        );
    }
}

See Channel Talk Android and iOS package documentation for more information.

Boot with status

boot() returns true only on success. To tell why a boot failed — e.g. to retry a transient networkTimeout but give up on a permanent accessDenied — use bootWithStatus(), which resolves to a ChannelTalkBootStatus (success, notInitialized, networkTimeout, notAvailableVersion, serviceUnderConstruction, requirePayment, accessDenied, unknown). It takes the same arguments as boot() and shares the same native boot path. On web, the SDK callback resolves to success when no error is reported, otherwise unknown.

final status = await ChannelTalk.bootWithStatus(pluginKey: 'pluginKey');
if (status != ChannelTalkBootStatus.success) {
  // inspect `status` and decide whether to retry
}

프로필과 모바일 배치 옵션

boot, bootWithStatus, bootForWeb의 customAttributes는 name, email 등 기본 프로필 뒤에 병합됩니다. 같은 키가 있으면 customAttributes 값이 우선하며, 프로필 안의 명시적인 null도 SDK로 전달됩니다. updateUser의 profileOnce는 일반 프로필과 별도로 전달되어 아직 값이 없는 필드만 채웁니다. 인자를 생략하면 해당 값을 변경하지 않습니다.

channelButtonOption과 bubbleOption은 Android/iOS의 boot와 bootWithStatus에서만 지원합니다. Web에서 두 옵션을 전달하면 SDK 호출 없이 비동기 UnsupportedError가 발생합니다. bootForWeb은 이 두 옵션을 노출하지 않습니다.

옵션 필드와 기본값
ChannelButtonOption icon: channel, position: right, xMargin: 20, yMargin: 20
BubbleOption position: top, yMargin: 생략 시 기기별 SDK 기본 여백 유지

버튼 위치는 ChannelButtonPosition.left/right, 팝업 위치는 BubblePosition.top/bottom입니다. 여백 단위는 Android dp, iOS pt이며, BubbleOption.yMargin: 0은 생략과 다릅니다. 옵션 객체 자체를 생략하면 기존 배치를 유지합니다. 특히 iOS의 기존 버튼 배치는 왼쪽, 가로 여백 16, 세로 여백 23입니다. const ChannelButtonOption()을 명시하면 양 플랫폼 모두 channel 아이콘, 오른쪽, 가로·세로 여백 20을 적용합니다.

ChannelButtonIcon은 18개 아이콘을 제공합니다: channel, chatBubbleFilled, chatProgressFilled, chatQuestionFilled, chatLightningFilled, chatBubbleAltFilled, smsFilled, commentFilled, sendForwardFilled, helpFilled, chatProgress, chatQuestion, chatBubbleAlt, sms, comment, sendForward, communication, headset.

다음은 Android/iOS에서 커스텀 프로필과 버튼·팝업 배치를 설정하는 예제입니다.

final status = await ChannelTalk.bootWithStatus(
  pluginKey: 'pluginKey',
  name: '기본 이름',
  customAttributes: {
    'name': '우선 적용할 이름',
    'plan': 'pro',
    'expiredAt': null,
  },
  channelButtonOption: const ChannelButtonOption(
    icon: ChannelButtonIcon.headset,
    position: ChannelButtonPosition.right,
    xMargin: 20,
    yMargin: 24,
  ),
  bubbleOption: const BubbleOption(position: BubblePosition.bottom),
);

if (status == ChannelTalkBootStatus.success) {
  await ChannelTalk.updateUser(profileOnce: {'signupSource': 'app'});
}

iOS

Set the app's iOS deployment target to 15.0 or later for both Swift Package Manager and CocoaPods.

Update info.plist.

<key>NSCameraUsageDescription</key>
<string>Accessing to camera in order to provide better user experience</string>

<key>NSMicrophoneUsageDescription</key>
<string>Accessing to microphone to record voice for video</string>

<key>NSPhotoLibraryAddUsageDescription</key>
<string>Accessing to photo library in order to save photos</string>
 
<key>NSPhotoLibraryUsageDescription</key>
<string>Accessing to photo library in order to provide better user experience</string>

Native dependencies

Both integrations currently use ChannelIOSDK 13.3.0.

The plugin installs ChannelIOSDK automatically through Swift Package Manager (SPM) or CocoaPods. Remove any explicit pod 'ChannelIOSDK', ... entry from ios/Podfile when upgrading. Keeping that entry with SPM causes a duplicate ChannelIOFront.framework build error.

Swift Package Manager: Flutter 3.44 and later enable SPM by default. To enable it for your app, merge this setting into the existing flutter section of the app's pubspec.yaml:

flutter:
  config:
    enable-swift-package-manager: true

Run flutter pub get, then build or run the app to let Flutter integrate the Swift package. See the Flutter SPM migration guide if your app has custom native integration.

CocoaPods: Existing CocoaPods apps can continue using the plugin's podspec. With Flutter 3.44 or later, set enable-swift-package-manager: false in the app configuration above to use CocoaPods. Keep the Flutter installation call in ios/Podfile; no separate ChannelIOSDK pod entry is needed:

platform :ios, '15.0'

target 'Runner' do
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

After changing the Podfile, run flutter pub get from the app directory, then pod install from ios/. This also applies to SPM apps that retain CocoaPods for other dependencies.

Add ChannelTalk initializing code to [project]/ios/Runner/AppDelegate.swift

import ChannelIOFront
...

    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        ...
        ChannelIO.initialize(application)
        ...
    }
...

Android

Requirements

  • minSdkVersion 21 (Channel Talk Android SDK requires API 21+ for features to work)
  • compileSdkVersion 35 is used by this plugin module
  • Android 13 (API 33) or later requires POST_NOTIFICATIONS permission for system push notifications.

The plugin adds Channel.io's official Maven repository for io.channel artifacts. If your app centrally manages repositories in settings.gradle, add it there too:

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven {
            url 'https://maven.channel.io/maven2'
            content { includeGroup 'io.channel' }
        }
    }
}

Android supports explicit Korean, Japanese, and English SDK languages. Language.device uses the device language during boot; in updateUser it leaves the current language unchanged because the Android SDK has no device-language enum.

Android의 onPopupDataReceived 데이터에는 timestamp가 포함됩니다. 이 값은 SDK가 전달한 원본 시간 값이며 패키지가 단위를 정규화하지 않습니다. 플랫폼 공통 밀리초·초 값으로 가정하지 말고, 시간을 변환할 때 해당 플랫폼 SDK의 계약을 확인하세요.

Push notifications in combination with FCM

This plugin works in combination with the firebase_messaging plugin to receive Push Notifications. To set this up:

    <service
        android:name="com.kuku.channel_talk_flutter.PushInterceptService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

just above the closing </application> tag.

Web

The SDK script must be loaded before calling this package. Await bootForWeb before calling APIs that need a booted user.

Web에서는 다음 9개 메서드에 대응하는 공식 JavaScript SDK API가 없어 현재 UnimplementedError가 발생합니다. 테스트 실패나 plugin key 권한 문제와 구분합니다.

API Web에서 지원하지 않는 이유
sleep 모바일의 푸시·track만 유지하는 휴면 모드에 대응하는 Web 명령이 없습니다.
isBooted Web SDK에 부팅 상태 조회 API가 없습니다. 부팅 결과는 await한 결과로 확인합니다.
setDebugMode Web SDK에 같은 디버그 로그 설정 API가 없습니다.
initPushToken 모바일 FCM/APNs 토큰 등록용이며 Web SDK에는 대응 명령이 없습니다.
isChannelPushNotification 모바일 호스트가 받은 푸시 payload 판별용입니다.
receivePushNotification 모바일 호스트의 푸시 수신을 SDK에 전달하는 API입니다.
storePushNotification 모바일에서 수신한 푸시를 SDK에 보관하는 API입니다.
hasStoredPushNotification 모바일 SDK에 저장된 푸시를 조회하는 API입니다.
openStoredPushNotification 모바일에 저장된 푸시로 상담을 여는 API입니다.

공개 범위는 공식 Web API 문서와 공식 loader 소스를 기준으로 확인했습니다. 브라우저 자체의 Web Push 구현 가능성과는 별개입니다. shutdown은 모든 SDK 동작을 종료하므로 sleep의 동일한 대체 동작은 아닙니다. 로컬 변수로 마지막 boot 결과를 보관하는 것도 SDK의 현재 상태를 직접 조회하는 것과 다릅니다.

The Web onChatCreated event has no chat ID argument, so its listener payload is null.

Web의 onUrlClicked는 URL을 알려주는 이벤트입니다. SDK는 콜백 반환값으로 기본 이동을 취소하지 않으므로 setPreventDefaultUrlClick(true)는 비동기 UnsupportedError를 반환합니다. setPreventDefaultUrlClick(false)는 SDK 호출 없이 true로 완료되어 기본 동작을 유지합니다. 자세한 콜백 계약은 공식 Web SDK의 UrlClickedCallback 정의를 참고하세요.

setPage requires a non-null page on Web. Use resetPage to reset the page and user chat profile. The listener APIs use the SDK's global clearCallbacks; manage Channel.io callbacks through this package when using setListener or removeListener.

Insert the following script within the tag of your HTML file(web/index.html):

<script>
  (function(){var w=window;if(w.ChannelIO){return w.console.error("ChannelIO script included twice.");}var ch=function(){ch.c(arguments);};ch.q=[];ch.c=function(args){ch.q.push(args);};w.ChannelIO=ch;function l(){if(w.ChannelIOInitialized){return;}w.ChannelIOInitialized=true;var s=document.createElement("script");s.type="text/javascript";s.async=true;s.src="https://cdn.channel.io/plugin/ch-plugin-web.js";var x=document.getElementsByTagName("script")[0];if(x.parentNode){x.parentNode.insertBefore(s,x);}}if(document.readyState==="complete"){l();}else{w.addEventListener("DOMContentLoaded",l);w.addEventListener("load",l);}})();
</script>

In case of Web platform, would better use bootForWeb API but we can also use boot API.

import 'package:channel_talk_flutter/channel_talk_flutter.dart';

void main() async {
    await ChannelTalk.bootForWeb(
        pluginKey: 'pluginKey', // Required
        memberId: 'memberId',
        memberHash: 'memberHash',
        email: 'email',
        name: 'name',
        mobileNumber: '0101231234',
        avatarUrl: 'avatarUrl',
        customLauncherSelector: 'customLauncherSelector',
        hideChannelButtonOnBoot: false,
        zIndex: 10000000,
        trackDefaultEvent: false,
        trackUtmSource: false,
        unsubscribeEmail: false,
        unsubscribeTexting: false,
        hidePopup: false,
        appearance: Appearance.light,
        language: Language.japanese,
    );
...
}

🔧 Supported API

API API Description Parameter Type Parameter Description Support platforms
setListener Set the delegate allows the reception of event callbacks from the SDK. delegate* ChannelTalkDelegate Support onShowMessenger/onHideMessenger/onChatCreated/onBadgeChanged/onFollowUpChanged/onUrlClicked/onPopupDataReceived Mobile, Web
removeListener Remove the delegate allows the reception of event callbacks from the SDK.q Mobile, Web
boot Load the information necessary to use the SDK. pluginKey* String Plugin key of Channel. Mobile, Web
배치 옵션은 Android/iOS 전용
memberId String? An identifier to distinguish each member user.
memberHash String? A HMAC-SHA256 value of memberId.
email String? An email of a user.
name String? A name of a user.
mobileNumber String? A mobile number of a user.
avatarUrl String? An avatar URL of a user.
language Language? A user’s language. It is valid when creating a new user. The language of the user that already exists will not change.
unsubscribeEmail bool? Sets whether to receive marketing messages via email.
unsubscribeTexting bool? Sets whether to receive marketing messages via texting (SMS, LMS)
trackDefaultEvent bool? Sets whether to track the default event, such as PageView.
hidePopup bool? Sets whether to hide popups such as marketing popup and in-app notifications.
appearance Appearance? Sets the appearance of SDK.
customAttributes Map<String, dynamic>? 기본 프로필 뒤에 병합합니다. 중복 키는 이 값이 우선하며 null도 전달합니다.
channelButtonOption ChannelButtonOption? Android/iOS 버튼 아이콘과 위치·여백입니다. 생략 시 기존 배치를 유지합니다. Web은 비동기 UnsupportedError입니다.
bubbleOption BubbleOption? Android/iOS 팝업 위치·여백입니다. yMargin 생략 시 SDK 기본값을 유지합니다. Web은 비동기 UnsupportedError입니다.
bootWithStatus 부팅 결과를 ChannelTalkBootStatus로 반환합니다. boot와 동일 boot와 동일 customAttributes와 두 모바일 배치 옵션을 포함합니다. Web SDK 콜백 결과는 success 또는 unknown이며 호출 예외는 Future 오류입니다. Mobile, Web
배치 옵션은 Android/iOS 전용
bootForWeb Load the information necessary to use the SDK. pluginKey* String Plugin key of Channel. Web
memberId String? An identifier to distinguish each member user.
memberHash String? A HMAC-SHA256 value of memberId.
email String? An email of a user.
name String? A name of a user.
mobileNumber String? A mobile number of a user.
avatarUrl String? An avatar URL of a user.
language Language? A user’s language. It is valid when creating a new user. The language of the user that already exists will not change.
unsubscribeEmail bool? Sets whether to receive marketing messages via email.
unsubscribeTexting bool? Sets whether to receive marketing messages via texting (SMS, LMS)
trackDefaultEvent bool? Sets whether to track the default event, such as PageView.
hidePopup bool? Sets whether to hide popups such as marketing popup and in-app notifications.
appearance Appearance? Sets the appearance of SDK.
customLauncherSelector String? The CSS Selector to select a custom launcher. Use this option to customize the default chat button.
hideChannelButtonOnBoot bool? Determines whether to hide the default chat button on boot. The default value is false.
zIndex int? Sets the z-index for SDK elements, such as the chat button, messenger, and marketing pop-ups. The default value is 10000000.
trackUtmSource bool? Determines whether to track the UTM source and referrer. The default value is true.
customAttributes Map<String, dynamic>? 기본 프로필 뒤에 병합합니다. 중복 키는 이 값이 우선하며 null도 전달합니다.
sleep Disables all features except for receiving system push notifications and using the Track. Mobile
shutdown Disconnects the SDK from the channel. Mobile, Web
showChannelButton Displays the Channel button on the global screen. Mobile, Web
hideChannelButton Hides the Channel button on the global screen. Mobile, Web
showMessenger Displays the messenger. Mobile, Web
hideMessenger Hides the messenger. Mobile, Web
openChat Opens User chat. chatId String? This is the chat ID. If the chatId is invalid or nil, a new user chat is opened. Mobile, Web
message String? This is the pre-filled message in the message input field when opening a new chat. It is valid when chatId is nil.
track Tracks the user's events. eventName* String This is the name of the event to track, with a maximum length of 30 characters. Mobile, Web
properties Map? This is additional information about the event.
updateUser Modifies user information. name String? A name of a user. Mobile, Web
email String? An email of a user.
mobileNumber String? A mobile number of a user.
avatarUrl String? An avatar URL of a user.
language Language? A user’s language. It is valid when creating a new user. The language of the user that already exists will not change.
unsubscribeEmail bool? Sets whether to receive marketing messages via email.
unsubscribeTexting bool? Sets whether to receive marketing messages via texting (SMS, LMS)
tags List[String]? A tag list of the user.
customAttributes Map<String, dynamic>? 기본 프로필 뒤에 병합합니다. 중복 키는 이 값이 우선하며 null도 전달합니다.
profileOnce Map<String, dynamic>? 아직 값이 없는 프로필 필드만 채웁니다. customAttributes와 별도로 전달되며 생략 시 전송하지 않습니다.
initPushToken Informs ChannelTalk about updates to the device token. deviceToken* String This is additional information about the event. Mobile
isChannelPushNotification It checks if the push data should be processed by the SDK. content* Map This is the `userInfo object received through push notifications. Mobile
receivePushNotification Notifies Channel Talk that the user has received a push notification. content* Map This is the `userInfo object received through push notifications. Mobile
storePushNotification Stores push information on the device. content* Map This is the `userInfo object received through push notifications. Mobile
hasStoredPushNotification Check for any saved push notifications from the Channel. Mobile
openStoredPushNotification Opens a user chat using the stored push information on the device through storePushNotification. Mobile
isBooted Verify that the SDK is in a Boot state. Mobile
setDebugMode Sets the debug mode. flag* String debug mode Mobile
setPage Sets the page and user chat profile used by track and new chats. page, profile String?, Map<String, dynamic>? page is the tracked screen name and is required on Web. profile sets user chat profile fields. Both parameters are optional on Android and iOS. Mobile, Web
resetPage Resets the tracked screen name and user chat profile. Mobile, Web
addTags Adds tags to the user. tags* List[String] • The maximum number of tags that can be added is 10.
• Tags are stored in lowercase.
• Any tags that have already been added will be ignored.
• nil, empty strings, or lists containing them are not allowed.
Mobile, Web
removeTags Removes tags from the user, ignoring any tags that do not exist. tags* List[String] These are the tags to be removed. Null, empty strings, or lists containing them are not allowed. Mobile, Web
openWorkflow Opens a user chat and starts the specified workflow. workflowId String? The ID of workflow to start with. An error page will be shown if such workflow does not exist. Mobile, Web
setAppearance Configures the SDK's theme. appearance* Appearance If specified as .light or .dark, it locks the theme to the respective mode. If specified as .system, it follows the device's system theme. Mobile, Web
hidePopup Hides the Channel popup on the global screen. Mobile, Web
setPreventDefaultUrlClick Android/iOS에서 기본 URL 이동을 차단하고 onUrlClicked 이벤트로 앱이 처리하도록 설정합니다. prevent* bool Web의 true는 비동기 UnsupportedError입니다. false는 SDK 호출 없이 true로 완료되며 기본 이동을 유지합니다. Web onUrlClicked는 URL 관찰만 지원합니다. Android, iOS
Web은 false만 허용

🤗 Contributing

Contributions are welcome! Feel free to open an issue or submit a pull request if you have a way to improve this project.

Make sure your request is meaningful and you have tested the app locally before submitting a pull request.

🙋‍♂️ Support

💙 If you like this project, give it a ⭐ and share it with friends!

buymeacoffee-violet-badge