Встраиваемый чат для мобильных приложений iOS
Программные средства разработки (SDK) Pyrus для iOS позволяют встроить удобный чат в ваше мобильное приложение.
Встроенный чат помогает получать мгновенную обратную связь от пользователей вашего мобильного приложения.

Когда клиент пишет в чат, ваша служба поддержки автоматически получает тикет в Pyrus. Специалист отвечает на заявку прямо в Pyrus, а клиенту приходит пуш-уведомление на телефон и ответ в чат вашего мобильного приложения. Это позволяет специалистам поддержки оперативно решать вопросы клиентов.

Основные возможности
- Внешний вид чата настраивается, поэтому чат может выглядеть как часть вашего приложения.
- Push-уведомления приходят клиенту, когда специалист отвечает на заявку.
- История переписки сохраняется в чате.
- Клиент может приложить к сообщению файлы, например фотографии, сделанные на камеру, или из галереи.
Вы можете встроить такой чат в приложение на базе iOS. Вот пошаговая инструкция.
Получить идентификатор приложения (AppID)
Чтобы специалисты службы поддержки могли обрабатывать сообщения из чата в Pyrus, ваше приложение нужно подключить к форме, в которой ведётся работа с обращениями клиентов. Для начала работы вам понадобится аккаунт администратора в Pyrus с доступом к настройке формы, в которой обрабатываются обращения пользователей. Если у вас нет такого аккаунта, обратитесь к коллеге, у которого он есть.
- Включите интеграцию в Pyrus. Убедитесь, что администратор формы в Pyrus включил интеграцию с чатом в приложении.           
- Получите AppID в настройке формы в Pyrus. Мы сгенерируем его автоматически, когда администратор формы включит интеграцию. AppID записан на странице настройки интеграции. 
Подготовить проект
1. Pods
В файл Pods добавить:
pod 'PyrusServiceDesk', :git => ‘https://github.com/simplygoodsoftware/pyrusservicedesk.git’, :tag => ‘3.0.37’
2. Swift Package Manager
Перейдите в настройки проекта Package Dependencies >> Packages >> Add. Введите в поле "Package URL":
https://github.com/simplygoodsoftware/pyrusservicedeskIOS
Из списка результатов выберите PyrusServiceDeskIOS >> Add Package.
3. Через настройки
Скачайте framework и перейдите в Targets >> General. Перетащите framework в Embedded Binaries.
Обновите информацию в разделе "Описание используемых типов и методов":
Текущая версия 3.0.37 собрана с использованием Xcode 15.4, Swift 5.10.
Запросить разрешение на доступ к камере и галерее
Чтобы пользователи могли прикреплять к сообщениям видео и фотографии, настройте доступ к камере и галерее. В файле Info.plist вашего приложения добавьте
“Privacy - Camera Usage Description”, “Privacy - Photo Library Usage Description”, “Privacy - Microphone Usage Description”.
Выбрать тип авторизации
Библиотека Pyrus Mobile Chat может работать в одном из двух режимов: с анонимной либо с внешней авторизацией.
Анонимный режим работы требует меньше затрат на внедрение. В этом случае данные чата привязаны к устройству. Пользователь на одном устройстве без использования явных логинов и паролей может писать в чат и видеть ответы операторов.
Основной недостаток анонимного режима в том, что если пользователь использует мобильное приложение на другом устройстве, то предыдущую переписку он не видит.
Если вы хотите, чтобы чат с историей переписки был доступен пользователю на разных устройствах, настройте внешнюю авторизацию. Для этого нужно реализовать веб-сервис, сообщающий системе о том, что данному пользователю разрешен доступ к чату.
Обратите внимание, что анонимная и внешняя авторизация взаимно исключают друг друга. Если вы, например, переключаете библиотеку Pyrus Mobile Chat с анонимной авторизации на внешнюю, то старая переписка в чате, сделанная с анонимной авторизацией, пользователям мобильного приложения перестаёт быть доступна.
Как работает авторизационный сервис
В режиме с внешней авторизацией решение о том, есть ли у пользователя доступ к данным чата, бэкенд Pyrus не принимает самостоятельно, а спрашивает об этом специальный авторизационный сервис, который вам необходимо реализовать. Работает это так.
- Пользователь любым способом авторизуется в мобильном приложении и после этого получает от вашего бэкенда пару ( userID, securityKey). На этом этапе библиотека Pyrus Mobile Chat и бэкенд Pyrus не участвуют. 
- При инициализации библиотеки Pyrus Mobile Chat значения userID и securityKey передаются как параметры. 
- В дальнейшем при любом запросе в бэкенд Pyrus (например, при запросе истории переписки или при отправке комментария пользователя) библиотека Pyrus Mobile Chat автоматически передаёт в бэкенд Pyrus параметры (userID, securityKey). - Перед обработкой запроса по существу бэкенд Pyrus проверяет права доступа, для этого передает пару (userID, securityKey) в ваш авторизационный веб-сервис. 
- Авторизационный веб-сервис в коммуникации с вашим бэкендом проверяют, являются ли параметры (userID, securityKey) подлинными и передают результат проверки обратно в бэкенд Pyrus. 
- Если разрешение от авторизационного сервиса получено, бэкенд Pyrus выполняет запрос: отправляет историю переписки, сохраняет комментарий пользователя и т.п. 
 

