Download presentation
Presentation is loading. Please wait.
1
UMSI 363 Nancy A. Benovich Gilby
Busting Myths and Pursuing Information Innovations with Mobile Apps in SWIFT Week 5 Nancy A. Benovich Gilby Ehrenberg Director of Entrepreneurship Clinical Associate Professor University of Michigan School of Information
2
Today The importance of “Team”, part 2
Your Project has gone through 1 week: Share out on your value hypothesis, quotes, decide if you will pivot on target user, problem and value hypothesis Potentially review Target User, Problem or Value Hypothesis Start on part 2 of the MyBanks application: Learning objectives Competition Research, Matrix
3
MYTH: Great innovation teams are born not grown
4
MYTH #5 MYTH: Don’t do what the customer tells you to do
5
Team Project Overview Project Week:
Form your team, establish ground rules, Interviews round 1, build app scaffolding, Review Customer Development Round 1 and Potentially Pivot, Competition, sketch/wireframe Review Customer Development Round 2, Pivot, Competition 2, sketch/wireframe, Business Model Canvas Review Customer Development Round 3 Draft pitch, Dataset, backend, MVP prototype 1 KJ Affinity Diagram, final wireframe test with users All teams pitch and review, MVP prototype 2 Pitch and demo to VCs, Executives, Entrepreneurs
6
"BUILD SOMETHING FOR SOMEBODY INSTEAD OF EVERYTHING FOR NOBODY" - Geoffrey Moore in Crossing the Chasm
7
Share Out: Customer Development Round 1
Each team will huddle for 15 minutes to identify quotes from interviews to share with the group. Each person should try to share one or two quotes with the group that reinforced or negated the target user or problem If possible, each team should plan to play a recorded quote from their interviews. Teams should identify a questions about the process so far they might want to ask Nancy, other teams, or lab assistants. They will capture these on sticky notes. FIRST STANDUP: Tell me What you did last week to get the interviews done What you will do this week to get 3 each, 6 more done What obstacles you have
8
Share Out target user description what is their urgent problem?
What is your value hypothesis? Each partner shares (plays) ONE quote that either strongly support or negates their value hypothesis Group discussion
9
Readings From each of the readings share one meaningful quote, write it on the white board The Entrepreneur's Guide to Customer Development: Chpt 8 The Lean Startup: Chpt 5-8 Peopleware Chpt 14-17
10
What ARE we doing?
11
We are building a TEAM … Importance of “Team”
12
Value for Who?
13
Business Model Canvas The Business Model Canvas, is a strategic management and entrepreneurial tool. It allows you to describe, design, challenge, invent, and pivot your business model.
14
What are we doing with these interviews?
15
KJ Method (Jiro Kawakita) and Questioning
Obtain a 360 degree perspective of the actual environment in which the product or service would be used. You explore through: Open-ended inquiry Process observation Participant observation Build a team united around what’s meaningful to the users from a variety of perspectives….. REMEMBER DIVERSITY IN TEAMS……THIS IS WHY IT IS VITAL FOR INNOVATION
16
KJ Method (Jiro Kawakita) and Questioning
Build an Affinity Diagram = KJ Diagram A “tool”, at some of my companies we fondly referred to it a “the bull's-eye” structures detailed objective data into more general conclusions. Used for providing initial structure in problem exploration. Often structures answers to a “WHAT” question e.g. “What is the major problem users have right now with Obama Care” EXAMPLE: Wildfire
17
Affect and Report Language
In DESIGN THINKING – trying to get to what is MEANINGFUL to the user…..emotion, pain or joy Field of semantics distinguishes between two kinds of language Affective and Report Affective language – emotional information = context = WHY Report language – logical information = facts = 5 W 1H = WHO WHAT WHEN WHERE HOW
18
Reminders: Safe space and emotional ups and downs of entrepreneurship
19
Parse What is it? What will it do for you?
20
Building Blocks for a FULL App
For an information app, it needs to have CRUDS Create, Read, Update, Delete and Search! You will bang your head, it will be frustrating but when you are done you will have a fully functioning app: Signup, Login, Password Recovery, Create/Update/Delete/Search (transactions), Search for Nearby Banks.
21
Assignment #8 Build the iOS MyBank App – Security and PFUser Object
22
Assignment #8 Build the iOS MyBank App – Security and PFUser Object
23
Assignment #8 Build the iOS MyBank App – Security and PFUser Object
When we get ready to ship your app, you can “Lock Down” Parse to make it more secure
24
Assignment #8 Build the iOS MyBank App – Security and PFUser Object
25
Assignment #8 Build the iOS MyBank App – Security and PFUser Object
26
Assignment #8 Build the MyBanks App with Parse – Application Overview
Overview of the logic of the MyBank application: iOS Client – User Flow When the user comes in, they're not yet logged in. They have the ability to sign up and the ability to log in. This can also be skinned to your liking. Now when I log in, I can view my accounts balance
27
Assignment #8 Build the MyBanks App with Parse – Application Overview
Overview of the logic of the MyBank application: iOS Client – User Flow I can add some data, the balance updates. I go back. By clicking My Savings at the top. I can go to my profile and update both my user name and my password, as well as control my avatar from both the camera or the gallery
28
Assignment #8 Build the MyBanks App with Parse – Application Overview
Overview of the logic of the MyBank application: iOS Client – User Flow I can view all my transactions. I can go to my PF table controller and see the last two transactions that I've made.
29
Assignment #8 Build the MyBanks App with Parse – Application Overview
Overview of the logic of the MyBank application: iOS Client – User Flow I can view all banks within my location. So that's our functionality of My Bank
30
Assignment #8 Build the MyBanks App with Parse – Application Overview
Overview of the logic of the MyBank application: Back end This will be a financial application that's intention is to teach the CRUD methodologies for Parse. CRUD means Create data, the ability to Read data, to Update data, and then to Delete data. We'll also be experimenting with geo-points and files. On the back end we have 3 classes, User, transactions and locations
31
Complete the MyBanks App
32
Assignment #8 Build the iOS MyBank App Step - 25
Example TableView methods for TransactionsViewController with data from Parse, create prototype cell in storyboard For efficiency in all TableViews, we want to create a prototype cell in the storyboard, call it cell, for use with the dequeueReusableCellWithIdentifier method as below, add 1 to prototype cell in TableView, indentifier cell in the TableView Cell
33
Assignment #8 Build the iOS MyBank App Step - 26
Example TableView methods for TransactionsViewController with data from Parse In Transaction View Controller is where the data from the user's transactions will populate. We'll go into our Transaction View Controller . We'll first focus on a method called loadData. This will teach you how Parse handles cache values. I add a variable called transactionsData which is an NSMutableArray. The first thing I'm going to do in this method is to removeAllObjects. This method will be called on refresh when the user pulls down the table, or even on load. So the first thing we'll do, is remove all those objects. The second thing we'll do is create a user object. So this will be called currentUser, and it will be equal to the PFUser object. If that currentUser... is not equal to nil, we can access the data. The next thing we'll do is to create a variable called findTransactionData. And this can be equal to an instance of the PFQuery object with a className... from our database that's called transactions. Now findTransactionData will have a lot of properties regarding cache and cachePolicy. In this case our cachePolicy... Can be equal to ElseNetwork. The kPFCachePolicyNetworkElseCache will allow us to function if there is no network capability. Now what we can do is test to see if there are results in our current cache. So the hasCachedResult property will tell us about that. We can also clear the cache... For that specific result. Additionally, we can clear the entire cache for the PFQuery object, and clearAllCachedResults. We can also set a limit for dates, called maxCacheAge. And that's equal to seconds. So I'll give it a full day of seconds. Now we can do it make a query for all our transactions. So what I'm going to do is findTransactionData, the PFQuery object, and we're going to ask it for the Key of accountholder, which is the user object. So we'll do equalTo, our user object which is currentUser. We'll also want these to be in ascending order. We can do orderByAscending or Descending. We'll do Descending, as we want the latest to appear at the top. So the object we'll use here is that createdAt column that gets created by Parse automatically. Now what we can do is find our data. So we'll use findObjectsInBackgroundWithBlock. Again, we have to open up a curly brace as it does not auto populate. And what we can do in here is create an objects value that can be an instance of AnyObject. And the error will be our traditional NSError. We'll do our Void in, and now we can go in and extract that data. So if error is equal to nil, we'll have some success. And for this time, we're gonna have to loop around our object's variable. So I'll do a for in loop for object in objects. Let's continually add those objects. So I'm gonna use the addObject property of the PFQuery object, and the object we can add is simply the individual object. So lastly, I can do a self.tableView.reloadData() to reload our table with the new data. I can even control the refresh. I'm gonna optionally wrap that to endRefreshing(). See next slide for code Now add the code for the viewDidAppear and viewDidLoad methods.
35
Assignment #8 Build the iOS MyBank App Step - 27
Populate the TransactionsViewController TableView with data from Parse, using example code The next step is to populate our table cells. Since you have experience with iOS Table Views, you'll be familiar with the required methods numberOfSectionsInTableView, and numberOfRowsInSection, which returns of the count of the objects transactionsData.count. We see a template that we’ll fill in with Parse code for how to delete a row and thus a transaction from Parse. More importantly, we see the method, cellForRowAtIndexPath, for how we populate our table cells with data from our Parse object. We're assigning a variable account to be equal to a PFObject of the specific object in that table cell. That's where the indexPath.row is. Further we're creating a variable called transdata that's cast as AnyObject that equals the row in the database account["transaction"]. That's where our user puts his withdrawal or deposit values. Finally, we're using NSDate formatting from Objective-C to format our date. And lastly, we return the cell.
36
Assignment #8 Build the iOS MyBank App Step - 28
Populate the TransactionsViewController TableView with data from Parse, using example code Now we’ll add the method, cellForRowAtIndexPath, which populates our table cells with data from our Parse object. We're assigning a variable account to be equal to a PFObject of the specific object in that table cell. That's where the indexPath.row is. Further we're creating a variable called transdata that's cast as AnyObject that equals the row in the database account["transaction"]. That's where our user puts his withdrawal or deposit values. Finally, we're using NSDate formatting from Objective-C to format our date. And lastly, we return the cell.
37
Assignment #8 Build the iOS MyBank App Step - 28
Populate the TransactionsViewController TableView with data from Parse, using example code Now let's finish our Delete functionality, and show you the final letter of the acronym CRUD. We've done Create, Read, Update, and now it's time to Delete. So what we can do is actually grab the value of that object, the same way we did to populate a table cell. We'll use the objectAtIndex, and we'll use indexPath.row. That'll be the specific object we intend to delete. The method we're gonna use is deleteInBackgroundWithTarget. Our target will be nil, and be cautious for case sensitivity as Xcode will pre-populate that with a separate method, our selector will also be nil. I'm using the deleteInBackgroundWithTarget instead of deleteInBackgroundWithBlock, because it'll give you the opportunity to code a method that will alert your users when the delete has occurred. So we'll keep that as nil as well. The next step is to remove the object itself. So I'll take transactionData which you can as a PFObject, and what we're going to do is removeObjectAtIndex. And this will also be indexPath.row. And that will remove the data from Parse. The last line, deleteRowsAtIndexPaths will delete the row from the user's visibility.. Now let's run a test, in the simulator View Transactions, and you'll see any deposits and with drawls you’ve made. Try deleting a transaction, make sure the amount updates correctly in View Account. See the screen shot on the next slide.
39
Assignment #8 Build the iOS MyBank App Step - 29
Adding logout functionality in ViewController We're in the ViewController, Remember, either the user is logged in already or they need to sign then login. Right after the Welcome.text = username, we’re going to create a dynamic button for our navigation bar. The dynamic button is an instance of the UIBarButtonItem class and we can add attributes for it. Our title can be simply 'Log Out'. Our style can be plain. Our target will be self for this class and our action will be the method name. At this point we have our Log Out button but now we need to add it to the Bar. So I'm going to call on self.navigationitem and it's right in our ButtonItem property And make that equal to our Log Button. Now, all I need to do is code the Log Out function. The sender will be the BarButtonItem. So how does Parse log somebody out. Well it's pretty easy. We take the PFUser object and apply it's LogOut method. We can also attack any variable that might still hold a value. I make a variable called currentUser and make it equal to PFUser. Now that value will become nil. But that's not all that needs to happen. When a user logs out, he needs to be redirected to the login screen. So now we'll create a variable called login that equals the PFLogInViewController We can dismiss our own controller since we're logged out and we can present the new Login Controller. Which is login, we can animate that as true. Then on completion have a nil Run a test, Push our Log Out button and now we're logged out. See the code and screenshots on the next slide
41
Assignment #8 Build the iOS MyBank App Step - 30
Explore the functionality of PFQueryTable for search and pagination When you make it this far, you are ready for some advance functionality provided by Parse.frameworks in PFQueryTableViewController. It inherits fromthe UITableView and offers some extra functionality, like pagination, ability to refresh with one delegate method. Open the SearchPFQuearyController class For efficiency in all TableViews, we want to create a prototype cell in the storyboard, call it HeaderCell, for use with the dequeueReusableCellWithIdentifier method. Add 1 to prototype cell in TableView, indentifier cell in the TableView Cell In the SearchPFQueryController, note that it has the delegate, UISearchBarDelegate. Majsure you import from Foundation and UIKit. We are going to add some functionality to the init method to give you an idea what this offers. The benefit of this Controller, by the way, for the application will be search functionality. That's why we've included the UISearchBarDelegate. So the methods that it provides are also very, very helpful. So the first thing we do is look at some of the methods offered by the PFQueryTableViewController. One is pullToRefreshEnabled. We can make that equal to true. One thing we can do is to call in a class name, we will do self.parseClassName and make it equal to what we're searching through, which is the transactions. There's some other useful things. I have minimal data so I'm will register this and leave it in the code. paginationEnabled, Make that false. But that's a very handy method that'll paginate for you. To make that work all you have to do is declare an objectsPerPage. So, let's say you wanted minimal per page, it would create pagination for you. So as we scroll down, we have traditional tableView methods, viewDidLoad, heightForHeaderInSection, viewForHeaderInSections, code on the next slide
43
Assignment #8 Build the iOS MyBank App Step - 31
SearchPFQueryController method queryForTable method When you make it this far, you are ready for some advance functionality provided by Parse.frameworks in PFQueryTableViewController. It inherits fromthe UITableView and offers some extra functionality, like pagination, ability to refresh with one delegate method. Open the SearchPFQuearyController class Notice the variable query that equals the PFQueryObject. Here we need to do two things. We need to determine if the user has entered search text, and if they have, write a query with that search. Or simply just list all the transactions. So let's first test to see if the user has entered any search text. Because we have the UISearchDelegate, we actually have a property called searchText. That's part of that search bar. And that has a property called isEmpty. So if the searchText isEmpty, we'll know we need to create our own query and call out every transaction. So I'm going to do a query.whereKey, and in this case, the accountholder needs to be equalTo the user object. And in this case, I'll just call on the PFUser object again and we'll get currentUser directly inside these braces. And now we need to append how we want that ordered. So I'll use query again, so we'll do orderByDescending. And the value on that will be createdAt, that pre-populated column that Parse provides for us. So that's if the user hasn't searched any text. Well, let's take care of if they have. In our else statement what we'll need to do is add the same query based on the user object. We'll need to also orderByDescending. And lastly, we'll need to append to this query where the key of reason, which is the field that holds the reason for the transaction, where that's equal to the searchText. So I'll type in query.whereKey and reason will be our object name. That'll be containsString and the value of the user search, which is searchText. So what we have here is a query based on the fact that our user has entered some searchText. After the . queryForTable, you’ll add the required cellForRowAtIndexPath as in any TableView. In this method, the cell identifier is actually PFTableViewCell. It inherits from that class. On line 79, we're going to create a variable called reason that'll be equal to the object reason. We'll have our transaction and we'll have a formatted string
45
Assignment #8 Build the iOS MyBank App Step - 32
SearchPFQueryController, UISearchBarDelegate methods Next we need to add searchBar delegates methods, These are all pre-populated delegate methods provided by that delegate object. We can show the CancelButton. On BeginEditing we can make the CancelButton be true. On EndEditing it'll be false. These are all part of the IOS docs. Now run and test. Look for a transaction you know you have (I have paycheck). Parse does not honor case insensitive searches. It's up to the developer to come up with a method to match the query to the data in the database. It will offer regular expressions, however. So that's the PFQuery TableViewController.
46
Use Geolocation to Find the Nearest Banks
47
Assignment #8 Build the iOS MyBank App Step - 33
Use Geolocation to find nearest banks In our AllBanksController, in the Main.storyboard, makesure the table view prototype cell is one and call the prototype cell cell , let's add the loadData function. In here you'll see if the User is not equal to nil or if they're logged in. We'll create a query that's an instance of the PFQuery object. What we need to do is show how to initiate PFGeoPoint, which is a class that Parse offers. So what we'll do is we'll call on PFGeoPoint and its property geoPointForCurrentLocationInBackground. Inside we're going to create a variable called point and that will be equal to where the user is at the current time, instance of the geoPoint object. And we'll also create an error block, that's wrapped and a Void in and a closing brace. Our next step will be to create a Query based on where the user's located. So we'll call on the query object and I'll use whereKey and in this case we'll focus on the locations object. If you remember, the field name is called "location" so we'll do "location" and instead of containedIn, we'll do nearGeoPoint. What this will do is create a list of the closest banks that we can find to the user's location. You can also make it within a certain amount of miles or a certain amount of kilometers by adding a property. In this case we just want the banks that are in our close proximity. In case there are multiples, we'll want to use the limit tag. We can make that equal to 10. The next thing is to extract the data from the Query, so we'll use the findObjectsInBackgroundWithBlock method. This method starts with an opening curly brace. We'll create a variable called objects. It will be cast as AnyObject for now, and once again I'll add an error block. Now we'll test to see if the error is nil. In this case if the error is nil, we're successful. We'll for loop around our objects and use the allBanks NS mutable array, We'll addObject. For each object on each turn of that loop after this, we can use a couple of refresh methods. We'll use the self.tableView reloadData method. We can even add optionally wrapped refreshControl that will end our refreshing. See the code on the next page
49
Assignment #8 Build the iOS MyBank App Step - 34
Use Geolocation to find nearest banks Now at this point we can go through the rest of the functionality. That loadData function will be called on the method view did appear. On view did load, we have our refresh control, the same refresh control that was in the transaction controller. When we scroll down we have our traditional Table methods. We have our candidate RowAtIndexPath and editingStyle as well. Note we don’t want to delete the bank from Parse, we'd rather just delete it from the interface so it doesn't show. The locations table is accessible by the public and if we were to delete the bank, then no one would have access to that bank So now comes the all-important method for tableView. And this is where we pre-populate the data in the cell. I've created a variable called myloc. This is a PFObject that will equal the objectAtIndex of each path as we loop through the table. Next, I'm creating objects called "bankname," "city," and "state." Below that I'm casting it as a String and populating our label.Text with it. Now let’s test. I'm running it in my iPhone. I'm going to the View All Banks button, but nothing shows up? You need to add a key/value pair to the info.plist file (in Xcode, look in the Supporting Files Folder). Click a + to add a new pair, type in NSLocationWhenInUseUsageDescription for Key, Something like Please Allow access to location services for the value. See the next slide for a screen shot. Now let’s really run it. One thing of note, if you want to change your location and customize it for testing in your simulator, click Debug and then Location, go to Custom Location and you can add a Latitude and Longitude. So that's how we use Parse's GeoPoint to create some helpful user functionality for our users.
51
To Get Credit MyBanksAssignments
#8B Try uploading your code to github putting a link to the code in the Assignment #8 in Canvas. Or, zip and upload to the assignment. This will be worth 6 points total for MyBank (3 last week, 3 this week) You can choose to submit this all in one week or if you are having difficulties, spread it over 2. If you choose 2 you must finish through the profile view.
52
To Get Credit For Assignments, Upload to Canvas Don’t Email (Accept Trello board)
#12 Revised target user description (at least 3 bullet points) what is their urgent problem? What is your value hypothesis? 3 audio quotes, one each from your target user interviews (you and your partner will pick one each to play for the class) #13 Create a Trello board for your project: Find and interview 6 additional target users for your refined niched: Validate Niche, Problem (add details of interview structure, recording, ). Team update Trello, track progress over the week, mark interview completion on cards. #14 Competition matrix part 1 #15 Team Wireframe prototype sketch draft 1 – hits top 3 problems you’ve identified so far
54
Readings The Second Machine Age: Chpt 1, Chpt 4 & 6
Business Model Generation Chpt 1 The Lean Startup: Chpts 1-4 Coffee Break EP33: Design Thinking with Tim Brown Value Proposition: Chpt 1 The Four Steps to the Epiphany Chpts 1-4, Appendix A-B Business Model Generation Chpt 2 The Entrepreneur's Guide to Customer Development: 1-5 Peopleware Chpt 1-6 The Entrepreneur's Guide to Customer Development: Chpt 8 The Lean Startup: Chpt 5-8 Peopleware Chpt 14-17
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.