> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appstack.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Swift SDK changelog

> Every release of the Appstack Swift SDK, newest first.

Releases of the `ios-appstack-sdk` Swift package, newest first. Always integrate against the latest
stable release — [`appstack-cli review`](/tooling/cli) will tell you what you
are on.

<Card title="Swift integration guide" icon="book-open" href="/SDKs/swift">
  Install, configure, and send your first events.
</Card>

<Update label="4.6.0" description="2026-09-02" tags={["Added","Fixed"]}>
  **Added**

  * Custom event parameters are encrypted on the device before being sent, so personal data such as an
    email or phone number leaves the app already protected. Parameter names that need to stay readable
    — for example `currency`, `revenue` and campaign fields — are excluded, and that list is
    controlled server-side, so no code change is required in your app. Requires iOS 17 or later; on
    iOS 15 and 16 the values are encrypted server-side as before. Purchase `transaction_details` and
    deeplink user data are unaffected, so revenue reporting is unchanged. A value that cannot be
    encrypted is omitted from the event, and the rest of the event still sends.

  **Fixed**

  * A `null` in the attribution match response no longer discards the whole response. Previously one
    null query parameter could cost an install its attribution data.
  * Event parameters holding `null` no longer cause the event to be silently dropped. Null values are
    now omitted from the payload (nulls inside arrays are kept), matching the Android SDK. This
    covered a nil Swift `Optional` passed as a parameter, any dictionary decoded from JSON that
    carries a null field, Dart `null` from Flutter, and nested nulls from React Native.
  * `sendEvent(event:name:parameters:)` no longer crashes the app when a parameter holds a value JSON
    cannot represent — a `Date`, `URL`, `Data`, `Set`, custom object, or a `NaN`/infinite number.
    Such keys are now dropped individually and named in an error log; the event still sends with its
    remaining parameters. Send strings, finite numbers, booleans, arrays, and nested string-keyed
    dictionaries.

  [Release notes on GitHub](https://github.com/appstack-tech/ios-appstack-sdk/releases/tag/4.6.0)
</Update>

<Update label="4.5.2" description="2026-09-01" tags={["Added"]}>
  **Added**

  * Events now carry an internal diagnostic recording whether Apple Ads attribution was enabled and
    whether the AdServices token fetch is pending, succeeded, or failed. The SDK sends an automatic
    diagnostic event when the token resolution completes, so no later app event is required.

  [Release notes on GitHub](https://github.com/appstack-tech/ios-appstack-sdk/releases/tag/4.5.2)
</Update>

<Update label="4.5.1" description="2026-08-18" tags={["Added"]}>
  **Added**

  * Added an Apple privacy manifest declaring the SDK's required-reason API usage.

  [Release notes on GitHub](https://github.com/appstack-tech/ios-appstack-sdk/releases/tag/4.5.1)
</Update>

<Update label="4.5.0" description="2026-08-11" tags={["Added","Changed","Fixed"]}>
  **Added**

  * `setCustomerUserId(_:)` sets the customer user id after `configure()`, for when the id is only
    known once the user logs in. It applies to every event sent from that point on, including events
    already buffered but not yet delivered.
  * `getAttributionParams()` now always carries an `appstack_match_status` key telling you whether the
    attribution request succeeded: `matched`, `matched_no_params`, `organic`, `skipped`, `failed` or
    `not_configured`. Only `failed` is worth re-reading later; the rest are settled answers.
  * Attribution match outcomes are now visible on the `.debug` log channel.

  **Changed**

  * `getAttributionParams()` no longer returns `nil` — where the result was previously `nil` or empty,
    it now carries the status key explaining why. Existing call sites keep compiling, but code using
    an empty result to mean "not attributed" should switch to the status key.

  **Fixed**

  * `deleteUserData()` now also clears the stored customer user id.
  * A blank customer user id is treated as absent instead of being sent as an empty string.
  * A `setCustomerUserId(...)` call made immediately after `configure()` is no longer overwritten by
    the value passed to `configure()`.

  [Release notes on GitHub](https://github.com/appstack-tech/ios-appstack-sdk/releases/tag/4.5.0)
</Update>

<Update label="4.4.1" description="2026-08-03" tags={["Added","Fixed"]}>
  **Added**

  * Attribution matching now includes additional network context to improve match diagnostics.

  **Fixed**

  * `sendEvent(event:)` now ignores `INSTALL`, which the SDK already tracks automatically. Sending it by hand previously double-counted installs; such calls are now logged and discarded.

  [Release notes on GitHub](https://github.com/appstack-tech/ios-appstack-sdk/releases/tag/4.4.1)
</Update>

<Update label="4.4.0" description="2026-07-17" tags={["Added","Changed","Fixed","Removed"]}>
  **Added**

  * Added Mac Catalyst support to the prebuilt XCFramework.

  **Changed**

  * Improved install detection and attribution reliability.
  * Improved Swift Package Manager resolution: installations now download the prebuilt XCFramework
    directly from the GitHub release asset instead of cloning the complete source repository.
  * Deprecated `isDebug` and `endpointBaseUrl`; both arguments are now ignored and will be removed
    in a future version. Integrations should migrate to `configure(apiKey:logLevel:customerUserId:)`.

  **Fixed**

  * Improved SDK behavior during initialization and temporary connectivity failures.

  **Removed**

  * Removed the test-only `AppstackAttributionSdk.setInstallDateForTesting(_:)` API.

  [Release notes on GitHub](https://github.com/appstack-tech/ios-appstack-sdk/releases/tag/4.4.0)
</Update>
