Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions Bugsnag/Client/BugsnagClient.m
Original file line number Diff line number Diff line change
Expand Up @@ -739,6 +739,18 @@ - (BugsnagCorrelation *)getCurrentCorrelation {
return [[BugsnagCorrelation alloc] initWithTraceId:traceId spanId:spanId];
}

- (BugsnagMetadata *)copyAppDeviceMetadata:(BugsnagMetadata *)metadata {
NSMutableDictionary *metadataInSection = [self.metadata getMetadataFromSection:@"app"];
if (metadataInSection != nil) {
[metadata addMetadata:metadataInSection toSection:@"app"];
}
metadataInSection = [self.metadata getMetadataFromSection:@"device"];
if (metadataInSection != nil) {
[metadata addMetadata:metadataInSection toSection:@"device"];
}
return metadata;
}

- (BugsnagMetadata *)metadataCapture:(BugsnagCaptureOptions *)capture
metadata:(BugsnagMetadata *)metadata {
if (capture == nil || capture.metadata == nil) {
Expand All @@ -755,6 +767,7 @@ - (BugsnagMetadata *)metadataCapture:(BugsnagCaptureOptions *)capture
return metadata;
}
if ([capture.metadata count] == 0) {
metadata = [self copyAppDeviceMetadata:metadata];
return metadata;
}

Expand All @@ -768,6 +781,7 @@ - (BugsnagMetadata *)metadataCapture:(BugsnagCaptureOptions *)capture
[metadata addMetadata:metadataInSection toSection:sectionKey];
}
}
metadata = [self copyAppDeviceMetadata:metadata];
return metadata;
}

Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
Changelog
=========

## TBD

### Enhancements

