SlideShare a Scribd company logo
1 of 74
Download to read offline
BUILD FEATURES,
NOT APPS
@NATASHATHEROBOT
SWIFT ROBOT
▸ NatashaTheRobot.com
▸ This Week in Swift
▸ Swift Jobs
▸ @NatashaTheNomad
▸ try! Swift
Most smartphone users download 0 apps per month
An average app loses up to 95% of users within the first month
!
!"
FEATURE:
NOTIFICATIONS
FEATURE:
SPEECH
RECOGNITION
"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
SIRI INTENTS:
▸ Audio or video calling
▸ Messaging
▸ Payments
▸ Searching photos
▸ Workouts
▸ Ride booking
FEATURE:
EXTENSIONS
"It took Line Messenger almost four
months to find its first two million
users ...
… but after stickers were launched, it
took only two days to find the next
million...
The company now makes over $270M a
year just from selling stickers."
THE FUTURE?
! -> "
ARCHITECTING
FOR FEATURES
▸ Frameworks all the things!
▸ Decouple sign in
▸ NSUserActivity FTW
!
OPEN VS PUBLIC
let rootURL = FileManager.default().
containerURLForSecurityApplicationGroupIdentifier("group.com.NatashaTheRobot.MyFavoriteGelato")
let defaults = UserDefaults(suiteName: "group.com.NatashaTheRobot.MyFavoriteGelato")
! + ⌚ + #
MULTIPLATFORM, SINGLE-SCHEME XCODE PROJECTS
by Max Howell on PromiseKit.org
FRAMEWORKS
▸ DRY
▸ App Groups
▸ iCloud Key-Value Storage
▸ Cross-Platform
SIGN IN
!
▸ Decouple Sign In
▸ Profit !
NSUSERACTIVITY FTW
// 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
}
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()
}
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]
}
}
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
}
RESTORE ACTIVITY
// GelatoListTableViewController
override func restoreUserActivityState(_ activity: NSUserActivity) {
if let index = activity.userInfo?["index"] as? Int {
searchedGelatoIdentifier = index
performSegue(withIdentifier: "showGelato", sender: self)
}
}
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
}
}
NSUSERACTIVITY
▸ Handoff
▸ Universal Links
▸ Search
▸ Location
▸ Contextual Reminders
▸ Contact Interactions
▸ Frameworks all the things!
▸ Decouple sign In
▸ NSUserActivity FTW
BUILD FEATURES,
NOT APPS
@NATASHATHEROBOT

More Related Content

What's hot

Socialcam App of the week
Socialcam App of the weekSocialcam App of the week
Socialcam App of the weekSojoSolutions
 
Revolve16 - Mobile Search with Google App Indexing in Xamarin Forms
Revolve16 - Mobile Search with Google App Indexing in Xamarin FormsRevolve16 - Mobile Search with Google App Indexing in Xamarin Forms
Revolve16 - Mobile Search with Google App Indexing in Xamarin FormsVincent Hoogendoorn
 
Simplifying Enterprise Mobility Terms - DronaHQ
Simplifying Enterprise Mobility Terms - DronaHQ Simplifying Enterprise Mobility Terms - DronaHQ
Simplifying Enterprise Mobility Terms - DronaHQ Kinjal Vora
 
Mike Schneider - Using Context to Appticipate User Needs
Mike Schneider - Using Context to Appticipate User NeedsMike Schneider - Using Context to Appticipate User Needs
Mike Schneider - Using Context to Appticipate User NeedsINBOUND
 
Slow down! What should you consider before going mobile? Eran zinman, Mobile ...
Slow down! What should you consider before going mobile? Eran zinman, Mobile ...Slow down! What should you consider before going mobile? Eran zinman, Mobile ...
Slow down! What should you consider before going mobile? Eran zinman, Mobile ...Eran Zinman
 
how to make Google Chrome number one mobile browser
how to make Google Chrome number one mobile browser how to make Google Chrome number one mobile browser
how to make Google Chrome number one mobile browser George Achillias
 
