Skip to content

Commit 4a29739

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

File tree

13 files changed

+155
-105
lines changed

13 files changed

+155
-105
lines changed

Examples/apps/BasicExample/BasicExample/AppDelegate.swift

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 3 additions & 3 deletions
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

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,61 @@ 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+
public override func isEqual(_ object: Any?) -> Bool {
59+
(object as? Self)?.rawValue == rawValue
60+
}
61+
62+
public override var hash: Int {
63+
rawValue.hashValue
64+
}
65+
66+
@objc public static let none: TrackedLifecycleEvent = []
67+
@objc public static let applicationInstalled = TrackedLifecycleEvent(rawValue: 1 << 0)
68+
@objc public static let applicationUpdated = TrackedLifecycleEvent(rawValue: 1 << 1)
69+
@objc public static let applicationOpened = TrackedLifecycleEvent(rawValue: 1 << 2)
70+
@objc public static let applicationBackgrounded = TrackedLifecycleEvent(rawValue: 1 << 3)
71+
@objc public static let applicationForegrounded = TrackedLifecycleEvent(rawValue: 1 << 4)
72+
#if os(macOS)
73+
@objc public static let applicationUnhidden = TrackedLifecycleEvent(rawValue: 1 << 5)
74+
@objc public static let applicationHidden = TrackedLifecycleEvent(rawValue: 1 << 6)
75+
@objc public static let applicationTerminated = TrackedLifecycleEvent(rawValue: 1 << 7)
76+
77+
@objc public static let all: TrackedLifecycleEvent = [
78+
.applicationInstalled,
79+
.applicationUpdated,
80+
.applicationOpened,
81+
.applicationBackgrounded,
82+
.applicationForegrounded,
83+
.applicationUnhidden,
84+
.applicationHidden,
85+
.applicationTerminated,
86+
]
87+
#elseif os(iOS) || os(tvOS) || os(visionOS) || targetEnvironment(macCatalyst)
88+
@objc public static let all: TrackedLifecycleEvent = [
89+
.applicationInstalled,
90+
.applicationUpdated,
91+
.applicationOpened,
92+
.applicationBackgrounded,
93+
.applicationForegrounded,
94+
]
95+
#else
96+
@objc public static let all = TrackedLifecycleEvent.none
97+
#endif
98+
}
99+
50100
public class Configuration {
51101
internal struct Values {
52102
var writeKey: String
53103
var application: Any? = nil
54-
var trackApplicationLifecycleEvents: Bool = true
104+
var trackedApplicationLifecycleEvents = TrackedLifecycleEvent.all
55105
var flushAt: Int = 20
56106
var flushInterval: TimeInterval = 30
57107
var defaultSettings: Settings? = nil
@@ -110,8 +160,19 @@ public extension Configuration {
110160
/// - Parameter enabled: A bool value
111161
/// - Returns: The current Configuration.
112162
@discardableResult
163+
@available(*, deprecated, message: "Use `setTrackedApplicationLifecycleEvents(_:)` for more granular control")
113164
func trackApplicationLifecycleEvents(_ enabled: Bool) -> Configuration {
114-
values.trackApplicationLifecycleEvents = enabled
165+
values.trackedApplicationLifecycleEvents = enabled ? .all : .none
166+
return self
167+
}
168+
169+
/// Opt-in/out of tracking lifecycle events. The default value is `.none`.
170+
///
171+
/// - Parameter events: An option set of the events to track.
172+
/// - Returns: The current Configuration.
173+
@discardableResult
174+
func setTrackedApplicationLifecycleEvents(_ events: TrackedLifecycleEvent) -> Configuration {
175+
values.trackedApplicationLifecycleEvents = events
115176
return self
116177
}
117178

Sources/Segment/ObjC/ObjCConfiguration.swift

Lines changed: 3 additions & 3 deletions
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

Lines changed: 36 additions & 43 deletions
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)