GithubHelp home page GithubHelp logo

alecsmirnov / focusstartfinaltask Goto Github PK

View Code? Open in Web Editor NEW
0.0 4.0 0.0 14.87 MB

Focus Start iOS 2020 - финальный проект (Messenger на VIPER архитектуре с применением Firebase и CoreData)

Swift 99.95% Ruby 0.05%

focusstartfinaltask's Introduction

Focus Start iOS 2020 - финальный проект

Разработано приложения для общения между пользователями 1 на 1. Приложение написано с применением архитектуры VIPER. В качестве базы данных использовалась реалтайм база данных Firebase. Для хранения данных пользователя использовалась CoreData.

Комментарий

Изначально я пытался сделать с возможностью групповых чатов, но из-за нехватки времени пришлось всё быстренько (2 дня) чистить и удалять. Из-за этого не успел вернуть отображение о прочтении сообщения собеседником, в виде галочек, как в телеграме. Сама возможность осталась и работает, каждое непрочитанное сообщение, что видит пользователь на экране - моментально "читается" и обновляется в БД, но для собеседника обновление не отображается т.к. изменил принцип наблюдения за изменениями. Так же из-за этого не успел вернуть/переделать и другие вещи. Также под нож отправилась возможность удалять и редактировать выбранные сообщения в чате. Сейчас можно удалить только все сообщения целиком, выбрав конкретный чат (очистить его лог). Из-за нехватки времени также не успел сделать модульные тесты. Логирование сделал, но потом убрал большую часть, т.к. попросту мешало/захламляло код.

БД, как мне кажется, вышла оптимальной. Её я лишь немного урезал, чтобы оставить саму возможность групповых чатов, но все таблицы, связанные с групповыми чатами больше не используются. Все данные чётко структурированы на 8 таблиц:

  • Пользователи - непосредственная информация о пользователях и время её обновления;
  • Чаты пользователей - ссылки (идентификаторы) на чаты, для конкретных пользователей и время их создания (пересоздания, если чат был удалён пользователем);
  • Последнее сообщение чата пользователя - ссылка на последнее сообщение для конкретного чата, конкретного пользователя, также время отправки сообщения;
  • Сообщения чата пользователя - ссылки на сообщения, для конкретного чата, конкретного пользователя (позволяет спокойно удалять, редактировать чаты, сообщения для конкретного пользователя);
  • Количество непрочитанных сообщений чата пользователя - кол-во сообщений и время обновления;
  • Статус пользователя - онлайн/офлайн состояние пользователя и время последней сессии;
  • Сообщения чата - непосредственные сообщения, которые хранятся вне зависимости от действий пользователей;
  • Участники чата - ссылки на участников конкретного чата.

Уровни вложенности минимальные, из-за чего отдельные данные можно легко получать, без необходимости грузить лишнее. Все связи между объектами сделаны посредством ссылок (идентификаторов), поэтому обновление каких-либо данных будет актуально для всех наблюдателей.

Используя CoreData и Firebase, сделал механизм хранения, получения и обновления новых данных, сделав приложение устойчивым к проблемам, отсутствию соединения с интернетом. В момент первой авторизации пользователя приложение проверяет наличие каких-либо данных, произошедших в момент отсутствия пользователя. Если имеются новые данные, чьё время обновления позже текущего времени обновления в приложении, приложение обновляет старые и сохраняет новые и время обновления. Если новых данных не поступало, приложение берёт данных из CoreData. Новые данные, повторят процесс обновления данных. Приложение хранит чаты и N-е количество последних сообщения. Количество сообщений зависит от параметров приложения.

Все сообщения группируются по датам (день, месяц, год), догружаются старые, если пользователь доходит до границы лога, как в настоящих мессенджерах)

Были кастомные переходы, они остались в паке Transitions, но из-за свайп-меню, того как сделано оно, как сделаны переходы, они конфликтуют, из-за чего иногда появляется баг с пропаданием вью статус бара. Не смог это исправить. Также из-за этого свайп-меню пришлось нарушить принцип VIPER'a, два модуля, по сути, являются частью одного модуля.

Описание приложения