URL авторизационного сервиса следует указать в форме, к которой подключен мобильный чат. Для этого зайдите в настройки выбранной формы и в разделе Расширения выберите Чат в мобильном приложении.

На открывшейся странице введите URL в соответствующее поле.

Инициализировать чат
При старте приложения вызовите метод createWith() класса PyrusServiceDesk.
Параметры метода createWith():
- appID, объект класса String. Идентификатор вашего приложения. Он записан в настройке формы, к которой подключён чат. Если у вас нет доступа, попросите администратора формы скопировать AppID, как описано в разделе «Получить идентификатор приложения (AppID)».
Данные параметры применяются только при внешней авторизации:
- userID, объект класса String. Строка ID пользователя во внешней системе. Не должен меняться у одного и того же пользователя;
- securityKey, объект класса String. Строка для аутентификации пользователя user_id во внешней системе. Может меняться у одного и того же пользователя, если внешняя система это позволяет.
Инициализация чата в анонимном режиме
Objective-C
Функция чата инициализируется в файле AppDelegate.m.
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[PyrusServiceDesk createWith:@"your_app_id"];
return YES;
}
Swift
Функция чата инициализируется в файле AppDelegate.swift.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        PyrusServiceDesk.createWith("your_app_id")
        return true
        }
Инициализация чата в режиме внешней авторизации
Objective-C:
[PyrusServiceDesk createWith:@"your_app_id" userId:@"userId" securityKey:@"securityKey"];
Swift:
PyrusServiceDesk.createWith("your_app_id", userId: "userId", securityKey: "securityKey")
Если передать параметр userId = nil, то будет работать анонимная авторизация, привязанная к устройству, а не к пользователю.
Запустить пользовательский интерфейс
Чтобы запустить пользовательский интерфейс, вызовите метод start() класса PyrusServiceDesk.
Параметры метода start(): viewController — объект класса UIViewController. Нужен для запуска пользовательского интерфейса.
Objective-c:
[PyrusServiceDesk startOn:self];
Swift:
PyrusServiceDesk.start(on: self)
Для настройки оформления чата передайте параметр configuration.
Параметры метода start():
- viewController, объект класса UIViewController. Нужен для запуска пользовательского интерфейса.
- configuration, объект класса ServiceDeskConfiguration. Используется для настройки оформления чата.
- onStopCallback, объект класса OnStopCallback. Используется для подписки на закрытие чата.
Objective-c:
[PyrusServiceDesk startOn:self configuration:configuration onStopCallback:onStopCallback];
Swift:
PyrusServiceDesk.start(on: self, configuration:configuration, onStopCallback:onStopCallback)
Чтобы кастомизировать навигацию в интерфейсе чата, используйте следующую функцию:
func start(with configuration:ServiceDeskConfiguration?, completion:(() -> Void)? = nil, onStopCallback: OnStopCallback? = nil) -> UINavigationController?
Метод start(with) возвращает чат со службой поддержки — объект класса UINavigationController, который можно отображать так, как нужно вам.
Параметры метода start(with):
- configuration — объект класса ServiceDeskConfiguration, используется для настройки оформления чат;
- onStopCallback — объект класса OnStopCallback, и спользуется для подписки на закрытие чата.
Настроить оформление чата
Метод start(), используемый для запуска пользовательского интерфейса, содержит параметр Configuration, объект класса ServiceDeskConfiguration. Создать и настроить объект ServiceDeskConfiguration можно с помощью объекта ServiceDeskConfiguration.Builder.
Методы объекта ServiceDeskConfiguration.Builder
- setUserName, объект класса String, задаёт имя пользователя (клиента поддержки), которое специалист службы поддержки увидит в Pyrus. Если пользователь авторизовался в приложении, вы можете передавать имя, почту и другие его данные в этот метод, чтобы оператор поддержки понимал, с кем общается, и быстрее решил вопрос.
- setChatTitle, объект класса String — задаёт заголовок в окне чата.
- setWelcomeMessage, объект класса String — приветственное сообщение, которое увидит пользователь, открыв чат.
- setThemeColor, объект класса UIColor — цвет основных элементов интерфейса.
- setAvatarForSupport, объект класса UIImage — аватар сотрудника службы поддержки.
- build — создает объект класса ServiceDeskConfiguration.
Детальная настройка внешнего вида чата
В дополнение к описанным выше кратким настройкам внешнего вида чата вы можете с помощью объекта ServiceDeskConfiguration уточнить вид отдельных элементов интерфейса. Все представленные далее настройки использовать необязательно: если вы пропустите часть из них, сработают соответствующие краткие настройки.
Вы можете детально оформить чат используя следующие параметры.
- setKeyboardAppearance, объект класса UIKeyboardAppearance — внешний вид клавиатуры для ввода сообщения. 
- setKeyboardColor, объект класса UIColor — цвет клавиатуры для ввода сообщения. 
- setFontName, объект класса String — название шрифта, который используется в чате. 
- setUserMessageBackgroundColor, объект класса UIColor — цвет фона для сообщений пользователей. По умолчанию имеет значение UIColor.secondarySystemBackground. 
- setSupportMessageBackgroundColor, объект класса UIColor — цвет фона для сообщений службы поддержки. По умолчанию имеет значение UIColor.secondarySystemBackground. 
- setUserTextColor, объект класса UIColor — цвет текста для сообщений пользователя. По умолчанию имеет значение nil. Если данный параметр не установлен, цвет текста будет автоматически подогнан под цвет фона сообщения. 
- setSupportTextColor, объект класса UIColor — цвет текста для сообщений службы поддержки. По умолчанию имеет значение UIColor.label. 
- setChatTitleColor, объект класса UIColor — цвет заголовка чата. Может использоваться, если не установлен параметр chatTitleView. Если chatTitleView установлен, он имеет наивысший приоритет. 
- setToolbarColor, объект класса UIColor — цвет навигационной панели чата. 
- setToolbarButtonColor, объект класса UIColor — цвет кнопки Назад. Используется, если не установлен параметр customLeftBarButtonItem. В последнем случае customLeftBarButtonItem имеет наивысший приоритет. 
- setBackgroundColor, объект класса UIColor — цвет фона чата. 
- setAttachmentMenuTextColor, объект класса UIColor — цвет текста для меню выбора вложенных файлов. 
- setAttachmentMenuButtonColor, объект класса UIColor — цвет кнопки для выбора прикрепляемого файла. 
- setSendButtonColor, объект класса UIColor — цвет кнопки для отправки сообщения. 
- setStatusBarStyle, объект класса UIStatusBarStyle — внешний вид строки состояния устройства. 
- setToolbarStyle, объект класса UIBarStyle — темная тема оформления чата. Установка этого параметра в значении false отключает функцию автоматического затемнения. Установка параметра в значение true автоматически сделает тему темной. По умолчанию параметр установлен в значении false. 
- setCustomRightBarButtonItem, объект класса UIBarButtonItem — вид правой кнопки в верхней панели управления. 
- setCustomLeftBarButtonItem, объект класса UIBarButtonItem — вид левой кнопки в верхней панели управления ( если установлен, то окно невозможно закрыть). 
- setInfoView, объект класса UIView — внешний вид информационного блока над чатом. 
- setChatTitleView, объект класса UIView — внешний вид кастомизированного заголовка чата. 
Примеры кратких и расширенных настроек оформления чата
Objective-C:
ServiceDeskConfigurationBuilder *builder = [[ServiceDeskConfigurationBuilder alloc] init];
    [builder setUserName: @"Иван Петров"];
    [builder setChatTitle: @"Поддержка ИмяОрганизации"];
    [builder setWelcomeMessage: @"Добрый день! Как я могу вам помочь?"];
    [builder setThemeColor: [UIColor redColor]];
    [builder setAvatarForSupport: [UIImage imageNamed:@"logo.png"]];
    [builder setKeyboardAppearance: UIKeyboardAppearanceDark darkKeyboardAppearance: UIKeyboardAppearanceDark];
    [builder setBackgroundColor: [UIColor systemBackgroundColor]];
