Skip to content

Commit eb28d3e

Browse files
authored
Merge pull request #830 from Iterable/evan/MOB-9560-identity-resolution
[MOB-9560] implements identity resolution
2 parents b82b8e6 + 3d6bc72 commit eb28d3e

File tree

8 files changed

+79
-46
lines changed

8 files changed

+79
-46
lines changed

swift-sdk.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@
194194
5B5AA717284F1A6D0093FED4 /* MockNetworkSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B5AA710284F1A6D0093FED4 /* MockNetworkSession.swift */; };
195195
5B6C3C1127CE871F00B9A753 /* NavInboxSessionUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B6C3C1027CE871F00B9A753 /* NavInboxSessionUITests.swift */; };
196196
5B88BC482805D09D004016E5 /* NetworkSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B88BC472805D09D004016E5 /* NetworkSession.swift */; };
197+
9F0616412C9CA9D400FE2E6A /* IterableIdentityResolution.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0616402C9CA9D200FE2E6A /* IterableIdentityResolution.swift */; };
197198
9F76FFFF2B17884900962526 /* EmbeddedHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F76FFFE2B17884900962526 /* EmbeddedHelper.swift */; };
198199
9FF05EAC2AFEA5FA005311F7 /* MockAuthManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF05EAB2AFEA5FA005311F7 /* MockAuthManager.swift */; };
199200
9FF05EAD2AFEA5FA005311F7 /* MockAuthManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF05EAB2AFEA5FA005311F7 /* MockAuthManager.swift */; };
@@ -642,6 +643,7 @@
642643
5B6C3C1027CE871F00B9A753 /* NavInboxSessionUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavInboxSessionUITests.swift; sourceTree = "<group>"; };
643644
5B88BC472805D09D004016E5 /* NetworkSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkSession.swift; sourceTree = "<group>"; };
644645
5BFC7CED27FC9AF300E77479 /* inbox-ui-tests-app.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "inbox-ui-tests-app.entitlements"; sourceTree = "<group>"; };
646+
9F0616402C9CA9D200FE2E6A /* IterableIdentityResolution.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableIdentityResolution.swift; sourceTree = "<group>"; };
645647
9F76FFFE2B17884900962526 /* EmbeddedHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmbeddedHelper.swift; sourceTree = "<group>"; };
646648
9FF05EAB2AFEA5FA005311F7 /* MockAuthManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAuthManager.swift; sourceTree = "<group>"; };
647649
AC02480722791E2100495FB9 /* IterableInboxNavigationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IterableInboxNavigationViewController.swift; sourceTree = "<group>"; };
@@ -1671,6 +1673,7 @@
16711673
E9EA7C9A2C1EDE4400A9D6FB /* AnonymousTracking */ = {
16721674
isa = PBXGroup;
16731675
children = (
1676+
9F0616402C9CA9D200FE2E6A /* IterableIdentityResolution.swift */,
16741677
E9EA7C9E2C1EDE5800A9D6FB /* AnonymousUserManager.swift */,
16751678
E9EA7C9B2C1EDE5800A9D6FB /* AnonymousUserManager+Functions.swift */,
16761679
E9EA7C9D2C1EDE5800A9D6FB /* AnonymousUserManagerProtocol.swift */,
@@ -2208,6 +2211,7 @@
22082211
ACB8273F22372A5C00DB17D3 /* IterableHtmlMessageViewController.swift in Sources */,
22092212
AC5812F624F3A90F007E6D36 /* OfflineRequestProcessor.swift in Sources */,
22102213
5555425028BED1B400DB5D20 /* KeychainWrapper.swift in Sources */,
2214+
9F0616412C9CA9D400FE2E6A /* IterableIdentityResolution.swift in Sources */,
22112215
AC81918A22713A400014955E /* AbstractDiffCalculator.swift in Sources */,
22122216
ACA95D2D275494A100AF4666 /* InboxViewRepresentable.swift in Sources */,
22132217
AC684A88222F4FDD00F29749 /* InAppDisplayer.swift in Sources */,

swift-sdk/Internal/AnonymousUserManager.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public class AnonymousUserManager: AnonymousUserManagerProtocol {
128128
}
129129

130130
self.localStorage.userIdAnnon = userId
131-
IterableAPI.setUserId(userId, nil, merge: false, nil, nil, true)
131+
IterableAPI.implementation?.setUserId(userId, authToken: nil, successHandler: nil, failureHandler: nil, isAnon: true, identityResolution: nil)
132132
self.syncNonSyncedEvents()
133133
}
134134
}

