Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .changeset/v4-remove-legacy-queue-migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'posthog-ios': major
---

**Breaking:** remove the migration of the event queue written by SDK 2.x (`posthog.queue.plist`).

Events still queued on disk by a 2.x SDK are deleted instead of sent when the app updates straight from 2.x to 4.0. Distinct ID, anonymous ID, groups and cached feature flags are still carried over. Events created by a 3.x SDK are not affected.

Queued events are no longer read in the 2.x format: a top-level `$set` and `message_id` are ignored. This includes 2.x events that 3.x imported and had not sent yet when the app updated to 4.0.
12 changes: 4 additions & 8 deletions PostHog.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
BF5E00000000000000000002 /* PHObjCExceptionCatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = BF5E00000000000000000006 /* PHObjCExceptionCatcher.h */; settings = {ATTRIBUTES = (Private, ); }; };
BF5E00000000000000000003 /* PHObjCExceptionCatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = BF5E00000000000000000007 /* PHObjCExceptionCatcher.m */; };
D0E500012FA0000100000002 /* PostHogEventSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E500012FA0000100000001 /* PostHogEventSnapshotTests.swift */; };
D0E500022FA0000100000002 /* PostHogEventTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0E500022FA0000100000001 /* PostHogEventTest.swift */; };
D0E500012FA0000100000021 /* event-shapes-batch.json in Resources */ = {isa = PBXBuildFile; fileRef = D0E500012FA0000100000011 /* event-shapes-batch.json */; };
D0E500012FA0000100000022 /* feature-flags-request.json in Resources */ = {isa = PBXBuildFile; fileRef = D0E500012FA0000100000012 /* feature-flags-request.json */; };
D0E500012FA0000100000023 /* session-replay-request.json in Resources */ = {isa = PBXBuildFile; fileRef = D0E500012FA0000100000013 /* session-replay-request.json */; };
Expand Down Expand Up @@ -95,8 +96,6 @@
6A11C0DE2026092800000011 /* PostHogSurveySheetDetentsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A11C0DE2026092800000012 /* PostHogSurveySheetDetentsTest.swift */; };
6A11C0DE2026092800000003 /* PostHogHingeStatusTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A11C0DE2026092800000004 /* PostHogHingeStatusTest.swift */; };
690FF0BF2AEFA97F00A0B06B /* FileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 690FF0BE2AEFA97F00A0B06B /* FileUtils.swift */; };
690FF0C52AEFAE8200A0B06B /* PostHogLegacyQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 690FF0C42AEFAE8200A0B06B /* PostHogLegacyQueue.swift */; };
690FF0DF2AEFBC5700A0B06B /* PostHogLegacyQueueTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 690FF0DE2AEFBC5700A0B06B /* PostHogLegacyQueueTest.swift */; };
690FF0E12AEFC59100A0B06B /* PostHogFileBackedQueueTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 690FF0E02AEFC59100A0B06B /* PostHogFileBackedQueueTest.swift */; };
690FF0E32AEFD12900A0B06B /* PostHogConfigTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 690FF0E22AEFD12900A0B06B /* PostHogConfigTest.swift */; };
6A0C1F2E3B4D5A6B7C8D9E02 /* PostHogOptOutPersistenceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0C1F2E3B4D5A6B7C8D9E01 /* PostHogOptOutPersistenceTest.swift */; };
Expand Down Expand Up @@ -864,6 +863,7 @@
BF5E00000000000000000006 /* PHObjCExceptionCatcher.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PHObjCExceptionCatcher.h; sourceTree = "<group>"; };
BF5E00000000000000000007 /* PHObjCExceptionCatcher.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PHObjCExceptionCatcher.m; sourceTree = "<group>"; };
D0E500012FA0000100000001 /* PostHogEventSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogEventSnapshotTests.swift; sourceTree = "<group>"; };
D0E500022FA0000100000001 /* PostHogEventTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogEventTest.swift; sourceTree = "<group>"; };
D0E500012FA0000100000011 /* event-shapes-batch.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; path = "event-shapes-batch.json"; sourceTree = "<group>"; };
D0E500012FA0000100000012 /* feature-flags-request.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; path = "feature-flags-request.json"; sourceTree = "<group>"; };
D0E500012FA0000100000013 /* session-replay-request.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; path = "session-replay-request.json"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -958,8 +958,6 @@
6A11C0DE2026092800000012 /* PostHogSurveySheetDetentsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogSurveySheetDetentsTest.swift; sourceTree = "<group>"; };
6A11C0DE2026092800000004 /* PostHogHingeStatusTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogHingeStatusTest.swift; sourceTree = "<group>"; };
690FF0BE2AEFA97F00A0B06B /* FileUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileUtils.swift; sourceTree = "<group>"; };
690FF0C42AEFAE8200A0B06B /* PostHogLegacyQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogLegacyQueue.swift; sourceTree = "<group>"; };
690FF0DE2AEFBC5700A0B06B /* PostHogLegacyQueueTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogLegacyQueueTest.swift; sourceTree = "<group>"; };
690FF0E02AEFC59100A0B06B /* PostHogFileBackedQueueTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogFileBackedQueueTest.swift; sourceTree = "<group>"; };
690FF0E22AEFD12900A0B06B /* PostHogConfigTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogConfigTest.swift; sourceTree = "<group>"; };
6A0C1F2E3B4D5A6B7C8D9E01 /* PostHogOptOutPersistenceTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostHogOptOutPersistenceTest.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1808,7 +1806,6 @@
6926DA8D2ADD2876005760D2 /* PostHogContext.swift */,
6A11C0DE2026092800000002 /* PostHogHingeStatusObserver.swift */,
69779BEB2AE68E6900D7A48E /* UIViewController.swift */,
690FF0C42AEFAE8200A0B06B /* PostHogLegacyQueue.swift */,
69F518372BB2BA0100F52C14 /* PostHogSwizzler.swift */,
69ED1A5B2C7F15F300FE7A91 /* PostHogSessionManager.swift */,
B5EB989F28A201A9F44026EE /* PostHogCompression.swift */,
Expand Down Expand Up @@ -1847,6 +1844,7 @@
B74800000000000000000004 /* PostHogTests-Bridging-Header.h */,
B74800000000000000000003 /* PostHogPushNotificationSwizzlingTest.swift */,
D0E500012FA0000100000001 /* PostHogEventSnapshotTests.swift */,
D0E500022FA0000100000001 /* PostHogEventTest.swift */,
DA27AEC82F56B3F3002A59CE /* PostHogSamplingTest.swift */,
DA27AEF12F56B3F3002A59CE /* PostHogGeoIpTest.swift */,
DB7100052F80000100000001 /* PostHogTracingHeadersTest.swift */,
Expand Down Expand Up @@ -1879,7 +1877,6 @@
6A11C0DE2026092300000002 /* PostHogContextScreenSizeTest.swift */,
6A11C0DE2026092800000012 /* PostHogSurveySheetDetentsTest.swift */,
6A11C0DE2026092800000004 /* PostHogHingeStatusTest.swift */,
690FF0DE2AEFBC5700A0B06B /* PostHogLegacyQueueTest.swift */,
DA4FFB142DA93C78006BAEEA /* PostHogSessionReplayTest.swift */,
DA4FFB182DA93C78006BAEEA /* PostHogReplayScreenshotDedupTest.swift */,
EA5700022DA93C78006BAEEA /* PostHogReplayCaptureTouchesTest.swift */,
Expand Down Expand Up @@ -3623,7 +3620,6 @@
DA3BB5052EDF15320097A97A /* PostHogStackFrame.swift in Sources */,
DACC08BB2D6E3C6D00115E46 /* PostHogIntegration.swift in Sources */,
DAD5DD0C2CB6DEF30087387B /* PostHogMaskViewModifier.swift in Sources */,
690FF0C52AEFAE8200A0B06B /* PostHogLegacyQueue.swift in Sources */,
3AE3FB332991388500AFFC18 /* PostHogQueue.swift in Sources */,
DA1044882D0B1D2D00C4ACF3 /* View+PostHogLabel.swift in Sources */,
DAA1B2F12F8C100000112233 /* View+PostHogNoRageClick.swift in Sources */,
Expand Down Expand Up @@ -3751,6 +3747,7 @@
BF5E00000000000000000001 /* PHBeforeSendExceptionTestFixture.m in Sources */,
B74800000000000000000002 /* PHNotificationDelegateTestFixture.m in Sources */,
D0E500012FA0000100000002 /* PostHogEventSnapshotTests.swift in Sources */,
D0E500022FA0000100000002 /* PostHogEventTest.swift in Sources */,
DA979D7B2CD370B700F56BAE /* PostHogAutocaptureEventTrackerSpec.swift in Sources */,
DA0C944B2D54CDD000BFD9FB /* PostHogStorageMigrationTest.swift in Sources */,
690FF0F52AF0F06100A0B06B /* PostHogSDKTest.swift in Sources */,
Expand Down Expand Up @@ -3809,7 +3806,6 @@
DADE7DFE2F7EA90D00C4650C /* PostHogDeepLinkIntegrationTests.swift in Sources */,
DA52CAEF2F24319800305F3D /* PostHogSessionReplayPluginTest.swift in Sources */,
DA52CAEF2F2431980030AA01 /* PostHogConsoleLogInterceptorTest.swift in Sources */,
690FF0DF2AEFBC5700A0B06B /* PostHogLegacyQueueTest.swift in Sources */,
DA6F24822D4A6CA100CA2777 /* PostHogApiTest.swift in Sources */,
AE3C6A5B6DAB01EF554A0270 /* PostHogPushNotificationTest.swift in Sources */,
D36F92424A13D7CE61B6E348 /* PostHogSwizzlerTest.swift in Sources */,
Expand Down
11 changes: 2 additions & 9 deletions PostHog/Models/PostHogEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -62,18 +62,11 @@ import Foundation