ServiceDeskConfiguration* configure = [builder build];
Swift:
let configuration : ServiceDeskConfiguration = ServiceDeskConfiguration.Builder()
            .setUserName("Иван Петров")
            .setChatTitle("Поддержка ИмяОрганизации")
            .setWelcomeMessage("Добрый день! Как я могу вам помочь?")
            .setThemeColor(.red)
            .setAvatarForSupport(UIImage(named: "logo.png"))
            .setKeyboardAppearance(.dark, .dark)
            .setBackgroundColor(.systemBackground)
            .build()
В функции, принимающие цвет в качестве параметра, можно передавать объект UIColor, который адаптируются под текущую, светлую или тёмную, тему интерфейса. Пример вспомогательной функции для создания изменяемого цвета:
extension UIColor {
    static func themedColor(lightColor: UIColor, darkColor: UIColor) -> UIColor {
        return {
            if #available(iOS 13.0, *) {
                return UIColor {
                    switch $0.userInterfaceStyle {
                    case .dark:
                        return darkColor
                    default:
                        return lightColor
                    }
                }
            }
            return lightColor
        }()
    }
}
Уведомления о новом сообщении в чате
Вы можете настроить отправку push-уведомлений, чтобы оповещать пользователя о новых сообщениях в чате. В этом разделе описан альтернативный вариант. Он проще в реализации, но уведомления будут приходить с задержкой и вы не увидите содержимое нового комментария. Настроить push-уведомления
Чтобы получать уведомления о новых сообщениях от сотрудника поддержки в чате, реализуйте интерфейс NewReplySubscriber и передайте реализацию интерфейса в метод subscribeToReplies() класса PyrusServiceDesk.
Если вы используете библиотеку Pyrus Mobile Chat на нескольких устройствах, что возможно с внешней авторизацией, то мобильному приложению полезно знать, что все новые комментарии уже прочитаны на другом устройстве. В этом случае библиотека вызовет функцию onNewReply с параметром hasUnreadComments равным false. Если чат открыт, функция не будет вызвана, даже если придут новые сообщения.
@objcpublicprotocol NewReplySubscriber{
    @objcfunc onNewReply(
        hasUnreadComments: Bool,
        lastCommentText: String?,
        lastCommentAttachmentsCount: Int,
        lastCommentAttachments: [String]?,
        utcTime: Double
    )
}
Objective-C:
В файле ViewController.h
@interface ViewController : UIViewController<NewReplySubscriber>
В файле ViewController.m
-(void)onNewReplyWithHasUnreadComments:(BOOL)hasUnreadComments lastCommentText:(NSString *)lastCommentText lastCommentAttachmentsCount:(NSInteger)lastCommentAttachmentsCount lastCommentAttachments:(NSArray<NSString *> *)lastCommentAttachments utcTime:(double)utcTime {
    print("Есть непрочитанные сообщения")
}
Swift:
func onNewReply(hasUnreadComments: Bool, lastCommentText: String?, lastCommentAttachmentsCount: Int, lastCommentAttachments: [String]?, utcTime: Double) {
    print("Есть непрочитанные сообщения")
}
Push-уведомления
Вы можете настроить отправку push-уведомлений, чтобы пользователь узнавал, когда специалист поддержки отправит комментарий в чат. Общая схема оповещения выглядит так: специалист отвечает на обращение клиента в Pyrus, из Pyrus с помощью вебхука ответ специалиста и push-токен отправляется на ваш сервер. Затем push-сервер Apple отправляет в приложение клиента push-уведомление о новом сообщении в чате.

