Skip to content

2.17.0.1

Choose a tag to compare

@github-actions github-actions released this 22 Jul 16:15

What's changed

First release of the DatadogNet.*.iOS packages, replacing the DatadogObjc.iOS /
DatadogCore.iOS set published from the old DataDog-SDK-iOS-net repository. Same eleven
packages, same native SDK (dd-sdk-ios 2.17.0), same namespaces and same API — rebuilt on a
packaging pipeline that is tested.

Package versions are <dd-sdk-ios version>.<binding revision>. 2.17.0.1 is dd-sdk-ios
2.17.0, binding revision 1. The fourth component belongs to this repository and advances when
the bindings or packaging change while the native binaries stay put.

⚠️ Breaking changes

Package IDs have changed. <Framework>.iOS is replaced by DatadogNet.<Name>.iOS.

-<PackageReference Include="DatadogObjc.iOS" Version="2.17.0.1" />
+<PackageReference Include="DatadogNet.Objc.iOS" Version="2.17.0.1" />

The namespaces are unchangedDatadogObjc, DatadogCore, DatadogSessionReplay and the
rest — so no using directive and no call site changes. See the README's
migration table for all eleven.

net7.0-ios is dropped. The packages now target net8.0-ios18.0, net9.0-ios18.0 and
net10.0-ios26.0; the old ones targeted net7.0-ios16.1 and net8.0-ios17.2.

Minimum deployment target is iOS 12.2, up from 12.0. The Datadog frameworks are Swift and rely
on the OS-provided Swift runtime, which is only ABI-stable from 12.2 — the packages previously
claimed support for two OS versions on which their own dependency does not exist.

CrashReporter.iOS was versioned 1.11.2.x; DatadogNet.CrashReporter.iOS is 2.17.0.1. It
ships inside the same Datadog release as everything else, and the PLCrashReporter-derived numbering
made it impossible to tell which Datadog build a given package belonged to.

Fixed

A startup crash in DatadogInternal.iOS. The binding declared three URLSession overloads
that INSUrlSessionDataDelegate already declares, so each selector was registered twice. This was
not a compile error — it killed the app during assembly registration, before a line of its own code
ran:

Could not register the selector 'URLSession:task:didFinishCollectingMetrics:' of the member
'DatadogInternal.DatadogURLSessionDelegate.URLSession' because the selector is already registered
on the member 'DidFinishCollectingMetrics'.

The duplicates are gone. The methods are still callable under their inherited names.

The inter-package dependency graph was inverted. DatadogInternal.iOS declared dependencies on
DatadogCore.iOS and DatadogTrace.iOS; the frameworks' actual load commands say both of those
depend on DatadogInternal. The graph is now derived from the binaries.

DatadogTrace.iOS did not declare OpenTelemetryApi.iOS. DatadogTrace is the only framework
that links OpenTelemetry, but the dependency was declared on DatadogObjc.iOS instead — so
referencing Trace on its own did not link. DatadogNet.Trace.iOS declares it directly.

Added

net9.0-ios and net10.0-ios.

A convenience API over the generated binding, in DatadogNet.Objc.iOS. Nothing is hidden or
renamed; the generated members are all still there.

  • using (monitor.StartView("checkout")) — a disposable scope, instead of a
    StartViewWithKey/StopViewWithKey pair matched by string key that leaks the view on an early
    return or an exception.
  • Plain C# dictionaries where the raw API takes NSDictionary<NSString, NSObject>, on every RUM and
    Logs overload. Values may be strings, numbers, bool, DateTime, Guid, enums, arrays and
    nested dictionaries; anything unconvertible throws rather than being silently dropped.
  • monitor.AddError(exception) and logger.Log(level, message, exception, attributes), which take
    a managed Exception where the binding takes an NSError — the latter setting error.kind,
    error.message and error.stack so it renders as an error in the Logs UI.
  • DDLogger.Create(name: "app") and DDLogs.Enable(), instead of an eight-argument designated
    initializer with no defaults.
  • DDDatadog.SetUserInfo(id) with optional name, email and attributes.
  • TrackingConsent as a real C# enum, mirroring DDTrackingConsent, which is a class of static
    instances.