let timestampDate = toISO8601Date(timestamp) ?? Date()

var properties = (json["properties"] as? [String: Any]) ?? [:]

// back compatibility with v2
let setProps = json["$set"] as? [String: Any]
if setProps != nil {
properties["$set"] = setProps
}
let properties = (json["properties"] as? [String: Any]) ?? [:]

guard let distinctId = (json["distinct_id"] as? String) ?? (properties["distinct_id"] as? String) else { return nil }

// `message_id` is deprecated and only accepted for backwards compatibility with legacy persisted events.
let uuid = ((json["uuid"] as? String) ?? (json["message_id"] as? String)) ?? UUID.v7String()
let uuid = (json["uuid"] as? String) ?? UUID.v7String()
let uuidObj = UUID(uuidString: uuid) ?? UUID.v7()

// Wire field name remains api_key, but it carries the PostHog project token.
Expand Down
2 changes: 1 addition & 1 deletion PostHog/PostHogFileBackedQueue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class PostHogFileBackedQueue {
migrateOldQueueFolder(queue: queue, oldQueueFolder: oldQueue)
} else {
// old plist file
migrateOldQueue(queue: queue, oldQueue: oldQueue)
deleteSafely(oldQueue)
}
}
}
Expand Down
44 changes: 0 additions & 44 deletions PostHog/PostHogLegacyQueue.swift