Push-сервер Apple должен знать токен, уникальный для устройства и вашего приложения. При запуске ваше приложение связывается с push-сервером Apple и получает токен устройства, который записывается в Pyrus.

Вызывать функцию setPushToken можно не более одного раза в пять минут для одного пользователя, и не более чем 5 раз в пять минут в целом.
Чтобы подписаться на уведомления о новых сообщениях в чате, зарегистрируйте push-токен.
Objective-C:
[PyrusServiceDesk setPushToken:@”your_token” completion:^(NSError* error){
        if(error)
        {
            //error
            NSLog(@"error = %@",error.localizedDescription);
        }
        else{
            //success
        }
    }];
Swift:
PyrusServiceDesk.setPushToken(“your_token”, completion: {
            (error) in
            if error != nil{
                //error
                print(error!.localizedDescription)
			...
            }
            else{
                //success
...
            }
        })
Чтобы отписаться от push-уведомлений, нужно передать nil в функцию setPushToken:
Objective-C:
[PyrusServiceDesk setPushToken:nil completion:^(NSError* error){
        if(error)
        {
            //error
            NSLog(@"error = %@",error.localizedDescription);
        }
        else{
            //success
        }
    }];
Swift:
PyrusServiceDesk.setPushToken(nil, completion: {
            (error) in
            if error != nil{
                //error
                print(error!.localizedDescription)
			...
            }
            else{
                //success
            ...
            }
        })
