I didn't attend DC. These notes are from watching the session videos.
101: Keynote
- Tim Cook
- Conference
- 13 million registered devs, 2 million added in the past year
- Over 5000 attendees
- Over 74 countries
- 70% are first-time attendees
- 350 scholarships this year
- 100 attendees under 18, youngest is 9
- Over 1000 apple engineers on site
- App Store
- Recently passed 2 million apps on the store
- 130 billion downloads
- $50 billion paid to developers
- Talking about 4 Apple platforms today
- Mac
- iPhone/iPad
- Apple TV
- Watch
- Conference
- Kevin Lynch: watchOS
- Performance: series improvements in app launch time
- Keep favorite apps in memory
- Background updates of data, refreshed information
- Instance lunch
- Dock: favorite apps
- Control center on watch face: swipe up from bottom
- Scribble: write letters on watch face. Handles different language, showed Mandarin
- Watch faces
- Mini Mouse
- Activity rings
- Easier to switch faces by swiping
- Stacey Lysek (sp?) demo
- Showed off some updated apps, watch face swiping, dock
- Back to Kevin
- SOS on the watch, to call for help
- Press and hold side button to dial 911 or select other emergencies
- Automatically notifies emergency contacts
- Activity and workout: Jay Blahnik (sp?)
- Activity Sharing
- See activity rings for other people
- Wheelchair users: different motions used for movement
- Time to Roll notifications
- Two dedicated workouts in the workout app
- Activity rings optimized for wheelchair users
- New app: Breathe
- Guide through deep breathing sessions
- Option to use haptic feedback
- Back to Kevin
- Other new stuff:
- Apple Pay within apps
- Fitness apps can run in the background
- SpriteKit, SceneKit
- Native event support for crown and gestures
- Embed audio and video
- Game Center, CloudKit
- Developer preview today
- Free upgrade out this fall
- Performance: series improvements in app launch time
- Eddie Cue: tvOS
- 1300 video channels, 6000 apps
- New apps:
- Sling (live TV) coming to Apple TV today
- Fox Sports Go: four games at once, coming this summer
- Molotov: French TV and on-demand, next month
- Games: Minecraft story mode, Sketch Party (Pictionary, basically)
- App TV remote app
- Playback controls, all features of the Siri remote
- Use accelerometer and gyroscope to play games
- Option to search YouTube from Siri
- Live Tune-in
- Siri: “Watch ESPN 2"
- Making available on iPad and Apple TV
- Single Sign-on to simplify signing in with cable provider
- Dark mode
- Auto-downloads: download an iOS app, and it’ll download on the TV
- Updates
- ReplayKit: live broadcast, share gameplay video
- PhotoKit
- HomeKit
- Developer preview today
- Upgrade out this fall
- Craig Federighi: OS X
- "OS X” for over 15 years
- Now macOS: Sierra
- Auto Unlock
- Nearby watch
- Universal clipboard
- Images, video, text: paste between devices
- iCloud drive
- Desktop files synced across macs and mobile devices
- Optimized storage
- Wipe unneeded/old files
- Apple Pay
- On the web: prompts you to authenticate the purchase with touch ID on your phone or watch
- Tabs
- Tabs everywhere
- Available to devs out of the box without extra work
- Picture in picture
- Example: youtube
- Works while other apps are in full-screen, too
- Siri on the Mac
- Can search files
- Refine search results by narrowing criteria
- Option to pin results into notification center
- Request to play playlists
- Big stuff
- Continuity
- Siri
- Developer preview today, public beta in July (beta.apple.com), public release in the fall
- Still Craig: iOS 10
- 1: Redesigned lock screen and home stuff
- Raise to wake: like Watch, phone wakes up without tapping a button, to see notifications since the Touch ID is so fast
- 3D touch on notifications to get more detail
- Control center
- Redesigned
- Separate Music controls when you swipe over
- Camera from lock screen
- Slide from the right
- Slide from the left to see widgets: weather, calendar
- Home screen 3D touch:
- Messages to see what’s in there
- Activity summary
- Looks like Today view has moved to the swipe left search view
- 2: Siri opened up to developers
- Slack, weChat, Uber, Lyft, RunKeeper, Number 26, Square Cash, Skype
- Same in CarPlay
- 3: QuickType
- Intelligent suggestions based on context
- Multilingual typing
- 4: Photos
- Advanced Computer Vision
- Deep learning techniques for facial recognition done locally on device
- Object and scene recognition: powerful searching
- Memories: generate movies with photos, videos, adds background music, option for length
- Eddie Cue back
- 5: Maps
- All new design
- Proactive: slide up from the bottom for suggestions, like calendar events, travel time to work
- Improved navigation, showing traffic and automatic zoom in/out as appropriate
- Easier to pan and zoom in navigation view to check traffic conditions
- Controls to find things along the route, like a gas station
- CarPlay: can include turn by turn navigation in the instrument cluster behind the wheel
- Map Extensions
- Example: make a dinner reservation in OpenTable right from maps
- Option to book a ride with extensions like Uber
- 6: Music
- 15 million paid subscribers
- All new design
- Bozoma Saint John: demo
- Downloaded section
- Recently added section
- For You section: recommended music
- Lyrics when song is playing
- 7: Apple News
- 60 million monthly users reading news
- Redesigned
- Featured stories
- Subscriptions
- Wall Street Journal, National Geographic
- Breaking news notifications to the lock screen
- Back to Craig
- 8: HomeKit
- New accessory types: cameras, door locks, etc
- All major manufacturers have HomeKit integration, some builders now doing it from scratch
- New Home app on iOS
- 3D touch to control light dimmer
- Scenes: "good night” might turn off lights, lock the door, adjust thermostat
- “Good morning siri” will start the morning scene
- HomeKit built into Control Center
- Built into Watch too
- 9: Phone
- Voicemail transcription
- Phone extension for apps to help identify possible phone spam
- New VOIP API for better incoming call notification: full screen instead of little push notification
- Contact card enhanced to keep track of how you prefer to call someone
- Cisco Spark app: can receive calls to work number on your iPhone
- 10: Messages
- Rich links
- Inline video playing
- Live camera feed when opening the photo option
- Emoji appear 3x bigger
- Emoji prediction in QuickType
- Quick emoji-fication of existing words in the message
- Bubble effects
- Big loud, smaller more gentle
- Invisible ink: slide finger across to reveal message or photo
- Handwritten messages, drawing out like like Apple Watch drawing
- Digital touch
- Heartbeat
- Whole-screen (“Happy new year” fireworks)
- Demo: Bethany and Emron (?)
- Emoji re-actions?
- iMessage Apps
- iMessage has an app drawer
- Demo
- Stickers: send alone, or stick them on existing messages
- DoorDash: food orders. Group cart.
- JibJab: faces on animations
- Others
- Notes collaboration
- Conversation view in Mail
- Live photos editing
- Split view in Safari on iPad: two websites side by side
- Dropping 4S support
- Privacy
- End to end encryption for things like FaceTime and messages
- On-device intelligence for image recognition
- No user profiling for searches in maps, spotlight, etc
- Differential privacy: to recognize overall trends
- Developer preview today, beta in July, public in Fall
- 1: Redesigned lock screen and home stuff
- Back to Tim
- Swift Playgrounds on iPad
- Sheryl Thomas to demo
- Lessons for learning to code
- Developer preview today, public beta July, public release same time as iOS 10
- Free
- Video about how developers got their start
- Extensions: secure, sandboxed
- iMessage apps (Darren Adler)
- Message, session, conversation
- Privacy: app does not have access to the larger conversation
- App will display in compact mode the same size as the keyboard when user is swiping through them
- Simulator includes a special Messages app to show both sides of a fake conversation
- Siri (Robbie Walker)
- App vocabulary: plist (specific to app)
- User vocabulary: code (specific to an individual user)
- Extension
- Understand parameters
- Confirm intent
- Handle intent
- Second extension to customize how Siri shows these options
- Siri will say a lot more and show less if your in CarPlay
- Swift (Chris Lattner)
- Swift 3
- Get early growing pains over with
- Stability and compatibility
- Swift 3
- Swift playgrounds on iPad
- Documentation on the file format available now
- Lesson materials available later this year
- Xcode
- Swift color and image literals
- Automatic doc blocks
- Xcode App extensions
- Starting with source editing
- Unified API reference
- Interface builder includes a toolbar to show each VC in different size classes and orientations
- Toggle to edit in one size class, and the device context bar shows only the devices/orientations where that class will be used
- Shows light/dark interface options for tvOS apps
- IB supports canvas operations at any zoom level
- New analyzers: localization, nullability, deallocation
- xcodebuild run pre-built tests
- Runtime Issues
- UI
- Ambiguous layouts
- Threads
- Thread sanitizer: able to detect common threading issues
- Memory
- Visualize and navigate object graph
- Automatically finds leaks
- UI
- Provisioning
- Rebuilt the system in 8
- Automatic code signing option: Xcode uses a dedicated profile
- Disable automatic to use customized code signing, per build configuration
- Development certs: now support multiple certs. No longer need to revoke/share when you get a new Mac
- Platform technologies (Sebastian)
- Compression: lzfse open sourced
- Networking: prioritize high priority apps and devices. With Cisco.
- Logging
- Unified, fast, compact, privacy
- File systems
- HFS+ released 1998
- Apple File System
- Cloning: copied file doesn’t take up more space until modified
- Snapshots: Full volume backup
- Privacy
- Differential privacy
- Privacy budget
- iOS
- Share option for apps when using 3D touch
- NSUserActivity is gateway to a whole lot of functionality
- Adding in iOS 10: people and places
- Widget
- Compact fixed size
- Widgets available in 3D touch from home screen
- To use that
- Update look
- Build with iOS 10 SDK—that’s it
- macOS
- iCloud APIs no longer restricted to App Store apps (as long as the app is signed)
- CloudKit
- Permission model: public, or private to the user
- New sharing feature to allow others to access data
- watchOS
- Glanceable: interactions are short
- Actionable: simplify access to most common actions
- Responsive: keep apps up to date and ready to act
- Three interfaces for an app
- Full screen
- Complication
- Notification
- Glances: now in the dock, not a separate glance interface
- Return to last app for up to 8 minutes after you last used it. After that, goes back to the watch face
- Background app refresh
- Workout apps run continually in the background
- Heart rate and accelerometer now provide continuous values during workouts
- Hardware APIs: Crown events, gesture recognizers, gyroscope
- SpriteKit, SceneKit, speaker access, inline video
- CloudKit
- Works when phone isn’t present but near known wifi
- Apple Pay
- Watch face gallery in iOS 10 shows complications from their iPhone apps
- Demo (Eliza)
- tvOS (Jim Young)
- Multipeer connectivity
- May require game controller
- Graphics
- sRGB vs Wide Color (P3)
- ReplayKit: introduced last year?
- Streaming this year
- ReplayKit streaming extension
- About 3 lines of code to adopt if you already support ReplayKit
203: What's New In Cocoa
- API Updates
- Swift API Guidelines
NS_SWIFT_NAME
for Obj-C code that's used in Swift
- API Refinements
- Nullability: mostly done last year, refined a bit this year
- Class properties
@noescape
,NS_NOESCAPE
- Swift API Guidelines
- AppKit
- File promise dragging
- NSGridView: like UIStackView
- Simpler control constructors
- Layout loop debugging support
- Foundation
- Dropping
NS
prefix in Swift - New value types in Swift
- Unit, measurement, MeasurementFormatter
- DateInterval, DateIntervalFormatter
- ISO8601DateFormatter
- Dropping
- Other updates
- New URLSessionTaskMetrics class
- Overview
- Smooth scrolling
- Improvements to self-sizing cells
- Interactive reordering
- Smooth scrolling
- Do most of the work in
cellForItemAtIndexPath
- Do minimal work in
willDisplayCell
/didEndDisplayingCell
- Note that a cell prepared in
cellForItemAtIndexPath
might never display, if the user changes scroll direction - Prefetching tips
- Use GCD of NSOperationQueue
- Adaptive technology: if the user is scrolling really fast, prefetching might not happen
- Use
cancelPrefetchingForItemsAt
to de-prioritize data loading to better match current user focus
- Prefetching availabile on UITableView too, in a similarly-named counterpart
- Do most of the work in
- Improvements to self-sizing cells
- To use self-sizing cells, give the UICollectionViewFlowLayout an
estimatedItemSize
- Three methods to self-sizing cells:
- Auto Layout
- Override
sizeThatFits
- Override
preferredLayoutAttributesFittingAttributes
- New constant:
UICollectionViewFlowLayoutAutomaticSize
- This will adjust the estimated size for future cells based on a running average of cells that have been sized
- To use self-sizing cells, give the UICollectionViewFlowLayout an
- Interactive reordering
beginInteractiveMovementForItem
updateInteractiveMovementTargetPosition
endInteractiveMovement
cancelInteractiveMovement
- New:
isPagingEnabled
- Autoresize masks in IB
- Translated to constraints at runtime, NOT build time
- Views with constraints ignore autoresizing masks
- Design and runtime constraints
- Placeholder constraint: checkbox in IB. Removed at build time. Programmatically create actual constraint at runtime.
- For custom views, use Intrinsic size: placeholder. Set a simulated size for use in IB. Provide real intrinsic content size from code.
- Turn off ambiguity per view. For use when constraints will be added at runtime. Change ambiguity setting away from Always Verify.
- NSGridView on macOS
- NSGridRow, NSGridColumn
- Automatic or explicit sizing
- Optional padding/spacing
- Hidden rows and columns
- NSGridCell
- Cells can be merged
- Can be created by specifying the views in an array: NSGridView(views: [])
- Automatically handles columns
- Columns, rows, cells, and the grid view all have x and y placement properties
- Inherited
- rowAlignment: set to baseline
- Takes precedent over the placement properties
- Fetch a the cell for a subview with gridView.cell(for: subview)
- topPadding and bottomPadding on cells
- Padding is like margin in CSS. Spacing is like padding in CSS.
- NSGridRow, NSGridColumn
- Layout feedback loop debugging
- UIViewLayoutFeedbackLoopDebuggingThreshhold launch argument will raise an exception. Set to 50...1000
- “Siri, remind me about this when I get home”—knows the context of what the user was doing at the time
- Covering
- NSUserActiviy: handoff
- Spotlight search: iOS 9
- Location suggestions: iOS 10
- Shown in QuickType
- Contextual Siri requests
- Contact interactions
- NSUserActivity for native apps, schema.org for web apps
- NSUserActivity
- Capture app state, in a way that can be restored later
- Creating activities
- Create NSUserActivity object, give it a user-facing title
- Enable capabilities: isEligibleForHandoff, isEligibleForSearch, isEligibleForPublicIndexing
- Specify userInfo: details to re-create state on restore
- Provide metadata: CSSearchableItemAttributeSet
- Thumbnail, keywords, webpage URL (for handoff to devices without the app installed)
- becomeCurrent(): indicates that
- application:continueUserActivity:restorationHandler
- Check activity type
- Items above allow for handoff, contextual Siri, location suggestion
- MapKit based apps
- Reuse the same user activity, and set mapItem property
- Best practice
- Lazy payload update
- set needsSave on activity
- Implement updateUserActivityState to provide updated payload when requested by the OS
- Keep strong reference to the NSUserActivity object
- userActivity property exists on UIResponder, so UIKit handles the reference
- Transfer a small payload
- Ex: don’t encode an image in the userInfo dictionary. Maybe use a URL for it instead
- Use reverse-DNS for activity types, to avoid name collisions
- Also: use multiple activity types, for different actions in the app
- Lazy payload update
- Location suggestions in QuickType
- Text field can indicate if the expected content is a location
- textField.textContentType = UITextContentTypeFullStreetAddress
- Other types: person’s name, address/location, phone number, etc
- Use the textContentType with the correct granularity, like FullStreetAddress vs CityAndState
- Routing apps: direction request banner in app switcher
- Register as a routing app
- in the capabilities panel
- optionally declare map regions that are supported (for local public transit, for example)
- Handle launch with MKDirectionsRequest
- App is launched with a URL
- use MKDirectionsRequest.isDirectionsRequestURL
- CLGeocoder().geocodeAddressDictionary to get place mark for the address
- iOS learns which routing app the user wants to be offered
- Register as a routing app
- Media app suggestions
- iOS promotes the app a user is likely to use based on behavior, in Spotlight and Today view
- If they follow a particular trigger, may be elevated to the lock screen
- For example, plug in headphones
- MPPlayableContentManager
- "The more the system knows about your app, the more opportunity it will have to promote it."
- Fundamentals
- Xcode uses
codesign
behind the scenes - Three things needed to sign apps:
- Signing certificate
- About the developer: identify you
- Issued by Apple. Trust chain back to Apple.
- Development (for build/run), distribution (auth with iTC or enterprise distro)
- Requires a private key. Created when the certificate is generated.
- Provisioning profiles
- About the app: identifies the app
- Issued by Apple
- Allows running on devices, and allows entitlements (whitelist)
- Entitlements
- Declare support for capabilities
- Fundamentally, just a string with associated value
- Defined per target
- plist is managed from the Capabilities tab
- Signing certificate
- When signing an app:
- Xcode builds the app
- Looks at certificates on the machine, and picks the newest one matching the team
- Looks provisioning profiles, and picks the newest one matching the bundle ID
- Profile embedded in the app
- Cert used to apply code seal to the app
- Xcode uses
- Signing Certificate per Mac
- Previously:
- Development accounts have a limit of one development cert
- Worked fine if you only had one machine. For more than one, you needed to sync your private key over.
- In Xcode 8: you can have multiple development certificates
- Distribution certs still have a limit of one
- Cert can be created on developer site or in Xcode 8
- Previously:
- Signing in Xcode
- Fully redesigned in Xcode 8
- Faster and more reliable
- New workflows, and new interface in the General tab
- Actionable messages when something goes wrong
- Status reporting, when Xcode fixes a problem
- Automatic signing
- Takes care of everything for you in the background
- Prompts only when necessary
- eg: when you connect an unregistered device, it'll ask if that device should be registered
- Signing report shows what Xcode did and why
- Report Navigator, in left sidebar
- Each row can be expanded by clicking disclosure at right
- Only works with development signing
- Limited to Xcode-created provisioning profiles
- Distribution assets are not touched
- Customized signing
- Full control over signing
- New error reporting shown alongside signing settings
- Info button next to the provisioning profile dropdown displays details about the profile
- Customized signing is limited to manually-created profiles. Xcode will never modify these.
- Any type of profile—build or distribution
- New build setting: PROVISIONING_PROFILE_SPECIFIER, references profiles by name (not unique ID)
- Updating settings in the Capabilities tab will not modify your provisioning profile. A little error icon by the capability will explain what steps need to be taken manually, and they also display near the signing settings on the General tab.
- Fully redesigned in Xcode 8
- Best Practices
- Use automatic signing
- Manual: don't use CODE_SIGNING_IDENTITY. This is specific to you, not the team.
- Cmd+Opt+/ to add doc block
- FIXME: comments now displayed in the document item list with a bandage icon
- Code completion for image names. De-refs to UIImage(imageNamed). Also works for colors.
- Ctl+Cmd+E: edit all in scope
- Ctl+Cmd+G: jump to next search result in workspace. Like Cmd+G across all files
- Source editor commands
- Xcode extensions run in their own processes: don’t interfere with Xcode
- Sandboxed and use entitlements to escape sandbox
- Only get access to necessary text and metadata at runtime: don’t get project structure or user’s files on disk
- Distributed though Mac App Store
- Extensions are built into a host application. Good place for settings/configuration and any other UI, since they have no UI in Xcode.
- Xcode automatically finds and starts extensions on launch, before they’re needed
- Extension is kept alive as long as possible, not setup and torn down repeatedly
- extensionDidFinishLaunching can be used for quick startup work
- Asynchronous from Xcode and other extensions startups
- Define commands in the Info.plist, or override that in commandDefinitions in the extension class (for dynamic commands)
- Each extension gets it’s own submenu in the Editor menu
- extensions listed alphabetically
- commands ordered by extension, since commands might be ordered logically
- Command object is initialized and sent an invocation call, with text buffer and meta data and a completion callback. Invocation includes:
- commandIdentifier: to handle multiple commands from the same class
- cancellationHandler: called if the user cancels your command
- buffer: the text the user is working with. Another object with info about indentation, lines, selection, file type, etc
- completeBuffer includes the entire file
- Xcode prevents the user from modifying the file while a command is being run
- This also means the user can cancel it, if it’s running too long, by showing a cancellation banner
- Cancellation is immediate
- Speed
- Start up quickly
- Use GCD
- Don’t replace the whole buffer if you don’t have to
- Handle cancellation quickly
- Alert types
- Visual
- Sound/vibration
- Badge
- New look for banner badges
- Background refresh
- content-available
- Existing API
- UIApplication
- Registration
- Scheduling
- Different callbacks for local and remote notifications
- Limited control after notifications are scheduled
- Different support across platforms
- UIApplication
- User Notification Framework
- Familiar API with feature parity
- Expanded content
- Combined local/remote handling
- Simplified delegate methods
- Better notification management: pending or already delivered notifications
- In-app presentation option
- watchOS
- Local notifications on the watch, for things like reaching a workout goal
- tvOS
- Badging app icons
- Registration
- Authorization for notification type
- Repeat for both local and remote notifications
- User selections can now be accessed
- New notification look
- Title, subtitle, and body
- Media attachments (more info in the advanced session)
- Triggers for notifications
- Push (remote)
- Time interval (local). Time from now, or recurring interval from now
- Calendar (local). Specific date and time in the future.
- Location (local). GPS or proximity to beacons
- Notification handling
- Application in foreground: Completion block on delegate method takes argument with presentation options, which allows you to specify how (or if) the notification is displayed
- Notification management
- Access pending and delivered notifications
- Remove notifications
- Update or “promote” notifications
- Update: add (as normal) a notification with the same identifier as the existing one
- Request identifier
- Specify for local
- Header in push payload for remote
- Actions
- Default action: when the user taps the notification to launch the app
- Actionable notifications
- Buttons with customizable title
- Appear below the notification
- Text input
- Same thing on watchOS
- Register action categories with the app
- Presenting actions
- Remote: set category identifier in the aps payload. Category must be registered already
- Local: Set categoryIdentifier on content object
- Buttons with customizable title
- Dismiss action: swipe left, then tap Clear
- Need to opt in for this
- customDismissAction in options for the category reg?
- Handling actions
- Delegate method didReceive response withCompletionHandler
- The response object contains info about the action
- Remote notifications: Service extension
- Augment or replace remote notifications before displayed to the user
- Can be used for end-to-end encryption, add attachment
- Extension gets short execution time: not for background task
- To implement
- Add a new Notification Service target
- Implement subclass of UNNotificationServiceExtension
- Method: didReceive, with a completion handler
- Call completion handled with a new UNMutableNotificationContent with the body set
- Also has serviceExtensionTimeWillExpire: must call completion handler here
- From the server, include mutable-content key
- New default app notifications in iOS 10
- Touch notifications to show more default
- Detail can be updated when you tap an action (like accepting a meeting event)
- Messages notifications show the conversation and allow multiple responses
- Media attachments
- 4kb remote payload: not big enough for an image
- Attachments added by service extension: include mutable-content flag
- Extension class adds an attachment to the content object, using a local URL
- Limited processing time and size
- Probably want to download a scaled image or just a clip of the video, then download the full one if they launch the app
- File is moved and handled by the OS?
- Images, audio, video
- Custom UI
- Notification content extension
- Custom views
- Respond to actions
- Notification detail display:
- Header, with icon, app name, close button
- Custom view
- Default content: payload from the notification. Title, subtitle, body
- Action buttons. Once tapped, the custom view can be updated
- Implementation
- Use template to add target: adds view controller and nib
- ViewController
- implements UNNotificationContentExtension
- Requires didReceive method: gets the notification object, for updating the UI
- Register different action categories in Info.plist
- UNNotificationExtensionDefaultContentHidden option in Info.plist: set to YES to hide the default display of title/subtitle/body (if it’s shown in the custom view)
- Can set preferredContentSize in the view controller to resize the custom view
- Sizing
- Extension is not running when the OS starts to display it
- UNNotificationExtensionInitialContentSizeRatio in Info.plist to set starting ratio
- Media attachments in content extension
- Can be accessed as content.attachments in the content extension view controller
- Need to call startAccessingSecurityScopedResource on the attachment
- Actions
- Delivered to the app, and the notification is dismissed immediately
- Intercept the action response to delay dismissal
- In the didReceive: call the completion handler with the dismiss response option
- Text input action
- Can use inputAccessoryView to customize input
- implement canBecomeFirstResponder on the view controller, return true
- override the inputAccessoryView var in the view controller
- In didReceive: make the view controller first responder so the input accessory view appears, then make the text field first responder so the keyboard appears
Questions
- How much time does the extension have to download media attachments?
- Can the extension use the same sandbox as the app, to cache files there for use later?
- HTTP/2 provider API
- Instant feedback
- Larger payload
- Simplified certificate handling. Same cert for:
- Dev and prod environments
- App, VoIP, and complication push
- Token authentication
- provider token instead of client cert
- Can be generated programmatically, to avoid expired certs
- Token signing key from the Apple developer account
- Coming “later this year"
- Structuring your app
- Identify areas of your app: UI, data transform, networking, etc
- Back each system with a dispatch queue
- Chaining vs Grouping work
- DispatchGroup
- Add work to different queues, associated with the same group
- Can receive notification when the group has completed executing all jobs
- Quality of service
- Using a higher QoS does not let you jump the line: it just elevates the work that’s in front of you in the queue in order to get to your job
- Swift 3
- Global vars initialized atomically
- Class properties not atomic
- Lazy properties not atomic