Skip to content

Commit 4a01fe6

Browse files
committed
ref: Use Swift integrations
1 parent 5fcb6a1 commit 4a01fe6

File tree

12 files changed

+114
-106
lines changed

12 files changed

+114
-106
lines changed

Sentry.xcodeproj/project.pbxproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -650,8 +650,6 @@
650650
84B7FA4629B2935F00AD93B1 /* ClearTestState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD47B4C268F0B080076A663 /* ClearTestState.swift */; };
651651
84BA62272CAE2EEF0049F636 /* SentryUserFeedbackWidgetButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84BA62262CAE2EEF0049F636 /* SentryUserFeedbackWidgetButtonView.swift */; };
652652
84CFA4CA2C9DF884008DA5F4 /* SentryUserFeedbackWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CFA4C92C9DF884008DA5F4 /* SentryUserFeedbackWidget.swift */; };
653-
84CFA4CD2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.m in Sources */ = {isa = PBXBuildFile; fileRef = 84CFA4CC2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.m */; };
654-
84CFA4CE2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.h in Headers */ = {isa = PBXBuildFile; fileRef = 84CFA4CB2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.h */; };
655653
84DBC62C2CE82F12000C4904 /* SentryFeedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DBC62B2CE82F0E000C4904 /* SentryFeedback.swift */; };
656654
84DEE86B2B686BD400A7BC17 /* SentrySamplerDecision.h in Headers */ = {isa = PBXBuildFile; fileRef = 84DEE86A2B686BD400A7BC17 /* SentrySamplerDecision.h */; };
657655
84DEE8762B69AD6400A7BC17 /* SentryLaunchProfiling.h in Headers */ = {isa = PBXBuildFile; fileRef = 84DEE8752B69AD6400A7BC17 /* SentryLaunchProfiling.h */; };
@@ -1101,6 +1099,8 @@
11011099
FA8E58F12E0AD4270049F69D /* SentryDispatchQueueWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA8E58F02E0AD4220049F69D /* SentryDispatchQueueWrapper.swift */; };
11021100
FA90FAA82E06614E008CAAE8 /* SentryExtraPackages.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA90FAA72E06614B008CAAE8 /* SentryExtraPackages.swift */; };
11031101
FA90FAFD2E070A3B008CAAE8 /* SentryURLRequestFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA90FAFC2E070A3B008CAAE8 /* SentryURLRequestFactory.swift */; };
1102+
FA914E592ECF968500C54BDD /* UserFeedbackIntegration.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA914E532ECF968000C54BDD /* UserFeedbackIntegration.swift */; };
1103+
FA914E5B2ECF988900C54BDD /* Integrations.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA914E5A2ECF988700C54BDD /* Integrations.swift */; };
11041104
FA94E6912E6B92C100576666 /* SentryClientReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA94E68B2E6B92BE00576666 /* SentryClientReport.swift */; };
11051105
FA94E6B22E6D265800576666 /* SentryEnvelope.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA94E6B12E6D265500576666 /* SentryEnvelope.swift */; };
11061106
FA94E7242E6F339400576666 /* SentryEnvelopeItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA94E7232E6F32FA00576666 /* SentryEnvelopeItemType.swift */; };
@@ -2004,8 +2004,6 @@
20042004
84BA62262CAE2EEF0049F636 /* SentryUserFeedbackWidgetButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryUserFeedbackWidgetButtonView.swift; sourceTree = "<group>"; };
20052005
84C47B2B2A09239100DAEB8A /* .codecov.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .codecov.yml; sourceTree = "<group>"; };
20062006
84CFA4C92C9DF884008DA5F4 /* SentryUserFeedbackWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryUserFeedbackWidget.swift; sourceTree = "<group>"; };
2007-
84CFA4CB2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SentryUserFeedbackIntegration.h; path = ../../../Sentry/include/SentryUserFeedbackIntegration.h; sourceTree = "<group>"; };
2008-
84CFA4CC2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SentryUserFeedbackIntegration.m; path = ../../../Sentry/SentryUserFeedbackIntegration.m; sourceTree = "<group>"; };
20092007
84DBC62B2CE82F0E000C4904 /* SentryFeedback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryFeedback.swift; sourceTree = "<group>"; };
20102008
84DEE86A2B686BD400A7BC17 /* SentrySamplerDecision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SentrySamplerDecision.h; path = include/SentrySamplerDecision.h; sourceTree = "<group>"; };
20112009
84DEE8752B69AD6400A7BC17 /* SentryLaunchProfiling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SentryLaunchProfiling.h; path = Sources/Sentry/include/SentryLaunchProfiling.h; sourceTree = SOURCE_ROOT; };
@@ -2483,6 +2481,8 @@
24832481
FA8E58F02E0AD4220049F69D /* SentryDispatchQueueWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryDispatchQueueWrapper.swift; sourceTree = "<group>"; };
24842482
FA90FAA72E06614B008CAAE8 /* SentryExtraPackages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryExtraPackages.swift; sourceTree = "<group>"; };
24852483
FA90FAFC2E070A3B008CAAE8 /* SentryURLRequestFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryURLRequestFactory.swift; sourceTree = "<group>"; };
2484+
FA914E532ECF968000C54BDD /* UserFeedbackIntegration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFeedbackIntegration.swift; sourceTree = "<group>"; };
2485+
FA914E5A2ECF988700C54BDD /* Integrations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Integrations.swift; sourceTree = "<group>"; };
24862486
FA94E68B2E6B92BE00576666 /* SentryClientReport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryClientReport.swift; sourceTree = "<group>"; };
24872487
FA94E6B12E6D265500576666 /* SentryEnvelope.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryEnvelope.swift; sourceTree = "<group>"; };
24882488
FA94E7232E6F32FA00576666 /* SentryEnvelopeItemType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryEnvelopeItemType.swift; sourceTree = "<group>"; };
@@ -4100,8 +4100,7 @@
41004100
8482FA992DD7C397000E9283 /* SentryFeedbackAPI.h */,
41014101
8482FA9A2DD7C397000E9283 /* SentryFeedbackAPI.m */,
41024102
84DBC62B2CE82F0E000C4904 /* SentryFeedback.swift */,
4103-
84CFA4CB2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.h */,
4104-
84CFA4CC2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.m */,
4103+
FA914E532ECF968000C54BDD /* UserFeedbackIntegration.swift */,
41054104
84CFA4C92C9DF884008DA5F4 /* SentryUserFeedbackWidget.swift */,
41064105
84B0DFF32CD2CF64007FB332 /* SentryUserFeedbackFormController.swift */,
41074106
84A903702D39F66F00690CE4 /* SentryUserFeedbackFormViewModel.swift */,
@@ -4989,6 +4988,7 @@
49894988
FA67DCD02DDBD4EA00896B02 /* ANR */,
49904989
FA67DCD22DDBD4EA00896B02 /* FramesTracking */,
49914990
FA67DCD62DDBD4EA00896B02 /* Performance */,
4991+
FA914E5A2ECF988700C54BDD /* Integrations.swift */,
49924992
);
49934993
path = Integrations;
49944994
sourceTree = "<group>";
@@ -5097,7 +5097,6 @@
50975097
8E133FA625E72EB400ABD0BF /* SentrySamplingContext.h in Headers */,
50985098
0A9BF4E428A114B50068D266 /* SentryViewHierarchyIntegration.h in Headers */,
50995099
D8BBD32728FD9FC00011F850 /* SentrySwift.h in Headers */,
5100-
84CFA4CE2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.h in Headers */,
51015100
8482FA9B2DD7C397000E9283 /* SentryFeedbackAPI.h in Headers */,
51025101
8E4E7C7425DAAB49006AB9E2 /* SentrySpanProtocol.h in Headers */,
51035102
8EC4CF4A25C38DAA0093DEE9 /* SentrySpanStatus.h in Headers */,
@@ -5755,6 +5754,7 @@
57555754
628094742D39584C00B3F18B /* SentryUserCodable.swift in Sources */,
57565755
631E6D341EBC679C00712345 /* SentryQueueableRequestManager.m in Sources */,
57575756
7B8713B426415BAA006D6004 /* SentryAppStartTracker.m in Sources */,
5757+
FA914E5B2ECF988900C54BDD /* Integrations.swift in Sources */,
57585758
7BDB03BB2513652900BAE198 /* _SentryDispatchQueueWrapperInternal.m in Sources */,
57595759
FA6FC0A32E0B5ACE00ED2669 /* SentrySdkPackage.swift in Sources */,
57605760
F48F78692E61DE28009D4E7D /* SentryReachability.swift in Sources */,
@@ -5820,7 +5820,6 @@
58205820
848A451D2BBF9504006AAAEC /* SentryProfilerTestHelpers.m in Sources */,
58215821
7B63459F280EBA7200CFA05A /* SentryUIEventTracker.m in Sources */,
58225822
7BF9EF782722B35D00B5BBEF /* SentrySubClassFinder.m in Sources */,
5823-
84CFA4CD2C9E0CA3008DA5F4 /* SentryUserFeedbackIntegration.m in Sources */,
58245823
7BCFA71627D0BB50008C662C /* SentryANRTrackerV1.m in Sources */,
58255824
8459FCC02BD73EB20038E9C9 /* SentryProfilerSerialization.m in Sources */,
58265825
620078722D38F00D0022CB67 /* SentryGeoCodable.swift in Sources */,
@@ -5928,6 +5927,7 @@
59285927
6276350C2D59FACC00F7CEF6 /* SentryEventDecoder.swift in Sources */,
59295928
7B6C5EDC264E8DA80010D138 /* SentryFramesTrackingIntegration.m in Sources */,
59305929
F4FE9E082E6248E40014FED5 /* SentryCrashWrapper.swift in Sources */,
5930+
FA914E592ECF968500C54BDD /* UserFeedbackIntegration.swift in Sources */,
59315931
849B8F9A2C6E906900148E1F /* SentryUserFeedbackConfiguration.swift in Sources */,
59325932
63295AF71EF3C7DB002D4490 /* SentryNSDictionarySanitize.m in Sources */,
59335933
7B8ECBFC26498958005FE2EF /* SentryDefaultAppStateManager.m in Sources */,

