Интеграция Zendesk SDK для поддержки в мобильном приложении
Zendesk SDK даёт пользователям доступ к live-чату и тикет-системе прямо из приложения. Но интеграция занимает больше дня не из-за сложности SDK — а из-за тонкостей инициализации, конфликтов с другими зависимостями и настройки кастомного UI под дизайн-систему продукта.
Архитектура Zendesk SDK
Zendesk предлагает два независимых SDK:
- Zendesk SDK (Support) — создание тикетов, просмотр истории обращений
- Zendesk Chat SDK — live-чат с агентом в реальном времени
- Zendesk Messaging (рекомендуется для новых проектов) — объединяет чат и тикеты, работает через Sunshine Conversations
Для большинства новых интеграций рекомендуем Messaging SDK — он заменяет оба предыдущих и поддерживает push-уведомления о новых ответах агента.
Интеграция на iOS (Swift)
// AppDelegate или @main App
import ZendeskSDKMessaging
import ZendeskSDK
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Zendesk.initialize(
withAppId: "YOUR_APP_ID",
clientId: "YOUR_CLIENT_ID",
zendeskUrl: "https://yoursubdomain.zendesk.com"
)
Messaging.initialize(with: Zendesk.instance!)
return true
}
Открытие чата:
let messagingViewController = Messaging.instance?.messagingViewController()
present(messagingViewController!, animated: true)
Проблема с инициализацией. Если Zendesk.initialize вызывается не в главном потоке — SDK падает с Thread Checker предупреждением в Xcode и иногда крэшем на cold start. Инициализация только на main thread.
Идентификация пользователя
Для авторизованных пользователей передаём JWT-токен вместо анонимной сессии:
Zendesk.instance?.setIdentity(
.jwtWithToken(token: userJwtToken)
)
JWT-токен генерируется на backend со стандартными claims: sub (user ID), email, name. Без идентификации агент видит анонимного пользователя и не может связать чат с историей аккаунта.
Интеграция на Android (Kotlin)
// Application.onCreate()
Zendesk.initialize(this,
appId = "YOUR_APP_ID",
clientId = "YOUR_CLIENT_ID",
zendeskUrl = "https://yoursubdomain.zendesk.com"
)
Messaging.initialize(Zendesk.instance)
// Открытие экрана поддержки
val intent = Messaging.instance!!.getMessagingActivity(context)
startActivity(intent)
Конфликт с Proguard. Zendesk SDK требует специфичных keep-правил. Если их нет — приложение крэшится при открытии чата в release-сборке с ClassNotFoundException. Актуальные правила есть в официальной документации, но AGP иногда их не применяет автоматически через consumerProguardFiles.
# proguard-rules.pro
-keep class zendesk.** { *; }
-keep class com.zendesk.** { *; }
Push-уведомления для новых ответов агента
Пользователь закрыл приложение — нужно уведомить о новом ответе:
// iOS: регистрируем токен в Zendesk
func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Zendesk.instance?.pushNotificationsProvider?.register(
deviceToken: deviceToken,
locale: Locale.current.languageCode ?? "en"
)
}
Zendesk сам отправляет push через свой сервис — не нужно настраивать отдельный серверный механизм. Но APNS-сертификат или p8-ключ нужно добавить в Zendesk Admin Console → Channels → Mobile SDK.
Кастомизация UI
Zendesk Messaging SDK предоставляет ограниченную кастомизацию через MessagingConfiguration. Если нужен полностью кастомный UI — смотрим в сторону Sunshine Conversations REST API: получаем историю через API, рендерим сами, отправляем сообщения через webhook.
Ориентиры по срокам
Базовая интеграция с чатом и push — 2–4 дня. Настройка JWT-идентификации, кастомного UI и тестирование push на iOS и Android — до 1 недели.







