5
5
import Foundation
6
6
import UIKit
7
7
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
41
10
}
42
11
43
- class IterableEmbeddedManager : NSObject , IterableEmbeddedManagerProtocol {
12
+ class IterableEmbeddedManager : NSObject , IterableInternalEmbeddedManagerProtocol {
44
13
init ( apiClient: ApiClientProtocol ,
45
14
urlDelegate: IterableURLDelegate ? ,
46
15
customActionDelegate: IterableCustomActionDelegate ? ,
47
16
urlOpener: UrlOpenerProtocol ,
48
- allowedProtocols: [ String ] ,
49
- localStorage: LocalStorageProtocol ) {
17
+ allowedProtocols: [ String ] ) {
50
18
ITBInfo ( )
51
19
52
20
self . apiClient = apiClient
53
21
self . urlDelegate = urlDelegate
54
22
self . customActionDelegate = customActionDelegate
55
23
self . urlOpener = urlOpener
56
24
self . allowedProtocols = allowedProtocols
57
- self . localStorage = localStorage
58
25
59
26
super. init ( )
60
27
addForegroundObservers ( )
@@ -76,86 +43,13 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
76
43
return messages [ placementId] ?? [ ]
77
44
}
78
45
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
-
148
46
public func addUpdateListener( _ listener: IterableEmbeddedUpdateDelegate ) {
149
47
listeners. add ( listener)
150
48
}
151
49
152
50
public func removeUpdateListener( _ listener: IterableEmbeddedUpdateDelegate ) {
153
51
listeners. remove ( listener)
154
52
}
155
-
156
- public func syncMessages( completion: @escaping ( ) -> Void ) {
157
- retrieveEmbeddedMessages ( completion: completion)
158
- }
159
53
160
54
public func handleEmbeddedClick( message: IterableEmbeddedMessage , buttonIdentifier: String ? , clickedUrl: String ) {
161
55
if let url = URL ( string: clickedUrl) {
@@ -187,7 +81,6 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
187
81
let processor = EmbeddedMessagingProcessor ( currentMessages: self . messages, fetchedMessages: [ : ] )
188
82
self . setMessages ( processor)
189
83
self . notifyUpdateDelegates ( processor)
190
- self . localStorage. embeddedCurrentMessageIds = [ ]
191
84
}
192
85
193
86
private func handleIterableCustomAction( name: String , forMessage message: IterableEmbeddedMessage ) {
@@ -237,7 +130,6 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
237
130
private var messages : [ Int : [ IterableEmbeddedMessage ] ] = [ : ]
238
131
private var listeners : NSHashTable < IterableEmbeddedUpdateDelegate > = NSHashTable ( options: [ . weakMemory] )
239
132
private var trackedMessageIds : Set < String > = Set ( )
240
- private var localStorage : LocalStorageProtocol
241
133
242
134
private func addForegroundObservers( ) {
243
135
NotificationCenter . default. addObserver ( self ,
@@ -258,26 +150,16 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
258
150
}
259
151
260
152
private func retrieveEmbeddedMessages( completion: @escaping ( ) -> Void ) {
261
- apiClient. getEmbeddedMessages ( messages : localStorage . embeddedCurrentMessageIds )
153
+ apiClient. getEmbeddedMessages ( )
262
154
. onCompletion (
263
155
receiveValue: { embeddedMessagesPayload in
264
156
let placements = embeddedMessagesPayload. placements
265
- var embeddedCurrentMessageIds : [ String ] = [ ]
157
+
266
158
var fetchedMessagesDict : [ Int : [ IterableEmbeddedMessage ] ] = [ : ]
267
159
for placement in placements {
268
160
fetchedMessagesDict [ placement. placementId!] = placement. embeddedMessages
269
161
}
270
162
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
281
163
let processor = EmbeddedMessagingProcessor ( currentMessages: self . messages,
282
164
fetchedMessages: fetchedMessagesDict)
283
165
@@ -341,3 +223,9 @@ class IterableEmbeddedManager: NSObject, IterableEmbeddedManagerProtocol {
341
223
}
342
224
}
343
225
}
226
+
227
+ extension IterableEmbeddedManager : EmbeddedNotifiable {
228
+ public func syncMessages( completion: @escaping ( ) -> Void ) {
229
+ retrieveEmbeddedMessages ( completion: completion)
230
+ }
231
+ }
0 commit comments