Sources/Sentry/SentryFeedbackAPI.m

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,18 @@
1212
# import "SentryHub+Private.h"
1313
# import "SentryLogC.h"
1414
# import "SentrySDK+Private.h"
15-
# import "SentryUserFeedbackIntegration.h"
15+
# import "SentrySwift.h"
1616

1717
@implementation SentryFeedbackAPI
1818

1919
- (void)showWidget
2020
{
21-
SentryUserFeedbackIntegration *feedback = [[SentrySDKInternal currentHub]
22-
getInstalledIntegration:[SentryUserFeedbackIntegration class]];
23-
[feedback showWidget];
21+
[SentryUserFeedbackAccessor showWidget];
2422
}
2523

2624
- (void)hideWidget
2725
{
28-
SentryUserFeedbackIntegration *feedback = [SentrySDKInternal.currentHub
29-
getInstalledIntegration:[SentryUserFeedbackIntegration class]];
30-
[feedback hideWidget];
26+
[SentryUserFeedbackAccessor hideWidget];
3127
}
3228

3329
@end

Sources/Sentry/SentryHub.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -630,10 +630,10 @@ - (BOOL)isIntegrationInstalled:(Class)integrationClass
630630
}
631631
}
632632

633-
- (nullable id<SentryIntegrationProtocol>)getInstalledIntegration:(Class)integrationClass
633+
- (nullable id)getInstalledIntegration:(Class)integrationClass
634634
{
635635
@synchronized(_integrationsLock) {
636-
for (id<SentryIntegrationProtocol> item in _installedIntegrations) {
636+
for (id item in _installedIntegrations) {
637637
if ([item isKindOfClass:integrationClass]) {
638638
return item;
639639
}
@@ -651,7 +651,7 @@ - (BOOL)hasIntegration:(NSString *)integrationName
651651
}
652652
}
653653

654-
- (void)addInstalledIntegration:(id<SentryIntegrationProtocol>)integration name:(NSString *)name
654+
- (void)addInstalledIntegration:(id)integration name:(NSString *)name
655655
{
656656
@synchronized(_integrationsLock) {
657657
[_installedIntegrations addObject:integration];

Sources/Sentry/SentrySDKInternal.m

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,13 @@
2626
#import "SentrySwiftAsyncIntegration.h"
2727
#import "SentryTransactionContext.h"
2828
#import "SentryUseNSExceptionCallstackWrapper.h"
29-
#import "SentryUserFeedbackIntegration.h"
3029

3130
#if SENTRY_HAS_UIKIT
3231
# import "SentryAppStartTrackingIntegration.h"
3332
# import "SentryFramesTrackingIntegration.h"
3433
# import "SentryPerformanceTrackingIntegration.h"
3534
# import "SentryScreenshotIntegration.h"
3635
# import "SentryUIEventTrackingIntegration.h"
37-
# import "SentryUserFeedbackIntegration.h"
3836
# import "SentryViewHierarchyIntegration.h"
3937
# import "SentryWatchdogTerminationTrackingIntegration.h"
4038
#endif // SENTRY_HAS_UIKIT
@@ -541,10 +539,6 @@ + (void)endSession
541539
[SentryFileIOTrackingIntegration class], [SentryNetworkTrackingIntegration class],
542540
[SentrySwiftAsyncIntegration class], nil];
543541

544-
#if TARGET_OS_IOS && SENTRY_HAS_UIKIT
545-
[defaultIntegrations addObject:[SentryUserFeedbackIntegration class]];
546-
#endif // TARGET_OS_IOS && SENTRY_HAS_UIKIT
547-
548542
#if SENTRY_HAS_METRIC_KIT
549543
[defaultIntegrations addObject:[SentryMetricKitIntegration class]];
550544
#endif // SENTRY_HAS_METRIC_KIT
@@ -582,6 +576,7 @@ + (void)installIntegrations
582576
name:NSStringFromClass(integrationClass)];
583577
}
584578
}
579+
[SentryIntegrationInstaller installWith:options];
585580
}
586581

