Skip to content

Commit 93fcec0

Browse files
authored
Merge pull request #718 from Iterable/reflecting-new-messages
[MOB-7468] updated payload reflecting only new messages
2 parents 1223f53 + 6b1c67c commit 93fcec0

12 files changed

+92
-21
lines changed

swift-sdk/Constants.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ enum Const {
5656
static let deviceId = "itbl_device_id"
5757
static let sdkVersion = "itbl_sdk_version"
5858
static let offlineMode = "itbl_offline_mode"
59+
static let embeddedCurrentMessageIds = "itbl_embedded_current_messageIds"
5960

6061
static let attributionInfoExpiration = 24
6162
}
@@ -220,6 +221,7 @@ enum JsonKey {
220221
enum Embedded {
221222
static let packageName = "packageName"
222223
static let sdkVersion = "SDKVersion"
224+
static let currentMessageIds = "currentMessageIds"
223225
}
224226

225227
enum Header {

swift-sdk/Internal/ApiClient.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,8 @@ extension ApiClient: ApiClientProtocol {
219219

220220
// MARK: - Embedded Messaging
221221

222-
func getEmbeddedMessages() -> Pending<PlacementsPayload, SendRequestError> {
223-
let result = createRequestCreator().flatMap { $0.createGetEmbeddedMessagesRequest() }
222+
func getEmbeddedMessages(messages: [String]) -> Pending<PlacementsPayload, SendRequestError> {
223+
let result = createRequestCreator().flatMap { $0.createGetEmbeddedMessagesRequest(messages: messages)}
224224
return send(iterableRequestResult: result)
225225
}
226226

swift-sdk/Internal/ApiClientProtocol.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ protocol ApiClientProtocol: AnyObject {
4646

4747
func getRemoteConfiguration() -> Pending<RemoteConfiguration, SendRequestError>
4848

49-
func getEmbeddedMessages() -> Pending<PlacementsPayload, SendRequestError>
49+
func getEmbeddedMessages(messages: [String]) -> Pending<PlacementsPayload, SendRequestError>
5050

5151
@discardableResult func track(embeddedMessageReceived message: IterableEmbeddedMessage) -> Pending<SendRequestValue, SendRequestError>
5252

swift-sdk/Internal/DependencyContainerProtocol.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ extension DependencyContainerProtocol {
6262
urlDelegate: config.urlDelegate,
6363
customActionDelegate: config.customActionDelegate,
6464
urlOpener: urlOpener,
65-
allowedProtocols: config.allowedProtocols)
65+
allowedProtocols: config.allowedProtocols,
66+
localStorage: localStorage)
6667
}
6768

6869
func createRequestHandler(apiKey: String,

swift-sdk/Internal/IterableEmbeddedManager.swift

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,16 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
4545
urlDelegate: IterableURLDelegate?,
4646
customActionDelegate: IterableCustomActionDelegate?,
4747
urlOpener: UrlOpenerProtocol,
48-
allowedProtocols: [String]) {
48+
allowedProtocols: [String],
49+
localStorage: LocalStorageProtocol) {
4950
ITBInfo()
5051

5152
self.apiClient = apiClient
5253
self.urlDelegate = urlDelegate
5354
self.customActionDelegate = customActionDelegate
5455
self.urlOpener = urlOpener
5556
self.allowedProtocols = allowedProtocols
57+
self.localStorage = localStorage
5658

5759
super.init()
5860
addForegroundObservers()
@@ -185,6 +187,7 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
185187
let processor = EmbeddedMessagingProcessor(currentMessages: self.messages, fetchedMessages: [:])
186188
self.setMessages(processor)
187189
self.notifyUpdateDelegates(processor)
190+
self.localStorage.embeddedCurrentMessageIds = []
188191
}
189192

190193
private func handleIterableCustomAction(name: String, forMessage message: IterableEmbeddedMessage) {
@@ -234,6 +237,7 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
234237
private var messages: [Int: [IterableEmbeddedMessage]] = [:]
235238
private var listeners: NSHashTable<IterableEmbeddedUpdateDelegate> = NSHashTable(options: [.weakMemory])
236239
private var trackedMessageIds: Set<String> = Set()
240+
private var localStorage: LocalStorageProtocol
237241

238242
private func addForegroundObservers() {
239243
NotificationCenter.default.addObserver(self,
@@ -254,16 +258,26 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
254258
}
255259

256260
private func retrieveEmbeddedMessages(completion: @escaping () -> Void) {
257-
apiClient.getEmbeddedMessages()
261+
apiClient.getEmbeddedMessages(messages: localStorage.embeddedCurrentMessageIds)
258262
.onCompletion(
259263
receiveValue: { embeddedMessagesPayload in
260264
let placements = embeddedMessagesPayload.placements
261-
265+
var embeddedCurrentMessageIds: [String] = []
262266
var fetchedMessagesDict: [Int: [IterableEmbeddedMessage]] = [:]
263267
for placement in placements {
264268
fetchedMessagesDict[placement.placementId!] = placement.embeddedMessages
265269
}
266270

271+
for placement in placements {
272+
if let placementId = placement.placementId {
273+
fetchedMessagesDict[placementId] = placement.embeddedMessages
274+
for embeddedMessage in placement.embeddedMessages {
275+
embeddedCurrentMessageIds.append(embeddedMessage.metadata.messageId)
276+
}
277+
}
278+
}
279+
280+
self.localStorage.embeddedCurrentMessageIds = embeddedCurrentMessageIds
267281
let processor = EmbeddedMessagingProcessor(currentMessages: self.messages,
268282
fetchedMessages: fetchedMessagesDict)
269283

swift-sdk/Internal/IterableUserDefaults.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ class IterableUserDefaults {
7070
}
7171
}
7272

73+
var embeddedCurrentMessageIds: [String]? {
74+
get {
75+
return userDefaults.stringArray(forKey: UserDefaultsKey.embeddedCurrentMessageIds.value)
76+
} set {
77+
save(strings: newValue, withKey: .embeddedCurrentMessageIds)
78+
}
79+
}
80+
7381
func getAttributionInfo(currentDate: Date) -> IterableAttributionInfo? {
7482
(try? codable(withKey: .attributionInfo, currentDate: currentDate)) ?? nil
7583
}
@@ -167,6 +175,10 @@ class IterableUserDefaults {
167175
userDefaults.set(string, forKey: key.value)
168176
}
169177

178+
private func save(strings: [String]?, withKey key: UserDefaultsKey) {
179+
userDefaults.set(strings, forKey: key.value)
180+
}
181+
170182
private func save(bool: Bool, withKey key: UserDefaultsKey) {
171183
userDefaults.set(bool, forKey: key.value)
172184
}
@@ -196,6 +208,7 @@ class IterableUserDefaults {
196208
static let deviceId = UserDefaultsKey(value: Const.UserDefault.deviceId)
197209
static let sdkVersion = UserDefaultsKey(value: Const.UserDefault.sdkVersion)
198210
static let offlineMode = UserDefaultsKey(value: Const.UserDefault.offlineMode)
211+
static let embeddedCurrentMessageIds = UserDefaultsKey(value: Const.UserDefault.embeddedCurrentMessageIds)
199212
}
200213

201214
private struct Envelope: Codable {

swift-sdk/Internal/LocalStorage.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,12 @@ struct LocalStorage: LocalStorageProtocol {
120120
ITBInfo("UPDATED: migrated authToken from UserDefaults to IterableKeychain")
121121
}
122122
}
123+
124+
var embeddedCurrentMessageIds: [String] {
125+
get {
126+
iterableUserDefaults.embeddedCurrentMessageIds ?? []
127+
} set {
128+
iterableUserDefaults.embeddedCurrentMessageIds = newValue
129+
}
130+
}
123131
}

swift-sdk/Internal/LocalStorageProtocol.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ protocol LocalStorageProtocol {
2424
func save(attributionInfo: IterableAttributionInfo?, withExpiration expiration: Date?)
2525

2626
func upgrade()
27+
28+
var embeddedCurrentMessageIds: [String] { get set }
2729
}
2830

2931
extension LocalStorageProtocol {

swift-sdk/Internal/RequestCreator.swift

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ struct RequestCreator {
422422

423423
// MARK: - Embedded Messaging Request Calls
424424

425-
func createGetEmbeddedMessagesRequest() -> Result<IterableRequest, IterableError> {
425+
func createGetEmbeddedMessagesRequest(messages: [String]?) -> Result<IterableRequest, IterableError> {
426426
if case .none = auth.emailOrUserId {
427427
ITBError(Self.authMissingMessage)
428428
return .failure(IterableError.general(description: Self.authMissingMessage))
@@ -438,7 +438,18 @@ struct RequestCreator {
438438

439439
setCurrentUser(inDict: &args)
440440

441-
return .success(.get(createGetRequest(forPath: Const.Path.getEmbeddedMessages, withArgs: args as! [String: String])))
441+
var urlComponents = URLComponents(string: Const.Path.getEmbeddedMessages)
442+
let messagesArray = messages ?? []
443+
let allQueryItems = args.map { URLQueryItem(name: "\($0.key)", value: "\($0.value)") }
444+
let messagesQueryItems = messagesArray.map { URLQueryItem(name: JsonKey.Embedded.currentMessageIds, value: $0) }
445+
446+
urlComponents?.queryItems = allQueryItems + messagesQueryItems
447+
448+
guard let urlString = urlComponents?.url?.absoluteString else {
449+
return .failure(IterableError.general(description: "Failed to create URL"))
450+
}
451+
452+
return .success(.get(createGetRequest(forPath: urlString, withArgs: args as! [String: String])))
442453
}
443454

444455
func createEmbeddedMessageReceivedRequest(_ message: IterableEmbeddedMessage) -> Result<IterableRequest, IterableError> {

tests/common/MockLocalStorage.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import Foundation
77
@testable import IterableSDK
88

99
class MockLocalStorage: LocalStorageProtocol {
10+
var embeddedCurrentMessageIds: [String] = []
11+
1012
var userId: String? = nil
1113

1214
var email: String? = nil

0 commit comments

Comments
 (0)