On Wednesday, November 6th, we presented three ideas for hackathon apps and we voted on which would be the best. I was surprised that my Flash Card idea was voted my best idea because it would promote the excellent Stanford iOS course and not the Flatiron School. But I accepted the class’ judgement and proceeded for the next three days to hack out what would become my first AppStore App.
The idea (codenamed and presented as iFlash) was simple: have Flash Cards that would tie to the Paul Hegarty Lectures in the iTunes U / Stanford CS193p iOS Course. In this fashion a student could review lectures on the train or while online at the supermarket. It was a fun way to review lecture materials once you finished watching the videos and hopefully reinforce that material. I have had the idea for some time now in the back of my head – especially, since the first assignments, Matchismo, deals with Cards and Decks and Paul even throws out Flash Cards as a possible implementation of the software. For me it was a way to get myself to rewatch this semester since I have already watched every semester since Evan Doll.
But there was also a twist. Each Flash Card in Test Mode would enable the student to test their understanding by having some multiple choice selection. The trick of the test mode would be to necessitate a clever wrong answer so that it wouldn’t be that easy to simply take a test. I would later find out that coming up with a clever decoy was the hardest part of the flash card content creation process.
One of the key pillars that I wanted to achieve was to ship the app before I had all the decks. Not only because it would take time to watch, take notes, and generate content but because the course was still going on. The architecture needed to address not just shipping with all the flash card decks but to be able to deliver new decks as they became available. I decided the best way to implement this would be to have a hosted JSON file per deck on a server and to have a deck of decks JSON file with a per deck version number to indicate when an update had occurred. The app would then download and parse the deck of decks to see if there was anything new and if so would then download the new JSON file(s) parse them and generate card and deck related entities in Core Data for every JSON element in the newly downloaded file(s). If the master deck of decks had no updates then no further updates were needed.
The Hackathon: 3 Days of Fun
For the three day hackathon I focused on a couple of flash cards for a couple of lectures, the app icon, and the view workflow of lectures tableview, study mode, and test mode. It was during this time that I decided on the Flash Card data structure of having a detailed front / back and two short questions. The other item of importance I finalized was the scoring engine.
Since the app was modeling a College / University course the scoring would be on a letter grade (A, B, C, etc) instead of by points as in a game. The letter grade would show on your Report Card at the end of the test and in the lectures table view. The letter grade would be calculated by the ratio of correct answers to total flash cards per lecture.
On day two I watched the 2012 WWDC Session 516 with Dan Kurtz on Integrating with Game Center. This helped me to think of modeling the app with not just players and scores but also with an achievements underpinning in order to more easily integrate with Game Center down the road.
On day three I wrote a category on NSMutable Array to allow me to shuffle the deck of cards upon the shake gesture (Shake to Shuffle). Each day we gave an update demo of where each of us was and on the last day we had a surprise demo to the Ruby class of 40+ plus the Flatiron staff. For three day of full-time coding the apps looked amazing.
Post Hackathon: The next 3 Weeks
Despite the good demo I did not think the app was AppStore submission worthy and I spent the next three weeks polishing the app and moving off of plists and using a hosted JSON file and moving off of NSUserDefaults and onto Core Data. My target was to submit to the store one month after having pitched the idea at the start of the hackathon. Even though we were in the midst of our Capstone project with a real client given the Thanksgiving break this submission goal seemed achievable. On Monday, December 2nd, I not only submitted the App days ahead of schedule but went to my first iOS developer interview (more on that experience in a future blog post).
AppStore: Waiting For Approval
I set a launch date of 12/12 in the submission and the app sat in ‘Waiting For Review’ for four days from Monday (12/2) through Thursday (12/5). During those four days I thought of numerous fair reasons for rejection from Apple. The usage of iOS in my App name, the usage of Stanford, of iTunes, I had a long mental list I was compiling so when rejection came I would be ready. While I was presenting our Capstone project app and my hackathon app at the Flatiron Science Fair on Thursday night Apple went from ‘Waiting to Review’ to ‘Processing for AppStore’ to Approved and ‘Ready For Sale’ in a manner of hours. I saw emails coming in on my iPhone while I was demoing on a big screen but I thought they were based on the RADARs that I had submitted to Apple and just swiped them away.
The approval on 12/5 and the planned 12/12 delayed launch gave me the time to come up with as many lecture decks as I could for launch which is why I set the delayed 12/12 date in the first place. I was able to get three lectures done by today’s launch with over 150+ Flash Cards. I’ll continue making lecture decks and I have a 1.1 planned where I’d like to integrate crash reporting and make some 1.0 performance updates. I was also looking at accomplishing my third of three goals I had set for myself when I first decided to go to Flatiron. Enter RADARs, present a Cocoa tech talk at a meetup, and submit an App to the AppStore.
I’ll need new goals now.
Thanks to everyone who downloaded iOS Tutor on launch day. I am truly grateful for your support. If you haven’t already then you can download it now and leave a review. It would mean a lot to me.