Mobile Functional Beauty - Trebbble
Mobile Functional Beauty - TrebbbleMobile Functional Beauty - Trebbble
Mobile Functional Beauty - TrebbbleTrebbble
 
Do You Need a Web App or a Native App?
Do You Need a Web App or a Native App?Do You Need a Web App or a Native App?
Do You Need a Web App or a Native App?iFactory Digital
 
Web Apps: to infinity and beyond #cpbr9
Web Apps: to infinity and beyond #cpbr9Web Apps: to infinity and beyond #cpbr9
Web Apps: to infinity and beyond #cpbr9Maria Clara Santana
 
Native vs. Mobile Web vs. Hybrid Apps for Mobile Development
Native vs. Mobile Web vs. Hybrid Apps for Mobile DevelopmentNative vs. Mobile Web vs. Hybrid Apps for Mobile Development
Native vs. Mobile Web vs. Hybrid Apps for Mobile DevelopmentJason Grigsby
 
Mobilising Digital - Perth 13/03/14
Mobilising Digital - Perth 13/03/14Mobilising Digital - Perth 13/03/14
Mobilising Digital - Perth 13/03/14Precedent
 
[Srijan Wednesday Webinars] Rethinking Mobile Strategy for 2015
[Srijan Wednesday Webinars] Rethinking Mobile Strategy for 2015[Srijan Wednesday Webinars] Rethinking Mobile Strategy for 2015
[Srijan Wednesday Webinars] Rethinking Mobile Strategy for 2015Srijan Technologies
 
Millward Brown AdReaction Africa - Marketing in the Mobile World
Millward Brown AdReaction Africa - Marketing in the Mobile WorldMillward Brown AdReaction Africa - Marketing in the Mobile World
Millward Brown AdReaction Africa - Marketing in the Mobile WorldKantar
 
Scrap the Big Launch, Fly a Kite
Scrap the Big Launch, Fly a KiteScrap the Big Launch, Fly a Kite
Scrap the Big Launch, Fly a KiteAditi Vora
 
Attract Group mobile app portfoio presentation
Attract Group mobile app portfoio presentationAttract Group mobile app portfoio presentation
Attract Group mobile app portfoio presentationAttract Group
 

What's hot (17)

Socialcam App of the week
Socialcam App of the weekSocialcam App of the week
Socialcam App of the week
 
Revolve16 - Mobile Search with Google App Indexing in Xamarin Forms
Revolve16 - Mobile Search with Google App Indexing in Xamarin FormsRevolve16 - Mobile Search with Google App Indexing in Xamarin Forms
Revolve16 - Mobile Search with Google App Indexing in Xamarin Forms
 
Simplifying Enterprise Mobility Terms - DronaHQ
Simplifying Enterprise Mobility Terms - DronaHQ Simplifying Enterprise Mobility Terms - DronaHQ
Simplifying Enterprise Mobility Terms - DronaHQ
 
Smart campus
Smart campusSmart campus
Smart campus
 
Mike Schneider - Using Context to Appticipate User Needs
Mike Schneider - Using Context to Appticipate User NeedsMike Schneider - Using Context to Appticipate User Needs
Mike Schneider - Using Context to Appticipate User Needs
 
Smart campus
Smart campusSmart campus
Smart campus
 
Slow down! What should you consider before going mobile? Eran zinman, Mobile ...
Slow down! What should you consider before going mobile? Eran zinman, Mobile ...Slow down! What should you consider before going mobile? Eran zinman, Mobile ...
Slow down! What should you consider before going mobile? Eran zinman, Mobile ...
 
how to make Google Chrome number one mobile browser
how to make Google Chrome number one mobile browser how to make Google Chrome number one mobile browser
how to make Google Chrome number one mobile browser
 
Mobile Functional Beauty - Trebbble
Mobile Functional Beauty - TrebbbleMobile Functional Beauty - Trebbble
Mobile Functional Beauty - Trebbble
 
Do You Need a Web App or a Native App?
Do You Need a Web App or a Native App?Do You Need a Web App or a Native App?
Do You Need a Web App or a Native App?
 
