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:

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)

(can be switched), 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

: 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

, , – 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”

: for formatting dates as e.g. “2 weeks ago” UnitDuration : added smaller units down to picoseconds

: added smaller units down to UnitFrequency : added framesPerSecond (~ alias for hertz )

: added (~ alias for ) UnitInformationStorage : for bytes , megabytes etc.

: for , 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

& friends:

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

– a Touch Bar item with a buttton NSCollectionViewCompositionalLayout – new layout system for collection views

– new layout system for collection views NSCollectionViewDiffableDataSource – powerful system-provided data source for collection views

– 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

– 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

and now run in a separate process NSPickerTouchBarItem – a Touch Bar element that lets you choose an item from a menu

– 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

– 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)

– 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.

and – 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

(spinner): UIActivityItemSource (share sheet API): activityViewControllerLinkMetadata() – metadata for rendering a preview of the link in the share sheet

(share sheet API): 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)

(home screen context menu actions): UIApplicationShortcutIcon (home screen context menu actions): init(systemImageName:) for SF Symbols

(home screen context menu actions): 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

– 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

– 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)

– for picking custom fonts (blog post, tweet) UIHoverGestureRecognizer – for mouse hover events (Catalyst only)

– 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)

(generating haptic feedback): UIKeyCommand (iPad keyboard shortcuts): title , image , action , state , attributes , alternates , propertyList

(iPad keyboard shortcuts): UILargeContentViewerItem and UILargeContentViewerInteraction – a new accessibility API for “zooming in” UI elements (blog post)

and – 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 (?)

and – for building the main app menu in Catalyst apps (?) UIMenuController (tooltip menu activated from text): showMenu(from:rect:) , hideMenu(from:) , hideMenu() (replaces old API)

(tooltip menu activated from text): 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

– 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

– 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

– 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

– powerful system-provided data source for table views UITextDocumentProxy (custom keyboards): setMarkedText(_:selectedRange:) , unmarkText()

(custom keyboards): UITextFieldDelegate : textFieldDidChangeSelection()

: UITextFormattingCoordinator – for showing a font panel in Catalyst apps?

– for showing a font panel in Catalyst apps? UITextInput (text field & text view): insertText(_:alternatives:style:) setAttributedMarkedText(_:selectedRange:) insertTextPlaceholder(with:) remove(_ textPlaceholder:)

(text field & text view): UITextInteraction – allows you to add system text selection gestures to a custom text view

– 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)

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

– deprecated, use AVFoundation WKExtendedRuntimeSession – extended runtime API only for specific types of activity: self care, mindfulness, physical therapy, smart alarms, health monitoring

– extended runtime API WKExtension : APIs for handling push notifications and extended runtime sessions

: WKInterfaceAuthorizationAppleIDButton – “Log in with Apple” button

– “Log in with Apple” button WKInterfaceDevice : supportsAudioStreaming

: WKInterfaceMap : setShowsUserHeading() , setShowsUserLocation() , setUserTrackingMode() (6.1)

: WKInterfaceTextField – new text field control

– 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

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

– 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

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

and 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