swift-sdk/Internal/AnonymousUserMerge.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import Foundation
99

1010
protocol AnonymousUserMergeProtocol {
11-
func tryMergeUser(destinationUser: String?, isEmail: Bool, shouldMerge: Bool, onMergeResult: @escaping MergeActionHandler)
11+
func tryMergeUser(destinationUser: String?, isEmail: Bool, merge: Bool, onMergeResult: @escaping MergeActionHandler)
1212
}
1313

1414
class AnonymousUserMerge: AnonymousUserMergeProtocol {
@@ -23,10 +23,10 @@ class AnonymousUserMerge: AnonymousUserMergeProtocol {
2323
self.localStorage = localStorage
2424
}
2525

26-
func tryMergeUser(destinationUser: String?, isEmail: Bool, shouldMerge: Bool, onMergeResult: @escaping MergeActionHandler) {
26+
func tryMergeUser(destinationUser: String?, isEmail: Bool, merge: Bool, onMergeResult: @escaping MergeActionHandler) {
2727
let anonymousUserId = localStorage.userIdAnnon
2828

29-
if (anonymousUserId != nil && destinationUser != nil && shouldMerge) {
29+
if (anonymousUserId != nil && destinationUser != nil && merge) {
3030
let destinationEmail = isEmail ? destinationUser : nil
3131
let destinationUserId = isEmail ? nil : destinationUser
3232

swift-sdk/Internal/InternalIterableAPI.swift

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,16 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
130130
_payloadData = data
131131
}
132132

133-
func setEmail(_ email: String?, authToken: String? = nil, merge: Bool = true, successHandler: OnSuccessHandler? = nil, failureHandler: OnFailureHandler? = nil) {
133+
func setEmail(_ email: String?, authToken: String? = nil, successHandler: OnSuccessHandler? = nil, failureHandler: OnFailureHandler? = nil, identityResolution: IterableIdentityResolution? = nil) {
134134

135135
ITBInfo()
136136

137-
//let shouldMerge = merge && localStorage.userIdAnnon != nil
138-
137+
let merge = identityResolution?.mergeOnAnonymousToKnown ?? config.identityResolution.mergeOnAnonymousToKnown
138+
let replay = identityResolution?.replayOnVisitorToKnown ?? config.identityResolution.replayOnVisitorToKnown
139+
139140
if(config.enableAnonTracking) {
140141
if(email != nil) {
141-
attemptAndProcessMerge(shouldMerge: merge, destinationUser: email, isEmail: true, failureHandler: failureHandler)
142+
attemptAndProcessMerge(merge: merge ?? true, replay: replay ?? true, destinationUser: email, isEmail: true, failureHandler: failureHandler)
142143
}
143144
self.localStorage.userIdAnnon = nil
144145
}
@@ -164,14 +165,15 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
164165

165166
}
166167

167-
func setUserId(_ userId: String?, authToken: String? = nil, merge: Bool = true, successHandler: OnSuccessHandler? = nil, failureHandler: OnFailureHandler? = nil, isAnon: Bool = false) {
168+
func setUserId(_ userId: String?, authToken: String? = nil, successHandler: OnSuccessHandler? = nil, failureHandler: OnFailureHandler? = nil, isAnon: Bool = false, identityResolution: IterableIdentityResolution? = nil) {
168169
ITBInfo()
169170

170-
//let shouldMerge = && localStorage.userIdAnnon != nil
171-
171+
let merge = identityResolution?.mergeOnAnonymousToKnown ?? config.identityResolution.mergeOnAnonymousToKnown
172+
let replay = identityResolution?.replayOnVisitorToKnown ?? config.identityResolution.replayOnVisitorToKnown
173+
172174
if(config.enableAnonTracking) {
173175
if(userId != nil && userId != localStorage.userIdAnnon) {
174-
attemptAndProcessMerge(shouldMerge: merge, destinationUser: userId, isEmail: false, failureHandler: failureHandler)
176+
attemptAndProcessMerge(merge: merge ?? true, replay: replay ?? true, destinationUser: userId, isEmail: false, failureHandler: failureHandler)
175177
}
176178

177179
if(!isAnon) {
@@ -203,11 +205,11 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
203205
logoutPreviousUser()
204206
}
205207

206-
func attemptAndProcessMerge(shouldMerge: Bool, destinationUser: String?, isEmail: Bool, failureHandler: OnFailureHandler? = nil) {
207-
anonymousUserMerge.tryMergeUser(destinationUser: destinationUser, isEmail: isEmail, shouldMerge: shouldMerge) { mergeResult, error in
208+
func attemptAndProcessMerge(merge: Bool, replay: Bool, destinationUser: String?, isEmail: Bool, failureHandler: OnFailureHandler? = nil) {
209+
anonymousUserMerge.tryMergeUser(destinationUser: destinationUser, isEmail: isEmail, merge: merge) { mergeResult, error in
208210

209211
if mergeResult == MergeResult.mergenotrequired || mergeResult == MergeResult.mergesuccessful {
210-
if (shouldMerge) {
212+
if (replay) {
211213
self.anonymousUserManager.syncNonSyncedEvents()
212214
}
213215
} else {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//
2+
// Untitled.swift
3+
// swift-sdk
4+
//
5+
// Created by Evan Greer on 9/19/24.
6+
// Copyright © 2024 Iterable. All rights reserved.
7+
//
8+
9+
import Foundation
10+
@objc public class IterableIdentityResolution: NSObject {
11+
12+
/// userId or email of the signed-in user
13+
public var replayOnVisitorToKnown: Bool?
14+
15+
/// the authToken which caused the failure
16+
public let mergeOnAnonymousToKnown: Bool?
17+
18+
public init(replayOnVisitorToKnown: Bool?,
19+
mergeOnAnonymousToKnown: Bool?) {
20+
self.replayOnVisitorToKnown = replayOnVisitorToKnown
21+
self.mergeOnAnonymousToKnown = mergeOnAnonymousToKnown
22+
}
23+
}

swift-sdk/IterableAPI.swift

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -139,20 +139,12 @@ import UIKit
139139

140140
// MARK: - SDK
141141

142-
public static func setEmail(_ email: String?, _ authToken: String? = nil, _ successHandler: OnSuccessHandler? = nil, _ failureHandler: OnFailureHandler? = nil) {
143-
implementation?.setEmail(email, authToken: authToken, successHandler: successHandler, failureHandler: failureHandler)
142+
public static func setEmail(_ email: String?, _ authToken: String? = nil, _ identityResolution: IterableIdentityResolution? = nil, _ successHandler: OnSuccessHandler? = nil, _ failureHandler: OnFailureHandler? = nil) {
143+
implementation?.setEmail(email, authToken: authToken, successHandler: successHandler, failureHandler: failureHandler, identityResolution: identityResolution)
144144
}
145145

146-
public static func setUserId(_ userId: String?, _ authToken: String? = nil, _ successHandler: OnSuccessHandler? = nil, _ failureHandler: OnFailureHandler? = nil) {
147-
implementation?.setUserId(userId, authToken: authToken, successHandler: successHandler, failureHandler: failureHandler)
148-
}
149-
150-
public static func setEmail(_ email: String?, _ authToken: String? = nil, merge: Bool = true, _ successHandler: OnSuccessHandler? = nil, _ failureHandler: OnFailureHandler? = nil) {
151-
implementation?.setEmail(email, authToken: authToken, merge: merge, successHandler: successHandler, failureHandler: failureHandler)
152-
}
153-
154-
public static func setUserId(_ userId: String?, _ authToken: String? = nil, merge: Bool = true, _ successHandler: OnSuccessHandler? = nil, _ failureHandler: OnFailureHandler? = nil, _ isAnon: Bool = false) {
155-
implementation?.setUserId(userId, authToken: authToken, merge: merge,successHandler: successHandler, failureHandler: failureHandler, isAnon: isAnon)
146+
public static func setUserId(_ userId: String?, _ authToken: String? = nil, _ identityResolution: IterableIdentityResolution? = nil, _ successHandler: OnSuccessHandler? = nil, _ failureHandler: OnFailureHandler? = nil) {
147+
implementation?.setUserId(userId, authToken: authToken, successHandler: successHandler, failureHandler: failureHandler, identityResolution: identityResolution)
156148
}
157149

158150
/// Handle a Universal Link

swift-sdk/IterableConfig.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,6 @@ public class IterableConfig: NSObject {
138138

139139
// How many events can be stored in the local storage. By default limt is 100.
140140
public var eventThresholdLimit: Int = 100
141+
142+
public var identityResolution: IterableIdentityResolution = IterableIdentityResolution(replayOnVisitorToKnown: true, mergeOnAnonymousToKnown: true)
141143
}

0 commit comments

Comments
 (0)