Расширенные настройки
Логирование
Threads.threads().attributes.logLevels = .off
- включение/отключение логгирования. В качестве значения используется class LogLevel c поддержкой протокола OptionSet(Swift) или NS_OPTIONS(Objective-C).
LogLevel, возможные значения:
- off (выключены все уровни логирования);
- info (общий уровень);
- network (сетевой уровень);
- network-sock (сетевой уровень, сокет);
- user-interface (пользовательский интерфейс);
- error (ошибки);
- all (включены все вышеперечисленные уровни);
let logLevelValue = (LogLevel.network.rawValue | LogLevel.networkSock.rawValue)
Threads.threads().attributes.logLevels = LogLevel(rawValue: logLevelValue)
Если активирован хоть один уровень логов, поток событий отправляется в системный OSLog с идентификатором "im.threads.logs" и можно наблюдать как через терминал XCode так и через Console в macos.
Одновременно с OSLog события фиксируются в файл на устройстве. Имя по умолчанию - Threads.log. Место сохранения .documentDirectory/Logs (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) + "/Logs"). Есть возможность принудительно выключить запись логов в файл на устройстве. Для этого в настройках атрибутов имени файла нужно передать nil:
Threads.threads().attributes.logFileName = nil
Настройки для файла записи логов на устройстве:
Threads.threads().attributes.logFileName: String? = "Threads"
- имя файла логов, по умолчанию - "Threads" (если передать nil, логи в файл писаться не будут);Threads.threads().attributes.logFileSizeMb: Int = 1
- максимальный размер файла в мегабайтах, по умолчанию - 1;Threads.threads().attributes.logFileMaxCount: Int = 7
- максимальное количество файлов логов в ротации, по умолчанию - 7. При превышении самый старый будет затираться.
ThreadsDelegate
Количество непрочитанных сообщений
- (void)threads:(Threads *)threads unreadMessagesCount:(NSUInteger)unreadMessagesCount;
Первый раз метод вызывается при инициализации СДК (после установки пользователя).
Для получения обновлений необходим активный чат (открытый и хранимый в памяти).
Если пользователь может выйти с экрана, но необходимо отображать актуальный счетчик, следует установить флаг keepSocketActive = true
.
В случае необходимости отображать счетчик до входа в чат, необходимо устанавливать пользователя через метод registerUser
с флагом keepSocketActive = true
.
Обработка ошибок
- (void)threads:(Threads *)threads didReceiveError:(NSError *)error;
Открытие чата по пушу
Для проверки было ли приложение открыто по пушу Threads
воспользуйтесь методом isThreadsOriginPushUserInfo
:
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
// Check for application launched from notification
if response.actionIdentifier == UNNotificationDefaultActionIdentifier {
let userInfo = response.notification.request.content.userInfo
if Threads.threads().isThreadsOriginPushUserInfo(userInfo) {
// Application launched from Threads notification
} else {
// Application launched from other notifications
}
}
completionHandler()
}
}
Програмная отправка сообщений
Текстовое сообщение
let text = "Hello, World!"
Threads.threads().sendMessage(withText: text) { [weak self] (error) in
if let error = error {
// handle error
} else {
// handle success
}
}
Лимит 4000 символов
Пример использования: TextMessageSwiftViewController.swift
, TextMessageObjcViewController.m
Изображение
let image = UIImage(named: "helloWorld")
Threads.threads().sendMessage(with: image) { [weak self] (error) in
if let error = error {
// handle error
} else {
// handle success
}
}
Лимит по-умолчанию 30Mb
Пример использования в PictureMessageSwiftViewController.swift
и PictureMessageObjcViewController.m
Использование сертификатов
SSL Pinning
Позволяет использовать указанный список сертификатов для проверки их соответствия с сертификатом на сервере. Сами сертификаты должны быть вложены в бандл приложения в кодировке DER.
Если список не пустой, то настройка allowUntrustedSSLCertificate
будет проигнорирована.
При использования данного функционала, не рекомендуется использовать только один сертификат. В случае его отзыва или истечения срока действия - SDK перестанет подключаться к серверу. Используйте резервные сертификаты с их своевременным обновлением.
[Threads threads].attributes.trustedCertificates
- По-умолчанию пустой массив.
- Swift
- Objective-C
Threads.threads().attributes.trustedCertificates = [
THRCert(contentsOf: Bundle.main.url(forResource: "GUTS_2022.cer", withExtension: nil)),
THRCert(contentsOf: Bundle.main.url(forResource: "guts.2022.cer", withExtension: nil)),
THRCert(contentsOfFile: "guts_22.cer"),
THRCert(contentsOfFile: "guts.22.cer")
[Threads threads].attributes.trustedCertificates = @[
[[THRCert alloc] initWithContentsOf: [NSBundle.mainBundle URLForResource:@"GUTS_2022.cer" withExtension:nil]],
[[THRCert alloc] initWithContentsOf: [NSBundle.mainBundle URLForResource:@"guts.2022.cer" withExtension:nil]],
[[THRCert alloc] initWithContentsOfFile:@"guts_22.cer"],
[[THRCert alloc] initWithContentsOfFile:@"guts.22.cer"]
];
Работа с недоверенными сертификатами
Регулирует проверку серверных сертификатов в SDK на валидность. Если активирована настройка trustedCertificatesList
, то эта настройка игнорируется и проверяется точное соответствие сертификатов из указанного списка.
[Threads threads].attributes.allowUntrustedSSLCertificate = [YES | NO]
- По-умолчанию отключено.
Уведомления о пользовательских действиях
"Threads.Controls.DidClickCloseButton"
- уведомление на нажатие пользователя по кнопке закрытия чата.
Версия API
Позволяет настраивать версию API для взаимодействия с серверами. Возможные значения в enum THRAPIVersion [api16 | api17 | api18].
- `Threads.threads.apiVersion - Значение по умолчанию - api16.
- Swift
- Objective-C
Threads.threads.apiVersion = THRAPIVersion.api18
[Threads threads].apiVersion = THRAPIVersionApi18;
Отключение пользовательского ввода
Для отключения пользовательского ввода и возможности отправки сообщений в чат, необходимо использовать следующее свойство:
Threads.threads.disableUserInput = true