На стороне сервера приложения нужно реализовать вебхук, который будет получать уведомления о новых комментариях в чате. И в настройке формы добавьте его URL.

При появлении нового ответа от поддержки на URL вебхука будет отправляться POST-запрос со следующим содержанием:
ticket_id — номер задачи, в которую добавлен комментарий.
token — идентификатор пользователя, включающий:
- user_id — идентификатор пользователя, который передается при каждом запросе;
- app_id — идентификатор мобильного приложения/веб-чата;
- device_id — идентификатор устройства;
- type — тип устройства: «ios».
comment — информация о новом комментарии:
- comment_id — номер нового комментария;
- body — текст комментария;
- is_inbound — всегда false, показывает, что комментарий исходящий, то есть ответ поддержки.
author — информация об авторе комментария:
- name — имя автора;
- avatar_id — идентификатор аватара автора;
- avatar_color — цвет аватара автора. Используется, если avatar_id не заполнено.
created_at — дата и время создания комментария.
attachments — описание приложенных файлов:
- id — идентификатор файла;
- name — имя файла;
- size — размер файла в байтах.
Уведомления о закрытии чата
Чтобы получать сообщения о закрытии окна чата, реализуйте интерфейс OnStopCallback и передайте реализацию интерфейса в метод start() класса PyrusServiceDesk.
@objc public protocol OnStopCallback{
    @objc func onStop()
}
Включаем оценку сервиса
В уведомлении о закрытии заявки вы можете предложить пользователю оценить качество обслуживания с помощью смайликов, соответствующих оценке от пяти до одного.

Чтобы подключить оценку, зайдите в раздел Формы в левом меню и выберите форму, в которой работает Pyrus Mobile Chat.

На странице настройки формы в списке доступных расширений нажмите значок Оценка сервиса.