587582
+ (void)reportFullyDisplayed

Sources/Sentry/SentryUserFeedbackIntegration.m

Lines changed: 0 additions & 52 deletions
This file was deleted.

Sources/Sentry/include/SentryHub+Private.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
2727

2828
@property (nullable, nonatomic, strong) SentrySession *session;
2929

30-
@property (nonatomic, strong) NSMutableArray<id<SentryIntegrationProtocol>> *installedIntegrations;
30+
@property (nonatomic, strong) NSMutableArray<id> *installedIntegrations;
3131

3232
@property (nonatomic, readonly, strong) NSObject *_swiftLogger;
3333

@@ -37,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
3737
*/
3838
- (NSArray<NSString *> *)trimmedInstalledIntegrationNames;
3939

40-
- (void)addInstalledIntegration:(id<SentryIntegrationProtocol>)integration name:(NSString *)name;
40+
- (void)addInstalledIntegration:(id)integration name:(NSString *)name;
4141
- (void)removeAllIntegrations;
4242

4343
- (SentryClientInternal *_Nullable)client;
@@ -84,7 +84,7 @@ NS_ASSUME_NONNULL_BEGIN
8484

8585
- (void)registerSessionListener:(id<SentrySessionListener>)listener;
8686
- (void)unregisterSessionListener:(id<SentrySessionListener>)listener;
87-
- (nullable id<SentryIntegrationProtocol>)getInstalledIntegration:(Class)integrationClass;
87+
- (nullable id)getInstalledIntegration:(Class)integrationClass;
8888
- (NSSet<NSString *> *)installedIntegrationNames;
8989

