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:
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
- system apps are now in
- 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 wayNSAttributedString
:- 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/rightNSLayoutManager
:usesDefaultHyphenation
(replaceshyphenationFactor
)
NSUserActivity
:targetContentIdentifier
(for choosing the scene to open on iPad)
OperationQueue
:addBarrierBlock
adds a “barrier” task that blocks others until it completesprogress
lets you track operation completion progress once you set itstotalUnitCount
operations
andoperationCount
are deprecated
ProcessInfo
:isMacCatalystApp
RelativeDateTimeFormatter
: for formatting dates as e.g. “2 weeks ago”UnitDuration
: added smaller units down topicoseconds
UnitFrequency
: addedframesPerSecond
(~ alias forhertz
)UnitInformationStorage
: forbytes
,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 CombineURLSession.webSocketTask()
,URLSessionWebSocketTask
- web sockets supportURLSessionRequest.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 trueURLSessionTaskTransactionMetrics
: 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 pictureAVSemanticSegmentationMatte
- 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 goNSDerivedAttributeDescription
- derived attributesNSFetchedResultsController
:controller(_: didChangeContentWith snapshot:)
- integration with the new diffable data sourcescontroller(_: 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 (inMKLocalSearchCompleter
,MKLocalSearch.Request
,MKMapSnapshotter.Options
,MKMapView
- replacesshowsPointsOfInterest
)resultTypes
for filtering the types of search results we’re interested in (inMKLocalSearchCompleter
,MKLocalSearch.Request
- replacesfilterType
)MKGeoJSONDecoder
- parsing GeoJSON dataMKMapItem.pointOfInterestCategory
MKMapView.cameraBoundary
for limiting the area in which the map can be movedMKMapView.cameraZoomRange
for limiting the camera zoomMKMapView.centerCoordinateDistance
replacesaltitude
MKMultiLine
,MKMultiPolygon
and matching renderersMKOverlayPathRenderer.shouldRasterize
, by default overlays are now drawn as vectors
- Natural Language:
NLDistance
NLEmbedding
NLGazetteer
NLTagger.requestAssets(for:tagScheme:completionHandler:)
- StoreKit:
SKArcadeService
for Apple ArcadeSKPaymentQueueDelegate
+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 contentpage(_:willNavigateTo:)
notifies it when the user navigates to a different pageSFSafariApplication
: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 butttonNSCollectionViewCompositionalLayout
- new layout system for collection viewsNSCollectionViewDiffableDataSource
- powerful system-provided data source for collection viewsNSColor
:systemTeal
andsystemIndigo
colorsinit(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 screenNSEvent
:.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
andNSSavePanel
now run in a separate processNSPickerTouchBarItem
- a Touch Bar element that lets you choose an item from a menuNSResponder
: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
andmaximumSliderWidth
NSStepperTouchBarItem
- a Touch Bar selector element with left/right arrowsNSStoryboard
:instantiateInitialController
andinstantiateController
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
andNSTextCheckingClient
- new API for checking spelling, grammar etc.NSTextView
:usesAdaptiveColorMappingForDarkAppearance
- automatically updates colors for light/dark appearance
NSToolbarItem
:isBordered
title
for text-only buttonsNSMenuToolbarItem
- a button that shows anNSMenu
NSSharingServicePickerToolbarItem
NSToolbarItemGroup
:- new initializers
- segmented controls, pulldown and popup menus
- automatic collapsed representation
NSUserActivity
:- added
persistentIdentifier
property from iOS
- added
NSView
:isHorizontalContentSizeConstraintActive
andisVerticalContentSizeConstraintActive
- 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 toUIWindowSceneDelegate
- 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 onUITargetedDragPreview
from the drag & drop API) defines the previewUIMenu
,UIAction
andUICommand
to build the menu hierarchyUITableViewDelegate
andUICollectionViewDelegate
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 defaultcompactAppearance
- 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 defaultcompactAppearance
- 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*
)
- APIs for installing custom fonts (
- HealthKit:
- heartbeat data:
HKHeartbeatSeriesBuilder
,HKHeartbeatSeriesSample
,HKHeartbeatSeriesQuery
- audiograms (hearing tests):
HKAudiogramSample
,HKAudiogramSensitivityPoint
HKCategoryTypeIdentifier
:audioExposureEvent
,toothbrushingEvent
HKQuantityTypeIdentifier
:appleStandTime
,environmentalAudioExposure
,headphoneAudioExposure
HKWorkoutActivityType
:discSports
andfitnessGaming
workout types
- heartbeat data:
- 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:
- 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
andmedium
- replaced old style constants with
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)
- new
UIBarStyle
:- deprecated
blackTranslucent
andblackOpaque
- deprecated
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
- new
UICollectionViewCompositionalLayout
- new layout system for collection viewsUICollectionViewDelegate
:- 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 viewsUIColor
:- semantic colors like
label
,secondaryLabel
,systemBackground
,link
etc. - semantic base colors like
systemRed
,systemBlue
etc. init(dynamicProvider:)
andresolvedColor(with:)
- semantic colors like
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)
- registering and looking up variants for different configurations:
UIImageView
:preferredSymbolConfiguration
for configuring SF Symbols style
UIImpactFeedbackGenerator
(generating haptic feedback):- impact styles
rigid
andsoft
- specifying impact intensity as a float value (blog post)
- impact styles
UIKeyCommand
(iPad keyboard shortcuts):title
,image
,action
,state
,attributes
,alternates
,propertyList
UILargeContentViewerItem
andUILargeContentViewerInteraction
- a new accessibility API for “zooming in” UI elements (blog post)UILayoutPriority
:dragThatCanResizeScene
,dragThatCannotResizeScene
,sceneSizeStayPut
UIMenuBuilder
andUIMenuSystem
- 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 gesturestouchBar
,makeTouchBar()
(Catalyst only)
UIScreen
:calibratedLatency
UIScreenshotService
- lets you provide a PDF version of a screenshotUIScrollView
:automaticallyAdjustsScrollIndicatorInsets
(tweet)horizontalScrollIndicatorInsets
,verticalScrollIndicatorInsets
UISearchBar
:searchTextField
- lets you configure the look of the search text fieldsetShowsScope(_:animated:)
UISearchController
:automaticallyShowsCancelButton
automaticallyShowsScopeBar
automaticallyShowsSearchResultsController
,showsSearchResultsController
UISearchTextField
- a text field that can show “tokens” before the search queryUISegmentedControl
- 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 sceneUIStatusBarStyle
:- added
darkContent
,default
is now automatic
- added
UIStepper
- new design (video)
UIStoryboard
:instantiateInitialViewController
andinstantiateViewController
methods for creating instances of VCs that use the new custom initializers
UITableView
:- new table style
insetGrouped
(tweet)
- new table style
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 viewsUITextDocumentProxy
(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 viewUITextView
: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
andperformAsCurrent()
UIVibrancyEffectStyle
:- the old class methods are deprecated and replaced by various label/fill styles
UIView
:overrideUserInterfaceStyle
to force light or dark modemodifyAnimations(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
(replacesmodalInPopover
) 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 modetraitCollectionDidChange
: 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 changeperformsActionsWhilePresentingModally
childViewControllerForTouchBar
,setNeedsTouchBarUpdate
(Catalyst only)
- changes to modal view presentation (blog post):
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
andfitnessGaming
workout types- apps can ask for health data access on the watch
- heartbeat data:
- SiriKit:
- UserNotifications:
UNNotificationServiceExtension
is now available on watchOSUNNotificationSettings.announcementSetting
- to allow Siri to read notifications through AirPods
- WatchConnectivity:
WCSession
:companionAppInstalled
WCSessionDelegate
:sessionCompanionAppInstalledDidChange:
WatchKit updates:
WKAudioFile*
- deprecated, use AVFoundationWKExtendedRuntimeSession
- 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” buttonWKInterfaceDevice
: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:
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 extensionsTVUserManager
,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 testingXCTUnwrap()
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:
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
3 comments:
ShinehahGnolaum
Could you be specific about where during WWDC 2019 they said something about CNChangeHistoryFetchRequest and CNChangeHistoryEvent for the Contacts Framework?
Kuba
@ShinehahGnolaum Hey! These lists are combined from the things mentioned in the talks, but also from looking through the documentation e.g. at https://developer.apple.com/ios/, release notes, and just simply API reference (I use this page http://codeworkshop.net/objc-diff/sdkdiffs/ to see what new classes/methods were added in some interesting places). So some things listed (a large part of them actually) might not have been mentioned anywhere in the talks and I've just found them elsewhere. It's not necessarily "things mentioned at WWDC", but "things released in the betas at WWDC".
It looks like these two you've mentioned are things like that, because I don't see them anywhere in any talk notes or transcriptions. Which is unfortunate, because I see they still don't have a proper documentation… which is probably why you're asking. I think the only piece of information that can help you somewhat is the ObjC header CNChangeHistoryFetchRequest.h in the SDK - you can access it through the "Open Quickly" (Cmd+Shift+O) in Xcode. There are some code comments there that aren't rendered in the web documentation. Not much in CNChangeHistoryEvent.h though.
chain link fence
Great site! very helpful! best fence installation in Des Moines