* Add error options to allow control over captured fields of handled events.
[#1879](https://github.com/bugsnag/bugsnag-cocoa/pull/1879)

## 6.34.1 (2025-10-09)

### Bug Fixes
Expand Down
1 change: 1 addition & 0 deletions Tests/BugsnagTests/BugsnagClientMirrorTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ - (void)setUp {
@"featureFlags @16@0:8",
@"groupingDiscriminator_ @16@0:8",
@"setGroupingDiscriminator_: v24@0:8@16",
@"copyAppDeviceMetadata: @24@0:8@16",
@"breadcrumbsCapture: @24@0:8@16",
@"metadataCapture:metadata: @32@0:8@16@24",
@"threadsCapture:callstack: @32@0:8@16@24",
Expand Down
4 changes: 4 additions & 0 deletions features/fixtures/ios/iOSTestApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
09F024FA2B9F3ACD007D9F73 /* Fixture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F024F92B9F3ACD007D9F73 /* Fixture.swift */; };
09F024FC2B9F3B16007D9F73 /* MazeRunnerCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F024FB2B9F3B16007D9F73 /* MazeRunnerCommand.swift */; };
09F025172BAD7B04007D9F73 /* DelayedNotifyErrorScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F025162BAD7B04007D9F73 /* DelayedNotifyErrorScenario.swift */; };
1C8CB8B52EBB994A007BF492 /* CaptureOptionsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C8CB8B42EBB9948007BF492 /* CaptureOptionsScenario.swift */; };
6526A0D4248A83350002E2C9 /* LoadConfigFromFileAutoScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6526A0D3248A83350002E2C9 /* LoadConfigFromFileAutoScenario.swift */; };
8A096DFC27C7E77600DB6ECC /* CxxBareThrowScenario.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A096DFB27C7E77600DB6ECC /* CxxBareThrowScenario.mm */; };
8A14F0F62282D4AE00337B05 /* (null) in Sources */ = {isa = PBXBuildFile; };
Expand Down Expand Up @@ -299,6 +300,7 @@
09F024F92B9F3ACD007D9F73 /* Fixture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fixture.swift; sourceTree = "<group>"; };
09F024FB2B9F3B16007D9F73 /* MazeRunnerCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MazeRunnerCommand.swift; sourceTree = "<group>"; };
09F025162BAD7B04007D9F73 /* DelayedNotifyErrorScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelayedNotifyErrorScenario.swift; sourceTree = "<group>"; };
1C8CB8B42EBB9948007BF492 /* CaptureOptionsScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureOptionsScenario.swift; sourceTree = "<group>"; };
6526A0D3248A83350002E2C9 /* LoadConfigFromFileAutoScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadConfigFromFileAutoScenario.swift; sourceTree = "<group>"; };
8A096DFB27C7E77600DB6ECC /* CxxBareThrowScenario.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CxxBareThrowScenario.mm; sourceTree = "<group>"; };
8A32DB8122424E3000EDD92F /* NSExceptionShiftScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSExceptionShiftScenario.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -498,6 +500,7 @@
F42953DE2BB41023C0B07F41 /* scenarios */ = {
isa = PBXGroup;
children = (
1C8CB8B42EBB9948007BF492 /* CaptureOptionsScenario.swift */,
010BAAF62833CE570003FF36 /* AbortOverrideScenario.m */,
F429534164257A2BE23ED72D /* AbortScenario.m */,
F4295A20DE438C2B28167714 /* AccessNonObjectScenario.m */,
Expand Down Expand Up @@ -837,6 +840,7 @@
A1117E5B2536036400014FDA /* OOMSessionScenario.swift in Sources */,
8AF8FCAE22BD23BA00A967CA /* HandledInternalNotifyScenario.swift in Sources */,
01F6B75B2832756300B75C5D /* OldHandledErrorScenario.swift in Sources */,
1C8CB8B52EBB994A007BF492 /* CaptureOptionsScenario.swift in Sources */,
CBE1C9252574F532004B8B5B /* OnErrorOverwriteUnhandledTrueScenario.swift in Sources */,
010BAB042833CE570003FF36 /* UserPersistencePersistUserClientScenario.m in Sources */,
8A42FD35225DEE04007AE561 /* SessionOOMScenario.m in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
09F024FA2B9F3ACD007D9F73 /* Fixture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F024F92B9F3ACD007D9F73 /* Fixture.swift */; };
09F024FC2B9F3B16007D9F73 /* MazeRunnerCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F024FB2B9F3B16007D9F73 /* MazeRunnerCommand.swift */; };
09F025172BAD7B04007D9F73 /* DelayedNotifyErrorScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F025162BAD7B04007D9F73 /* DelayedNotifyErrorScenario.swift */; };
1C8CB8B92EBE3CBE007BF492 /* CaptureOptionsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C8CB8B82EBE3CBE007BF492 /* CaptureOptionsScenario.swift */; };
6526A0D4248A83350002E2C9 /* LoadConfigFromFileAutoScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6526A0D3248A83350002E2C9 /* LoadConfigFromFileAutoScenario.swift */; };
8A096DFC27C7E77600DB6ECC /* CxxBareThrowScenario.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A096DFB27C7E77600DB6ECC /* CxxBareThrowScenario.mm */; };
8A14F0F62282D4AE00337B05 /* (null) in Sources */ = {isa = PBXBuildFile; };
Expand Down Expand Up @@ -314,6 +315,7 @@
09F024F92B9F3ACD007D9F73 /* Fixture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fixture.swift; sourceTree = "<group>"; };
09F024FB2B9F3B16007D9F73 /* MazeRunnerCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MazeRunnerCommand.swift; sourceTree = "<group>"; };
09F025162BAD7B04007D9F73 /* DelayedNotifyErrorScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelayedNotifyErrorScenario.swift; sourceTree = "<group>"; };
1C8CB8B82EBE3CBE007BF492 /* CaptureOptionsScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureOptionsScenario.swift; sourceTree = "<group>"; };
6526A0D3248A83350002E2C9 /* LoadConfigFromFileAutoScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadConfigFromFileAutoScenario.swift; sourceTree = "<group>"; };
8A096DFB27C7E77600DB6ECC /* CxxBareThrowScenario.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CxxBareThrowScenario.mm; sourceTree = "<group>"; };
8A32DB8122424E3000EDD92F /* NSExceptionShiftScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSExceptionShiftScenario.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -515,6 +517,7 @@
F42953DE2BB41023C0B07F41 /* scenarios */ = {
isa = PBXGroup;
children = (
1C8CB8B82EBE3CBE007BF492 /* CaptureOptionsScenario.swift */,
010BAAF62833CE570003FF36 /* AbortOverrideScenario.m */,
F429534164257A2BE23ED72D /* AbortScenario.m */,
F4295A20DE438C2B28167714 /* AccessNonObjectScenario.m */,
Expand Down Expand Up @@ -879,6 +882,7 @@
A1117E5B2536036400014FDA /* OOMSessionScenario.swift in Sources */,
8AF8FCAE22BD23BA00A967CA /* HandledInternalNotifyScenario.swift in Sources */,
01F6B75B2832756300B75C5D /* OldHandledErrorScenario.swift in Sources */,
1C8CB8B92EBE3CBE007BF492 /* CaptureOptionsScenario.swift in Sources */,
CBE1C9252574F532004B8B5B /* OnErrorOverwriteUnhandledTrueScenario.swift in Sources */,
010BAB042833CE570003FF36 /* UserPersistencePersistUserClientScenario.m in Sources */,
8A42FD35225DEE04007AE561 /* SessionOOMScenario.m in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@
09F0250F2BA301FD007D9F73 /* Fixture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F0250D2BA301FD007D9F73 /* Fixture.swift */; };
09F025112BA30225007D9F73 /* MazeRunnerCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F025102BA30225007D9F73 /* MazeRunnerCommand.swift */; };
09F025132BA30240007D9F73 /* CommandReaderThread.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F025122BA30240007D9F73 /* CommandReaderThread.swift */; };
1C8CB8B72EBE3C94007BF492 /* CaptureOptionsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C8CB8B62EBE3C94007BF492 /* CaptureOptionsScenario.swift */; };
8A096DFA27C7E6D800DB6ECC /* CxxBareThrowScenario.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8A096DF927C7E6D800DB6ECC /* CxxBareThrowScenario.mm */; };
967F6F1629B767CE0054EED8 /* InternalWorkingsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 967F6F1529B767CE0054EED8 /* InternalWorkingsScenario.swift */; };
96A25F362D66B55E00A18116 /* ObjCExceptionFeatureFlagsScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 96A25F352D66B55E00A18116 /* ObjCExceptionFeatureFlagsScenario.m */; };
Expand Down Expand Up @@ -414,6 +415,7 @@
09F0250D2BA301FD007D9F73 /* Fixture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fixture.swift; sourceTree = "<group>"; };
09F025102BA30225007D9F73 /* MazeRunnerCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MazeRunnerCommand.swift; sourceTree = "<group>"; };
09F025122BA30240007D9F73 /* CommandReaderThread.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandReaderThread.swift; sourceTree = "<group>"; };
1C8CB8B62EBE3C94007BF492 /* CaptureOptionsScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureOptionsScenario.swift; sourceTree = "<group>"; };
8A096DF927C7E6D800DB6ECC /* CxxBareThrowScenario.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CxxBareThrowScenario.mm; sourceTree = "<group>"; };
967F6F1529B767CE0054EED8 /* InternalWorkingsScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InternalWorkingsScenario.swift; sourceTree = "<group>"; };
96A25F352D66B55E00A18116 /* ObjCExceptionFeatureFlagsScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCExceptionFeatureFlagsScenario.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -441,6 +443,7 @@
01452234254AFCD600D436AA /* scenarios */ = {
isa = PBXGroup;
children = (
1C8CB8B62EBE3C94007BF492 /* CaptureOptionsScenario.swift */,
017D9CEC2833C81100B0AA87 /* AbortOverrideScenario.m */,
01F47C54254B1B2E00B184AD /* AbortScenario.m */,
01F47C5B254B1B2E00B184AD /* AccessNonObjectScenario.m */,
Expand Down Expand Up @@ -876,6 +879,7 @@
01F47D28254B1B3100B184AD /* ReadGarbagePointerScenario.m in Sources */,
01F47D2B254B1B3100B184AD /* AutoSessionUnhandledScenario.m in Sources */,
01F47D2E254B1B3100B184AD /* OOMLoadScenario.swift in Sources */,
1C8CB8B72EBE3C94007BF492 /* CaptureOptionsScenario.swift in Sources */,
01F6B74C2832381300B75C5D /* OldCrashReportScenario.swift in Sources */,
01F47CE5254B1B3100B184AD /* AccessNonObjectScenario.m in Sources */,
01F47D10254B1B3100B184AD /* AutoSessionWithUserScenario.m in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@
09F1E35B2CDCCAAF007F5933 /* Bugsnag.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 09F1E3572CDCCA8D007F5933 /* Bugsnag.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
09F1E35D2CDCCAB2007F5933 /* BugsnagNetworkRequestPlugin.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09F1E3562CDCCA8D007F5933 /* BugsnagNetworkRequestPlugin.xcframework */; };
09F1E35E2CDCCAB2007F5933 /* BugsnagNetworkRequestPlugin.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 09F1E3562CDCCA8D007F5933 /* BugsnagNetworkRequestPlugin.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
1C8CB8BD2EBE3CE0007BF492 /* CaptureOptionsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C8CB8BC2EBE3CE0007BF492 /* CaptureOptionsScenario.swift */; };
96A25F382D66B57E00A18116 /* ObjCExceptionFeatureFlagsScenario.m in Sources */ = {isa = PBXBuildFile; fileRef = 96A25F372D66B57E00A18116 /* ObjCExceptionFeatureFlagsScenario.m */; };
/* End PBXBuildFile section */

