2.17.0.1
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.1is dd-sdk-ios
2.17.0, binding revision1. 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 unchanged — DatadogObjc, 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/StopViewWithKeypair 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)andlogger.Log(level, message, exception, attributes), which take
a managedExceptionwhere the binding takes anNSError— the latter settingerror.kind,
error.messageanderror.stackso it renders as an error in the Logs UI.DDLogger.Create(name: "app")andDDLogs.Enable(), instead of an eight-argument designated
initializer with no defaults.DDDatadog.SetUserInfo(id)with optional name, email and attributes.TrackingConsentas a real C# enum, mirroringDDTrackingConsent, 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.1are 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/.