This file was deleted.

38 changes: 38 additions & 0 deletions PostHogTests/PostHogEventTest.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import Foundation
@testable import PostHog
import Testing

@Suite("PostHogEvent JSON decoding")
struct PostHogEventTest {
@Test("ignores the 2.x top-level $set and message_id")
func ignoresV2Fields() throws {
let messageId = "5CE069F8-E967-4B47-9D89-207EF7519453"
let json: [String: Any] = [
"event": "test",
"distinct_id": "user",
"properties": ["key": "value"],
"$set": ["plan": "pro"],
"message_id": messageId,
]

let event = try #require(PostHogEvent.fromJSON(json))

#expect(event.properties["$set"] == nil)
#expect(event.properties["key"] as? String == "value")
#expect(event.uuid.uuidString != messageId)
}

@Test("reads uuid")
func readsUuid() throws {
let uuid = "019A0000-0000-7000-8000-000000000001"
let json: [String: Any] = [
"event": "test",
"distinct_id": "user",
"uuid": uuid,
]

let event = try #require(PostHogEvent.fromJSON(json))

#expect(event.uuid.uuidString == uuid)
}
}
16 changes: 16 additions & 0 deletions PostHogTests/PostHogFileBackedQueueAlignmentTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,22 @@ struct PostHogFileBackedQueueAlignmentTest {
data.map { String(data: $0, encoding: .utf8)! }
}

@Test("deletes a v2 queue file without importing its events")
func deletesLegacyQueueFile() throws {
let dir = FileManager.default.temporaryDirectory
.appendingPathComponent("ph-queue-align-\(UUID().uuidString)")
let oldQueue = FileManager.default.temporaryDirectory
.appendingPathComponent("ph-queue-plist-\(UUID().uuidString)")
defer { try? FileManager.default.removeItem(at: dir) }
try Data(#"[{"event":"v2 event","distinct_id":"user","timestamp":"2023-10-25T14:14:04.407Z"}]"#.utf8)
.write(to: oldQueue)

let queue = PostHogFileBackedQueue(queue: dir, oldQueues: [oldQueue])

#expect(!FileManager.default.fileExists(atPath: oldQueue.path))
#expect(queue.depth == 0)
}

@Test("a failed write to a full queue preserves existing entries", .enabled(if: geteuid() != 0))
func failedWritePreservesFullQueue() throws {
let (queue, dir) = makeQueue()
Expand Down
133 changes: 0 additions & 133 deletions PostHogTests/PostHogLegacyQueueTest.swift

This file was deleted.

Loading
Loading