Skip to content

2.30.2.1

Choose a tag to compare

@github-actions github-actions released this 22 Jul 21:14
c6798e2

What's changed

Updates the native SDK from dd-sdk-ios 2.17.0 to 2.30.2, the last release of the 2.x line —
thirteen minor versions, published between September 2024 and October 2025. The 2.x line continued
to receive fixes after 3.0.0 shipped, so 2.30.2 is genuinely the end of the line rather than the
last release before the split.

Everything upstream added is bound: 29 new types, 17 new enums and 133 new members across the
eleven packages — 27 types and 120 members in DatadogObjc alone. Measured by parsing the
-Swift.h header each xcframework ships and diffing it against 2.17.0's, not by reading the
documentation.

Package versions are <dd-sdk-ios version>.<binding revision>. 2.30.2.1 is dd-sdk-ios
2.30.2, binding revision 1. The revision restarts at 1 for each new native version.

⚠️ Breaking changes

DDSessionReplay and DDSessionReplayConfiguration no longer exist in the DatadogObjc
namespace.
Upstream removed the parallel copies it used to declare there; Session Replay now
lives only in DatadogSessionReplay. If you wrote using DatadogObjc; and referred to
DDSessionReplay, add the other namespace:

 using DatadogObjc;
+using DatadogSessionReplay;

The upside: the two identically named types that previously made DDSessionReplay ambiguous when
both namespaces were imported are gone, so no alias is needed any more.

Session Replay privacy is now three settings, not one. defaultPrivacyLevel is deprecated
upstream in favour of independent text/input, image and touch levels, and the new initializer
requires all three — the choice can no longer be left implicit.

-DDSessionReplay.EnableWith(new DDSessionReplayConfiguration(replaySampleRate: 100)
-{
-    DefaultPrivacyLevel = DDSessionReplayConfigurationPrivacyLevel.Mask,
-});
+DDSessionReplay.EnableWith(new DDSessionReplayConfiguration(
+    replaySampleRate: 100,
+    textAndInputPrivacyLevel: DDTextAndInputPrivacyLevel.MaskAll,
+    imagePrivacyLevel: DDImagePrivacyLevel.MaskAll,
+    touchPrivacyLevel: DDTouchPrivacyLevel.Hide));

The old single-argument initializer and DefaultPrivacyLevel are still bound, so existing code
keeps compiling — but they are deprecated upstream and will be removed. Allow, Mask and
MaskUserInput map onto the new levels as Datadog documents.

DDRUMVitalEventVital.details is gone, replaced by failureReason, parentId, stepType and
vitalDescription. It is only reachable from inside a RUM event mapper, so most apps will not
notice.

Fixed

Session Replay would have failed at runtime had the binding been carried over unchanged.
Through 2.17.0 these classes were declared SWIFT_CLASS("_TtC20DatadogSessionReplay..."), which
sets the Objective-C runtime name to the mangled Swift symbol — so the binding spelled that mangled
name out in [BaseType (Name = ...)]. From 2.19.0 they are declared SWIFT_CLASS_NAMED, which
expands to swift_name(...) only and leaves the runtime name as the plain @interface name. The
binary confirms it: it exports _OBJC_CLASS_$_DDSessionReplay, not the mangled symbol. The Name=
attributes are therefore removed. Keeping them would have compiled cleanly and then failed with
"the native class hasn't been loaded" the first time a replay type was touched.

Added

Fine-grained Session Replay masking (2.18.0) — DDTextAndInputPrivacyLevel,
DDImagePrivacyLevel and DDTouchPrivacyLevel.

Per-view privacy overrides (2.19.0) — DDSessionReplayPrivacyOverrides, reached through a
category on UIView, so a single view can be masked or hidden regardless of the session-wide
level:

var overrides = myView.GetDdSessionReplayPrivacyOverrides();
overrides.TextAndInputPrivacy = DDTextAndInputPrivacyLevelOverride.MaskAll;
overrides.Hide = new NSNumber(true);

Deferred replay recording (2.21.0) — StartRecordingImmediately on the configuration, plus
DDSessionReplay.StartRecording() and StopRecording(), for apps that start recording only after
consent or on a particular screen.

Account information (2.29.0) — DDDatadog.SetAccountInfoWithAccountId, AddAccountExtraInfo
and ClearAccountInfo. Account details propagate to Logs, RUM, Traces and error reporting.
DDLogEvent gains a matching AccountInfo, and every RUM event model gains Account.

DDDatadog.ClearUserInfo (2.30.0), and SetUserInfoWithUserId, which requires an id where the
old overload did not (2.24.0).

