Skip to content

Commit 5f925a7

Browse files
zhu-xiaoweixiaoweii
andauthored
feat: add app end preset event (#26)
Co-authored-by: xiaoweii <xiaoweii@amazom.com>
1 parent 8094d18 commit 5f925a7

File tree

5 files changed

+43
-16
lines changed

5 files changed

+43
-16
lines changed

Sources/Clickstream/DataBase/ClickstreamDBUtil.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,23 +76,27 @@ class ClickstreamDBUtil: ClickstreamDBProtocol {
7676
_ = try dbAdapter.executeQuery(deleteStatement, [])
7777
}
7878

79-
// swiftlint:disable force_cast
8079
func getTotalSize() throws -> Int64 {
8180
let getTotalStatement = """
8281
SELECT SUM(eventSize) FROM Event
8382
"""
84-
let totalSize = try dbAdapter.executeQuery(getTotalStatement, []).scalar() as! Int64
85-
return totalSize
83+
if let totalSize = try dbAdapter.executeQuery(getTotalStatement, []).scalar() as? Int64 {
84+
return totalSize
85+
} else {
86+
return 0
87+
}
8688
}
8789

8890
func getEventCount() throws -> Int64 {
8991
let getEventCountStatement = """
9092
SELECT COUNT(*) FROM Event
9193
"""
92-
let totalCount = try dbAdapter.executeQuery(getEventCountStatement, []).scalar() as! Int64
93-
return totalCount
94+
if let totalCount = try dbAdapter.executeQuery(getEventCountStatement, []).scalar() as? Int64 {
95+
return totalCount
96+
} else {
97+
return 0
98+
}
9499
}
95-
// swiftlint:enable force_cast
96100
}
97101

98102
extension ClickstreamDBUtil: ClickstreamLogger {}

Sources/Clickstream/Dependency/Clickstream/AutoRecord/AutoRecordEventClient.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,10 @@ class AutoRecordEventClient {
143143
}
144144