Web Apps: to infinity and beyond #cpbr9
Web Apps: to infinity and beyond #cpbr9Web Apps: to infinity and beyond #cpbr9
Web Apps: to infinity and beyond #cpbr9
 
Native vs. Mobile Web vs. Hybrid Apps for Mobile Development
Native vs. Mobile Web vs. Hybrid Apps for Mobile DevelopmentNative vs. Mobile Web vs. Hybrid Apps for Mobile Development
Native vs. Mobile Web vs. Hybrid Apps for Mobile Development
 
Mobilising Digital - Perth 13/03/14
Mobilising Digital - Perth 13/03/14Mobilising Digital - Perth 13/03/14
Mobilising Digital - Perth 13/03/14
 
[Srijan Wednesday Webinars] Rethinking Mobile Strategy for 2015
[Srijan Wednesday Webinars] Rethinking Mobile Strategy for 2015[Srijan Wednesday Webinars] Rethinking Mobile Strategy for 2015
[Srijan Wednesday Webinars] Rethinking Mobile Strategy for 2015
 
Millward Brown AdReaction Africa - Marketing in the Mobile World
Millward Brown AdReaction Africa - Marketing in the Mobile WorldMillward Brown AdReaction Africa - Marketing in the Mobile World
Millward Brown AdReaction Africa - Marketing in the Mobile World
 
Scrap the Big Launch, Fly a Kite
Scrap the Big Launch, Fly a KiteScrap the Big Launch, Fly a Kite
Scrap the Big Launch, Fly a Kite
 
Attract Group mobile app portfoio presentation
Attract Group mobile app portfoio presentationAttract Group mobile app portfoio presentation
Attract Group mobile app portfoio presentation
 

Viewers also liked

Swift Delhi: Practical POP
Swift Delhi: Practical POPSwift Delhi: Practical POP
Swift Delhi: Practical POPNatasha Murashev
 
Practical Protocols with Associated Types
Practical Protocols with Associated TypesPractical Protocols with Associated Types
Practical Protocols with Associated TypesNatasha Murashev
 
How to Win on the Apple Watch
How to Win on the Apple WatchHow to Win on the Apple Watch
How to Win on the Apple WatchNatasha Murashev
 
The Secret Life of a Digital Nomad
The Secret Life of a Digital NomadThe Secret Life of a Digital Nomad
The Secret Life of a Digital NomadNatasha Murashev
 
Protocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS MeetupProtocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS MeetupNatasha Murashev
 
The Zen Guide to WatchOS 2
The Zen Guide to WatchOS 2The Zen Guide to WatchOS 2
The Zen Guide to WatchOS 2Natasha Murashev
 
Unleash the Power of Playgrounds
Unleash the Power of PlaygroundsUnleash the Power of Playgrounds
Unleash the Power of PlaygroundsNatasha Murashev
 
Practical Protocol-Oriented-Programming
Practical Protocol-Oriented-ProgrammingPractical Protocol-Oriented-Programming
Practical Protocol-Oriented-ProgrammingNatasha Murashev
 
TEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkTEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkVolker Hirsch
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with DataSeth Familian
 
Protocol-Oriented MVVM (extended edition)
Protocol-Oriented MVVM (extended edition)Protocol-Oriented MVVM (extended edition)
Protocol-Oriented MVVM (extended edition)Natasha Murashev
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017Drift
 

Viewers also liked (20)

Swift Delhi: Practical POP
Swift Delhi: Practical POPSwift Delhi: Practical POP
Swift Delhi: Practical POP
 
Practical Protocols with Associated Types
Practical Protocols with Associated TypesPractical Protocols with Associated Types
Practical Protocols with Associated Types
 
How to Win on the Apple Watch
How to Win on the Apple WatchHow to Win on the Apple Watch
How to Win on the Apple Watch
 
The Secret Life of a Digital Nomad
The Secret Life of a Digital NomadThe Secret Life of a Digital Nomad
The Secret Life of a Digital Nomad
 
Hello watchOS2
Hello watchOS2 Hello watchOS2
Hello watchOS2
 
Protocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS MeetupProtocol Oriented MVVM - Auckland iOS Meetup
Protocol Oriented MVVM - Auckland iOS Meetup
 