Установите переключатель в положение Включено.
Настройка меню отправки файлов в чат
По умолчанию пользователь может отправлять в чат фотографии, сделанные камерой, или выбирать изображения из галереи. Чтобы дать пользователю возможность отправлять другие типы файлов (например, техническую информацию, файлы конфигурации и т. д.), используйте метод registerFileChooser() класса PyrusServiceDesk.
PyrusServiceDesk.registerFileChooser (chooser: (FileChooser & UIViewController)?)
Chooser — реализация интерфейса FileChooser. Для того, чтобы перестать использовать настроенный FileChooser, в метод нужно передать null.
FileChooser имеет параметр label, в котором должна храниться строка с названием соответствующего пункта меню, например, «Прикрепить файл», и параметр chooserDelegate, протокол типа FileChooserDelegate.
Objective-C:
В CustomViewController.h:
@import PyrusServiceDesk; @interface CustomViewController : UIViewController <FileChooser> @end
В CustomViewController.m:
#import "CustomViewController.h" @interface CustomViewController () @end @implementation CustomViewController @synthesize chooserDelegate; @synthesize label; //label необходимо задать при инициализации CustomViewController ... @end
Swift:
class CustomViewController: UIViewController, FileChooser{
    var chooserDelegate: FileChooserDelegate?
    var label: String = "Отправить логи"
    ...
}
CustomViewController может отсылать своему делегату (chooserDelegate):
- Сообщение об отмене. Закрывает CustomViewController.
Objective-C:
[self.chooserDelegate didEndWithCancel];
Swift:
self.chooserDelegate?.didEndWithCancel()
- Сообщение об успехе. Должно содержать данные и путь к ним. Закрывает CustomViewController и отправляет данные в виде вложения в чат.
Objective-C:
[self.chooserDelegate didEndWithSuccess:data url:url];
Swift:
self.chooserDelegate?.didEndWithSuccess(data, url: url) //data — данные, которые необходимо отправить в чат, а url — путь к ним.
Закрытие окна
Для принудительного закрытия окна чата используйте метод stop():
Swift : PyrusServiceDesk.stop() Objective-C: [PyrusServiceDesk stop];
Описание используемых типов и методов
Текущая версия 3.0.10 собрана с использованием Xcode 13.0, Swift 5.5.
PyrusServiceDesk
@objc public class PyrusServiceDesk: NSObject
Класс для создания чата в приложении.
createWith
@objc public func createWith(_ appId: String?)
Параметры
| appID: | Используется для всех запросов. Если appId не задан, PyrusServiceDesk Controller не будет создан. | 
createWith
@objc static public func createWith(_ clientId: String?, userId: String, securityKey: String)
Параметры
| userID: | Строка ID пользователя во внешней системе. Не должен меняться у одного и того же пользователя. | 
| securityKey: | Строка, для аутентификации пользователя user_id во внешней системе. Может меняться у одного и того же пользователя, если внешняя система это позволяет. | 
registerFileChooser
@objc public static func registerFileChooser(_ chooser: (FileChooser & UIViewController)?)
Параметры
| chooser | UIViewController с расширением FileChooser. Запускает интерфейс для выбора файлов. Для отключения можно передавать null. | 
setPushToken
@objc public static func setPushToken(_ token:String?, completion: @escaping(Error?) -> Void)
Отправляет идентификатор устройства на сервер.
Параметры
| completion | Ошибка. Не nil, если всё прошло успешно. Чтобы разобраться, что случилось, проверьте error.localizedDescription. | 
| token | Строка с идентификатором устройства. | 
start
@objcpublicstaticfunc start(on viewController:UIViewController, onStopCallback: OnStopCallback? = nil)
Показать чат.
Параметры
| viewController | Представляет чат. | 
| onStopCallback: Объект OnStopCallback или nil. | Объект, который будет получать сообщения о том что чат был закрыт. | 
start
@objcpublicstaticfunc start(on viewController:UIViewController, configuration:ServiceDeskConfiguration?, onStopCallback: OnStopCallback? = nil)
Показать чат.
Параметры
| configuration | onStopCallback: Объект OnStopCallback или nil. Объект, который будет получать сообщения о том, что чат был закрыт. | 
| configuration | Объект ServiceDeskConfiguration или nil. ServiceDeskConfiguration — это объект, который создаёт внешний вид интерфейса: основной цвет, приветственное сообщение, аватар специалиста поддержки, заголовок окна с чатом. Если nil, используется стандартная конфигурация. | 
| viewController | Представляет чат. | 
subscribeToReplies
@objc public static func subscribeToReplies(_ subscriber: NewReplySubscriber?)
Подписывает [subscriber] на уведомления о том, что в чате появились новые сообщения от поддержки.
unsubscribeFromReplies
@objc public static func unsubscribeFromReplies(_ subscriber: NewReplySubscriber?)
Отписывает [subscriber] от оповещений о новых сообщениях от поддержки в чате.
Вызывается, когда параметры securityKey и userID не прошли проверку валидности
ServiceDeskConfiguration
@objc class ServiceDeskConfiguration: NSObject
Класс для настройки оформления чата. Создать и настроить ServiceDeskConfiguration можно с помощью объекта ServiceDeskConfiguration.Builder.
ServiceDeskConfiguration.Builder
@objc(ServiceDeskConfigurationBuilder)public class Builder: NSObject
Вспомогательный класс для конструирования объектов типа ServiceDeskConfiguration, описывающих внешний вид чата.
setAvatarForSupport
@objc public func setAvatarForSupport(_ avatarForSupport: UIImage?) -> Builder
Аватар специалиста поддержки. Отображается, если у специалиста поддержки не установлен аватар в Pyrus.
setChatTitle
@objc public func setChatTitle(_ chatTitle: String?) -> Builder
Содержит текст для заголовка чата. По умолчанию используется «Поддержка».
setThemeColor
@objc public func setThemeColor(_ themeColor: UIColor?) -> Builder
Цвет чата. По умолчанию используется tintColor приложения; если и он не задан, то (red: 0, green: 0.4784313725, blue: 1, alpha: 1).
setUserName
@objc public func setUserName(_ userName: String?) -> Builder
Имя пользователя (клиента поддержки), которое специалист службы поддержки увидит в Pyrus. По умолчанию используется «Гость» или "Guest" в зависимости от локали. Если пользователь авторизовался в приложении, вы можете передавать имя, эл.почту и другие его данные в этот метод, чтобы оператор поддержки понимал, с кем общается, и быстрее решил вопрос.
setWelcomeMessage
@objc public func setWelcomeMessage(_ welcomeMessage: String?) -> Builder
Первое сообщение, которое пользователь видит в чате. Если текст не задан, чат будет отображаться без приветственного сообщения.
setChatTitleView
@objc public func setChatTitleView(_ chatTitleView: UIView?) -> Builder
Используется для создания кастомизированного внешнего вида заголовка чата.
setCustomRightBarButtonItem
@objc public func setCustomRightBarButtonItem(_ customRightBarButtonItem: UIBarButtonItem?) -> Builder
Изменяет правую кнопку в верхней панели управления.
setCustomLeftBarButtonItem
@objc public func setCustomLeftBarButtonItem(_ customLeftBarButtonItem: UIBarButtonItem?) -> Builder
Изменяет левую кнопку в верхней панели управления. Если кнопка задана, то закрыть окно чата будет нельзя.
setInfoView
@objc public func setInfoView(_ infoView: PSDInfoView?) -> Builder
Используется для показа информационного блока над чатом.
setStatusBarStyle
@objc(setStatusBarStyle: darkBarStyle:) public func setStatusBarStyle(_ barStyle: UIStatusBarStyle, _ darkBarStyle: UIStatusBarStyle) -> Builder
Задает внешний верхней панели управления.
setKeyboardAppearance
@objc(setKeyboardAppearance: darkKeyboardAppearance:) public func setKeyboardAppearance(_ keyboardAppearance: UIKeyboardAppearance, _ darkKeyboardAppearance: UIKeyboardAppearance)
Задаёт внешний вид клавиатуры.
setKeyboardColor
@objc public func setKeyboardColor(_ color: UIColor) -> Builder
Задаёт цвет поля для ввода сообщения.
setFontName()
@objc public func setFontName(_ fontName: String?) -> Builder
Задаёт кастомизированный шрифт для всех элементов чата.
setFontName
@objc public func setFontName(_ fontName: String?) -> Builder
Задаёт кастомизированный шрифт для всех элементов чата.
setUserTextColor
@objc public func setUserTextColor(_ color: UIColor?) -> Builder
Задаёт цвет текста сообщений от пользователя.
setUserMessageBackgroundColor
@objc public func setUserMessageBackgroundColor(_ color: UIColor?) -> Builder
Задаёт цвет фона сообщений от пользователя.
setSupportTextColor
@objc public func setSupportTextColor(_ color: UIColor?) -> Builder
Задаёт цвет текста сообщений от службы поддержки.
setSupportMessageBackgroundColor
@objc public func setSupportTextColor(_ color: UIColor?) -> Builder
Задаёт цвет фона сообщений от службы поддержки.
setChatTitleColor
@objc public func setChatTitleColor(_ color: UIColor?) -> Builder
Задаёт цвет заголовка экрана.
setToolbarStyle
@objc(setToolbarStyle: darkBarStyle:) public func setToolbarStyle(_ barStyle: UIBarStyle, _ darkBarStyle: UIBarStyle) -> Builder
Задаёт тему верхней панели управления.
setToolbarColor
@objc public func setToolbarColor(_ color: UIColor?) -> Builder
Задаёт цвет верхней панели управления.
setToolbarButtonColor
@objc public func setToolbarButtonColor(_ color: UIColor?) -> Builder
Задаёт цвет кнопки "Назад".
setBackgroundColor
@objc public func setBackgroundColor(_ color: UIColor?) -> Builder
Задаёт цвет окна, в котором расположен чат.
setAttachmentMenuTextColor
@objc public func setAttachmentMenuTextColor(_ color: UIColor?) -> Builder
Задаёт цвет кнопок в меню добавления файлов к сообщению. По умолчанию используется цвет, который был передан в setThemeColor().
setAttachmentMenuButtonColor
@objc public func setAttachmentMenuButtonColor(_ color: UIColor?) -> Builder
Задаёт цвет для кнопки в меню добавления файлов к сообщению. По умолчанию используется цвет, который был передан в setThemeColor().
setSendButtonColor
@objc public func setSendButtonColor(_ color: UIColor?) -> Builder
Задаёт цвет для кнопки отправки сообщения. По умолчанию используется цвет, который был передан в setThemeColor().
build
@objc public func build -> ServiceDeskConfiguration
Возвращает объект ServiceDeskConfiguration, который можно передать при запуске чата.
NewReplySubscriber
@objc public protocol NewReplySubscriber
Протокол для отправки оповещений о новых сообщениях.
onNewReply
@objcfunc onNewReply(
        hasUnreadComments: Bool,
        lastCommentText: String?,
        lastCommentAttachmentsCount: Int,
        lastCommentAttachments: [String]?,
        utcTime: Double
    )
