Для доступа к функциям API Sender используется класс ChatFacade. Пример создания экземпляра класса:
chat = new ChatFacade(
URL, // адрес сервера. Использовать ChatFacade.URL_PROD
pref.getString(App.PROP_SID, ChatFacade.SID_UNDEF), // сохранённый sid
Tool.getImei(this), // IMEI, аппаратный идентификатор устройства
Tool.getDeviceName(), // Имя модели устройства
Tool.getDevType(), // Тип устройства (всегда “phone”)
Tool.getVersion(), // Версия клиентского приложения (из AndroidManifest.xml)
Tool.getServerVersion(), // Поддерживаемая версия протокола сервера (сейчас 7)
new ChatFacade.SenderListener() {
@Override
public void onReg(String sid) {
// регистрация устройства выполнена. Сохранить sid в SharedPreferences, очистить базу, начать новую синхронизацию
}
@Override
public void onNeedUpdate() {
// версия протокола на сервере несовместима с раелизованной на клиенте: предложить клиенту обновить приложение
}
@Override
public void onRegError(Exception e) {
// ошибка регистрации, выйти из приложения
}
@Override
public void onData(JSONObject jo) {
// новое сообщение с сервера, обработать в новом потоке
}
}
Для выполнения конкретных операций используются статические методы класса ChatFacade.
Для передачи клиенту сообщений при отсутствии постоянного соединения Sender-сервер использует Google Cloud Messaging. Чтобы активировать эту возможность следует получить GCM-токен и передать его на сервер вызовом:
chat.sendToken(token);
Выполнять эту операцию рекомендуется при каждом входе в приложение, обновляя токен.
chat.stop();
Рекомендуется выполнять при длительном бездействии пользователя и отсутствии сообщений с сервера, при уходе приложения в фон и т.п. Если при выключенном соединении на сервере внимания клиента будет ожидать сообщение, сервер пришлет на устройство GCM-сообщение вида:
{
"status":"wake_up"
}
При получении этого сообщения нужно создать новый экземпляр ChatFacade, что вызовет открытие соединения с сервером и сообщения будут получены.
chat.sendTyping(chatId);
где chatId - идентификатор чата в котором печатает данный пользователь.
Отсылать рекомендуется при увеличении длины вводимой строки в чате на 2-3 символа.
Событие будет доставлено в виде json-структуры:
{
"chatId": "user+be414da4-d876-4d21-9b5c-986863205f3b",
"formId": "typing",
"robotId": "routerobot",
"companyId": "sender",
"model": {
"from": "be414da4-d876-4d21-9b5c-986863205f3b"
}
}
model.from - id пользователя который печатает.
chatId - id чата, в котором происходит событие.
При получении события на 1-2 секунды следует активировать индикатор (надпись), показывающий что пользователь печатает. Если получено текстовое сообщение - индикатор следует скрыть.
chat.sendMessage(text, chatId, new ChatFacade.SendMsgListener() {
@Override
public void onSuccess(String msgId, long time) {
// сообщение отправлено. В базе сообщений следует сохранить id сообщения на сервере (msgId) и серверное время (time)
}
@Override
public void onError(Exception e) {
// сообщение не отправлено. Обновляем статус сообщения, чтобы клиент видел что оно не отправлено и мог повторить отправку
}
});
Событие будет доставлено в виде json-структуры:
{
"from": "be414da4-d876-4d21-9b5c-986863205f3b",
"chatId": "user+be414da4-d876-4d21-9b5c-986863205f3b",
"formId": "text",
"robotId": "routerobot",
"companyId": "sender",
"packetId": "90364",
"model": {
"text": "gggggfgjggfgh"
},
"created": 1429694199022
}
model.text - текст сообщения
fromId - id отправителя
chatId - id чата, в котором происходит событие
created - серверное время сообщения (unix timestamph, для сортировки)
Если сообщение в чат послано самим пользователем с другого устройства, то в поле fromId будет константа “me”.