Hello, WatchKit
Hello, WatchKitHello, WatchKit
Hello, WatchKit
 
The Zen Guide to WatchOS 2
The Zen Guide to WatchOS 2The Zen Guide to WatchOS 2
The Zen Guide to WatchOS 2
 
Unleash the Power of Playgrounds
Unleash the Power of PlaygroundsUnleash the Power of Playgrounds
Unleash the Power of Playgrounds
 
The Swift Architect
The Swift ArchitectThe Swift Architect
The Swift Architect
 
Practical Protocol-Oriented-Programming
Practical Protocol-Oriented-ProgrammingPractical Protocol-Oriented-Programming
Practical Protocol-Oriented-Programming
 
TEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkTEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of Work
 
HealthKit Deep Dive
HealthKit Deep DiveHealthKit Deep Dive
HealthKit Deep Dive
 
Using Parse in Hackathons
Using Parse in HackathonsUsing Parse in Hackathons
Using Parse in Hackathons
 
Protocol-Oriented MVVM
Protocol-Oriented MVVMProtocol-Oriented MVVM
Protocol-Oriented MVVM
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 
Hello, WatchKit
Hello, WatchKitHello, WatchKit
Hello, WatchKit
 
Hello, WatchKit
Hello, WatchKitHello, WatchKit
Hello, WatchKit
 
Protocol-Oriented MVVM (extended edition)
Protocol-Oriented MVVM (extended edition)Protocol-Oriented MVVM (extended edition)
Protocol-Oriented MVVM (extended edition)
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
 

Similar to Build Features Not Apps

Features not apps tokyo
Features not apps tokyoFeatures not apps tokyo
Features not apps tokyoHotrixxx
 
Create Features not apps
Create Features not appsCreate Features not apps
Create Features not appsmuhammad hunain
 
The Art and Science of Mobile App Success - Seattle Interactive Conference 20...
The Art and Science of Mobile App Success - Seattle Interactive Conference 20...The Art and Science of Mobile App Success - Seattle Interactive Conference 20...
The Art and Science of Mobile App Success - Seattle Interactive Conference 20...Jennifer Wong
 
Hieu Xamarin iOS9, Android M 3-11-2015
Hieu Xamarin iOS9, Android M  3-11-2015Hieu Xamarin iOS9, Android M  3-11-2015
Hieu Xamarin iOS9, Android M 3-11-2015Nguyen Hieu
 
How NOT to Suck at App Distribution - Quick Start Guide - Appsocially's Growt...
How NOT to Suck at App Distribution - Quick Start Guide - Appsocially's Growt...How NOT to Suck at App Distribution - Quick Start Guide - Appsocially's Growt...
How NOT to Suck at App Distribution - Quick Start Guide - Appsocially's Growt...Yusuke Takahashi, PhD
 
A gently introduction to AngularJS
A gently introduction to AngularJSA gently introduction to AngularJS
A gently introduction to AngularJSGregor Woiwode
 
Guidelines for Android application design.pptx
Guidelines for Android application design.pptxGuidelines for Android application design.pptx
Guidelines for Android application design.pptxdebasish duarah
 
Hi5 Hackathon Presentation
Hi5 Hackathon PresentationHi5 Hackathon Presentation
Hi5 Hackathon PresentationLou Moore
 
An Introduction to Deep Linking and App Indexing Codelab
An Introduction to Deep Linking and App Indexing CodelabAn Introduction to Deep Linking and App Indexing Codelab
An Introduction to Deep Linking and App Indexing CodelabJarek Wilkiewicz
 
Uncovering Secrets of Progressive Web Apps
Uncovering Secrets of Progressive Web AppsUncovering Secrets of Progressive Web Apps
Uncovering Secrets of Progressive Web AppsMaximiliano Firtman
 
Mobile App Feature Configuration and A/B Experiments
Mobile App Feature Configuration and A/B ExperimentsMobile App Feature Configuration and A/B Experiments
Mobile App Feature Configuration and A/B Experimentslacyrhoades
 
