Skip to content

Commit 1c63fca

Browse files
committed
update
1 parent 7d24517 commit 1c63fca

13 files changed

Lines changed: 85 additions & 326 deletions

Examples/AmplitudeSwiftUIExample/AmplitudeSwiftUIExample/AmplitudeSwiftUIExampleApp.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ extension Amplitude {
9393
networkTrackingOptions: .init(
9494
captureRules: [
9595
// .init(hosts: ["*"]), // all hosts, 500-599
96-
.init(urls: [.regex("https://httpbin\\.org/")], statusCodeRange: "0,400-599", requestBody: .init(allowList: ["**"])),
96+
.init(urls: [.regex("https://httpbin\\.org/")], statusCodeRange: "0,400-599", requestBody: .init(allowlist: ["**"])),
9797
],
9898
ignoreHosts: ["notmyapi.com"],
9999
ignoreAmplitudeRequests: true

Examples/AmplitudeSwiftUIExample/AmplitudeSwiftUIExample/ContentView.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Created by Hao Yu on 11/30/22.
66
//
77

8+
@_spi(Internal)
89
import AmplitudeSwift
910
import AppTrackingTransparency
1011
import CoreData
@@ -165,8 +166,13 @@ struct ContentView: View {
165166
Toggle("Rage Click", isOn: $rageClickTest)
166167
}
167168
}
168-
Section(header: Text("Crash Detection")) {
169+
Section(header: Text("Diagnostics")) {
169170
HStack(spacing: 20) {
171+
Button("Flush") {
172+
Task {
173+
await Amplitude.testInstance.amplitudeContext.diagnosticsClient.flush()
174+
}
175+
}.buttonStyle(AmplitudeButton())
170176
Button("Crash!!") {
171177
print("Crash tapped - this can trigger a crash")
172178
let x = [1,2,3]

Sources/Amplitude/Amplitude.swift

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ public class Amplitude {
119119

120120
let trackingQueue = DispatchQueue(label: "com.amplitude.analytics")
121121

122-
private var diagnosticsObserverTask: Task<Void, Never>?
123-
private var diagnosticsObserverId: UUID?
122+
private var enabledAutocapture: AutocaptureOptions = .init(rawValue: 0)
123+
private var needsSetAutocaptureDiagnostics: Bool = false
124124

125125
public init(
126126
configuration: Configuration
@@ -142,6 +142,7 @@ public class Amplitude {
142142
instanceName: configuration.getNormalizeInstanceName(),
143143
serverZone: serverZone,
144144
logger: configuration.loggerProvider,
145+
remoteConfigClient: configuration.remoteConfigClient,
145146
diagnosticsClient: configuration.diagnosticsClient)
146147

147148
let contextPlugin = ContextPlugin()
@@ -184,7 +185,10 @@ public class Amplitude {
184185
}
185186
trackingQueue.resume()
186187

187-
setupDiagnosticsObserver()
188+
amplitudeContext.diagnosticsClient.setTag(name: "sdk.\(Constants.SDK_LIBRARY).version", value: Constants.SDK_VERSION)
189+
190+
enabledAutocapture = configuration.autocapture
191+
updateDiagnosticsAutocaptureTags()
188192
}
189193

190194
convenience init(apiKey: String, configuration: Configuration) {
@@ -616,10 +620,6 @@ public class Amplitude {
616620
}
617621
logger?.debug(message: "Completed trimming events, kept \(eventCount) most recent events")
618622
}
619-
620-
deinit {
621-
diagnosticsObserverTask?.cancel()
622-
}
623623
}
624624

625625
extension Amplitude: PluginHost {
@@ -655,45 +655,26 @@ extension Amplitude: AnalyticsClient {
655655
}
656656
}
657657

658-
// MARK: - Diagnostics
659-
660658
extension Amplitude {
661659

662-
private func setupDiagnosticsObserver() {
663-
diagnosticsObserverTask = Task { [weak self] in
664-
guard let self else { return }
665-
666-
let (stream, observerId) = await self.amplitudeContext.diagnosticsClient.observeIsRunning()
667-
self.diagnosticsObserverId = observerId
668-
669-
for await isRunning in stream {
670-
guard isRunning else { continue }
671-
await self.setupDiagnostics()
672-
await self.cleanupDiagnosticsObserver()
673-
break
660+
func updateEnabledAutocapture(_ options: AutocaptureOptions, enabled: Bool) {
661+
trackingQueue.async {
662+
if enabled {
663+
self.enabledAutocapture.formUnion(options)
664+
} else {
665+
self.enabledAutocapture.subtract(options)
674666
}
675-
}
676-
}
667+
self.needsSetAutocaptureDiagnostics = true
677668

678-
private func cleanupDiagnosticsObserver() async {
679-
if let observerId = diagnosticsObserverId {
680-
await self.amplitudeContext.diagnosticsClient.stopObservingIsRunning(observerId)
681-
diagnosticsObserverId = nil
669+
self.trackingQueue.async { [weak self] in
670+
guard let self, needsSetAutocaptureDiagnostics else { return }
671+
needsSetAutocaptureDiagnostics = false
672+
updateDiagnosticsAutocaptureTags()
673+
}
682674
}
683-
diagnosticsObserverTask?.cancel()
684-
diagnosticsObserverTask = nil
685675
}
686676

687-
private func setupDiagnostics() async {
688-
await amplitudeContext.diagnosticsClient.setTag(name: "sdk.\(Constants.SDK_LIBRARY).version", value: Constants.SDK_VERSION)
689-
690-
CrashCatcher.register()
691-
692-
if let crash = CrashCatcher.checkForPreviousCrash() {
693-
CrashCatcher.clearCrashReport()
694-
await amplitudeContext.diagnosticsClient.increment(name: "analytics.crash")
695-
let eventProperties = ["report": crash]
696-
await amplitudeContext.diagnosticsClient.recordEvent(name: "analytics.crash", properties: eventProperties)
697-
}
677+
func updateDiagnosticsAutocaptureTags() {
678+
amplitudeContext.diagnosticsClient.setTag(name: "autocapture.enabled", value: enabledAutocapture.stringRepresentation())
698679
}
699680
}

Sources/Amplitude/AutocaptureOptions.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,32 @@ public struct AutocaptureOptions: OptionSet {
2525
.frustrationInteractions,
2626
]
2727
}
28+
29+
extension AutocaptureOptions {
30+
func stringRepresentation() -> String {
31+
guard rawValue != 0 else { return "none" }
32+
33+
var options: [String] = []
34+
35+
if contains(.sessions) {
36+
options.append("sessions")
37+
}
38+
if contains(.appLifecycles) {
39+
options.append("appLifecycles")
40+
}
41+
if contains(.screenViews) {
42+
options.append("screenViews")
43+
}
44+
if contains(.elementInteractions) {
45+
options.append("elementInteractions")
46+
}
47+
if contains(.networkTracking) {
48+
options.append("networkTracking")
49+
}
50+
if contains(.frustrationInteractions) {
51+
options.append("frustrationInteractions")
52+
}
53+
54+
return options.joined(separator: ",")
55+
}
56+
}

Sources/Amplitude/Configuration.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public class Configuration {
8282
public var interactionsOptions: InteractionsOptions
8383
public var enableDiagnostics: Bool
8484

85+
let remoteConfigClient: RemoteConfigClient
8586
let diagnosticsClient: CoreDiagnostics
8687

8788
@available(*, deprecated, message: "Please use the `autocapture` parameter instead.")
@@ -191,11 +192,16 @@ public class Configuration {
191192
self.loggerProvider = loggerProvider
192193
self.serverZone = serverZone
193194
self.enableDiagnostics = enableDiagnostics
195+
self.remoteConfigClient = RemoteConfigClient(apiKey: self.apiKey,
196+
serverZone: self.serverZone,
197+
instanceName: self.instanceName,
198+
logger: self.loggerProvider)
194199
self.diagnosticsClient = DiagnosticsClient(apiKey: self.apiKey,
195200
serverZone: self.serverZone,
196201
instanceName: self.instanceName,
197202
logger: self.loggerProvider,
198-
enabled: self.enableDiagnostics)
203+
enabled: self.enableDiagnostics,
204+
remoteConfigClient: self.remoteConfigClient)
199205
self.storageProvider = storageProvider
200206
?? PersistentStorage(storagePrefix: PersistentStorage.getEventStoragePrefix(apiKey, normalizedInstanceName), logger: self.loggerProvider, diagonostics: self.diagonostics, diagnosticsClient: self.diagnosticsClient)
201207
self.identifyStorageProvider = identifyStorageProvider

Sources/Amplitude/Plugins/NetworkTrackingPlugin.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ class NetworkTrackingPlugin: UtilityPlugin, NetworkTaskListener {
270270
// Update from remote config
271271
if let enabled = options["enabled"] as? Bool {
272272
optOut = !enabled
273+
amplitude?.updateEnabledAutocapture(.networkTracking, enabled: enabled)
273274
}
274275
if let ignoreHosts = options["ignoreHosts"] as? [String] {
275276
updatedOptions.ignoreHosts = ignoreHosts

Sources/Amplitude/Plugins/iOS/IOSLifecycleMonitor.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class IOSLifecycleMonitor: UtilityPlugin {
7676
remoteConfigSubscription = amplitude
7777
.amplitudeContext
7878
.remoteConfigClient
79-
.subscribe(key: Constants.RemoteConfig.Key.autocapture) { [weak self] config, _, _ in
79+
.subscribe(key: Constants.RemoteConfig.Key.autocapture) { [weak self, weak amplitude] config, _, _ in
8080
guard let self, let config else {
8181
return
8282
}
@@ -85,15 +85,18 @@ class IOSLifecycleMonitor: UtilityPlugin {
8585

8686
if let pageViews = config["pageViews"] as? Bool {
8787
newState.screenViews = pageViews
88+
amplitude?.updateEnabledAutocapture(.screenViews, enabled: pageViews)
8889
}
8990

9091
if let interactions = config["elementInteractions"] as? Bool {
9192
newState.elementInteractions = interactions
93+
amplitude?.updateEnabledAutocapture(.elementInteractions, enabled: interactions)
9294
}
9395

9496
if let frustrationInteractions = config["frustrationInteractions"] as? [String: Any] {
9597
if let enabled = frustrationInteractions["enabled"] as? Bool {
9698
newState.frustrationInteractions = enabled
99+
amplitude?.updateEnabledAutocapture(.frustrationInteractions, enabled: enabled)
97100
}
98101

99102
if let rageClick = frustrationInteractions["rageClick"] as? [String: Any],
@@ -109,6 +112,7 @@ class IOSLifecycleMonitor: UtilityPlugin {
109112

110113
if let appLifecycles = config["appLifecycles"] as? Bool {
111114
newState.appLifecycles = appLifecycles
115+
amplitude?.updateEnabledAutocapture(.appLifecycles, enabled: appLifecycles)
112116
}
113117

114118
trackingState = newState

Sources/Amplitude/Sessions.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,10 @@ public class Sessions {
7171
if configuration.enableAutoCaptureRemoteConfig {
7272
remoteConfigSubscription = context
7373
.remoteConfigClient
74-
.subscribe(key: Constants.RemoteConfig.Key.autocapture) { [weak self] config, _, _ in
74+
.subscribe(key: Constants.RemoteConfig.Key.autocapture) { [weak self, weak amplitude] config, _, _ in
7575
if let self, let sessions = config?["sessions"] as? Bool {
7676
trackSessionEvents = sessions
77+
amplitude?.updateEnabledAutocapture(.sessions, enabled: sessions)
7778
}
7879
}
7980
}

Sources/Amplitude/Utilities/CrashCapture.swift

Whitespace-only changes.

0 commit comments

Comments
 (0)