Tests. 123 package-layout checks over the packed .nupkgs — target frameworks, native payload,
slices, xcframework manifests, dependency groups, licences, symbols — and a 14-check on-simulator
suite that installs the packed packages into a real iOS app and drives the SDK: initialization,
RUM views/actions/errors/resources, all six log levels, Trace with all three header writers, Session
Replay, crash reporting, both URLSession delegates, and the convenience layer. It also asserts that
all eleven native frameworks are actually loaded into the process, which is what would catch a
package whose payload was empty or mis-stripped.

CI. Pull requests build, test and publish a -beta.<pr>.<run> prerelease; tagging v2.17.0.1
publishes the set and creates a GitHub release. Publishing uses nuget.org trusted publishing, so
there is no long-lived API key.

Changed

Packages are about 74 MB in total, down from what shipping every slice would cost. The upstream
archive carries tvOS slices for every framework, macCatalyst/macOS/watchOS/visionOS for two of them,
and a full set of dSYMs — none of it reachable from a net*-ios binding, and all of it embedded
once per target framework. FetchXcFrameworks.sh strips to the two iOS slices and rewrites each
Info.plist to match.

The native payload ships as a single compressed file rather than a directory of loose framework
files, which is what previously risked NU5123 and path-length restore failures on Windows.

No Carthage, and nothing is built from source. Datadog publishes the built xcframeworks as a
release asset, so the build downloads one archive and verifies it against a SHA-256 pinned in
build/checksums.txt. gen.sh, fixgen.sh, changever.sh, pack.sh, unpack.sh and
publish.sh are all gone; regeneration is build/GenerateBindings.sh, which writes to a scratch
directory for diffing rather than overwriting the committed sources — which is how the
duplicate-selector crash above survived for so long.

Licence metadata is accurate. The packages declared MIT, which described the binding code but
not the native binaries they ship. They now declare MIT AND Apache-2.0 and carry both texts under
licenses/. Your obligations have not changed; the metadata was simply incomplete.

Notes

DatadogNet.CrashReporting.iOS and DatadogNet.WebViewTracking.iOS are deliberately not pulled
in by DatadogNet.Objc.iOS. Neither is referenced by DatadogObjc's binary, and crash reporting
installs a signal handler — not something an app that only wanted RUM should get by default.
Reference them explicitly.

DDSessionReplay exists in both the DatadogObjc and DatadogSessionReplay namespaces, wrapping
two different native classes that do the same thing. Prefer the DatadogObjc one; importing both
namespaces unqualified makes the name ambiguous.

dd-sdk-ios 3.x is a larger move than a version bump: it removes DatadogObjc entirely (the
DD* types moved into each feature module), replaces PLCrashReporter with KSCrash, and adds
DatadogFlags and DatadogProfiling. This release deliberately stays on the 2.x line.

Packages

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

The first three components of 2.17.0.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.17.0.1
DatadogNet.Core.iOS DatadogCore 2.17.0.1
DatadogNet.Internal.iOS DatadogInternal 2.17.0.1
DatadogNet.Logs.iOS DatadogLogs 2.17.0.1
DatadogNet.RUM.iOS DatadogRUM 2.17.0.1
DatadogNet.SessionReplay.iOS DatadogSessionReplay 2.17.0.1
DatadogNet.Trace.iOS DatadogTrace 2.17.0.1
DatadogNet.WebViewTracking.iOS DatadogWebViewTracking 2.17.0.1
DatadogNet.CrashReporting.iOS DatadogCrashReporting 2.17.0.1
DatadogNet.CrashReporter.iOS CrashReporter 2.17.0.1
DatadogNet.OpenTelemetryApi.iOS OpenTelemetryApi 2.17.0.1
dotnet add package DatadogNet.Objc.iOS --version 2.17.0.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/.