Droidcon: Sean Owen: Driving Downloads via Intents- 29/10/2010
Droidcon: Sean Owen: Driving Downloads via Intents- 29/10/2010Droidcon: Sean Owen: Driving Downloads via Intents- 29/10/2010
Droidcon: Sean Owen: Driving Downloads via Intents- 29/10/2010Skills Matter
 
Building interactive app
Building interactive appBuilding interactive app
Building interactive appOmar Albelbaisy
 
Cocoa coders 141113-watch
Cocoa coders 141113-watchCocoa coders 141113-watch
Cocoa coders 141113-watchCarl Brown
 
Lecture #1 Creating your first android project
Lecture #1  Creating your first android projectLecture #1  Creating your first android project
Lecture #1 Creating your first android projectVitali Pekelis
 
Building jQuery Mobile Web Apps
Building jQuery Mobile Web AppsBuilding jQuery Mobile Web Apps
Building jQuery Mobile Web AppsOperation Mobile
 
Android 103 - Firebase and Architecture Components
Android 103 - Firebase and Architecture ComponentsAndroid 103 - Firebase and Architecture Components
Android 103 - Firebase and Architecture ComponentsKai Koenig
 
Mobile Web vs. Native Apps | Design4Mobile
Mobile Web vs. Native Apps | Design4MobileMobile Web vs. Native Apps | Design4Mobile
Mobile Web vs. Native Apps | Design4MobileJason Grigsby
 

Similar to Build Features Not Apps (20)

Build Features not apps tokyo
Build Features not apps tokyoBuild Features not apps tokyo
Build Features not apps tokyo
 
Features not apps tokyo
Features not apps tokyoFeatures not apps tokyo
Features not apps tokyo
 
Create Features not apps
Create Features not appsCreate Features not apps
Create Features not apps
 
The Art and Science of Mobile App Success - Seattle Interactive Conference 20...
The Art and Science of Mobile App Success - Seattle Interactive Conference 20...The Art and Science of Mobile App Success - Seattle Interactive Conference 20...
The Art and Science of Mobile App Success - Seattle Interactive Conference 20...
 
Hieu Xamarin iOS9, Android M 3-11-2015
Hieu Xamarin iOS9, Android M  3-11-2015Hieu Xamarin iOS9, Android M  3-11-2015
Hieu Xamarin iOS9, Android M 3-11-2015
 
How NOT to Suck at App Distribution - Quick Start Guide - Appsocially's Growt...
How NOT to Suck at App Distribution - Quick Start Guide - Appsocially's Growt...How NOT to Suck at App Distribution - Quick Start Guide - Appsocially's Growt...
How NOT to Suck at App Distribution - Quick Start Guide - Appsocially's Growt...
 
Deep linking
Deep linkingDeep linking
Deep linking
 
A gently introduction to AngularJS
A gently introduction to AngularJSA gently introduction to AngularJS
A gently introduction to AngularJS
 
Guidelines for Android application design.pptx
Guidelines for Android application design.pptxGuidelines for Android application design.pptx
Guidelines for Android application design.pptx
 
Hi5 Hackathon Presentation
Hi5 Hackathon PresentationHi5 Hackathon Presentation
Hi5 Hackathon Presentation
 
An Introduction to Deep Linking and App Indexing Codelab
An Introduction to Deep Linking and App Indexing CodelabAn Introduction to Deep Linking and App Indexing Codelab
An Introduction to Deep Linking and App Indexing Codelab
 
Uncovering Secrets of Progressive Web Apps
Uncovering Secrets of Progressive Web AppsUncovering Secrets of Progressive Web Apps
Uncovering Secrets of Progressive Web Apps
 
Mobile App Feature Configuration and A/B Experiments
Mobile App Feature Configuration and A/B ExperimentsMobile App Feature Configuration and A/B Experiments
Mobile App Feature Configuration and A/B Experiments
 
Droidcon: Sean Owen: Driving Downloads via Intents- 29/10/2010
Droidcon: Sean Owen: Driving Downloads via Intents- 29/10/2010Droidcon: Sean Owen: Driving Downloads via Intents- 29/10/2010
Droidcon: Sean Owen: Driving Downloads via Intents- 29/10/2010
 
