История тамбурина

Как заработать в ТамТам

Благодаря тому, что этот сервис еще не так популярен и раскручен — создавать и продвигать свои каналы в нем значительно проще, дешевле и перспективнее.

Уверен, смышленые и быстрые на подьём интернет предприниматели уже активно взялись за это направление. Признаюсь, я не из их числа, и, скорее всего, зря.

Подумайте об этом. И я поразмышляю )

В ближайшее время, наверняка, появится дополнительный функционал, который позволит создавать и продвигать приложения. Возможно те же боты, как и в Телеграмме. Увидим.

А я на этом заканчиваю. Оставляйте комментарии, подписывайтесь на обновления, в том числе на Телеграм канал блога 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

name

string characters

Command name

descriptionoptional

string characters Nullable

Optional command description

photooptional

object Nullable

Request to set bot photo

urloptional

string non-empty Nullable

Any external image URL you want to attach

tokenoptional

string Nullable

Token of any existing attachment

photosoptional

object Nullable

Tokens were obtained after uploading images

property name*optional

object (PhotoToken)

token

string

Encoded information of uploaded image

Сходства и различия с 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

text

string Nullable

Message text

attachments

Array of objects (AttachmentRequest) Nullable

Message attachments. See and it’s inheritors for full information

Array

type

string

image

payload

object

Request to attach image. All fields are mutually exclusive

urloptional

string non-empty Nullable

Any external image URL you want to attach

tokenoptional

string Nullable

Token of any existing attachment

photosoptional

object Nullable

Tokens were obtained after uploading images

property name*optional

object (PhotoToken)

token

string

Encoded information of uploaded image

link

object Nullable

Link to Message

type

string

Enum: «forward» «reply»

Type of message link

mid

string

Message identifier of original message

notifyoptional

boolean

Default: true

If false, chat participants would not be notified

notificationoptional

string Nullable

Fill this if you just want to send one-time notification to user

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector