Перейти к основному содержимому
Версия: 5.9.0

Troubleshooting

Частые вопросы (FAQ)

Цвета

Q: Изменил цвет, но он не применился

Проверьте по чеклисту:

  1. Тема задана до getChat()?
    chatCenterSDK.theme = myTheme
    let chatController = try chatCenterSDK.getChat()
  2. Правильный токен? Сверьте семантику в разделе Цветовая схема. Например, link и linkLight — два разных токена для акцентных элементов.
  3. Компонент не переопределяет токен? Если components.navigationBarStyle.titleTextStyle.color задан явно — токен typography.heading1 на него не влияет.
  4. Тёмная тема задана отдельно? colors.link = .red в светлой теме не затрагивает darkTheme.
  5. apply vs build? Изменение компонента в Flow через apply может затронуть все экраны. Используйте build для точечного переопределения (см. Стили -> Типичные ошибки).
  6. Тема пересоздаётся перед каждым открытием? Создавайте ChatTheme один раз при инициализации SDK — не перед каждым вызовом getChat().

Шрифты

Q: Изменил typography.body, но шрифт в пузырях не изменился

Текст в пузырях чата использует токен typography.message, а не body. Дефолт — .systemFont(ofSize: 14).

typography.message = .systemFont(ofSize: 15, weight: .regular)

Q: Кастомный шрифт не применяется к заголовку в навигационной панели

Заголовок навигационной панели управляется через NavigationBarStyle, а не через токен ChatTypography.title:

theme.components.navigationBarStyle.titleTextStyle.font = myFont
theme.components.navigationBarStyle.titleTextStyle.color = .white

Компоненты

Q: Изменение компонента в одном Flow влияет на все экраны

Компоненты из ChatComponents — reference-type. Мутация через apply правит общий объект, используемый и другими Flow. Чтобы переопределить компонент точечно, создайте новый экземпляр через build:

// Меняет глобально
theme.flows.chatFlow.apply {
$0.inputViewStyle.sendButtonStyle.image = myImage
}

// Точечное переопределение
let customInput = ChatInputStyle.build(with: theme.components) {
$0.sendButtonStyle.image = myImage
}
theme.flows.chatFlow.inputViewStyle = customInput

Q: Как изменить цвет фона пузырей сообщений?

Для входящих (от оператора) и исходящих (от клиента) сообщений по отдельности:

theme.flows.chatFlow.incomeMessages.bubbleTintColor = .systemBlue
theme.flows.chatFlow.outcomeMessages.bubbleTintColor = .systemGreen

Тёмная тема

Q: Тёмная тема не применяется при смене userInterfaceStyle

Убедитесь, что:

  1. darkTheme задан явно: chatCenterSDK.darkTheme = darkTheme
  2. Тема задана до getChat(), либо после смены тёмной темы чат закрыт и открыт заново через getChat()

Q: Часть элементов не меняет цвет в тёмной теме

Некоторые цвета (link, linkLight, positive, warning) одинаковы для светлой и тёмной темы по умолчанию. Для разных значений создайте отдельную ChatColors для тёмной темы и назначьте через darkTheme.


Иконки и изображения

Q: Иконка SF Symbol слишком маленькая / большая

Используйте конструктор с указанием размера:

images.attachButtonImage = ChatImage(system: "plus.circle", size: 24, tintColor: .systemBlue)

Граничные случаи

Q: Задал прозрачный цвет — текст пропал

ChatColors не проверяет цвет на прозрачность. Если задать .clear, элемент станет невидимым без ошибки.

// Текст будет невидим
colors.main = .clear

// Полупрозрачность
colors.main = .label.withAlphaComponent(0.8)

Q: Изменил theme пока чат уже открыт — UI не обновился

ChatTheme считывается при открытии чата. Изменение chatCenterSDK.theme после вызова getChat() не обновляет уже отображаемые компоненты.

Вариант 1 — перезапустить чат (наиболее надёжно):

chatCenterSDK.theme = newTheme
do {
let chatController = try chatCenterSDK.getChat() // открыть заново
navigationController?.pushViewController(chatController, animated: true)
} catch {
print("Не удалось переоткрыть чат: \(error)")
}

Вариант 2 — динамические цвета (обновляются автоматически при смене Light/Dark):

colors.main = UIColor { trait in
trait.userInterfaceStyle == .dark ? .white : .black
}

Ошибки конфигурации

Q: Иконка не отображается — как диагностировать?

ChatImage(named:) не выбрасывает ошибку если ассет не найден — иконка просто не отображается (внутри подставляется пустой UIImage()). Убедитесь, что имя ассета и бандл указаны верно:

// Кастомная иконка из бандла приложения
images.sendButtonImage = ChatImage(named: "my_icon", bundle: .main, tintColor: .white)

// Или SF Symbol (всегда доступен, не требует ассета)
images.sendButtonImage = ChatImage(system: "paperplane.fill", tintColor: .white)

Для проверки доступных SF Symbols используйте приложение SF Symbols (developer.apple.com/sf-symbols).


Q: Кастомный шрифт не загружается — как проверить?

Шрифт должен быть зарегистрирован в Info.plist под ключом UIAppFonts и использоваться по PostScript-имени:

// Диагностика: вывести все зарегистрированные PostScript-имена
for family in UIFont.familyNames.sorted() {
for name in UIFont.fontNames(forFamilyName: family) {
print(name) // ← ищите "YourFont-Regular" в выводе
}
}

// Всегда с fallback
typography.message = UIFont(name: "YourFont-Regular", size: 15)
?? .systemFont(ofSize: 15)

UIFont(name:size:) вернёт nil без ошибки если шрифт не найден — приложение не упадёт, но будет использован системный шрифт.


Отладка

Q: Как проверить, что тема применилась?

  1. Точка останова в отладчике — добавьте breakpoint после chatCenterSDK.theme = myTheme и проверьте свойства объекта
  2. Xcode View Hierarchy (Debug → View Hierarchy) — выберите нужный элемент, цвет и шрифт видны в инспекторе справа
  3. Логирование — убедитесь что код выполняется в нужном порядке:
    let theme = ChatTheme(colors: colors)
    print("Theme ready, link color: \(colors.link)")
    chatCenterSDK.theme = theme
    let chatController = try chatCenterSDK.getChat()

Не нашли ответ?

  • API Reference — полный список классов и свойств
  • Figma UIKit — визуальное представление компонентов
  • Демо-приложение → MainViewController+Custom.swift — актуальные рабочие примеры