Настройка
Инициализация
В методе application:didFinishLaunchingWithOptions:
сконфигурируйте экземпляр SDK Threads:
configureTransportProtocol
- актуальный транспорт для доставки сообщений
Параметры для настройки нужно получить у вашего менеджера подключения:
providerUid
- идентификатор приложенияwebSocketURL
- ссылка для подключения к чату через WebSocket APIrestURL
- ссылка для обращений к REST APIdataStoreURL
- ссылка для загрузки файлов через DataStore API
При конфигурации SDK через THRAttributes, все НЕ UI настройки необходимо устанавливать до вызова метода configureTransportProtocol
!
Например:
threads.attributes.logLevels = .all
threads.attributes.allowUntrustedSSLCertificate = true
- Swift
- Objective-C
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
}
#import <Threads/Threads.h>
@interface AppDelegate () <UNUserNotificationCenterDelegate, ThreadsDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Step 1: Configure Threads Framework
Threads *threads = [Threads threads];
threads.isDebugLoggingEnabled = YES;
[threads configureTransportProtocolWithDelegate:self
providerUid:@"PROVIDER_UID"
webSocketURL: [NSURL URLWithString:@"Ссылка на WebSocket API"]
restURL: [NSURL URLWithString:@"Ссылка на REST API"]
dataStoreURL: [NSURL URLWithString:@"Ссылка на DataStore API"]];
// Step 2: Register device for remote notifications
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
[[Threads threads] registerApplicationForRemoteNotificationsStandartOptionsWithAuthorizationStatusDenied:^{
// Handle deny notifications
} completionHandler:^(NSData * _Nullable deviceToken) {
// Handle received device token if needed
}];
return YES;
}
Установка пользователя
Осуществляется методом setClientInfo(_ clientInfo: THRClientInfo)
- Swift
- Objective-C
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)
THRClientInfo *clientInfo = [[THRClientInfo alloc] initWithClientId: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:
- Swift
- Objective-C
Threads.threads().updateClientInfo(clientInfo)
[[Threads threads] updateClientInfo:clientInfo];
Выход пользователя
Логаут необходимо выполнить, когда приложение должно перестать получать сообщения для пользователя. Например, когда пользователь разлогинился в приложении.
При смене clientId
автоматического логаута не производится
- Swift
- Objective-C
Threads.threads().logout()
или
Threads.threads().logout(withClientId: clientId)
[[Threads threads] logout];
или
[[Threads threads] logoutWithClientId:client.id];
Открытие чата
Для открытия чата необходимо получить chatViewController
c указанием параметров внешнего вида THRAttrubutes
, полученный контроллер можно отобразить любым нативным способом:
- Swift
- Objective-C
let attributes = THRAttributes()
let vc = Threads.threads().chatViewController(with: attributes)
navigationController?.pushViewController(vc, animated: true)
THRAttributes *attributes = [[THRAttributes alloc] init];
UIViewController *vc = [[Threads threads] chatViewControllerWithAttributes:attributes];
[self.navigationController pushViewController:vc animated:YES];
Дополнительные настройки инициализации
newChatCenterApi
- запрос истории сообщений, получение настроек будут использовать актуальные endpoint'ы сервера/api/...
Способы отображения чата
Примеры в демо-проекте
Все варианты открытия чата реализованы на Objective-C
и Swift
в соответствующих примерах в классе IntegrationsViewController
1. Открытие чата методом Push в коде
Открытие чата методом Push в текущем UINavigationController
- Swift
- Objective-C
let vc = Threads.threads().chatViewController(with: attributes)
navigationController?.pushViewController(vc, animated: true)
UIViewController *vc = [[Threads threads] chatViewControllerWithAttributes:attributes];
[self.navigationController pushViewController:vc animated:YES];
2. Открытие чата методом Present в коде
В данном способе необходимо поместить чат в UINavigationController
- Swift
- Objective-C
let vc = Threads.threads().chatViewController(with: attributes)
let nc = UINavigationController(rootViewController: vc)
present(nc, animated: true, completion: nil)
UIViewController *vc = [[Threads threads] chatViewControllerWithAttributes:attributes];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:chatViewController];
[self presentViewController:nc animated:YES completion:nil];
3. Открытие чата методом Show в Storyboard
Для открытия чата методом Show (e.g. Push) необходимо:
- Создать наследника
ChatNavigationController
отUINavigationController
- Указать созданный класс как
Custom Class
для необходимой сценыUINavigationController
в Storyboard. - Создать связь
Segue
к созданной сценеChatNavigationController
.
Пример реализации ChatNavigationController
- Swift
- Objective-C
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
}
}
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
.
- Swift
- Objective-C
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]
UIViewController *vc = [[Threads threads] chatViewControllerWithAttributes:attributes];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:vc];
nc.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Chat", "") image:[UIImage imageNamed:@"tabBarItemChat"] tag:0];
UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = @[nc];
5. Интеграция во вкладке UITabBarController в Storyboard
Чтобы интегрировать чат как вкладку через Storyboard
, нам понадобится ChatNavigationController
из способа Открытие чата методом Show в Storyboard.
- Создаем сцену
UINavigationController
- Указываем
Custom Class
-ChatNavigationController
, - Создаем связь
viewControllers
отUITabBarController
кChatNavigationController