3. Inspiration and Beginnings
Friend wanted to collaborate with me on his ideas, so we decided to take a course
together
I wanted to learn something new
Took the self learning Stanford iOS App Development course in 2013. Followed
the curriculum, completed all homework assignments, and extra credit
Pocket Change was my final project.
Used ARC to get a feel for memory management, despite auto memory
management already available in iOS.
retain, release, autorelease
Drawbacks, no one to grade my work and show me better ways of doing
something.
5. Pocket Change
Simple expense tracking tool for tracking cash incidentals
Idea is not novel or unique.
No app is as simple as this. Expense tracking apps contain budgets, graphs with no
easy interface to quickly enter your expenses.
Initially marketed to folks who want to track cash incidentals only
I personally found it more useful when I travel and marketed it as such
The heart of the solution is CoreData, a.k.a as SQLLite
iOS 6.1
10. Never hard code your values.
Load from a text file:
NSString *path = [[NSBundle mainBundle] pathForResource:@"categorywords"
ofType:@"txt"];
NSDictionary *categories = [NSDictionary dictionaryWithContentsOfFile:path];
Translate Dictionary to CoreDB
CoreDB is not thread safe. Luckily access to it is quick. So always access it
from the main thread.
Usually that is UIManagedDocument, or
[context performBlock:^{
// do stuff with context
}];
Some contexts including Core Data ones have a parentContext. The
parentContext will almost always have its own thread, so you can performBlock
on it. But it is a different context, so you will have to save and then refetch to
see the changes
11. uClimate San Francisco
Many areas in California have vastly different weather conditions. San Francisco in
particular
Need a data source: Weather Underground
Weather Apps are almost always free
Extensible to any place with data points
Hub and Spoke Architecture
iOS 6.1
CoreData
iAd Framework
MapKit
UIKit
CoreGraphics
24. uClimate San Francisco
Weather stations come and go.
Updating configuration should not involve a new software revision.
Every 24 hours back end server discovers new stations and purges old stations that
have not been active for a while.
App requests weather station list from back end and updates its configuration on
the fly.
App also processes custom list of stations. Updates are in the backend
Multi-threaded solution to account for slow networks and prevent the UI from
locking up.
Save and re-fetch approach in the DB is required due to different threads accessing
weather data.
25. iOnTime
I live in a congested area. Your timing is highly dependent on traffic.
I had the idea in 2013 but had to wait for iOS 7 so I could implement my solution
calculateETAWithCompletionHandler: Available in iOS 7.0 and later, or use
Google API
Considered patenting the idea, but …
Did not want to to store any date to address privacy concerns and not have to
manage out of sync information
26. iOnTime cont’d
Had to wait for iOS9 so I could add public transportation
Initially based on iOS7 then moved to iOS8
MessageUI
Foundation
UiKit
CoreLocation
MapKit
EventKit
EventKitUI
Apple introduced a similar concept a year after I started selling this App. Theirs is
built into the Calendar, it doesn’t work reliably
27.
28.
29.
30. uClimateSF Texting
• If the calendar event has an invitee,
the App uses the contact’s mobile
number to auto fill in the To
• A preloaded message of I am on my
way is put together if leaving on time.
• If it detects you have not left it
autofills with: Running late, see you
soon.
31.
32.
33.
34. iOnTime Design Considerations
Minimize impact on battery when tracking location
While in the foreground, implemented high accuracy GPS location.
While in the background, woke up once a minute and updated my GPS location
Minimize network usage by only requesting new travel time estimates every n minutes
or x distance since last location update
Getting Apple to approve location tracking while running in the background took
months of going back and forth.
The following plist configuration was rejected because they did not consider iOnTime a
navigation based solution
Without the ability to run in the background, I was unable to use the most accurate
location based solution, or wake up to ask for location.
35. iOnTime Design Considerations
Reworked implementation and background manager to receive significant location
updates from Apple
The significant-change location service delivers updates only when there has been
a significant change in the device’s location, such as 500 meters or more.
Updates to a change in traffic conditions changes are missed while in background
without location changes.
Apple time estimates are okay. It would be great to correlate with other sources
such as Waze and Google Maps
Remember ARC and auto memory management. Calendar event notification
expired as information was sent into the bowels of the App. Had to copy
information
Multi-threaded to not lock up the UI while location and time estimates are derived.
Dictionary of Dictionaries is a pain in Objective C. Easier in Java, and a piece of
cake in Python.
36.
37. iOnTime Usability
Improvements
• Ability to filter out calendars
• Customize alerting
• Arrive a number of minutes before
appointment
• Receive alerts a number of minutes
before you have to be on your way
• Did not use CoreData
• Dictionary of Dictionaries to reflect
Calendar configuration is more
challenging than having done that in
CoreData
38. Observations
Engineering is the easiest part of the App cycle
Marketing your app and getting it to stand out amongst the noise is hard
There are two forms of App development approaches, which one is you?
You have an idea, its unique, or you can do better, faster, or make it more user friendly
You have a business idea, the mobile app is your platform
User Experience is key
Do not do this alone
Requires dedicated time due to frequency of OS updates, new languages
introduced, and new platforms.
39.
40. Observations cont’d
Take your app to the next level. Social interaction amongst users. Requires a
backend infrastructure to connect everyone.
Careful with services like Parse. Very easy to use. Does not scale cost wise.
Cheaper to build your own infrastructure but takes longer to develop
Amazon Web Services
Database such as mySQL, Mongo DB, HBASE (Big Data).
Tutorial on Parse
https://www.raywenderlich.com/15916/how-to-synchronize-core-data-with-a-web-
service-part-1
Comparison of different services, Parse vs Stackmob vs. Appcelerator
http://www.raywenderlich.com/20482/how-to-choose-the-best-backend-provider-for-
your-ios-app-parse-vs-stackmob-vs-appcelerator-cloud-and-more
41.
42. Observations cont’d
Monetization is not easy
Advertisement model only works for apps that are engaging on screen
People do not want to pay for apps. Less so on Android than iOS
User retention gives value that you can demonstrate to investors
In app purchases. Typical gaming model. Does not work for all paradigms unless your idea
lends itself to that concept. Celebrity apps do this as well.
If you own data that you can provide an API for, you are in a very good place.
Explored making demo apps that can be upgraded to paid apps. Had minimal
conversion success
Tutorial on how to Market and Promote your App
http://www.raywenderlich.com/11359/how-to-market-and-promote-your-games-and-apps-
part-1
Editor's Notes
https://itunes.apple.com/us/course/developing-ios-8-apps-swift/id961180099
https://itunes.apple.com/en/course/developing-ios-7-apps-for/id733644550
You immediately own any object you get by sending a message starting with new, alloc, or copy
If you get an object from any other source you do not own it, but you can take ownership by sending it the NSObject message retain. Careful with this with automemory management because if you receive a notification for an object you cannot claim retain. You need to make your own copy of the object to pass it around in the stack. This was one of my challenges with iOnTime.
Why so many boards and links. I wanted a positive user experience. I did not want them to press more than three times to get to what they needed. So I flattened the look.
Weather Underground imposes limits on the frequency of updates and the daily number of updates. Initial version was for my app to directly query WU for data. Such an architecture would not scale as I would hit API limits quickly with just one user.
Came up with a hub and spoke architecture. My hub is a backend python program that interfaces with WU.
Apps would interface with my backend server and get data at limited time intervals. Less than ideal, but that is the only way to keep the cost down until the app generated enough revenue to sustain itself.
Back end server polls WU within its API contract limits
Only way to run the app affordably and extend it to the world
Note that I store the thumbnail image to reflect the weather condition in the DB.
Customized my annotations to show temperature or conditions at a glance.
Weather varies in a 15 square kilometer city.
When I noticed most downloads were from accounts outside of the U.S. I quickly included Celcius.
You do not need the class THLabel (more on that in the next slide). You can use the class UILabel and customize your text.
Refer to this link for a more basic example: http://stackoverflow.com/questions/9822756/replace-icon-pin-by-text-label-in-annotation
Thanks to Tobias Hagemann, he created a class THLabel that helps draw outlines around text to make them more visible.
https://github.com/MuscleRumble/THLabel
Delivery was delayed by wanting to establish an LLC, deliver Weather App and Expense App first. Stabilize them before I started this.
Finished implementation early 2015. Had lots of challenges in getting app approved by Apple
Technology evolves very quickly. Consider Bump, when iPhone first introduced, their approach to exchanging contact information was novel, however as iOS features improved Bump become obsolete. More on Bump later.
Added texting capability to tell your invitee if you are on your way or are running late.
Two different story boards, one for iPhone and one for iPad. Universal implementation. To get approved by the app store, you simply can’t use the same UI paradigm. They will reject it.
iPad paradigm involves a split view controller. I still wanted the tab bar controller and it took some interesting rework with the initiliization of the ipad version to ensure the proper UI po
Getting the UI to connect to the back end involved a lot of patience.
Think of the UI views as a deck of cards laid one on top of the other. Based on that understanding, you can set up your views and initialize the right component. The challenge in this case was the fact that in a split view I wanted to embed a tab bar controller. Good luck with that, there were no tutorials/examples or stack overflow questions based on that need. So I cobbled the code above based on the iPad idiom of split view controllers and how the interfaces are overlaid one on top of the other.
iOS does not let apps run in the background. After 5 minutes or so it shuts them down. So when they move to the background they need to wrap up what they have to do before they get shut down by the OS.
I implemented a background manager using timers to keep the application alive and run location services
The significant-change location service provides a way to get the current location and be notified when significant changes occur, but it’s critical to use it correctly to avoid using too much power.
I was doing a big stint of Python development and was using a lot of nested dictionaries. In Objective C and Java it is more involved.
Just because mobile solutions are there is it the right platform for your business idea.
Weather Underground model. They got folks to put their weather stations up for free. They grab the data and store it, then sell it to the end user. Excellent monetization and covers their cost for datacenters, storage and data propogation. This approach is more profitable in my opinion than making an app itself. If you have to buy the data, you are already at a disadvantage, so be careful.
Despite using ad based model, you are earning pennies, you need to have a huge deployment/download base. There are companies that can help you with marketing your app,. I have not tried that approach. I was not convinced with the ROI based on my ideas.
Design a nice UI, be mindful of User Experience, not more than a couple of button presses before you get to your objective. Rule of thumb in Web design, no more than three link presses to get to the page is a good thing to keep in mind when designing your interface. I try to keep it at two.
I used the approach of casting a wide net with my apps hoping to see which would be popular before I targeted more development and improvements. Others worked on one idea, it never took off but they continued to work on it regardless. Be careful.
Pricing makes a difference. If you feel you are providing a premium services, charging more than .99 has a psychological effect that you truly have a premium product. May work better than simply charging .99
Bump was bought out despite its technology becoming obsolete only because they had a user base which Google wanted. Bump collected customer behavior and habits. For me Bump user experience was disappointing, it took me more time to bump at times than if I had just copied the info by hand. However, they were the first to market.
Bump crossed many different platforms: Android, Windows, iOS and they tried with Blackberry as well.
When considering creating user based interaction amongst apps you need backend infrastructure. You can try using technology like Parse. They give you the modules in iOS to connect to Parse infrastructure which allows you to connect your app across users and devices. For demo purposes when looking to get investors, Parse might be good enough, but then as you scale, you will need to re-write your app notification interface to something cheaper.
My advice, don’t use things like Parse, build your own infrastructure, Amazon Web Services (AWS), mySql and write your own back end using Python or any language of your choice.
If you want to use Parse as a starting point to get a feel for user notification, try this tutorial: https://www.raywenderlich.com/15916/how-to-synchronize-core-data-with-a-web-service-part-1
Here is a link to how to compare difference services: http://www.raywenderlich.com/20482/how-to-choose-the-best-backend-provider-for-your-ios-app-parse-vs-stackmob-vs-appcelerator-cloud-and-more
Consider how many users you want to scale to. mySQL may not handle a large table, so design carefully. If your schema will always evolve, consider Mongo DB. However, be very careful about Mongo’s performance and disk usage. I am a fan of mySQL for most things.
I did not use the tutorial on marketing and promoting the app, so use at your own risk, but it might be a good starting point for you.