9090
#if SENTRY_TARGET_REPLAY_SUPPORTED

Sources/Sentry/include/SentryUserFeedbackIntegration.h

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
@_implementationOnly import _SentryPrivate
2+
3+
protocol Integration: AnyObject {
4+
associatedtype Dependencies
5+
6+
@MainActor func start(with options: Options, dependencies: Dependencies) -> Bool
7+
}
8+
9+
// Type erases the Dependencies to be SentryDependencyContainer
10+
private struct AnyIntegration {
11+
let start: (Options, SentryDependencyContainer) -> Bool
12+
let integration: any Integration
13+
let name: String
14+
15+
@MainActor init<I: Integration>(_ integration: I) where I.Dependencies == SentryDependencyContainer {
16+
name = NSStringFromClass(I.self)
17+
self.integration = integration
18+
start = {
19+
integration.start(with: $0, dependencies: $1)
20+
}
21+
}
22+
func start(with options: Options, dependencies: SentryDependencyContainer) -> Bool {
23+
start(options, dependencies)
24+
}
25+
}
26+
27+
@_spi(Private) @objc public final class SentryIntegrationInstaller: NSObject {
28+
@objc @MainActor public class func install(with options: Options) {
29+
let dependencies = SentryDependencyContainer.sharedInstance()
30+
var integrations: [AnyIntegration] = []
31+
#if !SENTRY_NO_UIKIT
32+
#if os(iOS)
33+
integrations.append(.init(UserFeedbackIntegration<SentryDependencyContainer>()))
34+
#endif
35+
#endif
36+
integrations.forEach { anyIntegration in
37+
guard anyIntegration.start(with: options, dependencies: dependencies) else { return }
38+
39+
SentrySDKInternal.currentHub().addInstalledIntegration(anyIntegration.integration, name: anyIntegration.name)
40+
}
41+
}
42+
}

