Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Build Features Not Apps

746 views

Published on

Presented at http://pragmamark.org/

Most iPhone users don’t bother installing any apps per months. And worse, ~80% never use an app they’ve installed again. The future of mobile is clearly not app, but features. Features that make the iPhone ecosystem still a native experience, but as open and flexible as the web. Learn how you could prepare for that future.

Published in: Technology
  • I just began eight weeks past and i have become four check for an entire of $4,15000...this is the best call I made in quite a while! "Much obliged to you for giving American express this unprecedented opportunity to make more cash from home. This further cash has adjusted my life in such a lot of courses in which, bestow you!".......GOOD LUCK Click this snap this connection -=-=-=-=-=-=-=-=-=-=-= http://www.cash-review.com
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Totally agree! 👏
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Build Features Not Apps

  1. 1. BUILD FEATURES, NOT APPS @NATASHATHEROBOT
  2. 2. SWIFT ROBOT ▸ NatashaTheRobot.com ▸ This Week in Swift ▸ Swift Jobs ▸ @NatashaTheNomad ▸ try! Swift
  3. 3. Most smartphone users download 0 apps per month
  4. 4. An average app loses up to 95% of users within the first month
  5. 5. !
  6. 6. !"
  7. 7. FEATURE: NOTIFICATIONS
  8. 8. FEATURE: SPEECH RECOGNITION
  9. 9. "As speech recognition accuracy goes from say 95% to 99%, all of us in the room will from barely using it today to using it all the time. Most people underestimate the difference between 95% and 99% accuracy - 99% is a game changer" - Andrew NG, Chief Scientist at Baidu
  10. 10. SIRI INTENTS: ▸ Audio or video calling ▸ Messaging ▸ Payments ▸ Searching photos ▸ Workouts ▸ Ride booking
  11. 11. FEATURE: EXTENSIONS
  12. 12. "It took Line Messenger almost four months to find its first two million users ...
  13. 13. … but after stickers were launched, it took only two days to find the next million...
  14. 14. The company now makes over $270M a year just from selling stickers."
  15. 15. THE FUTURE?
  16. 16. ! -> "
  17. 17. ARCHITECTING FOR FEATURES
  18. 18. ▸ Frameworks all the things! ▸ Decouple sign in ▸ NSUserActivity FTW
  19. 19. !
  20. 20. OPEN VS PUBLIC
  21. 21. let rootURL = FileManager.default(). containerURLForSecurityApplicationGroupIdentifier("group.com.NatashaTheRobot.MyFavoriteGelato")
  22. 22. let defaults = UserDefaults(suiteName: "group.com.NatashaTheRobot.MyFavoriteGelato")
  23. 23. ! + ⌚ + #
  24. 24. MULTIPLATFORM, SINGLE-SCHEME XCODE PROJECTS by Max Howell on PromiseKit.org
  25. 25. FRAMEWORKS ▸ DRY ▸ App Groups ▸ iCloud Key-Value Storage ▸ Cross-Platform
  26. 26. SIGN IN
  27. 27. !
  28. 28. ▸ Decouple Sign In ▸ Profit !
  29. 29. NSUSERACTIVITY FTW
  30. 30. // AppDelegate func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let webpageURL = userActivity.webpageURL { // separate webpageURL using NSURLComponents // present the correct View Controller if valid // otherwise, open link in Safari } return false }
  31. 31. CREATING AN ACTIVITY // GelatoDetailViewController override func viewDidLoad() { super.viewDidLoad() // other config here let activity = NSUserActivity(activityType: "com.natashatherobot.GelatoFinder.gelato") // will show up as this in Spotlight Search Results activity.title = gelato.name // Other keywords to search by activity.keywords = Set([gelato.name, "gelato"]) // should be handed off to another device? activity.isEligibleForHandoff = false // should be indexed in App History? activity.isEligibleForSearch = true // should be eligible for indexing for any user of this application? activity.isEligibleForPublicIndexing = true // Avoid deallocating before indexing, // global variable declared in UIResponder class userActivity = activity // don't forget to activate! userActivity!.becomeCurrent() }
  32. 32. SAVE UNIQUE INFO // GelatoDetailViewController override func viewDidLoad() { // create activity and other config here activity.delegate = self activity.needsSave = true // assign to userActivity, etc } extension GelatoDetailViewController: NSUserActivityDelegate { func userActivityWillSave(_ userActivity: NSUserActivity) { // info needed to recreate activity! userActivity.userInfo = ["index": gelatoIndex] } }
  33. 33. RESTORE ACTIVITY // AppDelegate func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { let mainController = (window!.rootViewController! as! UINavigationController).viewControllers.first mainController?.restoreUserActivityState(userActivity) return true }
  34. 34. RESTORE ACTIVITY // GelatoListTableViewController override func restoreUserActivityState(_ activity: NSUserActivity) { if let index = activity.userInfo?["index"] as? Int { searchedGelatoIdentifier = index performSegue(withIdentifier: "showGelato", sender: self) } }
  35. 35. RESTORE ACTIVITY // GelatoListTableViewController override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let gelatoDetailVC = segue.destination as? GelatoDetailViewController { let index = tableView.indexPathForSelectedRow?.row ?? searchedGelatoIdentifier ?? 0 gelatoDetailVC.gelato = gelatoFlavors[index] gelatoDetailVC.gelatoIndex = index } }
  36. 36. NSUSERACTIVITY ▸ Handoff ▸ Universal Links ▸ Search ▸ Location ▸ Contextual Reminders ▸ Contact Interactions
  37. 37. ▸ Frameworks all the things! ▸ Decouple sign In ▸ NSUserActivity FTW
  38. 38. BUILD FEATURES, NOT APPS @NATASHATHEROBOT

×