Building interactive app
Building interactive appBuilding interactive app
Building interactive app
 
Cocoa coders 141113-watch
Cocoa coders 141113-watchCocoa coders 141113-watch
Cocoa coders 141113-watch
 
Lecture #1 Creating your first android project
Lecture #1  Creating your first android projectLecture #1  Creating your first android project
Lecture #1 Creating your first android project
 
Building jQuery Mobile Web Apps
Building jQuery Mobile Web AppsBuilding jQuery Mobile Web Apps
Building jQuery Mobile Web Apps
 
Android 103 - Firebase and Architecture Components
Android 103 - Firebase and Architecture ComponentsAndroid 103 - Firebase and Architecture Components
Android 103 - Firebase and Architecture Components
 
Mobile Web vs. Native Apps | Design4Mobile
Mobile Web vs. Native Apps | Design4MobileMobile Web vs. Native Apps | Design4Mobile
Mobile Web vs. Native Apps | Design4Mobile
 

More from Natasha Murashev

Digital Nomad: The New Normal
Digital Nomad: The New NormalDigital Nomad: The New Normal
Digital Nomad: The New NormalNatasha Murashev
 
AltConf 2015: Swift Thinking
AltConf 2015: Swift ThinkingAltConf 2015: Swift Thinking
AltConf 2015: Swift ThinkingNatasha Murashev
 
Funcitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional WayFuncitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional WayNatasha Murashev
 
HealthKit: Getting Ready for the New Year
HealthKit: Getting Ready for the New YearHealthKit: Getting Ready for the New Year
HealthKit: Getting Ready for the New YearNatasha Murashev
 
Learning.... Swift functions!
Learning.... Swift functions!Learning.... Swift functions!
Learning.... Swift functions!Natasha Murashev
 
A Swift introduction a.k.a Fun with Minions!
A Swift introduction a.k.a Fun with Minions!A Swift introduction a.k.a Fun with Minions!
A Swift introduction a.k.a Fun with Minions!Natasha Murashev
 
The Many Faces of Swift Functions
The Many Faces of Swift FunctionsThe Many Faces of Swift Functions
The Many Faces of Swift FunctionsNatasha Murashev
 
Getting Started with Open Source
Getting Started with Open SourceGetting Started with Open Source
Getting Started with Open SourceNatasha Murashev
 
iOSDevCampDC: A Swift Introduction
iOSDevCampDC: A Swift IntroductioniOSDevCampDC: A Swift Introduction
iOSDevCampDC: A Swift IntroductionNatasha Murashev
 

More from Natasha Murashev (11)

Digital Nomad: The New Normal
Digital Nomad: The New NormalDigital Nomad: The New Normal
Digital Nomad: The New Normal
 
AltConf 2015: Swift Thinking
AltConf 2015: Swift ThinkingAltConf 2015: Swift Thinking
AltConf 2015: Swift Thinking
 
Swift Thinking
Swift ThinkingSwift Thinking
Swift Thinking
 
Funcitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional WayFuncitonal Swift Conference: The Functional Way
Funcitonal Swift Conference: The Functional Way
 
Intro To Swift
Intro To SwiftIntro To Swift
Intro To Swift
 
HealthKit: Getting Ready for the New Year
HealthKit: Getting Ready for the New YearHealthKit: Getting Ready for the New Year
HealthKit: Getting Ready for the New Year
 
Learning.... Swift functions!
Learning.... Swift functions!Learning.... Swift functions!
Learning.... Swift functions!
 
A Swift introduction a.k.a Fun with Minions!
A Swift introduction a.k.a Fun with Minions!A Swift introduction a.k.a Fun with Minions!
A Swift introduction a.k.a Fun with Minions!
 
The Many Faces of Swift Functions
The Many Faces of Swift FunctionsThe Many Faces of Swift Functions
The Many Faces of Swift Functions
 
Getting Started with Open Source
Getting Started with Open SourceGetting Started with Open Source
Getting Started with Open Source
 
