Skip to content

Commit 71480c5

Browse files
Merge pull request #403 from Iterable/offline-events
[MOB-2158] - Merge Offline events into master
2 parents 764eba9 + 6ab7bc9 commit 71480c5

File tree

61 files changed

+5624
-525
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+5624
-525
lines changed

Iterable-iOS-SDK.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Pod::Spec.new do |s|
1818
s.source = { :git => "https://github.com/Iterable/swift-sdk.git", :tag => s.version }
1919
s.source_files = "swift-sdk/**/*.{h,m,swift}"
2020

21-
s.resource_bundles = {'Iterable-iOS-SDK' => 'swift-sdk/Resources/**/*.{storyboard,xib,xcassets}' }
21+
s.resource_bundles = {'Iterable-iOS-SDK' => 'swift-sdk/Resources/**/*.{storyboard,xib,xcassets,xcdatamodeld}' }
2222

2323
s.pod_target_xcconfig = {
2424
'SWIFT_VERSION' => '5.2'

Package.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version:5.1
1+
// swift-tools-version:5.3
22

33
import PackageDescription
44

@@ -19,7 +19,10 @@ let package = Package(
1919
],
2020
targets: [
2121
.target(name: "IterableSDK",
22-
path: "swift-sdk"),
22+
path: "swift-sdk",
23+
resources: [
24+
.process("Resources"),
25+
]),
2326
.target(name: "IterableAppExtensions",
2427
path: "notification-extension"),
2528
]

host-app/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<key>CFBundleDevelopmentRegion</key>
66
<string>$(DEVELOPMENT_LANGUAGE)</string>
77
<key>CFBundleDisplayName</key>
8-
<string>UITestApp</string>
8+
<string>$(PRODUCT_NAME)</string>
99
<key>CFBundleExecutable</key>
1010
<string>$(EXECUTABLE_NAME)</string>
1111
<key>CFBundleIdentifier</key>

swift-sdk.xcodeproj/project.pbxproj

Lines changed: 328 additions & 8 deletions
Large diffs are not rendered by default.

swift-sdk.xcodeproj/xcshareddata/xcschemes/swift-sdk.xcscheme

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,20 @@
6262
ReferencedContainer = "container:swift-sdk.xcodeproj">
6363
</BuildableReference>
6464
</BuildActionEntry>
65+
<BuildActionEntry
66+
buildForTesting = "YES"
67+
buildForRunning = "NO"
68+
buildForProfiling = "NO"
69+
buildForArchiving = "NO"
70+
buildForAnalyzing = "NO">
71+
<BuildableReference
72+
BuildableIdentifier = "primary"
73+
BlueprintIdentifier = "ACFD5AB724C8200C008E497A"
74+
BuildableName = "offline-events-tests.xctest"
75+
BlueprintName = "offline-events-tests"
76+
ReferencedContainer = "container:swift-sdk.xcodeproj">
77+
</BuildableReference>
78+
</BuildActionEntry>
6579
</BuildActionEntries>
6680
</BuildAction>
6781
<TestAction
@@ -137,6 +151,16 @@
137151
ReferencedContainer = "container:swift-sdk.xcodeproj">
138152
</BuildableReference>
139153
</TestableReference>
154+
<TestableReference
155+
skipped = "NO">
156+
<BuildableReference
157+
BuildableIdentifier = "primary"
158+
BlueprintIdentifier = "ACFD5AB724C8200C008E497A"
159+
BuildableName = "offline-events-tests.xctest"
160+
BlueprintName = "offline-events-tests"
161+
ReferencedContainer = "container:swift-sdk.xcodeproj">
162+
</BuildableReference>
163+
</TestableReference>
140164
</Testables>
141165
</TestAction>
142166
<LaunchAction

swift-sdk/Internal/ApiClient.swift

