New stuff from WWDC 2019
As I’m writing these words, it’s the last day of November and the temperature has just dropped to close to 0°C here in Poland. But let’s move back to a better time for a moment, to the first days of June - the long days of warm sunny weather, inviting you to spend some time outside… and the huge pile of new stuff that Apple had just dropped on us on the WWDC keynote day, inviting you to try to frantically read and watch everything at once, and don’t leave the computer until you’ve read it all.
For the past 4 years I’ve been trying to cope with this crazy period by collecting notes from the WWDC talks, release notes, saving tweets, links to blog posts and so on, and organizing it all in a single ordered blog post. Writing things down this way is how I learn best, it helps me put together all loose pieces of information into a single picture, and gives me the peace of mind that I haven’t missed or forgotten anything important.
I usually finish this by July, but this year was different - first I got really hooked on SwiftUI and spent some time doing some experiments with it, and then I was busy working on and releasing my iOS content blocker app and doing some travelling. It didn’t help that the sheer amount of new APIs added this year was simply overwhelming.
So I finally got back to this in November, and I’m posting the list here on the half-anniversary of the 2019 keynote (yes, it’s really been 6 months already!) - hopefully it will still be of use to you. Previous editions are available here - I’ve also done some slight formatting changes here and there, and updated the links to point to Web Archive 🗄️ versions if the page no longer exists or was overwritten:
WWDC 2018 WWDC 2017 WWDC 2016 WWDC 2015
Quick links:
macOS 10.15 • iOS 13 • watchOS 6 • tvOS 13
Shared Frameworks • macOS 10.15 SDK • iOS 13 SDK • watchOS 6 SDK • tvOS 13 SDK
Web APIs & Android • Developer Tools • Safari 13 • Other
macOS 10.15 Catalina
https://www.apple.com/macos/catalina/ https://www.apple.com/macos/catalina/features/
Find My app (Catalyst-based)
combines “Find My iPhone” and “Find My Friends” can find devices that are offline and in sleep mode - communicates through other devices nearby (article)
iTunes is split into:
Music app (includes iTunes Store) Podcasts app (Catalyst-based) TV app device syncing section in Finder
redesigned Reminders app Screen Time for Mac (it has some problems though) Sidecar - using iPad as a second display, iPad with a pencil can act as a drawing tablet App Store:
Apple Arcade section
Mail:
“classic layout” of the window (email contents below) and classic look of the email list (narrow rows with columns) are now two indepedent settings in the View menu option to block emails from specific senders muting notifications from specific threads button for unsubscribing from newsletters in the email header
Maps:
completely rebuilt, much more detailed map content - entire US by the end of 2019, some other countries next year
Notes:
gallery view sharing folders of notes through iCloud sharing notes or folders as read-only more powerful search, including text recognition in images enhancements for checklists: reordering, moving checked items, uncheck all
Photos:
new years/months/days views
Preview:
signatures can be created using a nearby iPhone/iPad
QuickTime:
picture-in-picture button in the controls bar more details in the Movie Inspector creating a video from a sequence of images
Safari:
updated start page easier access to picture-in-picture through the “playing audio” icon on the tab when typing in the search bar, Safari suggests already open tabs to switch to web history and open tabs in iCloud are now end-to-end encrypted Cmd+T opens new tabs right after the active tab removed support for legacy (JavaScript-based) extensions
option to switch light/dark mode automatically new Apple ID and Family Sharing sections in the System Preferences support for Xbox and PS4 controllers accessibility:
“Hover Text” and “Voice Control” features mirrored display can be zoomed independently of the main one Siri voice can be used for VoiceOver and Speech
hovering over the zoom window button reveals options for tiling windows (tweet) Apple Watch can be used to unlock things on Macs without TouchID system suggests mobile hotspots to connect to if WiFi is unavailable (tweet) activation lock for Macs with T2 chip Gatekeeper now checks software for malware on every run Gatekeeper will now also check binaries not launched directly, e.g. bundles and libraries loaded by an app apps now need to ask for permission to:
record the screen or keyboard access user’s Documents, Desktop, Downloads, iCloud Drive, external and network drives access files in Trash (requires Full Disk Access); apps previously denied Full Disk Access will now appear on the list automatically, with the checkbox unchecked
the main disk partition is now divided into 2 logical volumes: system volume which is read only, and user data volume
system apps are now in /System/Applications, but Finder shows them in /Applications
default shell is now zsh (can be switched), dash is also included (docs) Dashboard (the old screen with widgets) is finally gone completely support for i386 (32-bit) apps is completely dropped built-in Python, Ruby and Perl runtimes are deprecated, will be removed in a future version
iOS 13
https://www.apple.com/ios/ios-13/ https://www.apple.com/ios/ios-13/features/ https://www.apple.com/ipados/ https://www.apple.com/ipados/features/ https://support.apple.com/en-us/HT210393
Dark Mode
can be toggled from the Control Center or scheduled
App Store:
new Apple Arcade tab replaces Updates Updates moved to the account popup (also accessible from the 3D Touch menu on the home screen) you can quickly delete apps while browsing the Updates list (video)
Books:
reading goals
Calendar:
event attachments
Camera & Photos:
new lighting effects for portrait new photo adjustments UI, new effects rotating and cropping videos, photo filters & effects can be applied to videos too redesigned Photos tab - intelligently selects best photos for days/months/years views screen recordings smart album when sharing photos, you can choose if you want to include location data and other info photos can be imported from an SD card straight to a third-party app fixed timezone handling (tweet)
CarPlay (article 1, article 2):
redesigned dashboard redesigned home screen redesigned Music app redesigned Calendar app Siri works with third party apps Hey Siri support smaller Siri screen support for adjustable screen size, irregular screens and for showing some information on a second screen Do Not Disturb while driving settings screen light mode opening an app on the iPhone doesn’t affect what’s shown on CarPlay
Clock:
new timer UI
Files:
Downloads folder iCloud Drive folder sharing (postponed to next year) creating new folders in the On My iPhone/iPad section built-in document scanner support for USB drives and SMB file servers new keyboard shortcuts on iPad
Find My app
combines “Find My iPhone” and “Find My Friends” can find devices that are offline and in sleep mode - communicates through other devices nearby (article)
Health:
redesigned UI menstrual cycle tracking
HomePod:
Handoff support live radio multi-user support
Mail:
better text formatting options option to ignore blocked senders (blacklist is shared with Messages, FaceTime and Phone apps) muting notifications from specific threads moved most toolbar actions to an action menu
Maps:
completely rebuilt, much more detailed map content - entire US by the end of 2019, some other countries next year favorite places place collections street view (Look Around) sharing ETA with friends real time flight/transit status easier way to share feedback about the map more natural sounding language in navigation
Messages:
name and avatars can be shared automatically when messaging unknown people improved search new animoji characters memoji:
many new customizations memoji stickers - all memoji are saved as stickers, can be used as emoji on the emoji keyboard, are synced between iOS devices creating memoji is now available on all A9+ devices
Music:
time-synced lyrics UI changes on the Now Playing screen and in action menus
Notes:
gallery view sharing folders of notes through iCloud sharing notes or folders as read-only more powerful search, including text recognition in images enhancements for checklists: reordering, moving checked items down, uncheck all
Phone:
silence unknown callers
Podcasts:
searching the content (transcripts) of podcasts
Reminders:
redesigned app
Safari:
new settings menu: changing font size, per site preferences saving all open tabs as a bookmark folder option to automatically close tabs after some period of time web history and open tabs in iCloud are now end-to-end encrypted search suggests pages currently open in other tabs downloads manager, downloading files to the new Downloads folder uploaded photos can be resized when sharing a page, you have an option to send it as a PDF, Reader View or Web Archive updated start page desktop-class browsing on iPad new keyboard shortcuts on iPad in iPad split view, toolbar is displayed at the top
Screen Time:
30 days of history “one more minute” limit extension communication limits for children (postponed)
Shortcuts:
Shortcuts app is now built in conversational (parametrized) shortcuts shortcuts automation: triggers for when to run shortcuts
Siri:
new, entirely computer-generated voice playing audio from third party apps
system UI:
new share sheet with intelligent contact suggestions redesigned screenshot markup screen screenshots in some apps now have an option to generate a PDF of a full document (e.g. in Safari, Notes) Haptic Touch mostly replaces 3D Touch (e.g. page preview from a link is now merged with URL preview in Safari) QuickPath keyboard - swipe typing separate emoji and language switch key on the keyboard (X phones only) (tweet) choosing WiFi network and Bluetooth devices in the control center (video) new QR code scanner in the control center (video) changed the way of moving the text cursor (drag & drop the cursor) changed some text selecting gestures (e.g. triple-tap, double-tap and drag) tapping with three fingers during editing shows a new edit actions menu quick scrolling in scroll views using the scrollbar indicator (video) multi-select gesture in tables - by dragging a finger over checkboxes (video) or two fingers over the rows (video), also Shift+tap on an iPad external keyboard new undo/redo gestures (video) new three finger cut/copy/paste gestures new volume UI (video) new ringer switch UI (video) changed some icon design throughout the OS (tweet, tweet)
iPad UI improvements (“iPad OS”):
tighter grid of icons widgets can be pinned on the home screen easy switching between apps in slideover multi-window support - same app can be opened multiple times expose for all views of a given app column view in Files with file preview/info and Quick Actions 2x lower Apple Pencil latency easy markup of anything in any app using pencil easy taking of screenshots using the pencil (by dragging it from a bottom corner) compact floating keyboard
performance improvements:
FaceID unlock up to 30% faster optimized app packaging - smaller app download sizes app launch speed up to 2x as fast improved automatic switching between WiFi and cellular connection (e.g. when leaving home)
privacy improvements for location data:
you can share location with an app just for current session alerts about background location tracking protection from tracking location through WiFi & Bluetooth signals
accessibility:
accessibility settings moved to the top level of the Settings app and reorganized, also added to quick start dialog “Voice Control” accessibility feature mouse/trackpad support - as an accessibility feature, part of Assistive Touch (works on both iPhone and iPad) (video, thread) Full Keyboard Access - lets you control the whole UI with keyboard (iPad only) option to disable auto-playing video previews
other settings:
optimized battery charging “Low Data Mode” setting for cellular and for WiFi networks, automatically enabled when you connect to a mobile hotspot (tweet) option to allow downloads of apps over 200 MB over cellular you can override language for each app separately in the Settings switching to bold fonts doesn’t require a restart
on phones with dual SIM, both numbers can be used for iMessage and Facetime and they can make calls simultaneously custom fonts can be installed in the system through third party apps dictation automatically detects which language the user is speaking in 38 new keyboard languages AirPods read incoming messages and let you respond (13.2) audio sharing with other people’s wireless headphones hotspot is shared automatically with members of iCloud family account when deleting an app with an active subscription, you get an alert asking if you want to cancel it (tweet) support for Xbox and PS4 controllers drops support for iPhone 5s, iPhone 6 & 6 Plus, iPod touch 6th gen, iPad mini 2 & 3 and iPad Air 1
watchOS 6
https://www.apple.com/watchos/watchos-6/ https://support.apple.com/en-us/HT210583
independent apps - you can now build Watch apps without an iOS app Apple Watch can now install OS updates without an iPhone and can be set to install updates automatically App Store app Audiobooks app Calculator app
includes tip calculation and bill splitting
Maps app: improved navigation menstrual cycle tracking app Noise app: decibel meter, warnings about high level of noise, noise level complication (Series 4/5 only) Now Playing: redesigned app, available as a normal app from the home screen Podcasts app: custom stations redesigned Reminders app redesigned Walkie-Talkie app Workouts app:
current elevation metric in some workouts stopwatch app can be continuously viewed on the watch face during workout shuffling workout playlist workout summary for previous runs can be shown on the watch
Voice memos app new watch faces: Gradient, Numerals Duo, Numerals Mono, California, Solar Dial, Modular Compact, Meridian (all except the numerals available only for Series 4/5) watch faces can be reordered on the watch (video) monochrome style for Infograph Modular face cellular signal complication wind and rain complications taptic chimes - plays taptic + sound at full hour activity trends (in the iOS Activity app) Siri:
can recognize songs through Shazam shows web search results
Continuity Keyboard between watchOS and iOS (you can use an iPhone to enter some text on the Watch) accessibility settings moved to the root level, added a lot more options support for autofilling one-time SMS codes like on iOS supports the same set of Watch models (Series 1 and above)
tvOS 13
redesigned home screen multi user support new control center sidebar with user switching Music app: shows lyrics support for Xbox and PS4 controllers underwater screensaver
Shared Frameworks
https://developer.apple.com/augmented-reality/ https://developer.apple.com/machine-learning/ https://developer.apple.com/xcode/swiftui/ https://developer.apple.com/tutorials/swiftui/ https://developer.apple.com/metal/
New frameworks:
🧰 SwiftUI - new declarative framework & tools to build apps for all platforms 🧰 Combine framework - Apple’s “RxSwift” 🧰 CryptoKit framework - a collection of cryptographic operations (do not confuse with CryptoTokenKit) (blog post 1, blog post 2) 🧰 SoundAnalysis framework - classifying audio using Core ML models
Foundation and app frameworks:
Dispatch:
DispatchTime.distance(to:), advanced(by:) DispatchQueue.schedule(...) - for Combine? dispatch_async_and_wait(), dispatch_barrier_async_and_wait()
JSONEncoder:
withoutEscapingSlashes formatting option
ListFormatter: for formatting lists of things in a language-specific way NSAttributedString:
a way to convert font sizes between macOS and iOS loadFromHTMLWith*** methods (in WebKit framework)
NSData:
compressed(using:) / decompressed(using:) - supports LZ4, LZMA, LZFSE and zlib the behavior of description has changed, which may affect some push token handling code (blog post)
NSDirectionalEdgeInsets, NSDirectionalRectEdge, NSRectAlignment - new geometry data objects that use leading/trailing instead of left/right NSLayoutManager:
usesDefaultHyphenation (replaces hyphenationFactor)
NSUserActivity:
targetContentIdentifier (for choosing the scene to open on iPad)
OperationQueue:
addBarrierBlock adds a “barrier” task that blocks others until it completes progress lets you track operation completion progress once you set its totalUnitCount operations and operationCount are deprecated
ProcessInfo:
isMacCatalystApp
RelativeDateTimeFormatter: for formatting dates as e.g. “2 weeks ago” UnitDuration: added smaller units down to picoseconds UnitFrequency: added framesPerSecond (~ alias for hertz) UnitInformationStorage: for bytes, megabytes etc. URLSession & friends:
HTTPCookie.sameSitePolicy (blog post) HTTPURLResponse.value(forHTTPHeaderField:) URL.parameterString is deprecated (note, this is not related to the query parameters after ?, but a different kind of parameters separated by ; - TIL) URLSession.dataTaskPublisher(...) - integration with Combine URLSession.webSocketTask(), URLSessionWebSocketTask - web sockets support URLSessionRequest.allowsConstrainedNetworkAccess - if the request should work in Low Data Mode, default is true (blog post) URLSessionRequest.allowsExpensiveNetworkAccess - if the request should work over cellular/hotspot connection, default is true URLSessionTaskTransactionMetrics: various new properties dropped support for SPDY protocol tasks using HTTP GET method can’t include a body updated TLS certificate requirements
Services & system frameworks:
Accelerate:
new Swift API
AVFoundation:
AVMetadataBodyObject - detecting human and animal bodies in the picture AVSemanticSegmentationMatte - portrait segmentation mattes for e.g. detecting person’s hair
Contacts
CNChangeHistoryFetchRequest, CNChangeHistoryEvent around 200 new relation type labels, including names like CNLabelContactRelationYoungerCousinMothersSiblingsDaughterOrFathersSistersDaughter (yes, really)
Core Animation:
CALayer.cornerCurve (blog post) CAMetalLayer.preferredDevice
Core Data:
NSBatchInsertRequest - for batch insertions of many records in one go NSDerivedAttributeDescription - derived attributes NSFetchedResultsController:
controller(: didChangeContentWith snapshot:) - integration with the new diffable data sources controller(: didChangeContentWith diff:) - returns a diff that can be manually applied
NSPersistentCloudKitContainer - new API for easy syncing through CloudKit (docs, comments, blog post 1, blog post 2, blog post 3) improvements to the persistent history API
Core Image:
new methods for instantiating built-in filters standard system colors in CIImage
Core Location:
deprecated methods related to deferred location updates CLLocationManager.delegate is now a weak property
Core ML 3:
on-device model personalization support for more neural network types
JavaScriptCore:
some new methods concerning symbols and promises
MapKit:
pointOfInterestFilter for filtering categories of places that we want to show (in MKLocalSearchCompleter, MKLocalSearch.Request, MKMapSnapshotter.Options, MKMapView - replaces showsPointsOfInterest) resultTypes for filtering the types of search results we’re interested in (in MKLocalSearchCompleter, MKLocalSearch.Request - replaces filterType) MKGeoJSONDecoder - parsing GeoJSON data MKMapItem.pointOfInterestCategory MKMapView.cameraBoundary for limiting the area in which the map can be moved MKMapView.cameraZoomRange for limiting the camera zoom MKMapView.centerCoordinateDistance replaces altitude MKMultiLine, MKMultiPolygon and matching renderers MKOverlayPathRenderer.shouldRasterize, by default overlays are now drawn as vectors
Natural Language:
NLDistance NLEmbedding NLGazetteer NLTagger.requestAssets(for:tagScheme:completionHandler:)
StoreKit:
SKArcadeService for Apple Arcade SKPaymentQueueDelegate + SKStorefront
UserNotifications:
UNNotificationContent.targetContentIdentifier - for choosing the scene to open on iPad
Vision:
image saliency detecting humans and animals image classification analyzing image similarities text recognition (OCR) - VNRecognizeTextRequest (blog post)
WebKit:
WKWebpagePreferences - desktop/mobile rendering mode
macOS 10.15 SDK
https://developer.apple.com/macos/ https://developer.apple.com/macos/whats-new/ https://developer.apple.com/ipad-apps-for-mac/ https://developer.apple.com/system-extensions/ https://developer.apple.com/documentation/macos_release_notes/macos_catalina_10_15_release_notes http://codeworkshop.net/objc-diff/sdkdiffs/macos/10.15/
General:
possibility to port iPad apps to Mac using Catalyst / Marzipan / UIKit for Mac (docs)
apps can be distributed outside of MAS (tweet)
support for universal links (SFUniversalLink) Gatekeeper:
software is now checked for malware on every run Gatekeeper will now also check binaries not launched directly, e.g. bundles and libraries loaded by an app notarization is now required “in a future version of macOS, unsigned code will not load by default” (?)
New frameworks and targets:
new set of frameworks to replace old kernel extensions:
🧰 DriverKit, HIDDriverKit and USBDriverKit for writing device drivers 🧰 EndpointSecurity for system security extensions 🧰 ExecutionPolicy framework - ? (Apple forum thread) 🧰 NetworkingDriverKit for networking extensions 🧰 SystemExtensions for managing new-style extensions future versions will no longer run old kernel extensions
🧰 AuthenticationServices framework from iOS 🧰 DeviceCheck framework from iOS 🧰 FileProvider framework from iOS - for integrating cloud storage with Finder 🧰 LinkPresentation framework - for rendering link previews (blog post) 🧰 OSLog framework - for processing system logs (initially called Logging) 🧰 PencilKit framework - for drawing with Apple Pencil 🧰 PushKit framework from iOS 🧰 QuickLookThumbnailing framework - extracted from iOS QuickLook framework, replaces old C-based API 🧰 RealityKit framework - for rendering 3D content in AR 🧰 Speech framework from iOS new extension targets: Authentication Services, Thumbnail Extension, DriverKit Driver
Framework updates:
CreateML:
object detection sound classification motion sensor activity classification recommender models word embeddings
PhotoKit:
added some missing functionality from iOS
QuickLook:
QLPreviewingController: API for generating previews as on iOS
Safari App Extensions API:
contentBlocker(withIdentifier:blockedResourcesWith:on:) notifies the extension when the content blocker blocks some content page(_:willNavigateTo:) notifies it when the user navigates to a different page SFSafariApplication: getAllWindows() SFSafariExtension: getBaseURI() SFSafariExtensionViewController: dismissPopover() SFSafariPage: getContainingTab(), getScreenshotsOfVisibleArea() SFSafariTab: getContainingWindow(), navigate(to:), close() SFSafariToolbarItem: showPopover() SFSafariWindow: getAllTabs(), close()
AppKit updates:
NSButtonTouchBarItem - a Touch Bar item with a buttton NSCollectionViewCompositionalLayout - new layout system for collection views NSCollectionViewDiffableDataSource - powerful system-provided data source for collection views NSColor:
systemTeal and systemIndigo colors init(name:dynamicProvider:) initializer for choosing light/dark variants uses tagged pointers, allocating NSColor objects should be faster
NSColorSampler - a magnifier tool for picking a color from somewhere on the screen NSEvent:
.changeMode event type - handling Apple Pencil mode switch on a connected iPad
NSFont:
monospacedSystemFont(ofSize:weight:) fontDescriptor.withDesign(_:) - finding e.g. rounded or monospaced variants
NSOpenPanel and NSSavePanel now run in a separate process NSPickerTouchBarItem - a Touch Bar element that lets you choose an item from a menu NSResponder:
changeMode(with:) - handling Apple Pencil mode switch on a connected iPad
NSScreen:
localizedName now returns e.g. “Thunderbolt Display” some new methods related to extended dynamic range
NSSliderTouchBarItem:
doubleValue minimumSliderWidth and maximumSliderWidth
NSStepperTouchBarItem - a Touch Bar selector element with left/right arrows NSStoryboard:
instantiateInitialController and instantiateController methods for creating instances of VCs that use the new custom initializers
NSSwitch - a switch control like on iOS (it shouldn’t be used as a replacement for a checkbox though) NSTextCheckingController and NSTextCheckingClient - new API for checking spelling, grammar etc. NSTextView:
usesAdaptiveColorMappingForDarkAppearance - automatically updates colors for light/dark appearance
NSToolbarItem:
isBordered title for text-only buttons NSMenuToolbarItem - a button that shows an NSMenu NSSharingServicePickerToolbarItem
NSToolbarItemGroup:
new initializers segmented controls, pulldown and popup menus automatic collapsed representation
NSUserActivity:
added persistentIdentifier property from iOS
NSView:
isHorizontalContentSizeConstraintActive and isVerticalContentSizeConstraintActive - tells AutoLayout to ignore the control’s content size (mostly for optimization)
NSWorkspace:
new asynchronous methods for opening files and launching applications with a new set of options, old API is deprecated
some undocumented changes to third party preference panes (blog post)
Deprecations:
MediaLibrary, OpenAL and Quartz Composer are deprecated (PDFKit moved out as a separate framework) Quicktime and QTKit frameworks are removed direct access to instance variables in some Cocoa classes (previously deprecated) was removed
iOS 13 SDK
https://developer.apple.com/ios/ https://developer.apple.com/ios/whats-new/ https://developer.apple.com/ipad/ https://developer.apple.com/ipad-apps-for-mac/ https://developer.apple.com/siri/ https://developer.apple.com/documentation/ios_ipados_release_notes/ios_13_release_notes http://codeworkshop.net/objc-diff/sdkdiffs/ios/13.0/
General:
possibility to port iPad apps to Mac using Catalyst / Marzipan / UIKit for Mac (docs)
apps can be distributed outside of MAS (tweet)
SF Symbols icon font (docs, HIG, tweet) scenes API and multi-window support (docs)
same app can be opened multiple times on different screens UIWindowScene, UIWindowSceneDelegate, UISceneSession and related classes for handling scenes some lifecycle callbacks that were done in UIApplicationDelegate should now be moved to UIWindowSceneDelegate new restoration system built on NSUserActivity
new preview & context menu UI activated with long-press:
displays a preview of a piece of content and/or a hierarchical context menu with actions UIContextMenuInteraction manages the whole interaction (blog post 1, blog post 2) UITargetedPreview (based on UITargetedDragPreview from the drag & drop API) defines the preview UIMenu, UIAction and UICommand to build the menu hierarchy UITableViewDelegate and UICollectionViewDelegate have some new methods for presenting context menus from cells in Catalyst apps the menu renders as a standard Mac context menu old 3D Touch peek & pop API (UIViewControllerPreviewing) is deprecated
new APIs for customizing the appearance of various system bars and their items with a lot more configuration options (docs):
UINavigationBar:
standardAppearance - appearance used in the normal state and as a default compactAppearance - used in landscape on smaller iPhones (4.7" and below) scrollEdgeAppearance - used when there’s a scroll view that’s scrolled all the way to the top
UINavigationItem:
standardAppearance, compactAppearance, scrollEdgeAppearance - overrides appearance on this specific screen
UITabBar:
standardAppearance
UITabBarItem:
standardAppearance - customizes appearance for this specific item
UIToolbar:
standardAppearance - appearance used in the normal state and as a default compactAppearance - used in landscape on smaller iPhones (4.7" and below)
old APIs are still available, but are listed as “Legacy Customizations”
New frameworks and targets:
🧰 BackgroundTasks framework - for app refresh and scheduling long-running tasks 🧰 Core Haptics framework (blog post) 🧰 CryptoTokenKit framework from macOS (for security tokens - do not confuse with CryptoKit) 🧰 ImageCaptureCore framework from macOS - for importing media from cameras and scanners 🧰 LinkPresentation framework - for rendering link previews (blog post) 🧰 MetricKit framework - for collecting metrics data on device 🧰 PencilKit framework - for drawing with Apple Pencil 🧰 QuickLookThumbnailing framework - some APIs extracted from existing QuickLook framework + some new functionality 🧰 RealityKit framework - for rendering 3D content in AR 🧰 VisionKit framework - for scanning documents (blog post) new extension target: Authentication Services
Framework updates:
ARKit 3:
people occlusion motion capture simultaneous use of front & back camera on iOS devices multiple faces tracking on FaceID devices collaborative sessions - improved API for multi-user AR
AuthenticationServices:
support for “Sign In With Apple”
AVFoundation:
AVCaptureMultiCamSession - capturing video using both cameras simultaneously
CarPlay:
dark mode and scenes support
Core Location:
user can choose to share location with your app just for current session two-phase request for “Always” access (you get “While Using” first and then user gets asked again when you try to use location in the background) updated some beacon ranging APIs using a new helper object CLBeaconIdentityConstraint
Core NFC:
NFCTagReaderSession, NFCVASReaderSession, NFCFeliCaTag, NFCISO7816APDU, NFCMiFareTag, NFCNDEFTag for reading different kinds of tags support for writing to tags
Core Text:
APIs for installing custom fonts (CTFontManager*)
HealthKit:
heartbeat data: HKHeartbeatSeriesBuilder, HKHeartbeatSeriesSample, HKHeartbeatSeriesQuery audiograms (hearing tests): HKAudiogramSample, HKAudiogramSensitivityPoint HKCategoryTypeIdentifier: audioExposureEvent, toothbrushingEvent HKQuantityTypeIdentifier: appleStandTime, environmentalAudioExposure, headphoneAudioExposure HKWorkoutActivityType: discSports and fitnessGaming workout types
HomeKit:
HomeKit Secure Video - secure, encrypted iCloud storage for video from HomeKit cameras (13.2) HomeKit for routers, firewalls all IoT devices (13.2)
MapKit:
MKMapSnapshotter.Options.traitCollection for creating snapshots in dark mode one-finger zoom gesture now works in MKMapView (video) see also the MapKit section in Shared Frameworks
PushKit:
complication pushes are deprecated on iOS, they should go straight to the Apple Watch now
QuickLook:
QLPreviewControllerDelegate: some new methods for supporting editing content through QuickLook
SiriKit:
conversational (parametrized) shortcuts you can suggest a shortcut phrase that the user can just confirm APIs for providing info about reservations (docs) APIs for searching and playing media (docs) APIs for starting VoIP calls (docs)
Speech:
on-device speech recognition (10 languages supported), speech analytics (blog post)
UserNotifications:
UNNotificationSettings.announcementSetting - to allow Siri to read notifications through AirPods
UIKit updates:
UIAccessibility:
isOnOffSwitchLabelsEnabled() (Display & Text Size / On/Off Labels) isVideoAutoplayEnabled (Motion / Auto-Play Video Previews) shouldDifferentiateWithoutColor() (Display & Text Size / Differentiate Without Color) UIAccessibilityCustomAction.actionHandler NSObject properties: accessibilityAttributedUserInputLabels, accessibilityUserInputLabels, accessibilityTextualContext, accessibilityRespondsToUserInteraction
UIActivityIndicatorView (spinner):
replaced old style constants with large and medium
UIActivityItemSource (share sheet API):
activityViewControllerLinkMetadata() - metadata for rendering a preview of the link in the share sheet
UIApplication:
requestSceneSession*** methods and new properties: connectedScenes, openSessions, supportsMultipleScenes deprecated a whole bunch of methods, properties and notifications related to:
status bar key window interaction events background refresh keep-alive timeout network activity indicator :(
UIApplicationDelegate:
some new delegate methods for handling window sessions deprecated background refresh API in favor of BackgroundTasks deprecated some delegate methods related to status bar
UIApplicationShortcutItem (home screen context menu actions):
targetContentIdentifier (for choosing the scene to open)
UIApplicationShortcutIcon (home screen context menu actions):
init(systemImageName:) for SF Symbols
UIBarButtonItem:
new close button type (tweet)
UIBarStyle:
deprecated blackTranslucent and blackOpaque
UIBlurEffect:
new set of “material” blur styles (video)
UIButton:
new close button type systemButton(with:target:action:) helper method methods for configuring display of SF Symbols icons
UICollectionViewCompositionalLayout - new layout system for collection views UICollectionViewDelegate:
methods for managing multi-selection methods for handling context menus with previews deprecated old menu handling actions
UICollectionViewDiffableDataSource - powerful system-provided data source for collection views UIColor:
semantic colors like label, secondaryLabel, systemBackground, link etc. semantic base colors like systemRed, systemBlue etc. init(dynamicProvider:) and resolvedColor(with:)
UIDocumentBrowserViewController:
defaultDocumentAspectRatio shouldShowFileExtensions recentDocumentsContentTypes localizedCreateDocumentActionTitle
UIDocumentPickerViewController:
shouldShowFileExtensions directoryURL - initial directory you can now ask for access to a whole folder (by using document type kUTTypeFolder)
UIFont:
monospacedSystemFont(ofSize:weight:) fontDescriptor.withDesign(_:) - finding e.g. rounded or monospaced variants
UIFontPickerViewController - for picking custom fonts (blog post, tweet) UIHoverGestureRecognizer - for mouse hover events (Catalyst only) UIImage:
init(systemName:) for SF Symbols (blog post) init(named:in:with:) for choosing a specific appearance variant or setting SF Symbols style system images: .add, .remove, .actions, .checkmark, .strokedCheckmark (tweet) baseline: baselineOffsetFromBottom, withBaselineOffset(fromBottom:), withoutBaseline() image configuration (for handling multiple variants for different appearances): configuration, withConfiguration(:) symbol configuration (for configuring SF Symbols): isSymbolImage, symbolConfiguration, applyingSymbolConfiguration(:) withTintColor(_:)
UIImageAsset:
registering and looking up variants for different configurations: image(with configuration:), register(_ image: with configuration:) (tweet)
UIImageView:
preferredSymbolConfiguration for configuring SF Symbols style
UIImpactFeedbackGenerator (generating haptic feedback):
impact styles rigid and soft specifying impact intensity as a float value (blog post)
UIKeyCommand (iPad keyboard shortcuts):
title, image, action, state, attributes, alternates, propertyList
UILargeContentViewerItem and UILargeContentViewerInteraction - a new accessibility API for “zooming in” UI elements (blog post) UILayoutPriority:
dragThatCanResizeScene, dragThatCannotResizeScene, sceneSizeStayPut
UIMenuBuilder and UIMenuSystem - for building the main app menu in Catalyst apps (?) UIMenuController (tooltip menu activated from text):
showMenu(from:rect:), hideMenu(from:), hideMenu() (replaces old API)
UIResponder:
buildMenu(with builder:) - building app menu in a Catalyst app? validate(_ command:) updateTextAttributes(conversionHandler:) activityItemsConfiguration editingInteractionConfiguration - lets you disable new 3-finger gestures touchBar, makeTouchBar() (Catalyst only)
UIScreen:
calibratedLatency
UIScreenshotService - lets you provide a PDF version of a screenshot UIScrollView:
automaticallyAdjustsScrollIndicatorInsets (tweet) horizontalScrollIndicatorInsets, verticalScrollIndicatorInsets
UISearchBar:
searchTextField - lets you configure the look of the search text field setShowsScope(_:animated:)
UISearchController:
automaticallyShowsCancelButton automaticallyShowsScopeBar automaticallyShowsSearchResultsController, showsSearchResultsController
UISearchTextField - a text field that can show “tokens” before the search query UISegmentedControl
new design (tweet) selectedSegmentTintColor (tintColor is ignored)
UISplitViewController:
primaryBackgroundStyle (Catalyst only - for creating Mac window sidebars)
UIStatusBarManager - an interface for viewing (but not modifying) the status bar state of the current scene UIStatusBarStyle:
added darkContent, default is now automatic
UIStepper
new design (video)
UIStoryboard:
instantiateInitialViewController and instantiateViewController methods for creating instances of VCs that use the new custom initializers
UITableView:
new table style insetGrouped (tweet)
UITableViewDelegate:
methods for managing multi-selection methods for handling context menus with previews deprecated old menu and edit handling actions
UITableViewDiffableDataSource - powerful system-provided data source for table views UITextDocumentProxy (custom keyboards):
setMarkedText(_:selectedRange:), unmarkText()
UITextFieldDelegate:
textFieldDidChangeSelection()
UITextFormattingCoordinator - for showing a font panel in Catalyst apps? UITextInput (text field & text view):
insertText(:alternatives:style:) setAttributedMarkedText(:selectedRange:) insertTextPlaceholder(with:) remove(_ textPlaceholder:)
UITextInteraction - allows you to add system text selection gestures to a custom text view UITextView:
usesStandardTextScaling - in Catalyst apps, automatically scales text properly on the Mac
UITraitCollection:
userInterfaceLevel trait = base/elevated (elevated ≈ being shown in a modal view) userInterfaceStyle, although technically it was added last year for CarPlay & tvOS :) accessibilityContrast legibilityWeight (Bold Text accessibility setting) imageConfiguration hasDifferentColorAppearance(comparedTo:) current and performAsCurrent()
UIVibrancyEffectStyle:
the old class methods are deprecated and replaced by various label/fill styles
UIView:
overrideUserInterfaceStyle to force light or dark mode modifyAnimations(withRepeatCount:autoreverses:animations:) transform3D deprecated old animation API that used separate class methods instead of parameters and blocks
UIViewController:
changes to modal view presentation (blog post):
.pageSheet and .formSheet modals are now displayed on portrait iPhone as “sheets” that don’t cover the screen completely and can be closed by dragging down the default modal presentation style is now called .automatic and it also renders as a sheet on iPhone in most cases, and on the iPad as a .pageSheet - set .fullScreen explicitly to keep the old behavior popovers on iPad also render as sheets in compact-width split screen view share extensions are displayed as page sheets on both iPhone and iPad page sheets on iPad have a new smaller size, which depends on system text size (or more specifically on the “readable width”); two page sheets on top of one another form a vertical stack new property modalInPresentation (replaces modalInPopover) lets you prevent the user from dismissing a sheet (can be dynamically updated, e.g. when user edits some data) the “view will/did (dis)appear” callbacks are not called on the presenting (parent) view controller if the modal appears as a sheet, since the parent view doesn’t completely disappear UIAdaptivePresentationControllerDelegate has new callbacks for handling sheet events:
presentationControllerDidAttemptToDismiss() presentationControllerShouldDismiss() presentationControllerWillDismiss() presentationControllerDidDismiss()
other changes:
overrideUserInterfaceStyle to force light or dark mode traitCollectionDidChange: iOS now predicts the initial set of traits and doesn’t call this method when a view is added to the hierarchy, only when the traits actually change performsActionsWhilePresentingModally childViewControllerForTouchBar, setNeedsTouchBarUpdate (Catalyst only)
UIWindow:
canResizeToFitContent (Catalyst only)
Deprecations:
launch images are deprecated - use launch storyboards (will be required from April)
apps built on iOS 13+ SDK will run in native mode on any new devices without requiring a new build support for split-screen modes will also be required for iPad apps from April (with exceptions?)
OpenAL framework is deprecated UIWebView is even more deprecated than before (update: info about the specific deadlines) UIApplicationExitsOnSuspend Info.plist option (yes, the one from iOS 4!) is finally deprecated
watchOS 6 SDK
https://developer.apple.com/watchos/ https://developer.apple.com/watchos/whats-new/ https://developer.apple.com/documentation/watchos_release_notes/watchos_6_release_notes https://developer.apple.com/documentation/watchkit/building_watchos_app_interfaces_with_swiftui http://codeworkshop.net/objc-diff/sdkdiffs/watchos/6.0/
General:
independent apps (docs)
option to build apps that can be distributed independently of the iOS version, or without a matching iOS app at all push notifications, complication pushes and CloudKit subscriptions can be sent straight to the watch
app and asset thinning - smaller downloads SF Symbols icon font (docs, HIG, tweet)
New frameworks:
🧰 AuthenticationServices framework 🧰 CoreMedia framework 🧰 Network framework 🧰 PushKit framework audio streaming APIs
Framework updates:
ClockKit:
Graphic Circular complications: additional template types CLKDateTextProvider: uppercase CLKFullColorImageProvider: support for “tinted images” CLKRelativeDateTextProvider: additional formatting styles
HealthKit:
heartbeat data: HKHeartbeatSeriesBuilder, HKHeartbeatSeriesSample, HKHeartbeatSeriesQuery audiograms (hearing tests): HKAudiogramSample, HKAudiogramSensitivityPoint HKCategoryTypeIdentifier: audioExposureEvent, toothbrushingEvent HKQuantityTypeIdentifier: appleStandTime, environmentalAudioExposure, headphoneAudioExposure HKWorkoutActivityType: discSports and fitnessGaming workout types apps can ask for health data access on the watch
SiriKit:
conversational (parametrized) shortcuts you can suggest a shortcut phrase that the user can just confirm APIs for providing info about reservations (docs) APIs for adding and searching media (docs) APIs for starting VoIP calls (docs) some additions to task APIs (docs)
UserNotifications:
UNNotificationServiceExtension is now available on watchOS UNNotificationSettings.announcementSetting - to allow Siri to read notifications through AirPods
WatchConnectivity:
WCSession: companionAppInstalled WCSessionDelegate: sessionCompanionAppInstalledDidChange:
WatchKit updates:
WKAudioFile* - deprecated, use AVFoundation WKExtendedRuntimeSession - extended runtime API
only for specific types of activity: self care, mindfulness, physical therapy, smart alarms, health monitoring
WKExtension:
APIs for handling push notifications and extended runtime sessions
WKInterfaceAuthorizationAppleIDButton - “Log in with Apple” button WKInterfaceDevice:
supportsAudioStreaming
WKInterfaceMap:
setShowsUserHeading(), setShowsUserLocation(), setUserTrackingMode() (6.1)
WKInterfaceTextField - new text field control instances of WKInterface* view classes can now be created in code - but only for use in SwiftUI 🙃
tvOS 13 SDK
https://developer.apple.com/tvos/ https://developer.apple.com/tvos/whats-new/ https://developer.apple.com/documentation/tvos_release_notes/tvos_13_release_notes http://codeworkshop.net/objc-diff/sdkdiffs/tvos/13.0/
General:
scenes API and multi-window support (see iOS) SF Symbols icon font (docs, HIG, tweet)
New frameworks:
🧰 AuthenticationServices framework from iOS 🧰 BackgroundTasks framework - for app refresh and scheduling long-running tasks 🧰 CryptoTokenKit framework from macOS (for security tokens - do not confuse with CryptoKit)
Framework updates:
UIKit: most changes from iOS apply here UITabBar:
leadingAccessoryView, trailingAccessoryView
UIViewController:
tabBarObservedScrollView
TVMLKit:
TVBrowserViewController TVDocumentViewController
TVUIKit:
TVCollectionViewFullScreenLayout, TVCollectionViewFullScreenCell
TVTopShelf* for building new style Top Shelf extensions TVUserManager, TVAppProfileDescriptor - for managing multiple user accounts
Deprecations:
OpenAL framework is deprecated
Web APIs & Android
https://developer.apple.com/sign-in-with-apple/ https://developer.apple.com/documentation/signinwithapplejs
Sign In With Apple
required if your app supports sign-in with third party accounts like FB (article) some first impressions: thread, blog post 1, blog post 2
MapKit JS:
web snapshots service (docs) dark mode support filtering points of interest and result types limiting map area and camera zoom parsing GeoJSON
MusicKit for Android
Developer Tools
Xcode 11
https://developer.apple.com/xcode/ https://developer.apple.com/xcode/whats-new/ https://developer.apple.com/documentation/xcode_release_notes/xcode_11_release_notes
live previews for SwiftUI integration with Swift Package Manager
Swift packages can be added as dependencies you can open Swift packages as projects (by opening Package.swift) (tweet)
@IBSegueAction - a way to use storyboard segues with custom view controller initializers editor improvements:
screen can be divided into multiple editors in any layout (click “Add Editor” in the top-right corner, hold Alt to divide vertically) options for assistant editors: Editor Only / Editor and Canvas / Editor and Assistant; assistant pane automatically hides editor now includes a minimap with headings from MARK comments (hold Cmd to see all symbols) (tweet) “edit all in scope” also edits documentation font styling in documentation comments (italic, bold and monospace, default font is Helvetica Neue) MARK comments draw a separator line in the editor source editor supports spell checking hierarchical code folding (folding and unfolding an outer block retains folding in an inner block) snippets/objects/media libraries are merged into a single panel with tabs you can cmd+click on Swift operators to jump to the definition
version control:
source control change bar (on the left edge of the editor) can show diff from the original version support for stashing and cherry-picking Xcode can automatically stash and restore changes when pulling from a repository the “Version Editor” views from the menu bar are broken up into different places:
“Comparison” view becomes “Code Review” “Authors” view becomes an option in the new editor settings “Log” view becomes a “History Inspector” in the right sidebar
project settings:
Signing section has been moved to the Capabilities tab Capabilities list only lists enabled capabilities, others can be added with a “+” button instead of On/Off switches it’s now possible to use a capability only in some build configurations “Embedded Binaries” and “Linked Frameworks and Libraries” lists are merged into one
assets:
assets in asset catalogs can be localized you can create custom SF Symbols icons by editing an exported SVG file from the SF Symbols app and adding it back to the asset catalog (docs)
simulator:
iOS simulator is GPU-accelerated (and you can choose the GPU if your Mac has more than one), supports Metal 🤘 Xcode no longer creates every available iOS simulator, only a set of most commonly used ones faster simulator launches (dyld shared cache)
debugging:
new “Environment Overrides” panel in the debug bar allows overriding appearance, text size and accessibility settings in a running app (replaces appearance switcher from Xcode 10 for Mac apps) Simulate Location switcher added to debug bar for iOS apps you can simulate network & thermal conditions on connected devices through the Devices window, tested device shows an icon in the status bar Metal memory debugger various improvements for watchOS debugging, including view hierarchy debugging, faster performance and better reliability, debugger connects directly through WiFi if possible
testing:
Test Plans - easy way to run tests in multiple configurations screenshots from UI tests can be generated in localized versions for App Store XCTest.measure(...) - APIs for performance testing XCTUnwrap() for unwrapping optionals new format of .xcresult bundles (tweet)
support for XCFrameworks, which are frameworks that can bundle code for multiple architectures (blog post) app performance metrics for iOS apps (in the Organizer) - anonymized stats on battery usage, launch time, hang rate, memory use, disk access enhancements to Siri Intents editor -Oz optimization option (tweet)
Swift
Swift 5.1: see article by Paul Hudson John Sundell’s article on the additions specifically made for SwiftUI
ObjC
changes to objc_msgSend (post 1, post 2)
App Store & developer services
Radar (BugReport) is now Feedback Assistant, has an updated design and shows more info about closed tickets, also has an app included in beta iOS & macOS (but not in final builds) (docs, tweet) redesigned CloudKit dashboard (tweet) redesigned certificate/profile management portal (tweet) App Store Connect API now has endpoints for handling provisioning (docs) iOS and Mac SDKs now use the same certificates (tweet) changes to some App Store Review Guidelines concerning data collection (source), plus later changes less strict requirements for the subscription purchase UI (tweet) TestFlight feedback: option “Share beta feedback” when taking a screenshot of an app from TestFlight, feedback is available in App Store Connect App Store Connect analytics shows app deletions (tweet) coming soon:
App Store for iMessage (tweet) App Store Connect usage analytics for Mac (tweet) live analytics dashboard for the last 24h (tweet)
Other tools
Create ML app for building machine learning models Reality Composer app for building AR experiences (Mac & iOS) Transporter app for uploading app binaries to the App Store SF Symbols app
Safari 13
https://developer.apple.com/documentation/safari_release_notes/safari_13_release_notes
desktop-class browsing on iPad - uses desktop Safari’s user agent, intelligently adapts sites to touch events support for dark mode on iOS support for CSS conic gradients support for FIDO2-compliant USB security keys using Web Authentication API support for screen sharing using web APIs support for aborting Fetch requests support for the __Secure- and __Host- cookie prefixes Pointer Events API Visual Viewport API API for requesting permission to accelerator/gyroscope data Web Inspector improvements:
Timelines: added CPU Usage / Energy Impact timeline, support for importing & exporting timelines Audit tab with accessibility audits, custom audits can be created (blog post 1, blog post 2) Changes tab in Elements tab sidebar Device settings menu when inspecting a site on a connected iPhone, which lets you e.g. change user agent or disable images or scripts
removed support for WebSQL removed support for legacy (JavaScript-based) extensions on the Mac
Other
New York font IMDF - Indoor Mapping Data Format and Indoor Maps Program Apple Music web app
Discussion in the ATmosphere