145145
func handleAppStart() {
146-
checkAppVersionUpdate(clickstream: clickstream)
147-
checkOSVersionUpdate(clickstream: clickstream)
146+
if isFirstTime {
147+
checkAppVersionUpdate(clickstream: clickstream)
148+
checkOSVersionUpdate(clickstream: clickstream)
149+
}
148150
if isFirstOpen {
149151
let event = clickstream.analyticsClient.createEvent(withEventType: Event.PresetEvent.FIRST_OPEN)
150152
recordEvent(event)
@@ -161,6 +163,16 @@ class AutoRecordEventClient {
161163
isFirstTime = false
162164
}
163165

166+
func recordAppEnd() {
167+
let event = clickstream.analyticsClient.createEvent(withEventType: Event.PresetEvent.APP_END)
168+
if lastScreenName != nil, lastScreenPath != nil, lastScreenUniqueId != nil {
169+
event.addAttribute(lastScreenName!, forKey: Event.ReservedAttribute.SCREEN_NAME)
170+
event.addAttribute(lastScreenPath!, forKey: Event.ReservedAttribute.SCREEN_ID)
171+
event.addAttribute(lastScreenUniqueId!, forKey: Event.ReservedAttribute.SCREEN_UNIQUEID)
172+
}
173+
recordEvent(event)
174+
}
175+
164176
func recordSessionStartEvent() {
165177
let event = clickstream.analyticsClient.createEvent(withEventType: Event.PresetEvent.SESSION_START)
166178
recordEvent(event)

Sources/Clickstream/Dependency/Clickstream/Event/Event.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ enum Event {
215215
static let USER_ENGAGEMENT = "_user_engagement"
216216
static let SCREEN_VIEW = "_screen_view"
217217
static let APP_START = "_app_start"
218+
static let APP_END = "_app_end"
218219
static let APP_EXCEPTION = "_app_exception"
219220
}
220221

Sources/Clickstream/Dependency/Clickstream/Session/SessionClient.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class SessionClient: SessionClientBehaviour {
6868
log.debug("Application entered the background.")
6969
storeSession()
7070
autoRecordClient.recordUserEngagement()
71+
autoRecordClient.recordAppEnd()
7172
clickstream.analyticsClient.submitEvents(isBackgroundMode: true)
7273
}
7374

Tests/ClickstreamTests/Clickstream/SessionClientTests.swift

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,13 @@ class SessionClientTests: XCTestCase {
9292
XCTAssertTrue(storedSession != nil)
9393

9494
let events = eventRecorder.savedEvents
95-
XCTAssertEqual(3, events.count)
95+
XCTAssertEqual(4, events.count)
9696
XCTAssertEqual(Event.PresetEvent.FIRST_OPEN, events[0].eventType)
9797
XCTAssertEqual(Event.PresetEvent.APP_START, events[1].eventType)
9898
XCTAssertEqual(Event.PresetEvent.SESSION_START, events[2].eventType)
99+
XCTAssertEqual(Event.PresetEvent.APP_END, events[3].eventType)
100+
XCTAssertNil(events[3].attributes[Event.ReservedAttribute.SCREEN_ID])
101+
XCTAssertNil(events[3].attributes[Event.ReservedAttribute.SCREEN_NAME])
99102
}
100103

101104
func testGoBackgroundWithUserEngagement() {
@@ -114,12 +117,16 @@ class SessionClientTests: XCTestCase {
114117
XCTAssertTrue(storedSession != nil)
115118
Thread.sleep(forTimeInterval: 0.1)
116119
let events = eventRecorder.savedEvents
117-
XCTAssertEqual(5, events.count)
120+
XCTAssertEqual(6, events.count)
118121
XCTAssertEqual(Event.PresetEvent.FIRST_OPEN, events[0].eventType)
119122
XCTAssertEqual(Event.PresetEvent.APP_START, events[1].eventType)
120123
XCTAssertEqual(Event.PresetEvent.SESSION_START, events[2].eventType)
121124
XCTAssertEqual(Event.PresetEvent.SCREEN_VIEW, events[3].eventType)
122125
XCTAssertEqual(Event.PresetEvent.USER_ENGAGEMENT, events[4].eventType)
126+
XCTAssertEqual(Event.PresetEvent.APP_END, events[5].eventType)
127+
XCTAssertNotNil(events[5].attributes[Event.ReservedAttribute.SCREEN_NAME])
128+
XCTAssertNotNil(events[5].attributes[Event.ReservedAttribute.SCREEN_ID])
129+
XCTAssertNotNil(events[5].attributes[Event.ReservedAttribute.SCREEN_UNIQUEID])
123130
}
124131

125132
func testReturnToForeground() {
@@ -147,12 +154,13 @@ class SessionClientTests: XCTestCase {
147154

148155
Thread.sleep(forTimeInterval: 0.1)
149156
let events = eventRecorder.savedEvents
150-
XCTAssertEqual(5, events.count)
157+
XCTAssertEqual(6, events.count)
151158
XCTAssertEqual(Event.PresetEvent.FIRST_OPEN, events[0].eventType)
152159
XCTAssertEqual(Event.PresetEvent.APP_START, events[1].eventType)
153160
XCTAssertEqual(Event.PresetEvent.SESSION_START, events[2].eventType)
154-
XCTAssertEqual(Event.PresetEvent.APP_START, events[3].eventType)
155-
XCTAssertEqual(Event.PresetEvent.SESSION_START, events[4].eventType)
161+
XCTAssertEqual(Event.PresetEvent.APP_END, events[3].eventType)
162+
XCTAssertEqual(Event.PresetEvent.APP_START, events[4].eventType)
163+
XCTAssertEqual(Event.PresetEvent.SESSION_START, events[5].eventType)
156164
}
157165

158166
func testReturnToForegroundWithScreenView() {
@@ -165,15 +173,16 @@ class SessionClientTests: XCTestCase {
165173
activityTracker.callback?(.runningInForeground)
166174
Thread.sleep(forTimeInterval: 0.1)
167175
let events = eventRecorder.savedEvents
168-
XCTAssertEqual(5, events.count)
176+
XCTAssertEqual(6, events.count)
169177
XCTAssertEqual(Event.PresetEvent.FIRST_OPEN, events[0].eventType)
170178
XCTAssertEqual(Event.PresetEvent.APP_START, events[1].eventType)
171179
XCTAssertTrue(events[1].attributes[Event.ReservedAttribute.IS_FIRST_TIME] as! Bool)
172180

173181
XCTAssertEqual(Event.PresetEvent.SESSION_START, events[2].eventType)
174182
XCTAssertEqual(Event.PresetEvent.SCREEN_VIEW, events[3].eventType)
175-
XCTAssertEqual(Event.PresetEvent.APP_START, events[4].eventType)
176-
let appStartEvent = events[4]
183+
XCTAssertEqual(Event.PresetEvent.APP_END, events[4].eventType)
184+
XCTAssertEqual(Event.PresetEvent.APP_START, events[5].eventType)
185+
let appStartEvent = events[5]
177186
XCTAssertNotNil(appStartEvent.attributes[Event.ReservedAttribute.SCREEN_NAME])
178187
XCTAssertNotNil(appStartEvent.attributes[Event.ReservedAttribute.SCREEN_ID])
179188
XCTAssertFalse(appStartEvent.attributes[Event.ReservedAttribute.IS_FIRST_TIME] as! Bool)

0 commit comments

Comments
 (0)