Skip to content

Commit 1ffaa0d

Browse files
bsneeddelannoyk
andauthored
Performed fixup for url options, lifecycle updates, objc compatibility (#396)
* feat: Allow for more granular tracked lifecycle events to track # Conflicts: # Sources/Segment/Plugins/Platforms/iOS/iOSLifecycleEvents.swift * Performed fixup for url options, lifecycle updates, objc compat * fix objc example * fix objc configuration; update docs. * fix watchOS * fixed watchOS defaults * fixed watchOS lifecycle event handling * removed test code * attempt to fix test * checking test timeout and real errors * bump timeout for CI, again. * Remove this yeetd thing. * put tests back like they were * Still too short for the CI runner. --------- Co-authored-by: Kevin Delannoy <kevin.delannoy@spothero.com>
1 parent f56df7e commit 1ffaa0d

File tree

17 files changed

+201
-154
lines changed

17 files changed

+201
-154
lines changed

.github/workflows/swift.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,6 @@ jobs:
5353
needs: cancel_previous
5454
runs-on: macos-15
5555
steps:
56-
- name: Install yeetd
57-
run: |
58-
wget https://github.com/biscuitehh/yeetd/releases/download/1.0/yeetd-normal.pkg
59-
sudo installer -pkg yeetd-normal.pkg -target /
60-
yeetd &
6156
- uses: maxim-lobanov/setup-xcode@v1
6257
with:
6358
xcode-version: "16.2"

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/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: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,68 @@ 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+
#elseif os(watchOS)
96+
@objc public static let all: TrackedLifecycleEvent = [
97+
.applicationInstalled,
98+
.applicationUpdated,
99+
.applicationOpened,
100+
.applicationBackgrounded,
101+
]
102+
#else
103+
@objc public static let all = TrackedLifecycleEvent.none
104+
#endif
105+
}
106+
50107
public class Configuration {
51108
internal struct Values {
52109
var writeKey: String
53110
var application: Any? = nil
54-
var trackApplicationLifecycleEvents: Bool = true
111+
var trackedApplicationLifecycleEvents = TrackedLifecycleEvent.all
55112
var flushAt: Int = 20
56113
var flushInterval: TimeInterval = 30
57114
var defaultSettings: Settings? = nil
@@ -110,8 +167,19 @@ public extension Configuration {
110167
/// - Parameter enabled: A bool value
111168
/// - Returns: The current Configuration.
112169
@discardableResult
170+
@available(*, deprecated, message: "Use `setTrackedApplicationLifecycleEvents(_:)` for more granular control")
113171
func trackApplicationLifecycleEvents(_ enabled: Bool) -> Configuration {
114-
values.trackApplicationLifecycleEvents = enabled
172+
values.trackedApplicationLifecycleEvents = enabled ? .all : .none
173+
return self
174+
}
175+
176+
/// Opt-in/out of tracking lifecycle events. The default value is `.none`.
177+
///
178+
/// - Parameter events: An option set of the events to track.
179+
/// - Returns: The current Configuration.
180+
@discardableResult
181+
func setTrackedApplicationLifecycleEvents(_ events: TrackedLifecycleEvent) -> Configuration {
182+
values.trackedApplicationLifecycleEvents = events
115183
return self
116184
}
117185

Sources/Segment/ObjC/ObjCConfiguration.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,15 @@ public class ObjCConfiguration: NSObject {
2727
}
2828
}
2929

30-
/// Opt-in/out of tracking lifecycle events. The default value is `false`.
30+
/// Opt-in/out of tracking lifecycle events. The default value is `true`.
31+
/// NOTE: the default differs from analytics-ios.
3132
@objc
3233
public var trackApplicationLifecycleEvents: Bool {
3334
get {
34-
return configuration.values.trackApplicationLifecycleEvents
35+
return (configuration.values.trackedApplicationLifecycleEvents != .none)
3536
}
3637
set(value) {
37-
configuration.trackApplicationLifecycleEvents(value)
38+
configuration.setTrackedApplicationLifecycleEvents(.all)
3839
}
3940
}
4041

0 commit comments

Comments
 (0)