История тамбурина
Содержание:
Как заработать в ТамТам
Благодаря тому, что этот сервис еще не так популярен и раскручен — создавать и продвигать свои каналы в нем значительно проще, дешевле и перспективнее.
Уверен, смышленые и быстрые на подьём интернет предприниматели уже активно взялись за это направление. Признаюсь, я не из их числа, и, скорее всего, зря.
Подумайте об этом. И я поразмышляю )
В ближайшее время, наверняка, появится дополнительный функционал, который позволит создавать и продвигать приложения. Возможно те же боты, как и в Телеграмме. Увидим.
А я на этом заканчиваю. Оставляйте комментарии, подписывайтесь на обновления, в том числе на Телеграм канал блога t.me/investbro_ru, жмите кнопочки соцсетей и до скорой встречи!
Persistence
Для кеширования данных в iOS-клиенте мы используем библиотеку YapDatabase.
YapDatabase — это Key-Value хранилище поверх SQLite с очень большим набором возможностей. Мне эта библиотека кажется гораздо более простой и гибкой, чем CoreData. Здесь можно выбрать механизм сериализации объектов в базе: по умолчанию это NSCoding, а мы используем всё тот же MessagePack.
YapDatabase не требует наследования объектов от базового класса или реализации какого-то протокола, не привязывает объекты к контексту. Чтение и запись производятся с помощью синхронных или асинхронных транзакций.
А при помощи системы расширений доступны все те же возможности, что и в «настоящей» БД: произвольные SQL-запросы и индексирование нескольких полей, полнотекстовый поиск, подписка на изменения (как в NSFetchedResultsController), подключаемое шифрование, работа с CloudKit и т. д. Hello-world примеры работы с БД приводить здесь не буду, они есть в вики на github.
На мой вкус, YapDatabase повышает продуктивность и понятность кода, но некоторые мои коллеги её не очень любят. И их можно понять: после длительной работы с CoreData для перехода на YapDatabase нужно действительно несколько вывернуть мозг.
Кроме того, при асинхронной работе с базой через несколько соединений нужно хорошо понимать, как база обрабатывает параллельные запросы на чтение и запись: через одно или разные соединения. А ещё помнить, что объекты обновляются в БД целиком. Нельзя просто сохранить тот экземпляр, который вы прочитали какое-то время назад и модифицировали. Необходимо прочитать объект из базы, изменить его так, как вам нужно, и записать обратно в рамках одной транзакции. В противном случае можно случайно записать в БД устаревшие данные.
Вообще работа с базой очень удобно встраивается в наш реактивный стиль написания кода. Асинхронные шаблоны транзакций (чтение/запись/модификация отдельного объекта) очень просто завернуть, например, в сигналы ReactiveCocoa, и встраивать работу с базой в одну цепочку с отправкой и обработкой сетевых запросов.
Get messages
get /messages
https://botapi.tamtam.chat/messages
Returns messages in chat: result page and marker referencing to the next page. Messages traversed in reverse direction so the latest message in chat will be first in result array. Therefore if you use and parameters, must be less than
query Parameters
chat_idoptional |
integer(bigint) Chat identifier to get messages in chat |
message_idsoptional |
Array of strings Nullable Comma-separated list of message ids to get |
fromoptional |
integer(bigint) Start time for requested messages |
tooptional |
integer(bigint) End time for requested messages |
countoptional |
integer Default: 50 Maximum amount of messages in response |
Edit current bot info
patch /me
https://botapi.tamtam.chat/me
Edits current bot info. Fill only the fields you want to update. All remaining fields will stay untouched
Request Body schema: application/json
nameoptional |
string characters Nullable Visible name of bot |
|||||||||||
usernameoptional |
string characters Nullable +* Bot unique identifier. It can be any string 4-64 characters long containing any digit, letter or special symbols: «-» or «_». It must starts with a letter |
|||||||||||
descriptionoptional |
string characters Nullable Bot description up to 16k characters long |
|||||||||||
commandsoptional |
Array of objects (BotCommand) Nullable Commands supported by bot. Pass empty list if you want to remove commands |
|||||||||||
Array
|
||||||||||||
photooptional |
object Nullable Request to set bot photo |
|||||||||||
|
Сходства и различия с Telegram
Если говорить об интерфейсе, то в этом плане ТамТам во многом напоминает Телеграм, да и его функционал является если не прямой, то очень близкой копией проекта Павла Дурова.
К примеру, здесь также есть каналы, вот только ведутся они, исходя из количества подписчиков и регулярности постов, не слишком систематично.
Правда, здесь есть и преимущество, которое отличает мессенджер от Telegram – вы можете искать нужные каналы прямо по названию в самом приложении, что может быть очень удобно.
Интересно, что после регистрации в приложении вы автоматически станете подписчиком на новости ТамТама, и он будет регулярно пушить вам контент, схожий с тем, что вы часто встречаете в Одноклассниках в уведомлениях.
Стикеры в приложении тоже на месте, но и они имеют существенные различия с теми, что присутствуют в Телеграме.
По своей сути это просто gif-картинки, которые анимируются при отправке или нажатии на них. Поиск стикеров вы сможете проводить по ключевым словам, а вот самых популярных картинок из «Телеги» вы здесь не найдёте.
При этом в приложении много коротеньких вырезок из самых разных сериалов и фильмов, так что необходимый вам по смыслу вариант вы всё же обнаружите.
Примечательно, что в ТамТам разработчики встроили не только аудиозвонки, но и видеочат, что, в общем, тоже даёт Телеграму фору. И работает это на вполне приемлемом уровне, да и качество нормальное – интерфейс во многом напоминает известный нам WhatsApp.
Ещё один момент, касающийся шифрования. Признаюсь, мне так и не удалось окончательно докопаться до способа шифрования сообщений, поэтому здесь всё довольно-таки туманно. Неизвестно даже, шифруются ли они вообще.
Правда, на Хабрахабре можно найти пост одного из разработчиков ТамТама, где он рассказывает о том, что создатели старались сфокусироваться именно на оптимизации скорости работы даже в условиях плохой связи, но вот про шифрование там тоже ничего не говорится.
Стоит ли переходить из Telegram
На этот вопрос нет прямого ответа. Скажу только, что если вы уже привыкли к Телеграму и сможете без труда обойти его блокировку при помощи SOCK5 или VPN, то, скорее всего, ТамТам вам не нужен.
Здесь вы (по крайней мере, пока) не найдёте большинства популярных каналов с оригинальным контентом, а базу с контактами вам и вовсе придётся пополнять заново, уговаривая знакомых устанавливать новый мессенджер.
Наверняка вы будете скучать и по полюбившимся многим стикерам-мемам, ведь вряд ли их заменят анимированные картинки, например, из «Физрука».
Да, и, конечно, нет никакой гарантии, что «Большой брат» не следит за вашей личной перепиской, от чего становится не очень комфортно при общении, согласитесь.
Однако на вопрос – есть ли будущее у ТамТама – можно всё же ответить положительно. Почему? Несмотря на специфическую атмосферу Одноклассников, которая присутствует в мессенджере, он всё же производит вполне позитивное впечатление.
Одним словом, ТамТам отлично подойдёт для семейного общения, например, чтобы в любой момент позвонить родителям или близким друзьям.
На этом всё, не забывайте подписываться на мой Телеграм-канал, делитесь своим опытом использования ТамТама и приглашайте друзей участвовать в обсуждении. До скорой встречи!
Архитектура приложения
Много рассказывать про архитектуру не буду, но совсем не упомянуть о её законах жанра, как говорится, не позволяют. Докладов и статей про MVVM уже очень много (например, классический туториал в версии для Objective-C b RAC: часть 1, часть 2, или статья о реализации этого паттерна для Swift).
Под слоем ViewModels есть набор сервисов, который реализует (и по возможности инкапсулирует) бизнес-логику, логику работы с протоколом и кеширование. Навигация в приложении осуществляется с помощью так называемого роутера, т. е. объекта, инкапсулирующего код, необходимый для открытия того или иного экрана. На самом деле роутеров в процессе стало несколько, поскольку у роутера есть тенденция становиться эдаким очень жирным God Object. Поэтому там, где это возможно, мы стараемся его декомпозировать. Например, за весь процесс регистрации/аутентификации пользователя отвечает отдельный роутер.
По опыту предыдущих проектов мы знали, что Dependency Injection очень упрощает структуру приложения и здорово облегчает изменения в архитектуре. В самом начале мы использовали для DI фреймворк Typhoon, но в ходе оптимизации времени запуска приложения выяснили, что разрешение зависимостей занимает непозволительно долгое время на старте приложения (единицы секунд на слабых устройствах). Поэтому мы перешли на ручной DI через property-based injection. Не сказал бы, что кода стало больше: уровень сервисов в приложении обычно настраивается в одном классе, а вся конфигурация сервисов легко читается. Для share и imessage экстеншенов, естественно, сервисы конфигурируются отдельно, поскольку в этом случае нужен гораздо меньший их набор.
Таким образом, связанность кода была изначально не очень большой, и даже через довольно продолжительное время после начала разработки мы без особого труда смогли вынести часть сервисов и обслуживающего кода в отдельную библиотеку (точнее, даже набор библиотек), которая реализует бо́льшую часть внутренней логики мессенджера, включая работу с протоколом и кеширование, и которую можно встраивать в другие приложения.
Answer on callback
post /answers
https://botapi.tamtam.chat/answers
This method should be called to send an answer after a user has clicked the button. The answer may be an updated message or/and a one-time user notification.
query Parameters
callback_id |
string Identifies a button clicked by user. Bot receives this identifier after user pressed button as part of |
Request Body schema: application/json
messageoptional |
object Nullable Fill this if you want to modify current message |
||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
notificationoptional |
string Nullable Fill this if you just want to send one-time notification to user |