Lines changed: 61 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct DeviceMetadata: Codable {
1515

1616
class ApiClient {
1717
init(apiKey: String,
18-
authProvider: AuthProvider,
18+
authProvider: AuthProvider?,
1919
endPoint: String,
2020
networkSession: NetworkSessionProtocol,
2121
deviceMetadata: DeviceMetadata) {
@@ -54,13 +54,14 @@ class ApiClient {
5454

5555
// MARK: - Private
5656

57-
private func createRequestCreator() -> RequestCreator {
57+
private func createRequestCreator() -> Result<RequestCreator, IterableError> {
5858
guard let authProvider = authProvider else {
59-
fatalError("authProvider is missing")
59+
return .failure(IterableError.general(description: "authProvider is missing"))
6060
}
6161

62-
return RequestCreator(apiKey: apiKey, auth: authProvider.auth, deviceMetadata: deviceMetadata)
62+
return .success(RequestCreator(apiKey: apiKey, auth: authProvider.auth, deviceMetadata: deviceMetadata))
6363
}
64+
6465

6566
private func createIterableHeaders() -> [String: String] {
6667
var headers = [JsonKey.contentType.jsonKey: JsonValue.applicationJson.jsonStringValue,
@@ -85,52 +86,53 @@ class ApiClient {
8586
// MARK: - API REQUEST CALLS
8687

8788
extension ApiClient: ApiClientProtocol {
88-
func register(hexToken: String,
89-
appName: String,
90-
deviceId: String,
91-
sdkVersion: String?,
92-
deviceAttributes: [String: String],
93-
pushServicePlatform: String,
94-
notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError> {
95-
send(iterableRequestResult: createRequestCreator().createRegisterTokenRequest(hexToken: hexToken,
96-
appName: appName,
97-
deviceId: deviceId,
98-
sdkVersion: sdkVersion,
99-
deviceAttributes: deviceAttributes,
100-
pushServicePlatform: pushServicePlatform,
101-
notificationsEnabled: notificationsEnabled))
89+
func register(registerTokenInfo: RegisterTokenInfo, notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError> {
90+
let result = createRequestCreator().flatMap { $0.createRegisterTokenRequest(registerTokenInfo: registerTokenInfo,
91+
notificationsEnabled: notificationsEnabled) }
92+
return send(iterableRequestResult: result)
10293
}
10394

10495
func updateUser(_ dataFields: [AnyHashable: Any], mergeNestedObjects: Bool) -> Future<SendRequestValue, SendRequestError> {
105-
send(iterableRequestResult: createRequestCreator().createUpdateUserRequest(dataFields: dataFields, mergeNestedObjects: mergeNestedObjects))
96+
let result = createRequestCreator().flatMap { $0.createUpdateUserRequest(dataFields: dataFields,
97+
mergeNestedObjects: mergeNestedObjects) }
98+
return send(iterableRequestResult: result)
10699
}
107100

108101
func updateEmail(newEmail: String) -> Future<SendRequestValue, SendRequestError> {
109-
send(iterableRequestResult: createRequestCreator().createUpdateEmailRequest(newEmail: newEmail))
102+
let result = createRequestCreator().flatMap { $0.createUpdateEmailRequest(newEmail: newEmail) }
103+
return send(iterableRequestResult: result)
110104
}
111105

112106
func getInAppMessages(_ count: NSNumber) -> Future<SendRequestValue, SendRequestError> {
113-
send(iterableRequestResult: createRequestCreator().createGetInAppMessagesRequest(count))
107+
let result = createRequestCreator().flatMap { $0.createGetInAppMessagesRequest(count) }
108+
return send(iterableRequestResult: result)
114109
}
115110

116111
func disableDevice(forAllUsers allUsers: Bool, hexToken: String) -> Future<SendRequestValue, SendRequestError> {
117-
send(iterableRequestResult: createRequestCreator().createDisableDeviceRequest(forAllUsers: allUsers, hexToken: hexToken))
112+
let result = createRequestCreator().flatMap { $0.createDisableDeviceRequest(forAllUsers: allUsers,
113+
hexToken: hexToken) }
114+
return send(iterableRequestResult: result)
118115
}
119116

120117
func track(purchase total: NSNumber, items: [CommerceItem], dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
121-
send(iterableRequestResult: createRequestCreator().createTrackPurchaseRequest(total, items: items, dataFields: dataFields))
118+
let result = createRequestCreator().flatMap { $0.createTrackPurchaseRequest(total, items: items,
119+
dataFields: dataFields) }
120+
return send(iterableRequestResult: result)
122121
}
123122

124123
func track(pushOpen campaignId: NSNumber, templateId: NSNumber?, messageId: String, appAlreadyRunning: Bool, dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
125-
send(iterableRequestResult: createRequestCreator().createTrackPushOpenRequest(campaignId,
126-
templateId: templateId,
127-
messageId: messageId,
128-
appAlreadyRunning: appAlreadyRunning,
129-
dataFields: dataFields))
124+
let result = createRequestCreator().flatMap { $0.createTrackPushOpenRequest(campaignId,
125+
templateId: templateId,
126+
messageId: messageId,
127+
appAlreadyRunning: appAlreadyRunning,
128+
dataFields: dataFields) }
129+
return send(iterableRequestResult: result)
130130
}
131131

132132
func track(event eventName: String, dataFields: [AnyHashable: Any]?) -> Future<SendRequestValue, SendRequestError> {
133-
send(iterableRequestResult: createRequestCreator().createTrackEventRequest(eventName, dataFields: dataFields))
133+
let result = createRequestCreator().flatMap { $0.createTrackEventRequest(eventName,
134+
dataFields: dataFields) }
135+
return send(iterableRequestResult: result)
134136
}
135137

136138
func updateSubscriptions(_ emailListIds: [NSNumber]? = nil,
@@ -139,40 +141,52 @@ extension ApiClient: ApiClientProtocol {
139141
subscribedMessageTypeIds: [NSNumber]? = nil,
140142
campaignId: NSNumber? = nil,
141143
templateId: NSNumber? = nil) -> Future<SendRequestValue, SendRequestError> {
142-
send(iterableRequestResult: createRequestCreator().createUpdateSubscriptionsRequest(emailListIds,
143-
unsubscribedChannelIds: unsubscribedChannelIds,
144-
unsubscribedMessageTypeIds: unsubscribedMessageTypeIds,
145-
subscribedMessageTypeIds: subscribedMessageTypeIds,
146-
campaignId: campaignId,
147-
templateId: templateId))
144+
let result = createRequestCreator().flatMap { $0.createUpdateSubscriptionsRequest(emailListIds,
145+
unsubscribedChannelIds: unsubscribedChannelIds,
146+
unsubscribedMessageTypeIds: unsubscribedMessageTypeIds,
147+
subscribedMessageTypeIds: subscribedMessageTypeIds,
148+
campaignId: campaignId,
149+
templateId: templateId) }
150+
return send(iterableRequestResult: result)
148151
}
149152

150153
func track(inAppOpen inAppMessageContext: InAppMessageContext) -> Future<SendRequestValue, SendRequestError> {
151-
send(iterableRequestResult: createRequestCreator().createTrackInAppOpenRequest(inAppMessageContext: inAppMessageContext))
154+
let result = createRequestCreator().flatMap { $0.createTrackInAppOpenRequest(inAppMessageContext: inAppMessageContext) }
155+
return send(iterableRequestResult: result)
152156
}
153157

154158
func track(inAppClick inAppMessageContext: InAppMessageContext, clickedUrl: String) -> Future<SendRequestValue, SendRequestError> {
155-
send(iterableRequestResult: createRequestCreator().createTrackInAppClickRequest(inAppMessageContext: inAppMessageContext, clickedUrl: clickedUrl))
159+
let result = createRequestCreator().flatMap { $0.createTrackInAppClickRequest(inAppMessageContext: inAppMessageContext,
160+
clickedUrl: clickedUrl) }
161+
return send(iterableRequestResult: result)
156162
}
157163

158164
func track(inAppClose inAppMessageContext: InAppMessageContext, source: InAppCloseSource?, clickedUrl: String?) -> Future<SendRequestValue, SendRequestError> {
159-
send(iterableRequestResult: createRequestCreator().createTrackInAppCloseRequest(inAppMessageContext: inAppMessageContext, source: source, clickedUrl: clickedUrl))
165+
let result = createRequestCreator().flatMap { $0.createTrackInAppCloseRequest(inAppMessageContext: inAppMessageContext,
166+
source: source,
167+
clickedUrl: clickedUrl) }
168+
return send(iterableRequestResult: result)
160169
}
161170

162171
func track(inAppDelivery inAppMessageContext: InAppMessageContext) -> Future<SendRequestValue, SendRequestError> {
163-
send(iterableRequestResult: createRequestCreator().createTrackInAppDeliveryRequest(inAppMessageContext: inAppMessageContext))
172+
let result = createRequestCreator().flatMap { $0.createTrackInAppDeliveryRequest(inAppMessageContext: inAppMessageContext) }
173+
return send(iterableRequestResult: result)
164174
}
165175

166176
func track(inboxSession: IterableInboxSession) -> Future<SendRequestValue, SendRequestError> {
167-
send(iterableRequestResult: createRequestCreator().createTrackInboxSessionRequest(inboxSession: inboxSession))
177+
let result = createRequestCreator().flatMap { $0.createTrackInboxSessionRequest(inboxSession: inboxSession) }
178+
return send(iterableRequestResult: result)
168179
}
169180

170181
func inAppConsume(messageId: String) -> Future<SendRequestValue, SendRequestError> {
171-
send(iterableRequestResult: createRequestCreator().createInAppConsumeRequest(messageId))
182+
let result = createRequestCreator().flatMap { $0.createInAppConsumeRequest(messageId) }
183+
return send(iterableRequestResult: result)
172184
}
173185

174186
func inAppConsume(inAppMessageContext: InAppMessageContext, source: InAppDeleteSource?) -> Future<SendRequestValue, SendRequestError> {
175-
send(iterableRequestResult: createRequestCreator().createTrackInAppConsumeRequest(inAppMessageContext: inAppMessageContext, source: source))
187+
let result = createRequestCreator().flatMap { $0.createTrackInAppConsumeRequest(inAppMessageContext: inAppMessageContext,
188+
source: source) }
189+
return send(iterableRequestResult: result)
176190
}
177191
}
178192

@@ -181,11 +195,14 @@ extension ApiClient: ApiClientProtocol {
181195
extension ApiClient {
182196
// deprecated - will be removed in version 6.3.x or above
183197
func track(inAppOpen messageId: String) -> Future<SendRequestValue, SendRequestError> {
184-
send(iterableRequestResult: createRequestCreator().createTrackInAppOpenRequest(messageId))
198+
let value = createRequestCreator().flatMap { $0.createTrackInAppOpenRequest(messageId) }
199+
return send(iterableRequestResult: value)
185200
}
186201

187202
// deprecated - will be removed in version 6.3.x or above
188203
func track(inAppClick messageId: String, clickedUrl: String) -> Future<SendRequestValue, SendRequestError> {
189-
send(iterableRequestResult: createRequestCreator().createTrackInAppClickRequest(messageId, clickedUrl: clickedUrl))
204+
let result = createRequestCreator().flatMap { $0.createTrackInAppClickRequest(messageId,
205+
clickedUrl: clickedUrl) }
206+
return send(iterableRequestResult: result)
190207
}
191208
}

swift-sdk/Internal/ApiClientProtocol.swift

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,7 @@
66
import Foundation
77

88
protocol ApiClientProtocol: AnyObject {
9-
func register(hexToken: String,
10-
appName: String,
11-
deviceId: String,
12-
sdkVersion: String?,
13-
deviceAttributes: [String: String],
14-
pushServicePlatform: String,
15-
notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError>
9+
func register(registerTokenInfo: RegisterTokenInfo, notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError>
1610

1711
func updateUser(_ dataFields: [AnyHashable: Any], mergeNestedObjects: Bool) -> Future<SendRequestValue, SendRequestError>
1812

swift-sdk/Internal/Auth.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,5 @@ struct Auth {
3030
case none
3131
}
3232
}
33+
34+
extension Auth: Codable {}

swift-sdk/Internal/ClassExtensions.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@ extension Array {
1414
}
1515
}
1616

17+
extension Array where Element: Comparable {
18+
func isAscending() -> Bool {
19+
return zip(self, self.dropFirst()).allSatisfy(<=)
20+
}
21+
22+
func isDescending() -> Bool {
23+
return zip(self, self.dropFirst()).allSatisfy(>=)
24+
}
25+
}
26+
1727
extension Dictionary where Key == AnyHashable, Value == Any {
1828
func getValue(for key: JsonKey) -> Any? {
1929
self[key.jsonKey]

0 commit comments

Comments
 (0)