Skip to content

Commit 1e4402d

Browse files
committed
feat: Allow for more granular tracked lifecycle events to track
1 parent 7d47f4b commit 1e4402d

File tree

13 files changed

+147
-105
lines changed

13 files changed

+147
-105
lines changed

Examples/apps/BasicExample/BasicExample/AppDelegate.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
1717
// Override point for customization after application launch.
1818

1919
let configuration = Configuration(writeKey: "WRITE KEY")
20-
.trackApplicationLifecycleEvents(true)
20+
.setTrackedApplicationLifecycleEvents(.all)
2121
.flushInterval(10)
2222
.flushAt(2)
2323

Examples/apps/DestinationsExample/DestinationsExample/AppDelegate.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
2323
// Override point for customization after application launch.
2424

2525
let configuration = Configuration(writeKey: "EioRQCqLHUECnoSseEguI8GnxOlZTOyX")
26-
.trackApplicationLifecycleEvents(true)
26+
.setTrackedApplicationLifecycleEvents(.all)
2727
.flushInterval(1)
2828

2929
analytics = Analytics(configuration: configuration)

Examples/apps/MacExample/MacExample/AppDelegate.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
1818
// Insert code here to initialize your application
1919

2020
let configuration = Configuration(writeKey: "<WRITE KEY>")
21-
.trackApplicationLifecycleEvents(true)
21+
.setTrackedApplicationLifecycleEvents(.all)
2222
.flushInterval(10)
2323
.flushAt(1)
2424
.errorHandler { error in

Examples/apps/ObjCExample/ObjCExample/AppDelegate.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ @implementation AppDelegate
2121
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
2222
// Override point for customization after application launch.
2323
SEGConfiguration *config = [[SEGConfiguration alloc] initWithWriteKey:@"<WRITE KEY>"];
24-
config.trackApplicationLifecycleEvents = YES;
24+
config.trackApplicationLifecycleEvents = SEGTrackedLifecycleEvent.all;
2525
config.flushAt = 1;
2626

2727
_analytics = [[SEGAnalytics alloc] initWithConfiguration: config];

Examples/apps/SegmentExtensionsExample/ArticleWidget/ArticleWidget.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,5 @@ extension Analytics {
101101
static var main = Analytics(configuration:
102102
Configuration(writeKey: "ABCD")
103103
.flushAt(3)
104-
.trackApplicationLifecycleEvents(true))
104+
.setTrackedApplicationLifecycleEvents(.all))
105105
}

Examples/apps/SegmentSwiftUIExample/SegmentSwiftUIExample/SegmentSwiftUIExampleApp.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@ extension Analytics {
2121
static var main = Analytics(configuration:
2222
Configuration(writeKey: "ABCD")
2323
.flushAt(3)
24-
.trackApplicationLifecycleEvents(true))
24+
.setTrackedApplicationLifecycleEvents(.all))
2525
}

Examples/apps/watchOSExample/watchOSExample WatchKit Extension/ExtensionDelegate.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class ExtensionDelegate: NSObject, WKExtensionDelegate {
1414
func applicationDidFinishLaunching() {
1515
// Perform any final initialization of your application.
1616
let configuration = Configuration(writeKey: "WRITE KEY")
17-
.trackApplicationLifecycleEvents(true)
17+
.setTrackedApplicationLifecycleEvents(.all)
1818
.flushInterval(10)
1919

2020
analytics = Analytics(configuration: configuration)

Examples/tasks/MultiInstance.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ import Segment
3838
extension Analytics {
3939
static var main = Analytics(configuration: Configuration(writeKey: "1234")
4040
.flushAt(3)
41-
.trackApplicationLifecycleEvents(true))
42-
41+
.setTrackedApplicationLifecycleEvents(.all))
42+
4343
static var support = Analytics(configuration: Configuration(writeKey: "5678")
4444
.flushAt(10)
45-
.trackApplicationLifecycleEvents(false))
45+
.setTrackedApplicationLifecycleEvents(.none))
4646
}

Sources/Segment/Configuration.swift

