ImageFeed - это приложение для просмотра фото из сервиса Unsplash. Пользователь авторизуется в приложении и просматривает фото. Фото возможно открыть в отдельном окне в высоком качестве. На фото можно добавлять и убирать лайки. Если пользователь закрывает приложение, данные об авторизации сохраняются и при новом открытии авторизация не требуется. Если пользователь выходит из приложения, то данные авторизации стираются.
![Simulator Screenshot - iPhone 15 Pro_1](https://private-user-images.githubusercontent.com/42520208/286336995-f37ba65e-6572-411a-944c-42868c9979ec.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwMzMzOTgsIm5iZiI6MTcxODAzMzA5OCwicGF0aCI6Ii80MjUyMDIwOC8yODYzMzY5OTUtZjM3YmE2NWUtNjU3Mi00MTFhLTk0NGMtNDI4NjhjOTk3OWVjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDE1MjQ1OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVjZmU5NDgyMGNiN2E5NTRlMDY0NzIzYWYwNjUyN2RkNDA4ZTk0ODkxN2FiYzU2MThiNzA5MzY1YzUwMTcxNTcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.e-KJ3GBxgk_EiTLTv6quvLQjJLb86h9bhPi3_AGHbjU)
![Simulator Screenshot - iPhone 15 Pro_2](https://private-user-images.githubusercontent.com/42520208/286337112-5d7b5ad3-684f-406e-9361-0cd6248fd459.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwMzMzOTgsIm5iZiI6MTcxODAzMzA5OCwicGF0aCI6Ii80MjUyMDIwOC8yODYzMzcxMTItNWQ3YjVhZDMtNjg0Zi00MDZlLTkzNjEtMGNkNjI0OGZkNDU5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDE1MjQ1OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY0YjY3ZjBjOTUyZThkMDNkODAxZmQwYzA4NDIwMWM5NjVmOTM4ZmU5NmNhOWI5OWQ3ZDczMGYwMTNjYWNmYTcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.4pR25kVX8SYIi_HatsoNWGpFZIqjwmx51aTdU6kffSw)
![Simulator Screenshot - iPhone 15 Pro_3](https://private-user-images.githubusercontent.com/42520208/286337154-02333518-ef88-45fe-9fb7-622bcd7998a9.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwMzMzOTgsIm5iZiI6MTcxODAzMzA5OCwicGF0aCI6Ii80MjUyMDIwOC8yODYzMzcxNTQtMDIzMzM1MTgtZWY4OC00NWZlLTlmYjctNjIyYmNkNzk5OGE5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDE1MjQ1OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM0MTY2YTdhY2NjMTY1YjkyMzdjYmNkOGUyMjY3NzI4NGU3ZTVjOTk0YWE2MjUyODQ3NzJmZGM4MDNjYjUwMzUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.4dr8qhMq2WmszRU3XFu-O36i_xjRHuAEmTJliwxnymg)
![Simulator Screenshot - iPhone 15 Pro_4](https://private-user-images.githubusercontent.com/42520208/286337260-1104e536-dc7b-43e1-93d1-55bd0d07b8f3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwMzMzOTgsIm5iZiI6MTcxODAzMzA5OCwicGF0aCI6Ii80MjUyMDIwOC8yODYzMzcyNjAtMTEwNGU1MzYtZGM3Yi00M2UxLTkzZDEtNTViZDBkMDdiOGYzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDE1MjQ1OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTgwMzA3NGUwNGUwYzhiODg4MjAwYmUzOWU2NTZkNmFkNWJkMTI1ZTNiZmFiM2Q5MDg4Y2Y5YjExMTU0OGE3MGEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.qOmiFXqgLNWixs6y2NrNEZ8y2kmTI0DIaP5-K13RQ8Y)
![Simulator Screenshot - iPhone 15 Pro_5](https://private-user-images.githubusercontent.com/42520208/286337261-d96be568-9adb-4cab-b713-c46abf3084e0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwMzMzOTgsIm5iZiI6MTcxODAzMzA5OCwicGF0aCI6Ii80MjUyMDIwOC8yODYzMzcyNjEtZDk2YmU1NjgtOWFkYi00Y2FiLWI3MTMtYzQ2YWJmMzA4NGUwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDE1MjQ1OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQxZmEwMWRmYmU1MGI5YmQ2OGQ4MmI1MjIxODhiODBjZTE1MDYxZDEyYmZlZTAyODBjNzdlOTRhNjViMGViNzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.tiNkzSTmFAx82i1euqsx7-9cXC3S0YA5xX1nhId7XtA)
![Simulator Screenshot - iPhone 15 Pro_6](https://private-user-images.githubusercontent.com/42520208/286337296-2b29f93c-87ec-48ae-9753-7644ea35d913.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTgwMzMzOTgsIm5iZiI6MTcxODAzMzA5OCwicGF0aCI6Ii80MjUyMDIwOC8yODYzMzcyOTYtMmIyOWY5M2MtODdlYy00OGFlLTk3NTMtNzY0NGVhMzVkOTEzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjEwVDE1MjQ1OFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM5Y2Q2ZDJlMGI3NjVkMGI4N2IzNmE0NWJjNzFiYjQ5NmZlNjZkODk3MzA1ZGY1ZGE5MWNhMTFmOTVjZjVhYzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.lEjWymVFaOt_VjihKdQ55FJrGOkmKlejg8Rtn6MCSh4)
- В приложении обязательна авторизация через OAuth Unsplash.
- Главный экран состоит из ленты с изображениями. Пользователь может просматривать ее, добавлять и удалять изображения из избранного.
- Пользователи могут просматривать каждое изображение отдельно и делиться ссылкой на них за пределами приложения.
- У пользователя есть профиль с избранными изображениями и краткой информацией о пользователе.
- При отсутсвии интернет-соединения показывается алерт с проблемой соединения
- Запускается без дополнительных требований;
Для входа в приложение пользователь должен авторизоваться через OAuth.
Экран авторизации содержит:
- Логотип приложения
- Кнопку «Войти»
Алгоритмы и доступные действия:
- При входе в приложение пользователь видит splash-screen;
- После загрузки приложения открывается экран с возможностью авторизации;
- При нажатии на кнопку «Войти» открывается браузер на странице авторизации Unsplash;
- При нажатии на кнопку «Login» браузер закрывается. В приложении появляется экран загрузки;
- Если авторизация через OAuth Unsplash не настроена, по нажатию на кнопку логина ничего не происходит;
- Если авторизация через OAuth Unsplash настроена не корректно — пользователь не сможет войти в приложение;
- При неудачной попытке входа всплывает модальное окно с ошибкой;
- При нажатии на «ОК» пользователь переходит обратно на экран авторизации;
- Если авторизация прошла успешно, то браузер закрывается. В приложении открывается экран с лентой.
- При нажатии на кнопку «Войти» открывается браузер на странице авторизации Unsplash;
В ленте пользователь может просматривать изображения в ленте, переходить к просмотру отдельного изображения и добавлять их в избранное.
Экран ленты содержит:
- Карточку с изображением;
- Кнопку Лайк;
- Дата загрузки фотографии;
- Таб бар для навигации между лентой и профилем.
Алгоритмы и доступные действия:
- Экран с лентой открывается по умолчанию после входа в приложение;
- Лента содержит изображения из Unsplash Editorial;
- При скролле вниз и вверх пользователь может просматривать ленту;
- Если изображение не успело загрузиться, то пользователю отображается системный лоадер;
- Если изображение невозможно загрузить – пользователь видит плэйсхолдер вместо изображения;
- При нажатии на кнопку Лайк (серое сердечко) пользователь может лайнкуть изображение. После нажатия отображается лоадер:
- Если запрос успешный, то лоадер пропадает, иконка меняет состояние на Кнопку Красный Лайк (красное сердечко).
- Если запрос не успешный, то всплывает модальное окно с ошибкой «попробуйте еще раз»
- Пользователь может убрать лайк, повторно нажав на кнопку Лайк (красное сердечко). После нажатия отображается лоадер:
- Если запрос успешный, то лоадер пропадает, иконка меняет состояние на серое сердечко.
- Если запрос не успешный, то всплывает модальное окно с ошибкой «попробуйте еще раз»;
- При нажатии на карточку с изображением оно увеличится до границ телефона и пользователь перейдет на экран просмотра изображения (раздел «Просмотр изображения на весь экран»);
- При нажатии на иконку профиля пользователь может перейти в профиль;
- Пользователь может переключаться между экранами ленты и профиля с помощью таб бара.
Из ленты пользователь может перейти к просмотру изображения на весь экран и поделиться им.
Экран содержит:
- Увеличенное изображение до границ телефона;
- Кнопку возврата на предыдущий экран;
- Кнопку для загрузки изображения и с возможностью им поделиться.
Алгоритмы и доступные действия:
- При открытии изображения на весь экран пользователь видит растянутое изображение до границ экрана. Изображение выровнено по центру;
- Если изображение невозможно загрузить и показать – пользователь видит плэйсхолдер;
- Если ответ на запрос не получен — появляется системный алерт с ошибкой;
- При нажатии на кнопку Назад пользователь может вернуться на экран просмотра ленты;
- При помощи жестов пользователь может перемещаться по растянутому изображению, зумировать и поворачивать изображение. Изображение фиксируется в выбранном положении;
- Если не настроены жесты для увеличения или поворота изображения — эти действия будут не доступны;
- При нажатии на кнопку кнопку Поделиться всплывает системное меню, в котором пользователь может загрузить изображение или поделиться им;
- После совершения действия меню скрывается;
- Пользователь может закрыть меню свайпом вниз или при нажатии на крестик;
- Если открытие системного меню при нажатии на кнопку “загрузить или поделиться изображением” не настроено — оно не будет показываться;
Пользователь может перейти в свой профиль, чтобы посмотреть данные профиля или выйти из него.
Экран профиля содержит:
- Данные профиля;
- Фотографию пользователя;
- Имя и username пользователя;
- Информация о себе;
- Кнопку выхода из профиля;
- Таб бар;
Алгоритмы и доступные действия:
- Данные профиля загружаются из профиля в Unsplash. Данные профиля нельзя изменить в приложении;
- Если данные профиля не подтянулись из Unsplash, то пользователь видит плэйсхолдер вместо аватрки. Username и имя не отображаются;
- При нажатии на кнопку выхода из профиля (логаут) пользователь может выйти из приложения. Всплывает системный алерт с подтверждением выхода;
- Если пользователь нажимает «Да», то он разлогинивается и открывается экран авторизации;
- Если не настроены или настроены неправильно действия с кнопкой «Да», то при нажатии пользователя не разлогинивается и попадает на экран авторизации;
- Если пользователь нажимает «Нет», то он возвращается на экран профиля;
- Если алерт не настроен, то при нажатии на кнопку выходы ничего не происходит, пользователь не может разлогиниться;
- Если пользователь нажимает «Да», то он разлогинивается и открывается экран авторизации;
- Пользователь может переключаться между экранами ленты и профиля с помощью таб бара.
- Приложение должно поддерживать iPhone X и выше и адаптировано под iPhone SE, минимальная поддерживаемая версия операционной системы - iOS 13.0;
- Режим просмотра - портретный;
- В приложении используются стандартные шрифты - SF Pro;
- Для хранения токена используется KeyChain;
- Архитектура приложения MVP;
- Верстка сторибордом и кодом.
Подключены через SPM:
- KingFisher;
- ProgressHUD;
- SwiftKeychainWrapper.