Skip to content

Releases: apollographql/apollo-ios

2.3.0

Choose a tag to compare

@AnthonyMDev AnthonyMDev released this 21 Jul 18:01

New

  • Add opt-in additionalCapitalizationRules to codegen (#1037): Adds a new opt-in additionalCapitalizationRules codegen option and public CapitalizationRule API (a Term of .string/.regex and a CaseStrategy of .upper/.lower) so acronyms can be fully capitalized (e.g. userIduserID). Following SwiftFormat semantics, an acronym is only capitalized when its first character is already uppercase, so identifiers like apiKey are preserved. The rules apply to field accessors, initializer parameters, enum cases, input fields, and test mocks. The option defaults to empty, so existing generated output is unchanged. Closes #3419. Thank you to @3redrubies for the contribution.

Fixed

  • Resolve deferred response paths against the initial cache records (#1052): When a @defer query streamed incremental chunks, the deferred path was turned into a cache key by naively joining the root key with the raw path components (e.g. QUERY_ROOT.animal.friend) instead of following the real normalized-record chain (QUERY_ROOT → Animal:<id> → …). The deferred fields landed on phantom records that nothing referenced, so a cache-first read came back missing those fields. Deferred paths are now resolved by walking the initial response's already-normalized records at parse time, so deferred fields merge onto the correct records. Fixes #3380. Thank you to @joseph-francis-ih for the contribution.
  • Close the old connection in WebSocketTransport.disconnectAndReconnect() (#1055): disconnectAndReconnect() replaced the active connection without closing the old one first. Because the old WebSocketConnection was strongly held by its receive loop's parked Task, it never deallocated — leaking the connection and its underlying URLSessionWebSocketTask, and delivering duplicate next messages routed through the stale connection. The old connection is now closed before being replaced. Fixes #3649.
  • Remove unnecessary throws from WebSocketTransport.init (#1039): WebSocketTransport.init was marked throws but made no throwing calls; the vestigial annotation has been removed. This is a source-breaking change for callers who used try when constructing a WebSocketTransport. Closes #3638.

Improved

  • Prune the findInXcode directory walk (#1015): VersionChecker.findInXcode recursively enumerated every descendant of the project root to locate Package.resolved, walking build artifacts, .git, vendored dependencies, and git worktrees on every generate/fetch-schema invocation. The walk now skips hidden files and package descendants, reducing a ~30s walk to ~0.2s on a repo with ~150k nested files. Note: a project located inside a hidden directory is no longer discovered; this is intentional. Thank you to @dfed for the contribution.

1.25.7

Choose a tag to compare

@AnthonyMDev AnthonyMDev released this 21 Jul 18:01

Improved

  • Expose DatabaseRow stored properties for SQLiteDatabase extensibility (#1056): DatabaseRow's stored properties (cacheKey and storedInfo) are now public, complementing the public initializer added in #664. This lets adopters build wrapper or decorator implementations of the public SQLiteDatabase protocol — for encryption, compression, logging, metrics, and similar use cases — without duplicating Apollo's SQLite implementation. This change only expands the public API surface and introduces no behavioral changes. Thank you to @ErShubhShankar for the contribution.

2.2.0

Choose a tag to compare

@AnthonyMDev AnthonyMDev released this 24 Jun 18:49

Fixed

  • Xcode 27 (Swift 6.4) build compatibility (#1034): Fixed multiple build failures introduced by Swift 6.4 / Xcode 27. AnyHashable's Sendable conformance is now explicitly unavailable in Swift 6.4, so AnyHashable as JSONValue casts no longer compile; replaced with explicit scalar type-matching helpers (with Bool checked before NSNumber to preserve round-trip fidelity). Fixed a duplicate runtime type descriptor crash caused by multiple test targets statically linking the same SPM products; all Apollo package products are now linked exclusively through a single apolloWrapper target. Fixed WebSocketConnection.send() silently discarding errors by cancelling the underlying task on failure so the transport's reconnection state machine runs correctly. Also fixed \x22 escapes in composed Swift Regexes and AsyncResultObserver.handler @Sendable conformance under Swift 6.4. Thank you to the community members who submitted PRs identifying these issues.
  • Fix WebSocketTransport retain cycle in receive loop (#1011): The WebSocketTransport actor was never deallocated after a connection was established because the unstructured Task in startConnectionReceiveLoop() captured self strongly. The receive loop now uses [weak self] and deinit explicitly closes the connection so the transport deallocates correctly when all external references are dropped. Thank you to @heltoft for the contribution.
  • Fix crash in SelectionSet equality for nullable-inner object lists (#986): Comparing two SelectionSet values containing a [Object?] (non-null list, nullable element) field where any element was null triggered a preconditionFailure("Expected list data to contain objects."). Added a [DataDict?] branch in convertElements that handles the mixed DataDict + NSNull case and preserves null positions so position-sensitive equality remains correct. Thank you to @dfed for the contribution.

2.1.2

Choose a tag to compare

@apollo-bot2 apollo-bot2 released this 08 May 20:07

Fixed

  • Make SubscriptionStream initializer public (#975): The SubscriptionStream initializer was inadvertently scoped to package access, preventing adopters from writing custom conformances to the public SubscriptionNetworkTransport protocol. The initializer is now public. Fixes #3637. Thank you to @ahou8 for raising the issue.
  • Fix \r\n in GraphQL descriptions generating invalid Swift comments (#961): GraphQL field descriptions containing \r\n (Windows CRLF) line endings caused codegen to emit invalid Swift — only the first line received the /// doc comment prefix and subsequent lines were emitted as uncommented text, breaking compilation. Fixes #3553. Thank you to @iPhoneNoobDeveloper for the contribution.

1.25.6

Choose a tag to compare

@apollo-bot2 apollo-bot2 released this 08 May 20:35

Fixed

  • Fix \r\n in GraphQL descriptions generating invalid Swift comments (#965): GraphQL field descriptions containing \r\n (Windows CRLF) line endings caused codegen to emit invalid Swift — only the first line received the /// doc comment prefix and subsequent lines were emitted as uncommented text, breaking compilation. Backport of #961. Fixes #3553. Thank you to @iPhoneNoobDeveloper for the contribution.

2.1.1

Choose a tag to compare

@apollo-bot2 apollo-bot2 released this 23 Apr 18:07

Fixed

  • Fix cache read failure for nested arrays of objects (#938): Reading nested arrays of objects (2D, 3D, etc.) from the normalized cache threw a JSONDecodingError.wrongType error. Reference resolution now handles array nesting at any depth. Fixes #3609. Thank you to @gurusekhar-ibm for raising the issue.
  • Fix incorrect default mock value when first enum case is deprecated (#949): When deprecatedEnumCases was set to .exclude, the mock codegen incorrectly used the first enum case as the default value in convenience initializers — even if that case was deprecated and excluded from the generated enum, causing a compile error. Fixes #3634. Thank you to @cswelin for raising the issue.
  • Fix recursive OneOf input object enum cases not marked indirect (#954): A @oneOf input object that directly references itself generated a Swift enum that failed to compile with Recursive enum is not marked 'indirect'. Self-referencing cases are now correctly marked indirect. Fixes #3633. Thank you to @ahou8 for raising the issue.

1.25.5

Choose a tag to compare

@apollo-bot2 apollo-bot2 released this 07 Apr 18:26

Fixed

  • Fixed concurrency crash in compileGraphQLResult on Swift 6.3/macOS 26 (#929): Serialized async let calls in compileGraphQLResult to work around a Swift concurrency runtime crash triggered when code generation is used in an AsyncParsableCommand. See PR #942. Thank you to @m4p for the contribution.

2.1.0

Choose a tag to compare

@apollo-bot2 apollo-bot2 released this 02 Apr 18:02

New

  • WebSocket Transport: Apollo iOS 2.0 now supports WebSocket connections using the graphql-transport-ws protocol for subscriptions, queries, and mutations. See the WebSocket Transport documentation for setup and usage details.
  • Swift 6.2 MainActor default isolation support (#925): Added a markTypesNonisolated codegen option that emits nonisolated on all generated type declarations. This prevents compilation errors when SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor is enabled. The option defaults to true when the codegen tool is compiled with Swift 6.2+.
  • ApolloURLSession delegate injection (#899): Added support for injecting a custom URLSessionTaskDelegate into ApolloURLSession, enabling delegate callback handling. Thank you to @hammy-e for the contribution.

Fixed

  • Fix concurrency issue in compileGraphQLResult (#929): Resolved a Swift compiler crash triggered by async let stack management during code generation in AsyncParsableCommand contexts. Thank you to @m4p for the contribution.

New

  • WebSocket Transport: Apollo iOS 2.0 now supports WebSocket connections using the graphql-transport-ws protocol for subscriptions, queries, and mutations. See the WebSocket Transport documentation for setup and usage details.
  • ApolloURLSession delegate injection (#899): Added support for injecting a custom URLSessionTaskDelegate into ApolloURLSession, enabling delegate callback handling. Thank you to @hammy-e for the contribution.
  • Make JSONRequest.useGetForQueries mutable (#897): The useGetForQueries property on JSONRequest is now a var, allowing interceptors to mutate the request directly instead of copying it. Thank you to @nevil for the contribution.

Fixed

  • Add preflight HTTP header for CSRF prevention (#900): Added the X-Apollo-Operation-Name header to requests to satisfy Apollo Router's CSRF prevention requirements.

Improved

  • Use dictionary for objectType(forTypename:) lookup (#918): Replaced the generated switch statement in SchemaMetadata.objectType(forTypename:) with a static dictionary lookup, improving deserialization performance by ~75% for schemas with many types (4000+). Thank you to @erneestoc for the contribution.

1.25.4

Choose a tag to compare

@apollo-bot2 apollo-bot2 released this 25 Mar 21:32

Improvement

  • Use dictionary instead of switch for objectType(forTypename:) lookup (#3631): The generated SchemaMetadata.objectType(forTypename:) method now uses a static dictionary for O(1) hash-based lookup instead of a switch statement that performed O(n) linear scanning. For schemas with many object types (~4300 types), this improves deserialization times by approximately 75%. See PR #926.

2.1.0-rc-1

2.1.0-rc-1 Pre-release
Pre-release

Choose a tag to compare

@apollo-bot2 apollo-bot2 released this 23 Mar 18:16

New

  • WebSocket Transport: Apollo iOS 2.0 now supports WebSocket connections using the graphql-transport-ws protocol for subscriptions, queries, and mutations. See the WebSocket Transport documentation for setup and usage details.
  • ApolloURLSession delegate injection (#899): Added support for injecting a custom URLSessionTaskDelegate into ApolloURLSession, enabling delegate callback handling. Thank you to @hammy-e for the contribution.
  • Make JSONRequest.useGetForQueries mutable (#897): The useGetForQueries property on JSONRequest is now a var, allowing interceptors to mutate the request directly instead of copying it. Thank you to @nevil for the contribution.

Fixed

  • Add preflight HTTP header for CSRF prevention (#900): Added the X-Apollo-Operation-Name header to requests to satisfy Apollo Router's CSRF prevention requirements.

Improved

  • Use dictionary for objectType(forTypename:) lookup (#918): Replaced the generated switch statement in SchemaMetadata.objectType(forTypename:) with a static dictionary lookup, improving deserialization performance by ~75% for schemas with many types (4000+). Thank you to @erneestoc for the contribution.