Skip to content

Commit 774a4c1

Browse files
authored
Merge branch 'embedded-no-diff-merge' into MOB-7672-bundle-module-issue
2 parents e0d13f5 + c877b50 commit 774a4c1

22 files changed

+181
-545
lines changed

swift-sdk/Constants.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ 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"
6059

6160
static let attributionInfoExpiration = 24
6261
}
@@ -221,7 +220,6 @@ enum JsonKey {
221220
enum Embedded {
222221
static let packageName = "packageName"
223222
static let sdkVersion = "SDKVersion"
224-
static let currentMessageIds = "currentMessageIds"
225223
}
226224

227225
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(messages: [String]) -> Pending<PlacementsPayload, SendRequestError> {
223-
let result = createRequestCreator().flatMap { $0.createGetEmbeddedMessagesRequest(messages: messages)}
222+
func getEmbeddedMessages() -> Pending<PlacementsPayload, SendRequestError> {
223+
let result = createRequestCreator().flatMap { $0.createGetEmbeddedMessagesRequest() }
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(messages: [String]) -> Pending<PlacementsPayload, SendRequestError>
49+
func getEmbeddedMessages() -> Pending<PlacementsPayload, SendRequestError>
5050

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

swift-sdk/Internal/DependencyContainerProtocol.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,12 @@ extension DependencyContainerProtocol {
5757
}
5858

5959
func createEmbeddedManager(config: IterableConfig,
60-
apiClient: ApiClientProtocol) -> IterableEmbeddedManagerProtocol {
60+
apiClient: ApiClientProtocol) -> IterableInternalEmbeddedManagerProtocol {
6161
IterableEmbeddedManager(apiClient: apiClient,
6262
urlDelegate: config.urlDelegate,
6363
customActionDelegate: config.customActionDelegate,
6464
urlOpener: urlOpener,
65-
allowedProtocols: config.allowedProtocols,
66-
localStorage: localStorage)
65+
allowedProtocols: config.allowedProtocols)
6766
}
6867

6968
func createRequestHandler(apiKey: String,

swift-sdk/Internal/EmptyEmbeddedManager.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55
import Foundation
66

77
class EmptyEmbeddedManager: IterableEmbeddedManagerProtocol {
8-
func resolveMessages(_ messages: [IterableEmbeddedMessage], completion: @escaping ([ResolvedMessage]) -> Void) {
9-
10-
}
11-
128
func addUpdateListener(_ listener: IterableEmbeddedUpdateDelegate) {
139

1410
}

swift-sdk/Internal/InternalIterableAPI.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
8282
self.dependencyContainer.createAuthManager(config: self.config)
8383
}()
8484

85-
lazy var embeddedManager: IterableEmbeddedManagerProtocol = {
85+
lazy var embeddedManager: IterableInternalEmbeddedManagerProtocol = {
8686
self.dependencyContainer.createEmbeddedManager(config: self.config,
8787
apiClient: self.apiClient)
8888
}()
@@ -685,7 +685,8 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
685685
customActionDelegate: config.customActionDelegate,
686686
urlOpener: urlOpener,
687687
allowedProtocols: config.allowedProtocols,
688-
inAppNotifiable: inAppManager)
688+
inAppNotifiable: inAppManager,
689+
embeddedNotifiable: embeddedManager)
689690

690691
handle(launchOptions: launchOptions)
691692

swift-sdk/Internal/InternalIterableAppIntegration.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,19 +117,22 @@ struct InternalIterableAppIntegration {
117117
private let urlOpener: UrlOpenerProtocol?
118118
private let allowedProtocols: [String]
119119
private weak var inAppNotifiable: InAppNotifiable?
120+
private weak var embeddedNotifiable: EmbeddedNotifiable?
120121

121122
init(tracker: PushTrackerProtocol,
122123
urlDelegate: IterableURLDelegate? = nil,
123124
customActionDelegate: IterableCustomActionDelegate? = nil,
124125
urlOpener: UrlOpenerProtocol? = nil,
125126
allowedProtocols: [String] = [],
126-
inAppNotifiable: InAppNotifiable) {
127+
inAppNotifiable: InAppNotifiable,
128+
embeddedNotifiable: EmbeddedNotifiable) {
127129
self.tracker = tracker
128130
self.urlDelegate = urlDelegate
129131
self.customActionDelegate = customActionDelegate
130132
self.urlOpener = urlOpener
131133
self.allowedProtocols = allowedProtocols
132134
self.inAppNotifiable = inAppNotifiable
135+
self.embeddedNotifiable = embeddedNotifiable
133136
}
134137

135138
/**
@@ -147,6 +150,8 @@ struct InternalIterableAppIntegration {
147150
switch silentPush.notificationType {
148151
case .update:
149152
_ = inAppNotifiable?.scheduleSync()
153+
case .updateEmbedded:
154+
embeddedNotifiable?.syncMessages {}
150155
case .remove:
151156
if let messageId = silentPush.messageId {
152157
inAppNotifiable?.onInAppRemoved(messageId: messageId)

swift-sdk/Internal/IterableEmbeddedManager.swift

Lines changed: 12 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -5,56 +5,23 @@
55
import Foundation
66
import UIKit
77

8-
public struct ResolvedMessage: Equatable {
9-
public let title: String?
10-
public let description: String?
11-
public var image: UIImage?
12-
public var imageAccessibilityLabel: String?
13-
public let buttonText: String?
14-
public let buttonTwoText: String?
15-
public let message: IterableEmbeddedMessage
16-
17-
init(title: String?,
18-
description: String?,
19-
image: UIImage?,
20-
imageAccessibilityLabel: String?,
21-
buttonText: String?,
22-
buttonTwoText: String?,
23-
message: IterableEmbeddedMessage) {
24-
self.title = title
25-
self.description = description
26-
self.image = image
27-
self.imageAccessibilityLabel = imageAccessibilityLabel
28-
self.buttonText = buttonText
29-
self.buttonTwoText = buttonTwoText
30-
self.message = message
31-
}
32-
33-
public static func ==(lhs: ResolvedMessage, rhs: ResolvedMessage) -> Bool {
34-
return lhs.title == rhs.title &&
35-
lhs.description == rhs.description &&
36-
lhs.image == rhs.image &&
37-
lhs.buttonText == rhs.buttonText &&
38-
lhs.buttonTwoText == rhs.buttonTwoText &&
39-
lhs.message == rhs.message
40-
}
8+
protocol IterableInternalEmbeddedManagerProtocol: IterableEmbeddedManagerProtocol, EmbeddedNotifiable {
9+
// we can add the internal delegate methods here
4110
}
4211

43-
class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
12+
class IterableEmbeddedManager: NSObject, IterableInternalEmbeddedManagerProtocol {
4413
init(apiClient: ApiClientProtocol,
4514
urlDelegate: IterableURLDelegate?,
4615
customActionDelegate: IterableCustomActionDelegate?,
4716
urlOpener: UrlOpenerProtocol,
48-
allowedProtocols: [String],
49-
localStorage: LocalStorageProtocol) {
17+
allowedProtocols: [String]) {
5018
ITBInfo()
5119

5220
self.apiClient = apiClient
5321
self.urlDelegate = urlDelegate
5422
self.customActionDelegate = customActionDelegate
5523
self.urlOpener = urlOpener
5624
self.allowedProtocols = allowedProtocols
57-
self.localStorage = localStorage
5825

5926
super.init()
6027
addForegroundObservers()
@@ -76,86 +43,13 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
7643
return messages[placementId] ?? []
7744
}
7845

79-
public func resolveMessages(_ messages: [IterableEmbeddedMessage], completion: @escaping ([ResolvedMessage]) -> Void) {
80-
var resolvedMessages: [Int: ResolvedMessage] = [:]
81-
82-
let group = DispatchGroup()
83-
84-
for (index, message) in messages.enumerated() {
85-
group.enter()
86-
87-
let title = message.elements?.title
88-
let description = message.elements?.body
89-
let imageUrl = message.elements?.mediaUrl
90-
let imageAccessiblityLabel = message.elements?.mediaUrlCaption
91-
let buttonText = message.elements?.buttons?.first?.title
92-
let buttonTwoText = message.elements?.buttons?.count ?? 0 > 1 ? message.elements?.buttons?[1].title : nil
93-
94-
DispatchQueue.global().async {
95-
if let imageUrl = imageUrl, let url = URL(string: imageUrl) {
96-
var request = URLRequest(url: url)
97-
request.setValue("Mozilla/5.0 (iPhone; CPU iPhone OS 16_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1", forHTTPHeaderField: "User-Agent")
98-
99-
let config = URLSessionConfiguration.default
100-
config.httpAdditionalHeaders = request.allHTTPHeaderFields
101-
102-
let session = URLSession(configuration: config)
103-
104-
session.dataTask(with: request) { (data, _, _) in
105-
defer { group.leave() }
106-
107-
guard let imageData = data else {
108-
print("Unable to load image data")
109-
return
110-
}
111-
112-
let resolvedMessage = ResolvedMessage(title: title,
113-
description: description,
114-
image: UIImage(data: imageData),
115-
imageAccessibilityLabel: imageAccessiblityLabel,
116-
buttonText: buttonText,
117-
buttonTwoText: buttonTwoText,
118-
message: message)
119-
120-
DispatchQueue.main.async {
121-
resolvedMessages[index] = resolvedMessage
122-
}
123-
124-
}.resume()
125-
} else {
126-
let resolvedMessage = ResolvedMessage(title: title,
127-
description: description,
128-
image: nil,
129-
imageAccessibilityLabel: nil,
130-
buttonText: buttonText,
131-
buttonTwoText: buttonTwoText,
132-
message: message)
133-
DispatchQueue.main.async {
134-
resolvedMessages[index] = resolvedMessage
135-
group.leave()
136-
}
137-
}
138-
}
139-
140-
}
141-
142-
group.notify(queue: .main) {
143-
let sortedResolvedMessages = resolvedMessages.sorted { $0.key < $1.key }.map { $0.value }
144-
completion(sortedResolvedMessages)
145-
}
146-
}
147-
14846
public func addUpdateListener(_ listener: IterableEmbeddedUpdateDelegate) {
14947
listeners.add(listener)
15048
}
15149

15250
public func removeUpdateListener(_ listener: IterableEmbeddedUpdateDelegate) {
15351
listeners.remove(listener)
15452
}
155-
156-
public func syncMessages(completion: @escaping () -> Void) {
157-
retrieveEmbeddedMessages(completion: completion)
158-
}
15953

16054
public func handleEmbeddedClick(message: IterableEmbeddedMessage, buttonIdentifier: String?, clickedUrl: String) {
16155
if let url = URL(string: clickedUrl) {
@@ -187,7 +81,6 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
18781
let processor = EmbeddedMessagingProcessor(currentMessages: self.messages, fetchedMessages: [:])
18882
self.setMessages(processor)
18983
self.notifyUpdateDelegates(processor)
190-
self.localStorage.embeddedCurrentMessageIds = []
19184
}
19285

19386
private func handleIterableCustomAction(name: String, forMessage message: IterableEmbeddedMessage) {
@@ -237,7 +130,6 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
237130
private var messages: [Int: [IterableEmbeddedMessage]] = [:]
238131
private var listeners: NSHashTable<IterableEmbeddedUpdateDelegate> = NSHashTable(options: [.weakMemory])
239132
private var trackedMessageIds: Set<String> = Set()
240-
private var localStorage: LocalStorageProtocol
241133

242134
private func addForegroundObservers() {
243135
NotificationCenter.default.addObserver(self,
@@ -258,26 +150,16 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
258150
}
259151

260152
private func retrieveEmbeddedMessages(completion: @escaping () -> Void) {
261-
apiClient.getEmbeddedMessages(messages: localStorage.embeddedCurrentMessageIds)
153+
apiClient.getEmbeddedMessages()
262154
.onCompletion(
263155
receiveValue: { embeddedMessagesPayload in
264156
let placements = embeddedMessagesPayload.placements
265-
var embeddedCurrentMessageIds: [String] = []
157+
266158
var fetchedMessagesDict: [Int: [IterableEmbeddedMessage]] = [:]
267159
for placement in placements {
268160
fetchedMessagesDict[placement.placementId!] = placement.embeddedMessages
269161
}
270162

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
281163
let processor = EmbeddedMessagingProcessor(currentMessages: self.messages,
282164
fetchedMessages: fetchedMessagesDict)
283165

@@ -341,3 +223,9 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
341223
}
342224
}
343225
}
226+
227+
extension IterableEmbeddedManager: EmbeddedNotifiable {
228+
public func syncMessages(completion: @escaping () -> Void) {
229+
retrieveEmbeddedMessages(completion: completion)
230+
}
231+
}

swift-sdk/Internal/IterableUserDefaults.swift

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,6 @@ 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-
8173
func getAttributionInfo(currentDate: Date) -> IterableAttributionInfo? {
8274
(try? codable(withKey: .attributionInfo, currentDate: currentDate)) ?? nil
8375
}
@@ -175,10 +167,6 @@ class IterableUserDefaults {
175167
userDefaults.set(string, forKey: key.value)
176168
}
177169

178-
private func save(strings: [String]?, withKey key: UserDefaultsKey) {
179-
userDefaults.set(strings, forKey: key.value)
180-
}
181-
182170
private func save(bool: Bool, withKey key: UserDefaultsKey) {
183171
userDefaults.set(bool, forKey: key.value)
184172
}
@@ -208,7 +196,6 @@ class IterableUserDefaults {
208196
static let deviceId = UserDefaultsKey(value: Const.UserDefault.deviceId)
209197
static let sdkVersion = UserDefaultsKey(value: Const.UserDefault.sdkVersion)
210198
static let offlineMode = UserDefaultsKey(value: Const.UserDefault.offlineMode)
211-
static let embeddedCurrentMessageIds = UserDefaultsKey(value: Const.UserDefault.embeddedCurrentMessageIds)
212199
}
213200

214201
private struct Envelope: Codable {

swift-sdk/Internal/LocalStorage.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,4 @@ 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-
}
131123
}

0 commit comments

Comments
 (0)