Expand Down Expand Up @@ -397,6 +398,7 @@
09F1E1C92CDCBD10007F5933 /* macOSTestAppXcFramework.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOSTestAppXcFramework.entitlements; sourceTree = "<group>"; };
09F1E3562CDCCA8D007F5933 /* BugsnagNetworkRequestPlugin.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BugsnagNetworkRequestPlugin.xcframework; path = ../../../../build/xcframeworks/products/BugsnagNetworkRequestPlugin.xcframework; sourceTree = "<group>"; };
09F1E3572CDCCA8D007F5933 /* Bugsnag.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Bugsnag.xcframework; path = ../../../../build/xcframeworks/products/Bugsnag.xcframework; sourceTree = "<group>"; };
1C8CB8BC2EBE3CE0007BF492 /* CaptureOptionsScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureOptionsScenario.swift; sourceTree = "<group>"; };
710618F62CF0BBCE00423249 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
96A25F372D66B57E00A18116 /* ObjCExceptionFeatureFlagsScenario.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjCExceptionFeatureFlagsScenario.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
Expand Down Expand Up @@ -443,6 +445,7 @@
09AABC0E2CDCED61007D6FC0 /* scenarios */ = {
isa = PBXGroup;
children = (
1C8CB8BC2EBE3CE0007BF492 /* CaptureOptionsScenario.swift */,
09AABB542CDCED61007D6FC0 /* AbortOverrideScenario.m */,
09AABB552CDCED61007D6FC0 /* AbortScenario.m */,
09AABB562CDCED61007D6FC0 /* AccessNonObjectScenario.m */,
Expand Down Expand Up @@ -816,6 +819,7 @@
09AABC3A2CDCED61007D6FC0 /* ConcurrentCrashesScenario.mm in Sources */,
09AABC2F2CDCED61007D6FC0 /* AutoSessionScenario.m in Sources */,
09AABC4B2CDCED61007D6FC0 /* DiscardClassesUnhandledCrashScenario.swift in Sources */,
1C8CB8BD2EBE3CE0007BF492 /* CaptureOptionsScenario.swift in Sources */,
09AABC402CDCED61007D6FC0 /* CxxExceptionScenario.mm in Sources */,
09AABCB42CDCED61007D6FC0 /* UnhandledErrorChangeInvalidReleaseStageScenario.swift in Sources */,
09AABC912CDCED61007D6FC0 /* OverwriteLinkRegisterScenario.m in Sources */,
Expand Down
65 changes: 65 additions & 0 deletions features/fixtures/shared/scenarios/CaptureOptionsScenario.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
//
// CaptureOptionsScenario.swift
// iOSTestApp
//
// Created by Daria Bialobrzeska on 04/11/2025.
// Copyright © 2025 Bugsnag. All rights reserved.
//

import Foundation

class CaptureOptionsScenario: Scenario {
var errorOptions: BugsnagErrorOptions?

override func configure() {
super.configure()
config.launchDurationMillis = 0
config.maxStringValueLength = 100
#if !os(watchOS)
config.sendThreads = .always
#endif
config.setUser("foobar", withEmail: "[email protected]", andName: "Foo Bar")
config.addMetadata(["msg": "My message"], section: "custom")
config.addMetadata(["msg2": "My message2"], section: "custom2")
config.addFeatureFlag(name: "Testing", variant: "e2e")
errorOptions = BugsnagErrorOptions()
}

override func run() {
Bugsnag.leaveBreadcrumb(withMessage: "CaptureOptionsScenario breadcrumb")
}

@objc func notify_manual() {
Bugsnag.notify(NSException(name: .rangeException,
reason: "Something is out of range"),
options:self.errorOptions)
}

@objc func disable_breadcrumb() {
self.errorOptions?.capture?.breadcrumbs = false
}

@objc func disable_feature_flags() {
self.errorOptions?.capture?.featureFlags = false
}

@objc func disable_stacktrace() {
self.errorOptions?.capture?.stacktrace = false
}

@objc func disable_threads() {
self.errorOptions?.capture?.threads = false
}

@objc func disable_user() {
self.errorOptions?.capture?.user = false
}

@objc func metadata_empty() {
self.errorOptions?.capture?.metadata = []
}

@objc func disable_specific_section_metadata2() {
self.errorOptions?.capture?.metadata = ["custom"]
}
}
Loading