- SPECTACULARLY BREAKING: The networking stack for HTTP requests has been completely rewritten. This is described in great detail in the RFC for the networking changes, as well as the updated documentation for Advanced Client Creation. Please, please, please file bugs or requests for clarification of the docs as soon as possible. Note that all changes until the networking stack comes out of beta will live on the
betas/networking-stackbranch. (#1341)
- Improves invalidation of a
URLSesionClientto include cancellation of in-flight operations. (#1376)
- Fixes an issue that would occur when a GraphQL query watcher's dependent keys would not get updated. (#1375)
- Adds an
extensionsdictionary property toGraphQLResult. (#1370) - Makes a couple of response parsing helpers public for advanced use cases. (#1372)
-
Adds the ability to pause and resume a WebSocket connection without dumping existing subscriptions. (#1335)
-
Adds an initializer to
SQLiteNormalizedCachethat takes aSQLite.swiftDatabaseConnectionto more easily allow setup of pre-configured connections. (#1330) -
Addresses a retain cycle that could cause memory leaks when using multiple instances of
HTTPNetworkTransport.NOTE: If you're using
URLSessionClientoutside the context ofHTTPNetworkTransport, make sure to callinvalidate()on it when whatever is holding onto it hitsdeinit()to prevent leaks. (#1366)
- BREAKING: Updates the CLI to
2.30.1to fix a long-standing issue where when generating operation IDs and their related JSON file, the correct operations + fragments would be used in generating the operation ID, but not output with the JSON file. This will slightly change the output inAPI.swift, but it also means we can remove a related workaround from the iOS SDK. (#1316) - BREAKING: Removed the
Cartfilewhich declared our dependencies, since we're now internally managing them with SPM, and newer versions of Carthage just use the SPM dependencies. Note that this can cause issues if you need to use a fork of dependencies, or if you're using an older version of Carthage. (#1311) - POSSIBLY BREAKING: Works around an issue that could cause some attempts to store untyped JSON dictionaries to throw unexpected errors about optional encoding. This also added handling of creating a dictionary from a
JSONValue, which may cause problems if you've already implemented this yourself, but which should mostly just replace the need to implement it yourself. Please file issues ASAP if you run into problems here. (#1317) - Works around an issue causing some attempts to store arrays of JSON dictionaries to have arbitrary key ordering. (#1281)
- Adds clearer error descriptions to a few errors. (#1295)
- Updates the CLI to
2.28.3to fix an issue where linter failures would cause a silent failure exit. (#1284, #1288](#1288)) - Adds a check to swift scripting that the downloaded file has the correct SHASUM, otherwise forcing redownload. (#1288)
- NEW: Swift scripting is officially out of Beta! Please check out our updated guide to integration. The tutorial should be updated to recommend using Swift Scripting within the next week or so. NOTE: The shell script is not deprecated yet, but will be shortly. (#1263)
- BREAKING: Found some workarounds to conditional conformance and updated all extensions to use the
apollo.extensionMethodsyntax introduced in0.28.0. (#1256) - BREAKING: Moved a few things into the new
ApolloCorelibrary. For CocoaPods and SPM users, this should be automatically picked up by your package manager. Carthage users, you will need to drag the newApolloCorelibrary into your project manually as you have with the other Apollo libs. (#1256) - BREAKING: Updated to version
2.28.0of the Apollo JS CLI. This includes moving a bunch ofstatic letallocations to computedstatic vars to prevent memory overuse. (#1246) - Made
GraphQLGetTransformerand its methods public and made a couple more methods onMultipartFormDatapublic. (#1273) - Fixes an issue when uploading multiple files for different variables. (#1279, special thanks to #1081)
- Fixes a crash when encoding
GraphQLVariableobjects which conform toJSONEncodable. (#1262)
- BREAKING: Changed a few things in the
ApolloCodegenlibrary to useobject.apollo.extensionMethodsyntax rather thanobject.apollo_extensionMethod. There's a few things that are still usingapollo_notation due to constraints around conditional conformance, but you should particularly check your swift scripts for changes aroundFileManagerAPIs. (#1183) - BREAKING:
NormalizedCachenow has a method for explicitly clearing the cache synchronously, in addition to the existing method to clear it asynchronously. If you've got a customNormalizedCacheimplementation, you'll need to add an implementation for this method. (#1186) - Fixed race conditions in
URLSessionClientthat were causing unexpected behavior. Turns out concurrency is hard! (#1227) - Improved handling of a dependent key update cancelling an in-flight server fetch on a watcher. (#1156)
- Added option to Swift Codegen to pass in a prefix for custom scalars. (#1216)
- Added ability to change a header on a websocket connection and automatically reconnect. (#1224)
- Better defense against multithreading crashes in
URLSessionClient. (#1184) - Fix for watchOS availability for
URLSessionClient. (#1175)
- BREAKING: Replaced calls directly into the closure based implementation of
URLSessionwith a delegate-based implementation calledURLSessionClient.-
This (finally) allows background session configurations to be used with
ApolloClient, since background session configurations immediately error out if you try to use the closure-basedURLSessionAPI. -
This makes a significant change to the initialization of
HTTPNetworkTransportif you're using a customURLSession: BecauseURLSessionmust have its delegate set at the point of creation,URLSessionClientis now creating the URL session. You can initialize aURLSessionClientwith aURLSessionConfiguration. if before you were using:let session = URLSession(configuration: myCustomConfiguration) let url = URL(string: "http://localhost:8080/graphql")! let transport = HTTPNetworkTransport(url: url, session: session)
You will now need to use:
let client = URLSessionClient(sessionConfiguration: myCustomConfiguration) let url = URL(string: "http://localhost:8080/graphql")! let transport = HTTPNetworkTransport(url: url, client: client)
-
If you were passing in a session you'd already set yourself up to be the delegate of to handle GraphQL requests, you'll need to subclass
URLSessionClientand override any delegate methods off ofURLSessionDelegate,URLSessionTaskDelegate, orURLSessionDataDelegateyou need to handle. Unfortunately only one class can be a delegate at a time, and that class must be declared when the session is instantiated.Note that if you don't need your existing delegate-based session to do any handling for things touched by Apollo, you can keep it completely separate if you'd prefer.
-
This does not change anything at the point of calls - everything is still closure-based in the end
Please file bugs on this ASAP if you run into problems. Thank you! (#1163)
-
- BREAKING, though in a good way: Updated the typescript CLI to 2.27.2, and updated the script to pull from a CDN (currently backed by GitHub Releases) rather than old Circle images. This should significantly increase download performance and stability. (#1166)
- BREAKING: Updated the retry delegate to allow more fine-grained control of what error to return if an operation fails in the process of retrying. (#1128, #1167)
- Added support to the Swift scripting package to be able to use multiple headers when downloading a schema. (#1153)
- Added the ability to set the SSL trust validator on a websocket. (#1124)
- Fixed an issue deserializing custom scalars in
ApolloSQLite. (#1144)
- Repoints download link to our CDN for the CLI for people on 0.25.0 who can't upgrade to 0.26.0 or higher immediately.
- BREAKING: Updated the
swift-toolsversion to 5.2 inPackage.swift. Note that if you're usingswift-tools5.2, you'll need to update the syntax of yourPackage.swiftfile and specify the name of the library manually for Apollo. (#1099, #1106) - POSSIBLY BREAKING: Upgraded the typescript CLI to 2.26.0. No changes were found in test frameworks, but this could theoretically break some stuff. (#1107, #1113)
- NEW: Added the ability to set Starscream's underlying
enableSOCKSProxyto better allow debugging web sockets in tools like Charles Proxy. (#1108) - Fixed several issues using paths with spaces in the Swift Codegen. (#1092, #1097).
ApolloCodegenLibis now properly passing theheaderargument last when downloading a schema. (#1096)- Automatic Persisted Queries now also work with mutations. (#1110)
- Repoints download link to our CDN for the CLI for people on 0.24.0 who can't upgrade to 0.26.0 or higher immediately.
- BREAKING: Updated
GraphQLResponseto be generic over the response type rather than the operation type. This will allow more flexibility for generic modifications to methods that need to useGraphQLResponse. (#1061) - BREAKING: Updated the file URL-based initializer of
GraphQLto throw with a clear error instead of failing silently. Removed the ability to pass in an input stream since that can't be recreated on a failure. Updated initializers take either rawDataor a file URL so that the input stream can be recreated on a retry. (#1086, #1089) - In the Swift Package Manager based codegen, made sure that the folder the CLI will be downloaded to is created if it doesn't exist. (#1069)
- Repoints download link to our CDN for the CLI for people on 0.23.x who can't upgrade to 0.26.0 or higher immediately.
- Changed the
@availableflags added in 0.23.1 to#if os(macOS), since the former is runtime and the latter is compile time, to work around a bug where SwiftUI compiles theApolloCodegenLiblibrary even if it's not included in the target being previewed. (#1066) - Added support for
omitDeprecatedEnumCasescommand line option I missed forApolloCodegenOptions(#1053)
- Added some
@availableflags to prevent accidental compilation ofApolloCodegenLibon platforms other than macOS. (#1041) - Made the
QueryonGraphQLQueryWatcherpublic so it can be referenced. (#1037)
-
BETA: Now available, SPM-based code generation, Phase 0 of our transition to Swift Codegen.
Note that the underlying codegen is still using
apollo-tooling, but that will change as we proceed with Phase 1 of the Swift Codegen Project, generating the code in Swift.Documentation is available at our Swift Scripting page.
When this gets to the final version this will supersede existing codegen, so please file bugs galore on this so we can get it good to go as quickly as possible. Thank you! (#940, #1033)\
-
Fixed some memory leaks in our internal Promises implementation. (#1016)
- Repoints download link to our CDN for the CLI for people on 0.22.0 who can't upgrade to 0.26.0 or higher immediately.
- BREAKING: Updated CLI to v2.22.1, including a bunch of fixes on the Swift side:
- Marked files which are generated as
@generated - Added documentation to the constructors of input structs
- Added additional type annotations to improve compile times.
- Marked files which are generated as
- BREAKING: Updated delegate in
HTTPNetworkTransportto be aweak varand to not be passed in as a parameter to the initializer. (#990, #1002) - Added a lock to
InMemoryNormalizedCacheto reduce possible race conditions. (#552) - Added the ability to not send duplicates on a websocket. (#1004)
- Fixed an issue that could lead to an undefined cache key in the SQLite library. (#991)
- Fixed an issue where existing fetch operations in a watcher would not be canceled before a new one was started. (#1012)
- Repoints download link to our CDN for the CLI for people on 0.21.0 who can't upgrade to 0.26.0 or higher immediately.
- BREAKING, but by popular request: Removed the requirement that the
clientNameandclientVersiononNetworkTransport, and added a default implementation so custom implementations don't need to set these up themselves. (#954)
- Repoints download link to our CDN for the CLI for people on 0.20.0 who can't upgrade to 0.26.0 or higher immediately.
- Fixed a bunch of data races in
ApolloWebSocket. (#880) - Updated
ApolloWebSocketto depend onApolloinPackage.swiftsince there is a dependency there. (#906) - POSSIBLY BREAKING Updated Swift tools verson in package declaration to 5.1. (#883)
- Repoints download link to our CDN for the CLI for people on 0.19.0 who can't upgrade to 0.26.0 or higher immediately.
- NEW: Added a retry delegate to allow retries based on GraphQL errors returned from your server, not just network-level errors. NOTE: Be careful with which errors you retry for - the mere presence of an error doesn't necessarily indicate a full failure since GraphQL queries can return partial results. (#770)
- NEW: Automatically generates ApolloEngine/ApolloGraphManager headers based on your main bundle's ID and version number. These can also be configured when you set up your
NetworkTransportif you need something more granular for different versions of your application. (#858) - POSSIBLY BREAKING: The
NetworkTransportprotocol is now class-bound. If you built your ownNetworkTransportimplementation instead of one of the ones included with the library, this now must be aclassinstead of astruct. (#770) - POSSIBLY BREAKING: Removed an
unzipmethod for arrays of arays which we were not using. However, since it was public, we figured we should let you know. (#872) - Bumped Starscream dependency to
3.1.1. (#873)
- Repoints download link to our CDN for the CLI for people on 0.18.x who can't upgrade to 0.26.0 or higher immediately.
- Removes TSAN from run on schemes to fix Carthage issue. (#862)
-
POSSIBLY BREAKING: Updated CLI to no longer be directly bundled, but to be downloaded if needed. This allows us to avoid bloating the iOS repo with the CLI zip, and to make it easier to test different versions of the CLI in the future. This change should automatically download the updated CLI version for you.
Note one significant change from prior bundled versions: If you are connected to the internet when you download the iOS dependency through SPM/Carthage/CocoaPods, you will now need to build your target while still connected to the internet in order to download the proper version of the CLI. Once the correct version of the CLI is downloaded, internet access should no longer be necessary to build. If you disconnect from the internet before the correct version downloads, you will not be able to build. (#855)
-
Updated version of CLI to download to
2.21.0. (#855) This includes:- Ability to have the codegen ignore deprecated enum cases by using the
--omitDeprecatedEnumCasesflag - Fix for generating input fields for
nullvalues
- Ability to have the codegen ignore deprecated enum cases by using the
-
Fixes a number of weak references with closures. Note that this may reveal some places you weren't hanging onto a strong reference to your
ApolloClientobject, which will cause it to get deallocated. (#854)
- NEW: Support for Automatic Persisted Queries. This feature allows you to send the hash of a query to your server, and if the server recognizes the hash, it can perform the whole query without you having to send it again. This is particularly useful for large queries, since it can reduce the amount of data you have to send from your user's device pretty significantly. (#767)
- BREAKING: Removed old script files which have been deprecated. If you were still using these, please check out the updated codegen build step setup instructions to get up and running with the
run-bundled-codegenscript. (#820) - POSSIBLY BREAKING: Updated bundled CLI to v2.19.1. Please check out the CLI changelog for full details, but this version actually moves to using multi-line Swift strings for queries. If you prefer to have condensed queries, it also introduces a
--suppressSwiftMultilineStringLiteralsflag which produces single-line queries stripped of whitespace. (#831) - Fixed a couple places we were not using
LocalizedErrorproperly. (#818)
- Updated the way
run-bundled-codegenchecks whether the bundled codegen has already been unzipped and has node locally. (#806) - Updated how default parameters are provided for
RequestCreatorProtocol. (#804)
- BREAKING: We've switched to a much simpler setup which does not involve NPM in order to use our CLI. This requires updating your build scripts. Please follow the updated instructions for setting up the build script here. The existing build script will continue to work until the next minor release, at which point it will be removed. (#766)
- Included CLI version fixes issues which showed up in
0.15.2. - BREAKING: We've removed all public references to our internal
Promiseimplementation, which was never intended to be public. (#709) - Fixed a deadlock in a transaction. (#763, #365)
- Added a
RequestCreatorProtocolto allow you to more easily muck with and/or mock creating multipart requests. (#771) - Fixed an issue causing problems building with SPM in Xcode 11. (#784)
- Revert CLI update from
0.15.2due to unexpected build issues.
-
Update Apollo CLI requirement to 2.18. This should pull in a couple fixes to the CLI:
- Way better escaping of identifiers, types, and strings (Tooling #1515)
- Fix compiler warning when an optional has a
.nonecase (Tooling #1482)
If you run into any weird build issues after this update, try deleting your local
node_modulesfolder and rebuilding before filing an issue. (#760) -
Better handling of the
localizedDescriptionforHTTPResponseError. (#756)
- Add platform name to framework bundle identifier to work around a change to app store submission. Please see the PR for more details. (#751)
- Expose the initializer for
GraphQLQueryWatcherso it can actually be instantiated. (#750)
-
BREAKING: Finally swapped out
URLSessionConfigurationon initializer forHTTPNetworkTransportto useURLSessiondirectly instead. If you were previously passing in a configuration, first hand it to aURLSessioninstance and then pass that instance into the initializer.This allows many new things including:
- Support for background sessions
- Easier mocking through
NSURLProtocol - Certificate pinning
- Self-signed certificates
- Metrics inspection
- Authentication challenge handling
All these are pretty much entirely through the ability to use URLSessionDelegate directly since we're now accepting a URLSession you can declare yourself to be the delegate of rather than just the configuration. (#699, inspired by #265)
- BREAKING, though hopefully in a good way: Significant updates to the Upload functionality to make it conform more closely to the GraphQL Upload Spec. Also added a goodly bit of documentation around this functionality. (#707)
- Way better support for Swift Package Manager, especially for
ApolloSQLiteandApolloWebSocket. (#674) - Created
ApolloClientProtocolto match all public methods ofApolloClientfor easier mocking. (#715, inspired by #693)
-
BREAKING Updated codegen to use 2.17 of the Apollo CLI. Please see the full release notes for that version of the CLI, but in short:
- Stops force-unwrapping and instead nil-coalesce to
.nonewhen the thing being unwrapped was a double-optional, which was causing some crashes - Fixes issue where removing redundant modifiers was a little too agressive
- Fixes escaping for
Selfas a type name - Adds
CaseIterablefor all known cases of an enum. If you were adding this yourself previously, you'll have to take it back out. - Adds comment with original operation to
operationDefinition, stripped excess whitespace from actual definition.
- Stops force-unwrapping and instead nil-coalesce to
-
Added explicit support for Catalyst builds. (#688)
-
Added support for
Intcustom scalars. (#402) -
Exposed
clearCachedirectly on stores so a store being used by multiple clients can be more explicitly cleared. (#518) -
Fixed an issue where an error on cache write would not be propagated correctly. (#673)
-
Updated supported Node version to the Long-Term Support version. (#672)
PLEASE READ THESE RELEASE NOTES BEFORE INSTALLING IF YOU WERE USING AN OLDER VERSION!
-
SUPER-BREAKING: Updated a ton of completion closures that could use it to use
Resultinstead of optional parameter / optional error. (#644). There are a few details to this one to be particularly aware of:- If you see a bunch of Swift build errors that are claiming Generic Parameter "Query" could not be inferred, that means you need to update your completion closure to take the single
Result<Parameter, Error>parameter instead of the two (Parameter?,Error?) parameters. - Particularly around caching, if there are places where both parameters were
nilin previous iterations, you will now get anError. This will generally be aJSONDecodingError.missingValue, either as the direct error or as theunderlyingerror of aGraphQLResultError. Please check out the changes toFetchQueryTestsin PR #644 for a better look at how some of that has changed.
- If you see a bunch of Swift build errors that are claiming Generic Parameter "Query" could not be inferred, that means you need to update your completion closure to take the single
-
BREAKING: Updated the codegen to use v2.16 of the Apollo CLI. (#647). This is a major version change so some things need to be added, and some parameter names have changed:
- You must add
--target=swiftso the CLI knows to generate Swift code. - If you were using
--schema=schema.json, use--localSchemaFile="schema.json"instead (the quotes are required!). - If you were using
--queries="$(find . -name '*.graphql')"to pass in an array of all your GraphQL files, use--includes=./*.graphqlinstead.
If you get error messages about multiple versions of node when you attempt to run, delete the
node_modulesfolder in your source root and rebuild.Upgrading fixes several issues:
operationNameis now generated for all operations.- Trailing newlines are now added to all generated files.
- You must add
-
NEW: Ability to upload files according to the GraphQL Multi-part request spec. (#626, #648, inspired by #116)
-
NEW: Now that
operationNameis generated for all operations, we're sending it along with all requests. (#657, inspired by #492) -
NEW: We're also sending
operationNameas theX-APOLLO-OPERATION-NAMEheader and when anoperationIdentifieris provided, sending that as theX-APOLLO-OPERATION-IDheader. (#658) -
NEW: Option to run
VACUUMon your SQLite store when clearing to help obliterate all traces of data. (#652) -
NEW: Auto-generated API documentation from inline comments. Now available on the website NOTE: Any manual changes made to markdown files will get overwritten, if you want to contribute to the docs, please add inline comments to the code and then I'll get the docs updated. (#642).
-
Made
GraphQLResultErrorand its underlying errorpublicfor better error handling. (#655)
- BREAKING: Removed internal
Resulttype in favor of Swift's built inResulttype. This allows you to not have to prefix anything that uses the built-in result type withSwift.Resultin places where you're using the Apollo SDK. (#641) - BREAKING: Set strict dependency versions for Starscream and SQLite.swift to prevent potential problems with Swift version conflicts. (#641).
- BREAKING: Made Carthage dependencies for Starscream and SQLite.swift private so they're not automatically pulled in when trying to build just the main SDK with Carthage. If you're using the
ApolloSQLiteorApolloWebSocketframeworks with Carthage, please read the updated documentation!. (#635, #641) - Fixed issue where
GETrequests were requiringAnyHashableinstead ofAnywhich made requests withBoolproperties never send. (#628, big thanks to #624)
- Fixed missing
Foundationimports for several classes that were causing issues with Buck and Swift Package Manager builds. (#620) - Updated version of
SQLite.swiftdependency to one that properly supports Swift 5. (#621) - Whole mess o'documentation updates. (#618)
- Fixed a whitespace issue with one of the build scripts. (#618)
- Made the
GraphQLResultinitializer public for testing. (#544)
- BREAKING: Updated Podspec to preserve paths rather than embedding scripts in the framework. Updated instructions for embedding with CocoaPods. (#575, #610)
- NEW: At long last, the ability to update headers on preflight requests, the ability to peer into what came to the
URLSessionand the ability to determine if an operation should be retried. (#602) - NEW: Added
.fetchIgnoringCacheCompletelycaching option, which can result in significantly faster performance if you don't need the caching. (#551) - NEW: Added support for using
GETfor queries. (#572, #599, #602) - Updated lib and dependencies to use Swift 5, and say so in the Podfile. (#522, #528, #561, #592)
- Exposed a method to ping a WebSocket server to keep it alive. (#422)
- Handling is always done on a handler queue. (#539)
- Added documentation on the
readandupdateoperations for watching queries. (#452) - Updated build scripts for non-CocoaPods installations to account for spaces in project names or folders. (#610)
- Fixed a code generation fail if you're using MacPorts instead of Homebrew to install
npm. (#591)
- Disabled bitcode in Debug builds for physical devices (#499)
- Don't embed the Swift standard libraries by default (#501)
- Swift 5 support (#427, #475)
- Update to newest version of Starscream (#466
- Add ability to directly update cache with write methods (#413)
- Add docs for
readandupdateoperations (#452)
- Add ability to pass params to
Query.Data(#437) - Provide separate archs for the iOS Simulator (#410)
- Actually install the correct version of Node instead of just checking for it (#434)
- Updated required version of
apollo-clito1.9. A nice addition to1.9.2is that Swift Enums now conforms to Hashable enabling among other things comparision between fetch objects. (#578) - Fixed internal bug that caused infinite reconnection cycle when connection is lost. A reconnectionInterval was added as a workaround. (#368)
- Fixed internal bug that prevents the
wrongTypecase being returned by theJSONDecodingErrorimplementation ofMatchable. (#367) - Added delegate for WebTransport which can handle connection/reconnection/disconnection events of websocket. (#379)
- Since
apollo-codegenis now part of the newapollo-cli, the build script used to generateAPI.swiftneeds to be updated. See the docs for the updated script.
-
Added read and write functions for fine-grained manual store updates.
-
Added support for pluggable asynchronous caches, with an optional experimental SQLite implementation.
-
Fragments are now merged into the parent result, so you only need to go through
fragmentswhen you want to pass a fragment explicitly. -
Generated result models are no longer immutable (but still obey value semantics).
-
Generated result models now have memberwise initializers (when they represent a concrete type) or type-specific factory methods (when they represent multiple possible types).
-
Any generated result model can be safely initialized from a JSON object (
init(jsonObject:)and converted into ajsonObject. -
Generated input objects now differentiate between a property being
nulland a property not being present.