This is a friendly competition app where groups can create specific battles amongst themselves. For example, who can drink more water during the week. Images for proof can be submitted to keep players honest.
- Category: Social
- Mobile: Can have more real-time updates and watch some sort of progress bar. The app could also incorporate posting to social media for winning and photo galleries to track progress. Maps could also be a component for certain challenges.
- Story: This would be a good way to keep track of friendly competitions and also encourage people to have better habits by doing challenges together.
- Market: The market for this app would be any friend group.
- Habit: This is pretty habit-forming because of the need to keep updating your status to stay on top of it
- Scope: This app seems in scope in terms of creating an app where "challenges" can be set with a time limit and users can post photos and see overall progress against each other.
Required Must-have Stories
- User can login
- User can create an account
- User can create a challenge
- User can invite their friends
- User can update their progress on the challenge
- User can customize the numerical amount that it is counting (e.g. liters, miles, days, etc.)
- User can post photos into an internal gallery
- User can set a time limit on a challenge
- User can see their ranking on a certain challenge
- User can see their ongoing challenges
- User can find challenges
- User can find friends
- User can link to their Facebook and find facebook friends
Optional Nice-to-have Stories
- User can watch a progress bar throughout the challenge
- Public and private challenges
- User can post completed challenges to social media
- User can add in maps for running challenges
- User can access HealthKit
- User can see trending challenges
- Generates photo highlight reel after challenge is over
- Login Screen
- User can login
- Registration Screen
- User can create an account
- Profile Screen
- User can invite friends
- linking their account
- User can invite friends
- Settings Screen
- User can edit some features
- Creation
- User can create a challenge
- User can set a time limit
- Challenge Screen
- User can see a leaderboard
- Log Screen
- User can update their progress
- User can post photos
- Find friends Screen
- User can invite friends
- search for friends
- User can invite friends
- Search Screen
- User can find challenges
- Stream
- User can see their ongoing challenges
Tab Navigation (Tab to Screen)
- Home Feed
- Creation
- Search
- Find Friend
- Profile
Flow Navigation (Screen to Screen)
- Login Screen
- Home
- Registration Screen
- Home
- Settings Screen
- None
- Creation Screen
- Home (after done)
- Challenge Screen
- Home (after done)
- Find Friend Screen
- Creation Screen (select a group of friends)
- Search Screen
- Home
- Stream Screen (home)
- Challenge Screen
- Profile Screen
- None
User
| Property | Type | Description |
|---|---|---|
| objectId | String | unique id for the user object(default field) |
| username | String | username |
| password | String | password |
| profilePic | File | profile Image for the user |
| friends | String Array | array of objectids for friends |
| likes | String Array | array of objectids for liked challenges |
| completed | String Array | array of objectids for completed challenges |
| won | String Array | array of objectids for won challenges |
Challenge
| Property | Type | Description |
|---|---|---|
| objectId | String | unique id for the challenge object(default field) |
| name | String | name of challenge |
| unit | String | unit used in challenge (liters, miles, etc.) |
| timeStart | DateTime | start time of challenge |
| timeEnd | DateTime | end time of challenge |
| createdAt | DateTime | when challenge was created |
| public | Bool | whether the challenge is public or not |
| likeCount | Number | number of likes |
| author | Pointer to user | author of challenge |
| complete | Bool | whether the challenge is done |
Inbox
| Property | Type | Description |
|---|---|---|
| objectId | String | unique id (default field) |
| user1 | Pointer to user | user that sent request |
| user2 | Pointer to user | user that received the request |
| challenge | Pointer to challenge | challenge that was shared (optional) |
Log
| Property | Type | Description |
|---|---|---|
| objectId | String | unique id (default field) |
| author | Pointer to user | author of the log |
| challenge | Pointer to challenge | challenge that is being logged to |
| image | File | image being logged |
| units | Number | number of units being logged |
Participants
| Property | Type | Description |
|---|---|---|
| objectId | String | unique id (default field) |
| user | Pointer to user | user participating |
| challenge | Pointer to challenge | challenge that they are participating in |
- Read/GET
PFQuery *query = [PFQuery queryWithClassName:@"Challenge"];
[query whereKey:@"name" equalTo:@"water"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
// The find succeeded.
NSLog(@"Successfully retrieved %d scores.", objects.count);
// Do something with the found objects
for (PFObject *object in objects) {
NSLog(@"%@", object.objectId);
}
} else {
// Log details of the failure
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
- Create/POST
PFObject *challenge = [PFObject objectWithClassName:@"Challenge"];
challenge[@"name"] = @"water";
[challenge saveInBackgroundWithBlock:^(BOOL succeeded, NSError * _Nullable error) {
if (succeeded) {
// The object has been saved.
} else {
// There was a problem, check error.description
}
}];
- Update/PUT
PFQuery *query = [PFQuery queryWithClassName:@"Challenge"];
// Retrieve the object by id
[query getObjectInBackgroundWithId:@"someId"
block:^(PFObject *challenge, NSError *error) {
challenge[@"name"] = @"new";
[challenge saveInBackground];
}];
Screens
- Login Screen
- (Read/GET) Query to see if user exists
- Registration Screen
- (Create/POST) Create a new user
- Profile Screen
- (Read/GET) Query to see user profile
- (Update/PUT) Update user profile image
- Creation
- (Create/POST) Create a new challenge object
- (Create/POST) Create a new inbox object
- (Update/PUT) Update user challenges
- Challenge Screen
- (Read/GET) Query to get challenge object
- (Read/GET) Query to get participants
- (Read/GET) Query to get log
- (Create/POST) Create a new inbox object
- Log Screen
- (Create/POST) Create a new log object
- Find friends Screen
- (Create/POST) Create a new inbox object
- (Read/GET) Query to get user objects
- Search Screen
- (Read/GET) Query to get challenge object
- (Update/PUT) Update user challenges
- (Create/POST) Create a new participant object
- Stream
- (Read/GET) Query to get challenge object
- (Read/GET) Query to get user object
- (Update/PUT) Update user challenges
- (Create/POST) Create a new participant object
- Inbox
- (Create/POST) Create a new participant object
- (Update/PUT) Update user challenges
- (Update/PUT) Update user friends
- [OPTIONAL: List endpoints if using existing API such as Yelp]
