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

Настройка

Инициализация

В методе application:didFinishLaunchingWithOptions: сконфигурируйте экземпляр SDK Threads:

  • configureTransportProtocol - актуальный транспорт для доставки сообщений
к сведению

Параметры для настройки нужно получить у вашего менеджера подключения:

  • providerUid - идентификатор приложения
  • webSocketURL - ссылка для подключения к чату через WebSocket API
  • restURL - ссылка для обращений к REST API
  • dataStoreURL - ссылка для загрузки файлов через DataStore API
осторожно

При конфигурации SDK через THRAttributes, все НЕ UI настройки необходимо устанавливать до вызова метода configureTransportProtocol!

Например:

threads.attributes.logLevels = .all
threads.attributes.allowUntrustedSSLCertificate = true
import Threads

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

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

// Step 1: Configure Threads Framework
let threads = Threads.threads()
threads.attributes.logLevels = .all

threads.configureTransportProtocol(
with: self,
providerUid: "PROVIDER_UID",
webSocketURL: URL(string: 'Ссылка на WebSocket API')!,
restURL: URL(string: 'Ссылка на REST API')!,
dataStoreURL: URL(string: 'Ссылка на DataStore API'))!

// Step 2: Register device for remote notifications
UNUserNotificationCenter.current().delegate = self

Threads.threads().registerApplicationForRemoteNotificationsStandartOptions(authorizationStatusDenied: {
// Handle deny notifications
}) { deviceToken in
// Handle received device token if needed
}

return true
}

Установка пользователя

Осуществляется методом setClientInfo(_ clientInfo: THRClientInfo)

let clientInfo = THRClientInfo(clientId: CLIENT_ID)
clientInfo.name = CLIENT_NAME
clientInfo.data = CLIENT_DATA
clientInfo.appMarker = APP_MARKER
clientInfo.signature = SIGNATURE
clientInfo.authToken = AUTH_TOKEN
clientInfo.authSchema = AUTH_SCHEMA
clientInfo.authMethod = AUTH_METHOD
Threads.threads().setClientInfo(clientInfo)

Где:

  • CLIENT_ID - уникальный идентификатор клиента, обязательный параметр.
  • CLIENT_NAME - имя пользователя, опциональный параметр.
  • CLIENT_DATA - json строка с клиентскими данными, опциональный параметр.
  • APP_MARKER - идентификатор Мультичат, если не используется передавать только null.
  • SIGNATURE - авторизационная подпись clientId, на данный момент опциональный параметр, проверка включается на сервере Threads. Подпись должна генерироваться на вашем сервере авторизации на основе clientId с помощью приватного ключа RSA, затем зашифрована в Base64. По общей схеме работы с подписью см. документацию по бэкенду.
  • AUTH_TOKEN - строка с токеном для авторизаци.
  • AUTH_SCHEMA - строка со схемой авторизации.
  • AUTH_METHOD - enum определяющий способ передачи информация об авторизации. (THRAuthMethodHeaders - данные авторизации передаются в заголовках (способ по умолчанию). THRAuthMethodCookies - данные авторизации передаются через cookies)
осторожно

CLIENT_ID должен быть уникальным, и всегда относится к одному и тому же пользователю. Избегайте использования в качестве идентификатора номера телефона, адреса электронной почты и прочих идентификаторов привязанных к данным пользователя.

Обновление данных авторизации

При изменении одного из параметров AUTH_TOKEN, AUTH_SCHEMA или AUTH_METHOD, необходимо вызвать метод updateClientInfo:

Threads.threads().updateClientInfo(clientInfo)

Выход пользователя

Логаут необходимо выполнить, когда приложение должно перестать получать сообщения для пользователя. Например, когда пользователь разлогинился в приложении.

предупреждение

При смене clientId автоматического логаута не производится

Threads.threads().logout()
или
Threads.threads().logout(withClientId: clientId)

Открытие чата

Для открытия чата необходимо получить chatViewController c указанием параметров внешнего вида THRAttrubutes, полученный контроллер можно отобразить любым нативным способом:

let attributes = THRAttributes()
let vc = Threads.threads().chatViewController(with: attributes)
navigationController?.pushViewController(vc, animated: true)

Дополнительные настройки инициализации

  • newChatCenterApi - запрос истории сообщений, получение настроек будут использовать актуальные endpoint'ы сервера /api/...

Способы отображения чата

Примеры в демо-проекте

Все варианты открытия чата реализованы на Objective-C и Swift в соответствующих примерах в классе IntegrationsViewController

1. Открытие чата методом Push в коде

Открытие чата методом Push в текущем UINavigationController

let vc = Threads.threads().chatViewController(with: attributes)
navigationController?.pushViewController(vc, animated: true)

2. Открытие чата методом Present в коде

В данном способе необходимо поместить чат в UINavigationController

let vc = Threads.threads().chatViewController(with: attributes)
let nc = UINavigationController(rootViewController: vc)
present(nc, animated: true, completion: nil)

3. Открытие чата методом Show в Storyboard

Для открытия чата методом Show (e.g. Push) необходимо:

  1. Создать наследника ChatNavigationController от UINavigationController
  2. Указать созданный класс как Custom Class для необходимой сцены UINavigationController в Storyboard.
  3. Создать связь Segue к созданной сцене ChatNavigationController.

Пример реализации ChatNavigationController

class ChatNavigationController.m: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()

self.viewControllers = [self.getChatViewController()]
}

func getAttributes() -> THRAttributes {
let attributes = THRAttributes()
attributes.showWaitingForSpecialistProgress = false
return attributes
}

func getChatViewController() -> UIViewController {
let attributes = getAttributes()
let chatViewController = Threads.threads().chatViewController(with: attributes)
return chatViewController
}
}

4. Интеграция во вкладке UITabBarController в коде

Метод интеграция во вкладке похож с открытием чата методом Present тем, что необходимо чат помещать в UINavigationController.

let vc = Threads.threads().chatViewController(with: attributes)

let nc = UINavigationController(rootViewController: chatViewController)
nc.tabBarItem = UITabBarItem(title: NSLocalizedString("Chat", comment: ""), image: UIImage(named: "tabBarItemChat"), tag: 0)

let tabBarController = UITabBarController()
tabBarController.viewControllers = [nc]

5. Интеграция во вкладке UITabBarController в Storyboard

Чтобы интегрировать чат как вкладку через Storyboard, нам понадобится ChatNavigationController из способа Открытие чата методом Show в Storyboard.

  1. Создаем сцену UINavigationController
  2. Указываем Custom Class - ChatNavigationController,
  3. Создаем связь viewControllers от UITabBarController к ChatNavigationController