Приложение состоит из следующий экранов:

Экран Логин

Экран для входа в приложение. Содержит поля для ввода email'а и пароля, а также кнопки:

  • Войти - в случае её нажатия, происходит проверка состояния полей для ввода и, один из возможных вариантов: a) уведомление пользователя о неправильном вводе; b) вход в приложение (переход на экран Чатов).
  • Создать аккаунт - в случае её нажатия происходит переход на экран Регистрации.

Экран Регистрации

Экран для создания пользовательского аккаунта. Состоит из 4-х полей, 3 из которых являются обязательными, а также из 2-х кнопок, аналогичных кнопкам на экране Логина. Обязательные поля: First name, Email, Password. Необязательное поле: Last name. В случае успешного создания аккаунта пользователь перейдёт на экран Чатов.

Экран Чатов

Экран для просмотра активных чатов и совершения действий над ними. Чат на экране представлен в виде:

  • имени пользователя;
  • его картинки профиля (если её нет, вместо неё буду инициалы имени пользователя);
  • значок его активности (находится ли он онлайн или офлайн);
  • текст последнего сообщения в данном чате (а также преписка, если оно отправлено вами);
  • время последнего сообщения в данном чате;
  • количество непрочитанных сообщений (если такие имеются).

Все изменения в профиле пользователя, с которым ведётся диалог, также моментально обновляются и в списке чатов. По свайпу влево, по выбранному чату, открывается меню:

  • очистить историю сообщений - все сообщения удаляются и являются непрочитанными (раньше была индикация как в телеграме, но из-за выпиливания групповых чатов и прочего урезания, её я сломал xD);
  • удалить чат - удаляет чат и сообщения для текущего пользователя, сообщения у собеседника и в таблице сообщений остаются нетронутыми. Чат является неактивным, пока один из пользователей не напишет сообщение.

Экран Переписки (Лог чата)

На данном экране происходит непосредственное общение с другим пользователем. На данном экране отображаются сообщения, сгруппированные по Дню, Месяцу, Году. Если переписка достаточно длинная, можно долистать до верхней границы диалога и потянуть вниз, инициировав загрузку предыдущих сообщений, которые не хранятся в памяти телефона. В зависимости от настроек приложения, можно устанавливать сколько последних сообщений будет хранится в памяти телефона, а также размер "порции" прошлых сообщений, которая будет загружена после одного действия "пулл рефреш". Для демонстрации (чтобы не приходилось писать много сообщений и потом листать их) оба эти значения равны 3-м.

Экран Поиска собеседника

Экран для поиска собеседника. Переход на него происходит при нажатии кнопки "Поиск", находящейся в правом верхнем углу экрана Чатов. Экран отображает всех пользователей данного приложения с возможностью сортировки их по имени. При выборе пользователя происходит переход на экран Переписка, в уже существующий диалог или в новый, если его раньше не было.

Экран Меню

Свайп меню, состоящее из 2-х пунктов:

  • редактировать профиль - при выборе данного пункта происходит переход на Экран редактирования профиля;
  • выйти из приложения - при выборе данного пункта происходит очистка всех данных пользователя на телефоне и выход из аккаунта и приложения, возвращая пользователя к экрану Логина.

Экран редактирования профиля

Экран для редактирования информации пользователя. Состоит из:

  • картинка - при нажатии на которую, или снизу, на кнопку под ней, происходит открытие галереи или камеры для выбора изображения профиля пользователя (При выборе картинки происходит её ресайз под максимальный размер, среди всех, который отображает приложение. В данном случае 54 поинта);
  • поля для редактирования: First name, Last name, Email.

В случае, если пользователь не меняет Email, изменения в его профиле произойдут моментально, при нажатии на кнопку "Сохранить". Если пользователь решил поменять Email, приложение попросит подтвердить данное действие вводом пароля, после чего проверит совпадение пароля и доступность нового Email адреса. Если произошла неудача - приложение покажет соответствующее сообщение. Если всё хорошо - экран профиля будет закрыт и новые данные уже будут применены.

focusstartfinaltask's People

Contributors

alecsmirnov avatar

Watchers

 avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.