core location best practices - apple developer...continuous location in the background location...
TRANSCRIPT
© 2016 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.
Privacy and power
System Frameworks #WWDC16
Session 716
Core Location Best Practices
Brad Jensen Apple Inc
The Schedule
The Schedule
Major Features
The Schedule
Major FeaturesBest Practices
Major Features
Authorization
Authorization
Required to access location
Authorization
Required to access location
Authorization
Required to access locationWhen-in-use
Authorization
Required to access locationWhen-in-use• requestWhenInUseAuthorization
Authorization
Required to access locationWhen-in-use• requestWhenInUseAuthorization
Always
Authorization
Required to access locationWhen-in-use• requestWhenInUseAuthorization
Always• requestAlwaysAuthorization
Authorization
Required to access locationWhen-in-use• requestWhenInUseAuthorization
Always• requestAlwaysAuthorization
When-in-use Authorization
When-in-use Authorization
Foreground
When-in-use Authorization
ForegroundBlue bar
When-in-use Authorization
ForegroundBlue barWatchConnectivity
Standard Location
Standard Location
Single location• requestLocation
Standard Location
Single location• requestLocation
Continuous location• startUpdatingLocation
Standard Location
Single location• requestLocation
Continuous location• startUpdatingLocation• stopUpdatingLocation
Standard Location
Single location• requestLocation
Continuous location• startUpdatingLocation• stopUpdatingLocation
Features
Standard Location
Single location• requestLocation
Continuous location• startUpdatingLocation• stopUpdatingLocation
Features• Deferred updates
Standard Location
Single location• requestLocation
Continuous location• startUpdatingLocation• stopUpdatingLocation
Features• Deferred updates• Automatic pausing
Continuous Location in the Background
Continuous Location in the Background
Location updates and app continue running
Continuous Location in the Background
Location updates and app continue runningWhen-in-use authorized apps get a blue bar
Continuous Location in the Background
Location updates and app continue runningWhen-in-use authorized apps get a blue barStop when done
Continuous Location in the Background
Location updates and app continue runningWhen-in-use authorized apps get a blue barStop when doneRequirements
Continuous Location in the Background
Location updates and app continue runningWhen-in-use authorized apps get a blue barStop when doneRequirements• Enable background location in
information property list
Continuous Location in the Background
Location updates and app continue runningWhen-in-use authorized apps get a blue barStop when doneRequirements• Enable background location in
information property list• Set allowsBackgroundLocationUpdates
Continuous Location in the Background
Location updates and app continue runningWhen-in-use authorized apps get a blue barStop when doneRequirements• Enable background location in
information property list• Set allowsBackgroundLocationUpdates• Start continuous location updates in foreground
Standard Location in the Background
Standard Location in the Background
Start in background
Standard Location in the Background
Start in backgroundAlways authorization
Standard Location in the Background
Start in backgroundAlways authorizationNo extra runtime
Region Monitoring
Region Monitoring
Monitor for specific locations
Region Monitoring
Monitor for specific locationsContinues when app is suspended
Region Monitoring
Monitor for specific locationsContinues when app is suspendedTwo variants
Region Monitoring
Monitor for specific locationsContinues when app is suspendedTwo variants• Circular Region
Region Monitoring
Monitor for specific locationsContinues when app is suspendedTwo variants• Circular Region• Beacon Region
Region Monitoring
Monitor for specific locationsContinues when app is suspendedTwo variants• Circular Region• Beacon Region
Limited resource
Region Monitoring
Monitor for specific locationsContinues when app is suspendedTwo variants• Circular Region• Beacon Region
Limited resourceStart with startMonitoring(for:)
Region Monitoring
Monitor for specific locationsContinues when app is suspendedTwo variants• Circular Region• Beacon Region
Limited resourceStart with startMonitoring(for:)Stop with stopMonitoring(for:)
TriggersRegion Monitoring
TriggersRegion Monitoring
Notifications• UNLocationNotificationTrigger
TriggersRegion Monitoring
Notifications• UNLocationNotificationTrigger
Introduction to Notifications Pacific Heights Wednesday 9:00AM
TriggersRegion Monitoring
Notifications• UNLocationNotificationTrigger
HomeKit• HMLocationEvent
Introduction to Notifications Pacific Heights Wednesday 9:00AM
TriggersRegion Monitoring
Notifications• UNLocationNotificationTrigger
HomeKit• HMLocationEvent
When-in-use authorization
Introduction to Notifications Pacific Heights Wednesday 9:00AM
Beacon Ranging
Beacon Ranging
UUID, major ID, and minor ID
Beacon Ranging
UUID, major ID, and minor IDRange to beacons
Beacon Ranging
UUID, major ID, and minor IDRange to beaconsNo extra runtime
Aside
https://developer.apple.com/ibeacon/
Significant Location Change Monitoring
Significant Location Change Monitoring
Monitor for large changes in location
Significant Location Change Monitoring
Monitor for large changes in locationUseful, but niche
Significant Location Change Monitoring
Monitor for large changes in locationUseful, but nicheConsider Visit Monitoring
Visit Monitoring
Visit Monitoring
Monitor for places of interest to the user
Visit Monitoring
Monitor for places of interest to the userSuitable for all-day use
Visit Monitoring
Monitor for places of interest to the userSuitable for all-day useContinues when app is suspended
Visit Monitoring
Monitor for places of interest to the userSuitable for all-day useContinues when app is suspendedStart with startMonitoringVisits
Visit Monitoring
Monitor for places of interest to the userSuitable for all-day useContinues when app is suspendedStart with startMonitoringVisitsStop with stopMonitoringVisits
Geocoding
Geocoding
Address to coordinates
Geocoding
Address to coordinatesCoordinates to address
Geocoding
Address to coordinatesCoordinates to addressAuthorization is not required
Geocoding
Address to coordinatesCoordinates to addressAuthorization is not requiredRate limiting
Geocoding
Address to coordinatesCoordinates to addressAuthorization is not requiredRate limiting• Cache results
Geocoding
Address to coordinatesCoordinates to addressAuthorization is not requiredRate limiting• Cache results• One request per user action
Which Authorization Level?
Which Authorization Level?
When-in-use Always
Which Authorization Level?
When-in-use Always
Standard Location ✓ ✓
Background Location Session ✓ ✓
Beacon Ranging ✓ ✓
Which Authorization Level?
When-in-use Always
Standard Location ✓ ✓
Background Location Session ✓ ✓
Beacon Ranging ✓ ✓
Region Monitoring ✓
Visit Monitoring ✓
Significant Location Change Monitoring ✓
Availability
Availability
Standard Location
Background Location Session
Beacon Ranging
Region Monitoring
Visit Monitoring
Significant Location Change Monitoring
Geocoding
Availability
Standard Location
Background Location Session
Beacon Ranging
Region Monitoring
Visit Monitoring
Significant Location Change Monitoring
Geocoding
iOS
✓
✓
✓
✓
✓
✓
✓
Availability
Standard Location
Background Location Session
Beacon Ranging
Region Monitoring
Visit Monitoring
Significant Location Change Monitoring
Geocoding
iOS
✓
✓
✓
✓
✓
✓
✓
macOS
✓
N/A
CircularRegions
✓
✓
Availability
Standard Location
Background Location Session
Beacon Ranging
Region Monitoring
Visit Monitoring
Significant Location Change Monitoring
Geocoding
iOS
✓
✓
✓
✓
✓
✓
✓
macOS
✓
N/A
CircularRegions
✓
✓
watchOS
✓
✓
Availability
Standard Location
Background Location Session
Beacon Ranging
Region Monitoring
Visit Monitoring
Significant Location Change Monitoring
Geocoding
iOS
✓
✓
✓
✓
✓
✓
✓
macOS
✓
N/A
CircularRegions
✓
✓
watchOS
✓
✓
tvOSSingle
Location
✓
Availability
iOS macOS watchOS tvOS
Standard Location ✓ ✓ ✓ SingleLocation
Background Location Session ✓ N/A
Beacon Ranging ✓
Region Monitoring ✓ CircularRegions
Visit Monitoring ✓
Significant Location Change Monitoring ✓ ✓
Geocoding ✓ ✓ ✓ ✓
Best Practices
Privacy
Privacy
The most important part
Privacy
The most important partYou must respect the user’s privacy
Privacy
The most important partYou must respect the user’s privacyYou must respect the user’s privacy
Privacy
The most important partYou must respect the user’s privacyYou must respect the user’s privacyDon’t ask for more than you need
Privacy
The most important partYou must respect the user’s privacyYou must respect the user’s privacyDon’t ask for more than you needMake it clear
ContinuedPrivacy
ContinuedPrivacy
Anonymize server queries
ContinuedPrivacy
Anonymize server queriesUse file protection
Power
Power
Core Location’s power cost is highly variable
Power
Core Location’s power cost is highly variableUsers like their batteries
Power
Core Location’s power cost is highly variableUsers like their batteriesDesign with power in mind
Power
Core Location’s power cost is highly variableUsers like their batteriesDesign with power in mindUsing the right API matters
Which API?
Which API?
Now or Later?
Which API?
Now or Later?
RegionMonitoring
VisitMonitoring
Where?
Later
SpecificLocation
Any Location
Which API?
Now or Later?Now
Why?
RegionMonitoring
VisitMonitoring
Where?
Later
SpecificLocation
Any Location
Which API?
Now or Later?Now
Why?
Deferred Location Updates
Fitness
RegionMonitoring
VisitMonitoring
Where?
Later
SpecificLocation
Any Location
Which API?
Now or Later?Now
Why?
ContinuousLocation
Navigation
Deferred Location Updates
Fitness
RegionMonitoring
VisitMonitoring
Where?
Later
SpecificLocation
Any Location
Continuously Updating UI?
Yes
Other
Which API?
Now or Later?Now
Why?
ContinuousLocation
Navigation
Deferred Location Updates
Fitness
RegionMonitoring
VisitMonitoring
Where?
Later
SpecificLocation
Any Location
Continuously Updating UI?
Yes
Other
Which API?
Now or Later?Now
Why?
ContinuousLocation
Navigation
Deferred Location Updates
Fitness
RegionMonitoring
VisitMonitoring
Where?
Later
SpecificLocation
Any Location
Single Location
Recording a Track?
Yes No
No
Best practicesAuthorization
Best practicesAuthorization
Use when-in-use authorization when possible
Best practicesAuthorization
Use when-in-use authorization when possibleCommunicate
Best practicesAuthorization
Use when-in-use authorization when possibleCommunicate
Best practicesAuthorization
Use when-in-use authorization when possibleCommunicateDirect users to settings• UIApplicationOpenSettingsURLString
Best practicesAuthorization
Use when-in-use authorization when possibleCommunicateDirect users to settings• UIApplicationOpenSettingsURLString
Best practicesThreading
Best practicesThreading
CLLocationManager requires a runloop
Best practicesThreading
CLLocationManager requires a runloopYou can use CLLocationManager on the main thread
Best practicesThreading
CLLocationManager requires a runloopYou can use CLLocationManager on the main threadInteract with CLLocationManager from the thread it was created on
// Requesting authorization
func requestAuthorization() {
let manager = CLLocationManager()
manager.requestWhenInUseAuthorization()
}
// Requesting authorization
func requestAuthorization() {
let manager = CLLocationManager()
manager.requestWhenInUseAuthorization()
}
// Requesting authorization
class LocationAuthorizationRequester {
static let manager = CLLocationManager()
func requestAuthorization() {
LocationAuthorizationRequester.manager.requestWhenInUseAuthorization()
}
}
// Requesting authorization
class LocationAuthorizationRequester {
static let manager = CLLocationManager()
func requestAuthorization() {
LocationAuthorizationRequester.manager.requestWhenInUseAuthorization()
}
}
// Requesting authorization
class LocationAuthorizationRequester {
static let manager = CLLocationManager()
func requestAuthorization() {
LocationAuthorizationRequester.manager.requestWhenInUseAuthorization()
}
}
// Requesting authorization
class ViewController: UIViewController {
let manager = CLLocationManager()
func requestAuthorization() {
self.manager.requestWhenInUseAuthorization()
}
// ...
}
// Requesting authorization
class ViewController: UIViewController {
let manager = CLLocationManager()
func requestAuthorization() {
self.manager.requestWhenInUseAuthorization()
}
// ...
}
// Requesting authorization
class ViewController: UIViewController {
let manager = CLLocationManager()
func requestAuthorization() {
self.manager.requestWhenInUseAuthorization()
}
// ...
}
Best practicesStandard Location
Best practicesStandard Location
Use requestLocation
Best practicesStandard Location
Use requestLocationSet desiredAccuracy property
Best practicesStandard Location
Use requestLocationSet desiredAccuracy propertyEnable automatic pausing
Best practicesStandard Location
Use requestLocationSet desiredAccuracy propertyEnable automatic pausingUse deferred location updates
Best practicesStandard Location
Use requestLocationSet desiredAccuracy propertyEnable automatic pausingUse deferred location updatesEnergy Log Instrument
Best practicesStandard Location
Use requestLocationSet desiredAccuracy propertyEnable automatic pausingUse deferred location updatesEnergy Log InstrumentSet allowsBackgroundLocationUpdates
Best practicesStandard Location
Use requestLocationSet desiredAccuracy propertyEnable automatic pausingUse deferred location updatesEnergy Log InstrumentSet allowsBackgroundLocationUpdates
Best practicesStandard Location
Use requestLocationSet desiredAccuracy propertyEnable automatic pausingUse deferred location updatesEnergy Log InstrumentSet allowsBackgroundLocationUpdates
Best practicesMonitoring APIs
Best practicesMonitoring APIs
Use a single CLLocationManager
Best practicesMonitoring APIs
Use a single CLLocationManagerMonitoring continues until explicitly stopped
Best practicesMonitoring APIs
Use a single CLLocationManagerMonitoring continues until explicitly stoppedStop monitoring on launch if you’re unsure of your state
Best practicesMonitoring APIs
Use a single CLLocationManagerMonitoring continues until explicitly stoppedStop monitoring on launch if you’re unsure of your state
let manager = CLLocationManager()
manager.stopMonitoringVisits()
manager.stopMonitoringSignificantLocationChanges()
for region in manager.monitoredRegions {
manager.stopMonitoring(for: region)
}
Indoor Location
watchOS
watchOS
iPhone automatically assists
watchOS
iPhone automatically assistsWhen-in-use authorization
watchOS
iPhone automatically assistsWhen-in-use authorizationstartUpdatingLocation is available*
*startUpdatingLocation will be available in a future seed
watchOS
iPhone automatically assistsWhen-in-use authorizationstartUpdatingLocation is available*
*startUpdatingLocation will be available in a future seed
Building Great Workout Apps Pacific Heights Friday 11:00AM
macOS
macOS
Always authorization
macOS
Always authorizationAutomatic prompting
macOS
Always authorizationAutomatic promptingUse requestLocation
tvOS
tvOS
You have• Single location• Geocoding• MapKit
tvOS
You have• Single location• Geocoding• MapKit
Respect the user’s privacy
Best Practices
Best Practices
Respect the user’s privacy
Best Practices
Respect the user’s privacyConserve power
Best Practices
Respect the user’s privacyConserve powerUse the right API
Best Practices
Respect the user’s privacyConserve powerUse the right APILook at Potloc
More Information
https://developer.apple.com/wwdc16/716
Related Sessions
What's New in watchOS 3 Presidio Tuesday 5:00PM
Introduction to Notifications Pacific Heights Wednesday 9:00AM
Building Great Workout Apps Pacific Heights Friday 11:00AM
Labs
Core Location Lab Frameworks Lab C Friday 12:30PM
Notifications Lab Graphics, Games and Media Lab B Friday 9:00AM
HomeKit Lab Frameworks Lab A Friday 11:30AM