iOSDevCampDC: A Swift Introduction
iOSDevCampDC: A Swift IntroductioniOSDevCampDC: A Swift Introduction
iOSDevCampDC: A Swift Introduction
 

Recently uploaded

WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityWSO2
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Zilliz
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
Navigating Identity and Access Management in the Modern Enterprise
Navigating Identity and Access Management in the Modern EnterpriseNavigating Identity and Access Management in the Modern Enterprise
Navigating Identity and Access Management in the Modern EnterpriseWSO2
 
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...TrustArc
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxMarkSteadman7
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightSafe Software
 
ChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityVictorSzoltysek
 
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...caitlingebhard1
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAnitaRaj43
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringWSO2
 

Recently uploaded (20)

WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
WSO2 Micro Integrator for Enterprise Integration in a Decentralized, Microser...
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Navigating Identity and Access Management in the Modern Enterprise
Navigating Identity and Access Management in the Modern EnterpriseNavigating Identity and Access Management in the Modern Enterprise
Navigating Identity and Access Management in the Modern Enterprise
 
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Simplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptxSimplifying Mobile A11y Presentation.pptx
Simplifying Mobile A11y Presentation.pptx
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and Insight
 
ChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps Productivity
 
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...Stronger Together: Developing an Organizational Strategy for Accessible Desig...
Stronger Together: Developing an Organizational Strategy for Accessible Desig...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software Engineering
 

Build Features Not Apps

  • 2. SWIFT ROBOT ▸ NatashaTheRobot.com ▸ This Week in Swift ▸ Swift Jobs ▸ @NatashaTheNomad ▸ try! Swift
  • 3.
  • 4. Most smartphone users download 0 apps per month
  • 5. An average app loses up to 95% of users within the first month
  • 6.
  • 7. !
  • 8.
  • 9.
  • 10. !"
  • 12.
  • 13.
  • 15.
  • 16.
  • 17. "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
  • 18. SIRI INTENTS: ▸ Audio or video calling ▸ Messaging ▸ Payments ▸ Searching photos ▸ Workouts ▸ Ride booking
  • 20.
  • 21.
  • 22.
  • 23.
  • 24. "It took Line Messenger almost four months to find its first two million users ...
  • 25. … but after stickers were launched, it took only two days to find the next million...
  • 26. The company now makes over $270M a year just from selling stickers."
  • 28.
  • 31. ▸ Frameworks all the things! ▸ Decouple sign in ▸ NSUserActivity FTW
  • 32.
  • 33.
  • 34. !
  • 35.
  • 36.
  • 38.
  • 39. let rootURL = FileManager.default(). containerURLForSecurityApplicationGroupIdentifier("group.com.NatashaTheRobot.MyFavoriteGelato")
  • 40. let defaults = UserDefaults(suiteName: "group.com.NatashaTheRobot.MyFavoriteGelato")
  • 41.
  • 42. ! + ⌚ + #
  • 43.
  • 44.
  • 45.
  • 46. MULTIPLATFORM, SINGLE-SCHEME XCODE PROJECTS by Max Howell on PromiseKit.org
  • 47. FRAMEWORKS ▸ DRY ▸ App Groups ▸ iCloud Key-Value Storage ▸ Cross-Platform
  • 49.
  • 50.
  • 51.
  • 52. !
  • 53.
  • 54.
  • 55.
  • 56.
  • 57. ▸ Decouple Sign In ▸ Profit !
  • 59. // 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 }
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65. 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() }
  • 66. 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] } }
  • 67. 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 }
  • 68. RESTORE ACTIVITY // GelatoListTableViewController override func restoreUserActivityState(_ activity: NSUserActivity) { if let index = activity.userInfo?["index"] as? Int { searchedGelatoIdentifier = index performSegue(withIdentifier: "showGelato", sender: self) } }
  • 69. 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 } }
  • 70.
  • 71. NSUSERACTIVITY ▸ Handoff ▸ Universal Links ▸ Search ▸ Location ▸ Contextual Reminders ▸ Contact Interactions
  • 72.
  • 73. ▸ Frameworks all the things! ▸ Decouple sign In ▸ NSUserActivity FTW