Juno is an online dating app that displays user compatibility based on their sun sign(astrology). Users are then able to swipe and like/dislike the suggested profiles based on their photos and a small bio. Users are able to exchange messages after they match.
- Category: Lifestyle/Social
- Mobile: Maps, camera, location, push, real-time
- Story: In this digital age of dating, we take back control and focus on those prefrences that suit us when looking for partners, by adding additonals filters like race as to find partner that we have more in common with, or learn a new culture from or Birth month so as to find that match made in heavean we ar able to find the person right for you.
- Market: Anyone 18 and over that is interested in online dating and astrology.
- Habit: Endless swiping through profiles, talking to new people, and the simplicity of the app makes it very addictive.
- Scope: Will be focused on implementing the in-app messaging and compatbility matching features. These will be relatively easy to complete and can be done within the expected time frame.
Required Must-have Stories
- User can log in.
- User stays logged in across app restarts.
- User can create an account.
- User can view a feed of profiles.
- User can tap yes/no to a profile.
- User can view their compatibility score with other users.
- User can send messages to matched profiles.
- User can view their profile with their age and number of matches.
- User can update their profile.
- User can modify their settings.
- User can logout.
Optional Nice-to-have Stories
- User can receive notifications.
- User can upload more than one photo.
- User can view their compatibility with other users based on their birth chart.
- User can swipe to say yes/no to a profile.
- User can filter the results.
- Login
- User can log in.
- User stays logged in across app restarts.
- Registration
- User can create an account.
- Stream
- User can view a feed of profiles.
- User can tap yes/no to a profile.
- User can view their compatibility score with other users.
- Messaging
- User can send messages to matched profiles.
- Profile
- User can view their profile with their age and number of matches.
- User can update their profile.
- Settings
- User can update their email, location, time of birth etc.
- User can logout.
- User can receive notifications.
Tab Navigation (Tab to Screen)
- Home Feed
- Profile
- Chat
Flow Navigation (Screen to Screen)
- Login Screen
- Home Feed
- Registraton Screen
- Home Feed
- Stream Screen
- Profile
- Chat
- Messaging Screen
- Profile
- Stream
- Profile Screen
- Stream
- Chat
- Settings Screen
- Profile
- Login Screen
- Registraton Screen
- Stream Screen
- Profile Screen
- Settings Screen
- Messaging Screen
Property | Type | Description |
---|---|---|
userId | String | unique id for users |
fname | String | the user's first name |
lname | String | the user's last name |
username | String | the unique name the user logs in with |
password | String | the string the user will use to verify their identity |
location | String | where the user is located |
dob | DateTime | the user's date of birth |
birthLocation | String | where the user was born |
profilePhoto | File | the image that the user chooses for their profile |
likes | Array | an array of user profiles that the user has liked |
matches | Array | an array of user profiles that the user has matched with |
jobTitle | String | the user's occupation |
companySchool | String | the user's company/school |
sign | String | the user's star sign |
Property | Type | Description |
---|---|---|
sign | Array | map used to store the compatibility value between each sign |
- Login Screen
- (Read/GET) Query logged in user object
let username = usernameField.text! let password = passwordField.text! PFUser.logInWithUsername(inBackground: username, password: password) { (user, error) in if user != nil { self.performSegue(withIdentifier: "loginSegue", sender: nil) } else { print("Error: \(error?.localizedDescription)") } }
- (Read/GET) Query logged in user object
- Registration Screen
- (Create/POST) Create a new user
let user = PFUser() user.username = usernameField.text user.password = passwordField.text user.signUpInBackground { (success, error) in if success { self.performSegue(withIdentifier: "loginSegue", sender: nil) } else { print("Error: \(error?.localizedDescription)") } }
- (Create/POST) Create profile photo and additional user info
let currentProfile = PFObject(className: "Profile") profile["userId"] = PFUser.current()! let imageData = imageView.image!.pngData() let file = PFFileObject(name: "image.png", data: imageData!) currentProfile["profilePhoto"] = file currentProfile["name"] = nameField.text currentProfile.saveInBackground { (success, error) in if success { self.dismiss(animated: true, completion: nil) print("saved!") } else { print("error!") } }
- (Create/POST) Create a new user
- Stream Screen
- (Read/GET) Query profiles that the user has not liked
let query = PFQuery(className:"Profile") query.whereKey("userId", notContainedIn: currentProfile["likes"]) query.findObjectsInBackground { (profiles: [PFObject]?, error: Error?) in if let error = error { print(error.localizedDescription) } else if let profiles = profiles { print("Successfully retrieved \(profiles.count) profiles.") // TODO: Do something with profiles... } }
- (Create/POST) Create a new like on a profile
user = PFUser.current()! currentProfile.add(user, forKey: "likes") currentProfile.saveInBackground { (success, error) in if success { print("Like added") } else { print("Error adding like") } }
- (Read/GET) Query profiles that the user has not liked
- Profile Screen
- (Update/PUT) Update user profile image and additional user info
let imageData = imageView.image!.pngData() let file = PFFileObject(name: "image.png", data: imageData!) currentProfile["profilePhoto"] = file currentProfile["about"] = aboutMeField.text currentProfile.saveInBackground { (success, error) in if success { self.dismiss(animated: true, completion: nil) print("saved!") } else { print("error!") } }
- (Update/PUT) Update user profile image and additional user info
- Settings Screen
- (Update/PUT) Update user info
let location = locationField.text currentProfile["location"] = location currentUser.saveInBackground { (success, error) in if success { print("Changes saved") } else { print("Error saving changes") } }
- (Update/PUT) Update user info
- Messaging Screen
- (Read/GET) Query matched profiles
let query = PFQuery(className:"User") query.whereKey("userId", containedIn: matches) query.findObjectsInBackground { (profiles: [PFObject]?, error: Error?) in if let error = error { print(error.localizedDescription) } else if let profiles = profiles { print("Successfully retrieved \(profiles.count) profiles.") // TODO: Do something with profiles... } }
- (Read/GET) Query messages
let predicate = NSPredicate(format: "conversation_id == %@", conversationId) self.conversation_query = Message.query(with: predicate)?.order(byAscending: "createdAt") self.conversation_query.findObjectsInBackground { (objects, err) in if err==nil { if let messages = objects as? [Message] { self.messages = messages self.collectionView.reloadData() } } }
- (Create/POST) Create new message
message.body_text = text message.saveInBackground { (saved, err) in if saved { print("Message sent") }else { if let error = err { print(error.localizedDescription) } } } finishSendingMessage()
- (Read/GET) Query matched profiles