SwiftUI auto-tracking (2.29.0) — DDSwiftUIRUMViewsPredicate and
DDSwiftUIRUMActionsPredicate, their DDDefault* implementations, and the
SwiftUIViewsPredicate / SwiftUIActionsPredicate properties on DDRUMConfiguration. Bound with
the same [Model, Protocol] shape as the UIKit predicates, so an app can subclass the generated
class instead of implementing the interface.

The AP2 datacenter (2.29.0) — DDSite.Ap2.

RUM attribute APIs (2.23.0) — DDRUMMonitor.AddAttributes and RemoveAttributesForKeys, for
setting attributes on the monitor rather than per event.

DDConfiguration.BackgroundTasksEnabled (2.22.0), and DDRUMConfiguration.TrackAnonymousUser
(2.24.0) with the matching AnonymousId on RUM user models.

New RUM view metrics reachable through the event mappers: Time To Network Settled and
Interaction To Next View (2.23.0), hang and hitch rates (2.25.0), and the view performance models
(CLS, FCP, FID, INP, LCP, FBC) and slow-frame detail. Device models gain battery level, brightness,
locale, power-saving mode and time zone (2.30.0), and every event gains Ddtags (2.30.1).

DDInternalLogger (2.19.0) — the Objective-C entry point to the SDK's internal telemetry.

PLCrashReporterConfig.MaxReportBytes and the initializer that sets it, from the PLCrashReporter
update in 2.25.0.

Tests

The on-simulator suite grows to 20 checks, running against the packed packages on both
net9.0-ios18.0 and net10.0-ios26.0. New coverage: fine-grained Session Replay privacy with
deferred recording start/stop, per-view privacy overrides set and read back through a fresh
accessor, account info set/extend/clear alongside user-info clearing, and the new RUM attribute
APIs and AP2 site.

run-simulator-tests.sh now deletes the device app's obj/ and bin/ before building. Clearing
the NuGet cache is not enough: the native payload is extracted into obj/ and copied into the
.app, and neither step re-runs when the package version string is unchanged — so re-packing the
same version left the previous build's xcframeworks embedded in the app. That produced a
genuinely misleading failure during this upgrade, in which the frameworks were present and loaded
but every Objective-C class lookup missed, because the app was running 2.17.0 binaries against a
2.30.2 binding.

Notes

Package size dropped from about 80 MB to about 50 MB across the eleven packages. The frameworks
themselves are smaller in 2.30.2; nothing changed in how they are stripped or packed.

Objective Sharpie could not be used for this upgrade. Version 3.5.116, the current release,
bundles a clang that cannot parse the module maps in recent iOS SDKs — it fails with
module '_stddef' requires feature 'found_incompatible_headers__check_search_paths' against both
the 18.5 and 26.5 SDKs, before emitting anything. It also refuses to bind a framework whose
recorded DTSDKName is not installed, which is normal for a downloaded binary. The delta was
therefore derived by parsing the shipped headers and diffing them against the previous version's.
build/GenerateBindings.sh documents both problems and now honours a SHARPIE environment
variable, so the package can be expanded and run in place without administrator rights once it
works again.

No new packages. dd-sdk-ios 2.30.2 ships the same eleven frameworks as 2.17.0.
DatadogFlags and DatadogProfiling are 3.x-only, as is the removal of DatadogObjc and the move
from PLCrashReporter to KSCrash.

Full changelog: v2.17.0.1...v2.30.2.1

Packages

Bound against dd-sdk-ios 2.30.2, targeting net8.0-ios18.0, net9.0-ios18.0 and net10.0-ios26.0.

The first three components of 2.30.2.1 are the dd-sdk-ios version; the fourth is this
repository's binding revision, which advances when the bindings or packaging change while
the native binaries stay put.

Package Wraps NuGet
DatadogNet.Objc.iOS DatadogObjc 2.30.2.1
DatadogNet.Core.iOS DatadogCore 2.30.2.1
DatadogNet.Internal.iOS DatadogInternal 2.30.2.1
DatadogNet.Logs.iOS DatadogLogs 2.30.2.1
DatadogNet.RUM.iOS DatadogRUM 2.30.2.1
DatadogNet.SessionReplay.iOS DatadogSessionReplay 2.30.2.1
DatadogNet.Trace.iOS DatadogTrace 2.30.2.1
DatadogNet.WebViewTracking.iOS DatadogWebViewTracking 2.30.2.1
DatadogNet.CrashReporting.iOS DatadogCrashReporting 2.30.2.1
DatadogNet.CrashReporter.iOS CrashReporter 2.30.2.1
DatadogNet.OpenTelemetryApi.iOS OpenTelemetryApi 2.30.2.1
dotnet add package DatadogNet.Objc.iOS --version 2.30.2.1

Licensing

The binding code is MIT; the bundled native binaries are Apache-2.0, as built and
published by Datadog. Each package ships both texts under licenses/.