Отправлено новое сообщение.
Параметры
| hasUnreadComments: | Уведомление о новом сообщении в чате. | 
| lastCommentText: | Текст последнего непрочитанного сообщения. Возвращает значение nil, если новых сообщений нет. | 
| lastCommentAttachmentsCount: | Общее число приложенных к сообщению файлов. Возвращает значение nil если новых сообщений или приложенных файлов нет. | 
| lastCommentAttachments: | Список названий вложенных файлов. Возвращает значение nil, если новых сообщений или приложенных файлов нет. | 
| utcTime: | Время создания последнего непрочитанного сообщения в формате UTC. Возвращает значение nil, если новых сообщений нет. | 
FileChooser
@objc public protocol FileChooser
Расширение для передачи файлов.
chooserDelegate
@objc var chooserDelegate : FileChooserDelegate? { get set }
Отправляет статусные сообщения о завершении.
label
@objc var label : String { get set}
Название пункта меню, которое видит пользователь.
FileChooserDelegate
@objc public protocol FileChooserDelegate
Отправляет статусные сообщения о завершении.
didEndWithSuccess
@objc func didEndWithSuccess(_ data : Data?, url : URL?)
Отправляет статус «Успешно».
Параметры
| data | Данные вложения, которые нужно отправить в чат. Если пустое или nil, отобразится предупреждение об ошибке. | 
| url | Путь к файлу. | 
didEndWithCancel
@objc func didEndWithCancel()
Отправляет статус «Отменено».
OnStopCallback
@objc public protocol OnStopCallback
Протокол для отправки оповещений о закрытии чата.
onStop
@objc func onStop()
Окно чата PyrusServiceDesk было закрыто.
Авторизационный веб-сервис
Получает вызов HTTP POST c параметрами:
- app_id: строка, создается Pyrus в настройках мобильного чата;
- user_id: строка до 100 символов, ID пользователя во внешней системе. Никогда не должен меняться. Не может совпадать у разных пользователей, в том числе бывших;
- security_key: строка до 100 символов, для аутентификации пользователя user_id во внешней системе. Логика формирования и использования security_key полностью отдается на ваше усмотрение. Не рекомендуем использовать без хеширования с солью пароли, секретные ключи и другие параметры, которые позволяют авторизоваться в мобильном приложении или дают доступ к каким-либо другим вашим системам.
Ожидаемый ответ:
- в случае успешной авторизации: HTTP 200 OK;
- в случае некорректно сформированного запроса (неправильные поля либо security_key неверного для вашей системы формата): HTTP 400 Bad Request;
- в случае неуспешной авторизации: HTTP 403 Forbidden.