Releases: sbokatuk/DatadogNet.Mac
Release list
3.14.0.4
3.14.0.4
Binding-only release. The native SDK is unchanged — still
dd-sdk-ios 3.14.0, built from source
for Mac Catalyst — and so are the package ids, namespaces and API. The fourth component advances
for one behaviour fix every consumer gets, plus the same release-machinery round the sibling
repositories took.
Apps no longer crash on first use under the default trim mode
DatadogNet.Mac.Example built and linked cleanly and then died on its first touch of logging:
ObjCRuntime.RuntimeException: Could not find the type 'ObjCRuntime.__Registrar__'
in the assembly 'DatadogNet.Logs.Mac'.
The cause is not in these bindings: the managed-static registrar — .NET 9+'s default for Mac
Catalyst — weaves its __Registrar__ lookup type into binding assemblies reliably only under
TrimMode=full, and MAUI apps default to TrimMode=partial, where the weaving silently skips
some assemblies (dotnet/macios#21636). Which
assemblies get skipped is luck: on a real Mac, DatadogNet.Core.Mac got its type,
DatadogNet.Logs.Mac did not.
The packages now defend themselves: a buildTransitive props file on DatadogNet.Core.Mac —
the one dependency every package here shares — defaults consuming apps to the classic static
registrar, which needs no weaving. It applies only when the app has not already chosen a
Registrar, so opting back into managed-static (with TrimMode=full, where the bug does not
reproduce) keeps working. Verified by repacking and rebuilding the example on the same Mac:
first log line delivered, no crash. The full write-up is
docs/known-issue-managed-static-registrar-trimmode-partial.md.
This came out of the same round of real-hardware checks that caught the iOS packages' missing
device symbols (fixed separately in DatadogNet.iOS 3.14.0.5) — Catalyst has no simulator, so
running the example here at all was the novelty.
Release machinery
The same round the sibling repositories took, so releases behave identically across them:
- Verification is gated on
verify: a release run only packs and publishes; the sample,
package validation and smoke tests run on PRs, where their failures are actionable. - A release starts when its release note merges: tagging follows from
docs/release-notes/<version>.mdlanding on the default branch, and a tag whose commit is not
an ancestor of the default branch is refused. - Upstream is watched: a scheduled workflow compares
DatadogNativeVersionagainst the
latest dd-sdk-ios release and opens one issue, idempotently, when upstream is ahead.
Upgrading from 3.14.0.3
-<PackageReference Include="DatadogNet.Logs.Mac" Version="3.14.0.3" />
+<PackageReference Include="DatadogNet.Logs.Mac" Version="3.14.0.4" />Nothing to change beyond the version: same native build, same API, same package set, and all
packages move together as they depend on each other at an exact version. If your app sets
Registrar explicitly, your choice is respected; everyone else silently stops being exposed to
the weaving bug.
Full changelog: v3.14.0.3...v3.14.0.4
Packages
Bound against dd-sdk-ios 3.14.0, built from source for Mac Catalyst, targeting net8.0-maccatalyst18.0, net9.0-maccatalyst18.0 and net10.0-maccatalyst26.0.
dsyms-3.14.0.4.zip below carries the dSYMs for these exact binaries - Datadog publishes
no Catalyst builds, so this release is the only place they exist. Upload them to Datadog for
crash symbolication. The zip also carries BUILD-INFO.txt: the Xcode, SDK and timestamp the
binaries were built with, for anyone rebuilding at this tag to compare.
The first three components of
3.14.0.4are 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.Core.Mac |
DatadogCore |
3.14.0.4 |
DatadogNet.RUM.Mac |
DatadogRUM |
3.14.0.4 |
DatadogNet.Logs.Mac |
DatadogLogs |
3.14.0.4 |
DatadogNet.Trace.Mac |
DatadogTrace |
3.14.0.4 |
DatadogNet.SessionReplay.Mac |
DatadogSessionReplay |
3.14.0.4 |
DatadogNet.WebViewTracking.Mac |
DatadogWebViewTracking |
3.14.0.4 |
DatadogNet.CrashReporting.Mac |
DatadogCrashReporting |
3.14.0.4 |
DatadogNet.Flags.Mac |
DatadogFlags |
3.14.0.4 |
DatadogNet.Profiling.Mac |
DatadogProfiling |
3.14.0.4 |
DatadogNet.Internal.Mac |
DatadogInternal |
3.14.0.4 |
DatadogNet.OpenTelemetryApi.Mac |
OpenTelemetryApi |
3.14.0.4 |
dotnet add package DatadogNet.Core.Mac --version 3.14.0.4
dotnet add package DatadogNet.RUM.Mac --version 3.14.0.4
Licensing
The binding code is MIT; the bundled native binaries are Apache-2.0, built from Datadog's sources, and
each package ships both texts under licenses/.
3.14.0.3
3.14.0.3
Binding-only release. The native SDK is unchanged — still
dd-sdk-ios 3.14.0, built from source
for Mac Catalyst — and so are the package ids, namespaces and API. The fourth component advances
for a round of guarantees about how these packages are built and what you can verify about
them.
Every release is now attested
The .nupkg files and the dsyms-<version>.zip carry
build provenance attestations:
a signed, public statement that the exact bytes you downloaded came out of this repository's
release workflow, at this tag and commit, on GitHub's runners — checkable with
gh attestation verify <file> --repo sbokatuk/DatadogNet.Mac. The README's new
Verifying a build section says
what that proves, what it does not, and documents the stronger rebuild-and-compare path — for
which dsyms-<version>.zip now also carries BUILD-INFO.txt, the record of the exact Xcode and
SDK the binaries were compiled with. Previously that record never left CI.
dSYMs are guaranteed, not best-effort
3.14.0.2 started attaching the dSYMs to every release; this release makes them a hard guarantee.
The build now fails if any framework's dSYM is missing, and counts one per shipped framework
before recording the build as done — for binaries Datadog does not publish, these are the only
symbolication data that will ever exist, and "the copy silently failed" is no longer a way to
lose them.
The binaries are smoke-checked at build time
Building dd-sdk-ios for Catalyst requires patching upstream's project file, and a stale patch
does not always fail the build — it can archive a gutted module: fewer classes, no Objective-C
surface, a MissingMethodException waiting in your app. Every xcframework is now checked with
nm the moment it is created: a canonical exported symbol per framework (the class behind each
package's main entry point — DDDatadog, DDRUM, DDLogs, ... — or the Swift entry type for
the three frameworks with no Objective-C surface), asserted on both the arm64 and x86_64 slices.
The package tests likewise now assert the exact slice name the README promises,
ios-arm64_x86_64-maccatalyst, rather than a shape that a single-arch slice could satisfy.
The SessionReplay description tells the whole truth
DatadogNet.SessionReplay.Mac's nuget.org description promised session recording with no
caveat; the README and the sample have always said the honest part — upstream's recorder is
iOS/iPadOS-only and records nothing on Catalyst. The description now says it too: the package
ships so shared code that references it compiles and links unchanged.
Repository machinery
None of these change the packages, but they change how likely the packages are to be right:
- The drift guards run between releases. The binding-drift check — bindings are verbatim
copies of DatadogNet.iOS's — used to run only on pull requests and tags. A weekly scheduled
workflow now re-runs it, extends it to the hand-synced tooling files (compared
comment-stripped, so each copy's own documentation stays legal), and opens a single idempotent
issue when DatadogNet.iOS'ssrc/moves past the pinned sync commit. - A mistyped release tag no longer publishes. The tag drives which native line is released;
it is now cross-checked againstDirectory.Build.props, with a documented override for
deliberate different-line releases. - The xcframework cache keys on the resolved Xcode (version and build), not just the pinned
SDK line — a runner-image patch bump can no longer serve binaries an older compiler built. - Release-configuration coverage. The sample now also builds in Release against the packed
packages, the configuration consumers actually ship. build/BumpNativeVersion.shrewrites every pin an SDK upgrade touches in one command —
including reading the matching OpenTelemetryApi version from the new tag's
Cartfile.resolved— and prints the manual steps that remain.
net8 sunset
Unchanged policy, restated so it does not persist by inertia: the net8.0-maccatalyst18.0 head
is dropped in the first release after .NET 8 leaves support on 10 November 2026, in step
with DatadogNet.iOS.
Upgrading from 3.14.0.2
Nothing to change: same native SDK, same API.
Full changelog: v3.14.0.2...v3.14.0.3
Packages
Bound against dd-sdk-ios 3.14.0, built from source for Mac Catalyst, targeting net8.0-maccatalyst18.0, net9.0-maccatalyst18.0 and net10.0-maccatalyst26.0.
dsyms-3.14.0.3.zip below carries the dSYMs for these exact binaries - Datadog publishes
no Catalyst builds, so this release is the only place they exist. Upload them to Datadog for
crash symbolication. The zip also carries BUILD-INFO.txt: the Xcode, SDK and timestamp the
binaries were built with, for anyone rebuilding at this tag to compare.
The first three components of
3.14.0.3are 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.Core.Mac |
DatadogCore |
3.14.0.3 |
DatadogNet.RUM.Mac |
DatadogRUM |
3.14.0.3 |
DatadogNet.Logs.Mac |
DatadogLogs |
3.14.0.3 |
DatadogNet.Trace.Mac |
DatadogTrace |
3.14.0.3 |
DatadogNet.SessionReplay.Mac |
DatadogSessionReplay |
3.14.0.3 |
DatadogNet.WebViewTracking.Mac |
DatadogWebViewTracking |
3.14.0.3 |
DatadogNet.CrashReporting.Mac |
DatadogCrashReporting |
3.14.0.3 |
DatadogNet.Flags.Mac |
DatadogFlags |
3.14.0.3 |
DatadogNet.Profiling.Mac |
DatadogProfiling |
3.14.0.3 |
DatadogNet.Internal.Mac |
DatadogInternal |
3.14.0.3 |
DatadogNet.OpenTelemetryApi.Mac |
OpenTelemetryApi |
3.14.0.3 |
dotnet add package DatadogNet.Core.Mac --version 3.14.0.3
dotnet add package DatadogNet.RUM.Mac --version 3.14.0.3
Licensing
The binding code is MIT; the bundled native binaries are Apache-2.0, built from Datadog's sources, and
each package ships both texts under licenses/.
3.14.0.2
3.14.0.2
Binding-only release. The native SDK is unchanged — still
dd-sdk-ios 3.14.0, built from source
for Mac Catalyst — and so are the package ids, namespaces and API. The fourth component advances
for the changes below, which came out of a full ergonomics review of the four DatadogNet
repositories.
dSYMs are no longer thrown away
The build always produced dSYMs and then lost them with the temporary directory — and for
Catalyst binaries that Datadog does not publish, they are the only symbolication data that will
ever exist. They now land in libs/dsyms, ride the CI cache with the frameworks, and every
release from this one on carries a dsyms-<version>.zip attachment. Upload it to Datadog to
symbolicate crash reports from apps on these packages.
The fragile seams now fail loudly
- The pbxproj patches assert they applied. Building dd-sdk-ios for Catalyst requires patching
SUPPORTS_MACCATALYSTand the platform filters in an Xcode-generated project file. Each patch
now verifies it changed something (or found the already-patched state) and fails naming the
patch that missed — so an upstream project-file reformat breaks the patch step with a clear
message instead of the archive step with "unable to resolve module dependency". DatadogOtelVersionis checked, not trusted. The second manually-maintained pin must match
the OpenTelemetryApi version the checked-out dd-sdk-ios tag records in itsCartfile.resolved;
a bump that forgets it now fails the build instead of silently building the wrong OTEL.- The verbatim-copy invariant is enforced. The binding sources are copies of
DatadogNet.iOS's; the sync script now records the exact iOS commit it copied from
(build/ios-bindings-source.txt), and CI'sbinding-driftjob re-runs the sync against that
commit and fails on any difference — a direct edit here, or a forgotten re-sync, is a red
build rather than a latent iOS/Catalyst behaviour split.
Synced binding improvements
Re-synced from DatadogNet.iOS (see its 3.14.0.3 notes for the detail): doc summaries on the
main entry types reach IntelliSense here too, the DDLogger null-attributes behaviour is
documented as deliberate — a [NullAllowed] would trade a managed exception for a native crash —
and the trim/AOT analyzers are on with the surface analysing clean.
Smaller improvements
- nuget.org now shows these notes:
docs/release-notes/<version>.mdis packed into
PackageReleaseNotes, with the releases page as fallback. - CI fails when the README's versions drift from
Directory.Build.props. - The tooling copied from DatadogNet.iOS (
merge-packages.py, theselect-xcodeaction,
BuildNugets.sh) no longer carries that repository's comments verbatim: each file now says
what is true here and marks itself as a keep-in-sync copy.
net8 sunset
Stated policy, so the decision does not persist by inertia: the net8.0-maccatalyst18.0 head is
dropped in the first release after .NET 8 leaves support on 10 November 2026, in step with
DatadogNet.iOS.
Upgrading from 3.14.0.1
Nothing to change: same native SDK, same API.
Full changelog: v3.14.0.1...v3.14.0.2
Packages
Bound against dd-sdk-ios 3.14.0, built from source for Mac Catalyst, targeting net8.0-maccatalyst18.0, net9.0-maccatalyst18.0 and net10.0-maccatalyst26.0.
dsyms-3.14.0.2.zip below carries the dSYMs for these exact binaries - Datadog publishes
no Catalyst builds, so this release is the only place they exist. Upload them to Datadog for
crash symbolication.
The first three components of
3.14.0.2are 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.Core.Mac |
DatadogCore |
3.14.0.2 |
DatadogNet.RUM.Mac |
DatadogRUM |
3.14.0.2 |
DatadogNet.Logs.Mac |
DatadogLogs |
3.14.0.2 |
DatadogNet.Trace.Mac |
DatadogTrace |
3.14.0.2 |
DatadogNet.SessionReplay.Mac |
DatadogSessionReplay |
3.14.0.2 |
DatadogNet.WebViewTracking.Mac |
DatadogWebViewTracking |
3.14.0.2 |
DatadogNet.CrashReporting.Mac |
DatadogCrashReporting |
3.14.0.2 |
DatadogNet.Flags.Mac |
DatadogFlags |
3.14.0.2 |
DatadogNet.Profiling.Mac |
DatadogProfiling |
3.14.0.2 |
DatadogNet.Internal.Mac |
DatadogInternal |
3.14.0.2 |
DatadogNet.OpenTelemetryApi.Mac |
OpenTelemetryApi |
3.14.0.2 |
dotnet add package DatadogNet.Core.Mac --version 3.14.0.2
dotnet add package DatadogNet.RUM.Mac --version 3.14.0.2
Licensing
The binding code is MIT; the bundled native binaries are Apache-2.0, built from Datadog's sources, and
each package ships both texts under licenses/.
3.14.0.1
3.14.0.1
The first release of the DatadogNet Mac Catalyst bindings: eleven packages wrapping the native
frameworks of dd-sdk-ios 3.14.0,
built from source for platform=macOS,variant=Mac Catalyst and targeting
net8.0-maccatalyst18.0, net9.0-maccatalyst18.0 and net10.0-maccatalyst26.0.
Highlights
- Same API as DatadogNet.iOS 3.14.0.x. The binding definitions are verbatim copies of that
repository's, so#if IOScode - or the DatadogNet façade's iOS implementation - compiles
against these packages unchanged. Only the package ids differ (DatadogNet.<Module>.Mac). - Native frameworks built from source. Datadog publishes no Mac Catalyst binaries, so
build/BuildXcFrameworks.shcompiles the pinned dd-sdk-ios tag (and the OpenTelemetryApi
package it links) for Catalyst, patching two things upstream's project file gets wrong for this
platform:SUPPORTS_MACCATALYST = NOon every target, andplatformFiltersthat silently drop
theDatadogInternaldependency from Catalyst builds. - Honest platform claims.
SupportedOSPlatformVersionis 15.0 (macOS 12), matching both the
.NET 9 maccatalyst workload floor and Datadog's documented Catalyst support. Session Replay
ships for link-compatibility but records nothing on Catalyst, and the sample deliberately
leaves it out. - No
DatadogNet.Objc.Mac. That id exists on iOS purely as a 2.x compatibility meta-package;
there is no 2.x here to be compatible with.
Known limitations
- Datadog's Catalyst support is "partial": features work, but the platform is not first-class
tested upstream. Verify your telemetry end-to-end. DatadogFlagsandDatadogProfilingship the native frameworks but expose no Objective-C API
yet, mirroring the iOS packages.
Packages
Bound against dd-sdk-ios 3.14.0, built from source for Mac Catalyst, targeting net8.0-maccatalyst18.0, net9.0-maccatalyst18.0 and net10.0-maccatalyst26.0.
The first three components of
3.14.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.Core.Mac |
DatadogCore |
3.14.0.1 |
DatadogNet.RUM.Mac |
DatadogRUM |
3.14.0.1 |
DatadogNet.Logs.Mac |
DatadogLogs |
3.14.0.1 |
DatadogNet.Trace.Mac |
DatadogTrace |
3.14.0.1 |
DatadogNet.SessionReplay.Mac |
DatadogSessionReplay |
3.14.0.1 |
DatadogNet.WebViewTracking.Mac |
DatadogWebViewTracking |
3.14.0.1 |
DatadogNet.CrashReporting.Mac |
DatadogCrashReporting |
3.14.0.1 |
DatadogNet.Flags.Mac |
DatadogFlags |
3.14.0.1 |
DatadogNet.Profiling.Mac |
DatadogProfiling |
3.14.0.1 |
DatadogNet.Internal.Mac |
DatadogInternal |
3.14.0.1 |
DatadogNet.OpenTelemetryApi.Mac |
OpenTelemetryApi |
3.14.0.1 |
dotnet add package DatadogNet.Core.Mac --version 3.14.0.1
dotnet add package DatadogNet.RUM.Mac --version 3.14.0.1
Licensing
The binding code is MIT; the bundled native binaries are Apache-2.0, built from Datadog's sources, and
each package ships both texts under licenses/.