Sources/Swift/Integrations/UserFeedback/SentryUserFeedbackIntegrationDriver.swift

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,6 @@ import Foundation
33
@_implementationOnly import _SentryPrivate
44
import UIKit
55

6-
@objc
7-
@_spi(Private) public protocol SentryUserFeedbackIntegrationDriverDelegate: NSObjectProtocol {
8-
func capture(feedback: SentryFeedback)
9-
}
10-
116
/**
127
* An integration managing a workflow for end users to report feedback via Sentry.
138
* - note: The default method to show the feedback form is via a floating widget placed in the bottom trailing corner of the screen. See the configuration classes for alternative options.
@@ -17,13 +12,13 @@ import UIKit
1712
@_spi(Private) public class SentryUserFeedbackIntegrationDriver: NSObject {
1813
let configuration: SentryUserFeedbackConfiguration
1914
private var widget: SentryUserFeedbackWidget?
20-
weak var delegate: (any SentryUserFeedbackIntegrationDriverDelegate)?
15+
let callback: (SentryFeedback) -> Void
2116
let screenshotSource: SentryScreenshotSource
2217
weak var customButton: UIButton?
2318

24-
@_spi(Private) public init(configuration: SentryUserFeedbackConfiguration, delegate: any SentryUserFeedbackIntegrationDriverDelegate, screenshotSource: SentryScreenshotSource) {
19+
@_spi(Private) public init(configuration: SentryUserFeedbackConfiguration, screenshotSource: SentryScreenshotSource, callback: @escaping (SentryFeedback) -> Void) {
2520
self.configuration = configuration
26-
self.delegate = delegate
21+
self.callback = callback
2722
self.screenshotSource = screenshotSource
2823
super.init()
2924

@@ -88,7 +83,7 @@ import UIKit
8883
extension SentryUserFeedbackIntegrationDriver: SentryUserFeedbackFormDelegate {
8984
func finished(with feedback: SentryFeedback?) {
9085
if let feedback = feedback {
91-
delegate?.capture(feedback: feedback)
86+
callback(feedback)
9287
}
9388
presenter?.dismiss(animated: configuration.animations) {
9489
self.configuration.onFormClose?()
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
@_implementationOnly import _SentryPrivate
2+
3+
#if os(iOS) && !SENTRY_NO_UIKIT
4+
5+
protocol ScreenshotSourceProvider {
6+
var screenshotSource: SentryScreenshotSource? { get }
7+
}
8+
9+
final class UserFeedbackIntegration<Dependencies: ScreenshotSourceProvider>: Integration {
10+
11+
fileprivate var driver: SentryUserFeedbackIntegrationDriver?
12+
13+
@MainActor func start(with options: Options, dependencies: Dependencies) -> Bool {
14+
guard let configuration = options.userFeedbackConfiguration else {
15+
return false
16+
}
17+
18+
// The screenshot source is coupled to the options, but due to the dependency container being
19+
// tightly to the options anyways, it was decided to not pass it to the container.
20+
guard let screenshotSource
21+
= dependencies.screenshotSource else {
22+
return false
23+
}
24+
25+
driver = SentryUserFeedbackIntegrationDriver(configuration: configuration, screenshotSource: screenshotSource) { feedback in
26+
SentrySDK.capture(feedback: feedback)
27+
}
28+
return true
29+
}
30+
}
31+
32+
@_spi(Private) @objc public final class SentryUserFeedbackAccessor: NSObject {
33+
34+
@objc public class func showWidget() {
35+
let feedback = SentrySDKInternal.currentHub().getInstalledIntegration(UserFeedbackIntegration<SentryDependencyContainer>.self) as? UserFeedbackIntegration<SentryDependencyContainer>
36+
feedback?.driver?.showWidget()
37+
}
38+
39+
@objc public class func hideWidget() {
40+
let feedback = SentrySDKInternal.currentHub().getInstalledIntegration(UserFeedbackIntegration<SentryDependencyContainer>.self) as? UserFeedbackIntegration<SentryDependencyContainer>
41+
feedback?.driver?.hideWidget()
42+
}
43+
}
44+
45+
#endif

0 commit comments

Comments
 (0)