+55-2
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,53 @@ public enum StorageMode {
4747

4848
// MARK: - Internal Configuration
4949

50+
@objc(SEGTrackedLifecycleEvent)
51+
public final class TrackedLifecycleEvent: NSObject, OptionSet {
52+
public let rawValue: Int
53+
54+
public init(rawValue: Int) {
55+
self.rawValue = rawValue
56+
}
57+
58+
@objc public static let none = TrackedLifecycleEvent()
59+
@objc public static let applicationInstalled = TrackedLifecycleEvent(rawValue: 0b00000001)
60+
@objc public static let applicationUpdated = TrackedLifecycleEvent(rawValue: 0b00000010)
61+
@objc public static let applicationOpened = TrackedLifecycleEvent(rawValue: 0b00000100)
62+
@objc public static let applicationBackgrounded = TrackedLifecycleEvent(rawValue: 0b00001000)
63+
@objc public static let applicationForegrounded = TrackedLifecycleEvent(rawValue: 0b00010000)
64+
#if os(macOS)
65+
@objc public static let applicationUnhidden = TrackedLifecycleEvent(rawValue: 0b00100000)
66+
@objc public static let applicationHidden = TrackedLifecycleEvent(rawValue: 0b01000000)
67+
@objc public static let applicationTerminated = TrackedLifecycleEvent(rawValue: 0b10000000)
68+
69+
@objc public static let all = TrackedLifecycleEvent([
70+
applicationInstalled,
71+
applicationUpdated,
72+
applicationOpened,
73+
applicationBackgrounded,
74+
applicationForegrounded,
75+
applicationUnhidden,
76+
applicationHidden,
77+
applicationTerminated,
78+
])
79+
#elseif os(iOS) || os(tvOS) || os(visionOS) || targetEnvironment(macCatalyst)
80+
@objc public static let all = TrackedLifecycleEvent([
81+
applicationInstalled,
82+
applicationUpdated,
83+
applicationOpened,
84+
applicationBackgrounded,
85+
applicationForegrounded,
86+
])
87+
#else
88+
@objc public static let all = TrackedLifecycleEvent.none
89+
#endif
90+
}
91+
5092
public class Configuration {
5193
internal struct Values {
5294
var writeKey: String
5395
var application: Any? = nil
54-
var trackApplicationLifecycleEvents: Bool = true
96+
var trackedApplicationLifecycleEvents = TrackedLifecycleEvent.all
5597
var flushAt: Int = 20
5698
var flushInterval: TimeInterval = 30
5799
var defaultSettings: Settings? = nil
@@ -110,8 +152,19 @@ public extension Configuration {
110152
/// - Parameter enabled: A bool value
111153
/// - Returns: The current Configuration.
112154
@discardableResult
155+
@available(*, deprecated, message: "Use `setTrackedApplicationLifecycleEvents(_:)` for more granular control")
113156
func trackApplicationLifecycleEvents(_ enabled: Bool) -> Configuration {
114-
values.trackApplicationLifecycleEvents = enabled
157+
values.trackedApplicationLifecycleEvents = enabled ? .all : .none
158+
return self
159+
}
160+
161+
/// Opt-in/out of tracking lifecycle events. The default value is `.none`.
162+
///
163+
/// - Parameter events: An option set of the events to track.
164+
/// - Returns: The current Configuration.
165+
@discardableResult
166+
func setTrackedApplicationLifecycleEvents(_ events: TrackedLifecycleEvent) -> Configuration {
167+
values.trackedApplicationLifecycleEvents = events
115168
return self
116169
}
117170

Sources/Segment/ObjC/ObjCConfiguration.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ public class ObjCConfiguration: NSObject {
2929

3030
/// Opt-in/out of tracking lifecycle events. The default value is `false`.
3131
@objc
32-
public var trackApplicationLifecycleEvents: Bool {
32+
public var trackApplicationLifecycleEvents: TrackedLifecycleEvent {
3333
get {
34-
return configuration.values.trackApplicationLifecycleEvents
34+
return configuration.values.trackedApplicationLifecycleEvents
3535
}
3636
set(value) {
37-
configuration.trackApplicationLifecycleEvents(value)
37+
configuration.setTrackedApplicationLifecycleEvents(value)
3838
}
3939
}
4040

Sources/Segment/Plugins/Platforms/Mac/macOSLifecycleEvents.swift

+36-43
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ class macOSLifecycleEvents: PlatformPlugin, macOSLifecycle {
2828
// Make sure we aren't double calling application:didFinishLaunchingWithOptions
2929
// by resetting the check at the start
3030
_didFinishLaunching.set(true)
31-
32-
if analytics?.configuration.values.trackApplicationLifecycleEvents == false {
33-
return
34-
}
3531

3632
let previousVersion = UserDefaults.standard.string(forKey: Self.versionKey)
3733
let previousBuild = UserDefaults.standard.string(forKey: Self.buildKey)
@@ -40,64 +36,63 @@ class macOSLifecycleEvents: PlatformPlugin, macOSLifecycle {
4036
let currentBuild = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
4137

4238
if previousBuild == nil {
43-
analytics?.track(name: "Application Installed", properties: [
44-
"version": currentVersion ?? "",
45-
"build": currentBuild ?? ""
46-
])
39+
if analytics?.configuration.values.trackedApplicationLifecycleEvents.contains(.applicationInstalled) == true {
40+
analytics?.track(name: "Application Installed", properties: [
41+
"version": currentVersion ?? "",
42+
"build": currentBuild ?? ""
43+
])
44+
}
4745
} else if currentBuild != previousBuild {
48-
analytics?.track(name: "Application Updated", properties: [
49-
"previous_version": previousVersion ?? "",
50-
"previous_build": previousBuild ?? "",
46+
if analytics?.configuration.values.trackedApplicationLifecycleEvents.contains(.applicationUpdated) == true {
47+
analytics?.track(name: "Application Updated", properties: [
48+
"previous_version": previousVersion ?? "",
49+
"previous_build": previousBuild ?? "",
50+
"version": currentVersion ?? "",
51+
"build": currentBuild ?? ""
52+
])
53+
}
54+
}
55+
56+
if analytics?.configuration.values.trackedApplicationLifecycleEvents.contains(.applicationOpened) == true {
57+
analytics?.track(name: "Application Opened", properties: [
58+
"from_background": false,
5159
"version": currentVersion ?? "",
5260
"build": currentBuild ?? ""
5361
])
5462
}
55-
56-
analytics?.track(name: "Application Opened", properties: [
57-
"from_background": false,
58-
"version": currentVersion ?? "",
59-
"build": currentBuild ?? ""
60-
])
61-
63+
6264
UserDefaults.standard.setValue(currentVersion, forKey: Self.versionKey)
6365
UserDefaults.standard.setValue(currentBuild, forKey: Self.buildKey)
6466
}
6567

6668
func applicationDidUnhide() {
67-
if analytics?.configuration.values.trackApplicationLifecycleEvents == false {
68-
return
69+
if analytics?.configuration.values.trackedApplicationLifecycleEvents.contains(.applicationUnhidden) == true {
70+
let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
71+
let currentBuild = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
72+
73+
analytics?.track(name: "Application Unhidden", properties: [
74+
"from_background": true,
75+
"version": currentVersion ?? "",
76+
"build": currentBuild ?? ""
77+
])
6978
}
70-
71-
let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
72-
let currentBuild = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
73-
74-
analytics?.track(name: "Application Unhidden", properties: [
75-
"from_background": true,
76-
"version": currentVersion ?? "",
77-
"build": currentBuild ?? ""
78-
])
7979
}
8080

8181
func applicationDidHide() {
82-
if analytics?.configuration.values.trackApplicationLifecycleEvents == false {
83-
return
82+
if analytics?.configuration.values.trackedApplicationLifecycleEvents.contains(.applicationHidden) == true {
83+
analytics?.track(name: "Application Hidden")
8484
}
85-
86-
analytics?.track(name: "Application Hidden")
8785
}
8886
func applicationDidResignActive() {
89-
if analytics?.configuration.values.trackApplicationLifecycleEvents == false {
90-
return
87+
if analytics?.configuration.values.trackedApplicationLifecycleEvents.contains(.applicationBackgrounded) == true {
88+
analytics?.track(name: "Application Backgrounded")
9189
}
92-
93-
analytics?.track(name: "Application Backgrounded")
9490
}
9591

9692
func applicationDidBecomeActive() {
97-
if analytics?.configuration.values.trackApplicationLifecycleEvents == false {
93+
if analytics?.configuration.values.trackedApplicationLifecycleEvents.contains(.applicationForegrounded) == false {
9894
return
9995
}
100-
10196
analytics?.track(name: "Application Foregrounded")
10297

10398
// Lets check if we skipped application:didFinishLaunchingWithOptions,
@@ -109,11 +104,9 @@ class macOSLifecycleEvents: PlatformPlugin, macOSLifecycle {
109104
}
110105

111106
func applicationWillTerminate() {
112-
if analytics?.configuration.values.trackApplicationLifecycleEvents == false {
113-
return
107+
if analytics?.configuration.values.trackedApplicationLifecycleEvents.contains(.applicationTerminated) == true {
108+
analytics?.track(name: "Application Terminated")
114109
}
115-
116-
analytics?.track(name: "Application Terminated")
117110
}
118111
}
119112

0 commit comments

Comments
 (0)