This application consists of nine full screens for searching and communicating with people, and the Firebase as a Backend-as-a-service solution for this project. The user can log in the application either through email and password or via Google, create their own profile. After successful authorization, he can search for people, add them as friends, chat with them, send them photos.
For a simple test of my app you can use the login and password below in Sign up screen:
Login: a@mail.ru
Password: 123456
- UICollectionView Compositional Layout and UICollectionView Diffable DataSource
- AutoLayout programmatically using NSLayoutAnchor and StackViews
- Architecture: MVC
- CocoaPods
- Firebase:
- FirebaseAuth (Email/Google Authentication)
- Firestore (for storing user's info and data about active and waiting chats)
- Storage (to store users' avatars and pictures sent in chats)
- MessageKit + InputBarAccessoryView (for real-time chat with images and text messages)
- SDWebImage 5.0 (for asynchronous image loading and caching)
Auth and profile setup viewControllers:
At the auth stage, the app can show several types of errors to the user through alert.
All fields must be filled in and the avatar picture uploaded for successful authorization
![](https://private-user-images.githubusercontent.com/115653999/238139103-8b9ff43d-2432-4bec-ba3d-214e654d97eb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MzA4MTksIm5iZiI6MTcyNDczMDUxOSwicGF0aCI6Ii8xMTU2NTM5OTkvMjM4MTM5MTAzLThiOWZmNDNkLTI0MzItNGJlYy1iYTNkLTIxNGU2NTRkOTdlYi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyN1QwMzQ4MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1mY2EyNDU2MzAyZjk2MWZmYWQwMzdjMDdlNzY5OGJiMzQ1NjVjNzI1NmQ4ZDBlYjk2N2VkNTk4YzkwOWE3MzMxJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.wf8A-ocETsfc82Epl882xUMOTQQsgLkJAxlfNC9iFMw)
![](https://private-user-images.githubusercontent.com/115653999/238139131-9d49d26f-cf30-42a9-bf66-3f5d7ffff756.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MzA4MTksIm5iZiI6MTcyNDczMDUxOSwicGF0aCI6Ii8xMTU2NTM5OTkvMjM4MTM5MTMxLTlkNDlkMjZmLWNmMzAtNDJhOS1iZjY2LTNmNWQ3ZmZmZjc1Ni5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyN1QwMzQ4MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT03NzBiNzcyODUyMWM1YmU1NjcwZTFlY2U2NDZhZTBlMmU4NDU4MDA4OThjMjgxZWQ1N2Q2YzkwNGYyNjg1MzE0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.2M5oDv9vXiq7CYz9TjseSoloZiG2fyE0RPVabOy8OXA)
![](https://private-user-images.githubusercontent.com/115653999/238139134-1fcecad2-0f49-4ffc-8166-bdeb824054a5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MzA4MTksIm5iZiI6MTcyNDczMDUxOSwicGF0aCI6Ii8xMTU2NTM5OTkvMjM4MTM5MTM0LTFmY2VjYWQyLTBmNDktNGZmYy04MTY2LWJkZWI4MjQwNTRhNS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyN1QwMzQ4MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wYTY5NzU3ZTUxMmY5YWNiNmYzYmQ3MzExYTQ1ZjA4NDQ3ZjcyNjMxYzUwMDU1NWI2ODY3OWZjMmIwNDFlZTcyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.wQu6N6w68QynacwA_WR_TaCkRsBXolhnVMhqGZv1Naw)
![](https://private-user-images.githubusercontent.com/115653999/238148044-d25fd977-098b-407f-9343-4109c9c47eb4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MzA4MTksIm5iZiI6MTcyNDczMDUxOSwicGF0aCI6Ii8xMTU2NTM5OTkvMjM4MTQ4MDQ0LWQyNWZkOTc3LTA5OGItNDA3Zi05MzQzLTQxMDljOWM0N2ViNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyN1QwMzQ4MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1hNzAyOTFkYmIzYTU4Y2ZkMzRkZjlmNGM1MmYyMzQzMzNjNjg2M2I0Mjg1OWY1ODg2Zjk4ZmZjY2VkMDBhMjgzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.GOf-TGW6AFq9ea0vU9JgtLhmeeV_2JNflK-jVKGD-Ao)
Main viewControllers:
ListenerRegistration is used for observing users and chats and getting actual data from the server.
SearchBar is used for searching people by the input text.
CAGradientLayer is used for custom buttons.
![](https://private-user-images.githubusercontent.com/115653999/238149831-65d747cc-ac0f-4fba-952a-912c614f94e1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MzA4MTksIm5iZiI6MTcyNDczMDUxOSwicGF0aCI6Ii8xMTU2NTM5OTkvMjM4MTQ5ODMxLTY1ZDc0N2NjLWFjMGYtNGZiYS05NTJhLTkxMmM2MTRmOTRlMS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyN1QwMzQ4MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0zOWVkZjFiZmI1ZTY0OThiZDEzNjk1ODUzYzIxOWRkMDk4NDlkODNlMTIzNDJiNmJhYWQ0NjAyYTM3YWRkNDVkJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.gE4-sTloD5G31iXOBikwbKy1q8Y86v82WhzDz8eop3Q)
![](https://private-user-images.githubusercontent.com/115653999/238149837-4a42cf60-6cae-4d52-a772-ff406c393cfc.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MzA4MTksIm5iZiI6MTcyNDczMDUxOSwicGF0aCI6Ii8xMTU2NTM5OTkvMjM4MTQ5ODM3LTRhNDJjZjYwLTZjYWUtNGQ1Mi1hNzcyLWZmNDA2YzM5M2NmYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyN1QwMzQ4MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04OThlYzU1YTNmNjNkMTVkYzQ2NDFhMjRjM2U0NTI4ZDdiZGU5MjVhZGQyMzRkMDIwMmI5ODljNzYwNDQ4Y2YyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.h5dwppCniuQwFKV7ackCJVPSvSjPBxlvbfYJaeUw-rY)
Extra viewControllers and real-time chat:
![](https://private-user-images.githubusercontent.com/115653999/238149929-e3851c35-9dad-4ab3-aaf5-1ad20172ed57.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MzA4MTksIm5iZiI6MTcyNDczMDUxOSwicGF0aCI6Ii8xMTU2NTM5OTkvMjM4MTQ5OTI5LWUzODUxYzM1LTlkYWQtNGFiMy1hYWY1LTFhZDIwMTcyZWQ1Ny5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyN1QwMzQ4MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lN2E0MzU2ZWQwZWVlNmI5ZTk2MmY0NzEwZjAzNGJkYzhhZTIyZjM5MjhiMTg1YWZkMTdkZGQ0MjYzOGVmY2RiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.xMSuxD7_HUl5hovXUfZpCswl1IyNRkmXpsak2NYDlWw)
![](https://private-user-images.githubusercontent.com/115653999/238149937-7a8e5591-e76f-4408-a641-5c5efc40ef0c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MzA4MTksIm5iZiI6MTcyNDczMDUxOSwicGF0aCI6Ii8xMTU2NTM5OTkvMjM4MTQ5OTM3LTdhOGU1NTkxLWU3NmYtNDQwOC1hNjQxLTVjNWVmYzQwZWYwYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyN1QwMzQ4MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04MzY3NzI5OTQxMzBiYzgzMzEyY2QxNzMwZDdkYmYxZmQzMmQzZTVhYzQ2OGI2NDg3ODY4YjljNDFkMTc4ZjRjJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.mEBK5d-MtKXxISlRUoq9cYc0qayc8uiAAUFYtoZVuZM)
![](https://private-user-images.githubusercontent.com/115653999/238149940-59c13a43-f23f-4ff0-8d90-e92fe489c569.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MzA4MTksIm5iZiI6MTcyNDczMDUxOSwicGF0aCI6Ii8xMTU2NTM5OTkvMjM4MTQ5OTQwLTU5YzEzYTQzLWYyM2YtNGZmMC04ZDkwLWU5MmZlNDg5YzU2OS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyN1QwMzQ4MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xZTE2N2FhOTdhNjljYTBhYjQwOTJjMDYzNzg5YWVkZGI0YmU5MzRjZmFlNzVlZmVkNjUxYzM5ZDU4NDkwZjJkJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.5H1MmR5CCCbZmmY_CH_L131zT5NfiHbecWhAF8bJ4ak)