Skip to content

Commit

Permalink
Merge pull request #403 from Iterable/offline-events
Browse files Browse the repository at this point in the history
[MOB-2158] - Merge Offline events into master
  • Loading branch information
tapashmajumder committed Oct 5, 2020
2 parents 764eba9 + 6ab7bc9 commit 71480c5
Show file tree
Hide file tree
Showing 61 changed files with 5,624 additions and 525 deletions.
2 changes: 1 addition & 1 deletion Iterable-iOS-SDK.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Pod::Spec.new do |s|
s.source = { :git => "https://github.com/Iterable/swift-sdk.git", :tag => s.version }
s.source_files = "swift-sdk/**/*.{h,m,swift}"

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

s.pod_target_xcconfig = {
'SWIFT_VERSION' => '5.2'
Expand Down
7 changes: 5 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:5.1
// swift-tools-version:5.3

import PackageDescription

Expand All @@ -19,7 +19,10 @@ let package = Package(
],
targets: [
.target(name: "IterableSDK",
path: "swift-sdk"),
path: "swift-sdk",
resources: [
.process("Resources"),
]),
.target(name: "IterableAppExtensions",
path: "notification-extension"),
]
Expand Down
2 changes: 1 addition & 1 deletion host-app/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>UITestApp</string>
<string>$(PRODUCT_NAME)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
Expand Down
336 changes: 328 additions & 8 deletions swift-sdk.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions swift-sdk.xcodeproj/xcshareddata/xcschemes/swift-sdk.xcscheme
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,20 @@
ReferencedContainer = "container:swift-sdk.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "NO"
buildForProfiling = "NO"
buildForArchiving = "NO"
buildForAnalyzing = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ACFD5AB724C8200C008E497A"
BuildableName = "offline-events-tests.xctest"
BlueprintName = "offline-events-tests"
ReferencedContainer = "container:swift-sdk.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
Expand Down Expand Up @@ -137,6 +151,16 @@
ReferencedContainer = "container:swift-sdk.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "ACFD5AB724C8200C008E497A"
BuildableName = "offline-events-tests.xctest"
BlueprintName = "offline-events-tests"
ReferencedContainer = "container:swift-sdk.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
Expand Down
105 changes: 61 additions & 44 deletions swift-sdk/Internal/ApiClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ struct DeviceMetadata: Codable {

class ApiClient {
init(apiKey: String,
authProvider: AuthProvider,
authProvider: AuthProvider?,
endPoint: String,
networkSession: NetworkSessionProtocol,
deviceMetadata: DeviceMetadata) {
Expand Down Expand Up @@ -54,13 +54,14 @@ class ApiClient {

// MARK: - Private

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

return RequestCreator(apiKey: apiKey, auth: authProvider.auth, deviceMetadata: deviceMetadata)
return .success(RequestCreator(apiKey: apiKey, auth: authProvider.auth, deviceMetadata: deviceMetadata))
}


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

extension ApiClient: ApiClientProtocol {
func register(hexToken: String,
appName: String,
deviceId: String,
sdkVersion: String?,
deviceAttributes: [String: String],
pushServicePlatform: String,
notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError> {
send(iterableRequestResult: createRequestCreator().createRegisterTokenRequest(hexToken: hexToken,
appName: appName,
deviceId: deviceId,
sdkVersion: sdkVersion,
deviceAttributes: deviceAttributes,
pushServicePlatform: pushServicePlatform,
notificationsEnabled: notificationsEnabled))
func register(registerTokenInfo: RegisterTokenInfo, notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError> {
let result = createRequestCreator().flatMap { $0.createRegisterTokenRequest(registerTokenInfo: registerTokenInfo,
notificationsEnabled: notificationsEnabled) }
return send(iterableRequestResult: result)
}

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

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

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

func disableDevice(forAllUsers allUsers: Bool, hexToken: String) -> Future<SendRequestValue, SendRequestError> {
send(iterableRequestResult: createRequestCreator().createDisableDeviceRequest(forAllUsers: allUsers, hexToken: hexToken))
let result = createRequestCreator().flatMap { $0.createDisableDeviceRequest(forAllUsers: allUsers,
hexToken: hexToken) }
return send(iterableRequestResult: result)
}

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

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

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

func updateSubscriptions(_ emailListIds: [NSNumber]? = nil,
Expand All @@ -139,40 +141,52 @@ extension ApiClient: ApiClientProtocol {
subscribedMessageTypeIds: [NSNumber]? = nil,
campaignId: NSNumber? = nil,
templateId: NSNumber? = nil) -> Future<SendRequestValue, SendRequestError> {
send(iterableRequestResult: createRequestCreator().createUpdateSubscriptionsRequest(emailListIds,
unsubscribedChannelIds: unsubscribedChannelIds,
unsubscribedMessageTypeIds: unsubscribedMessageTypeIds,
subscribedMessageTypeIds: subscribedMessageTypeIds,
campaignId: campaignId,
templateId: templateId))
let result = createRequestCreator().flatMap { $0.createUpdateSubscriptionsRequest(emailListIds,
unsubscribedChannelIds: unsubscribedChannelIds,
unsubscribedMessageTypeIds: unsubscribedMessageTypeIds,
subscribedMessageTypeIds: subscribedMessageTypeIds,
campaignId: campaignId,
templateId: templateId) }
return send(iterableRequestResult: result)
}

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

func track(inAppClick inAppMessageContext: InAppMessageContext, clickedUrl: String) -> Future<SendRequestValue, SendRequestError> {
send(iterableRequestResult: createRequestCreator().createTrackInAppClickRequest(inAppMessageContext: inAppMessageContext, clickedUrl: clickedUrl))
let result = createRequestCreator().flatMap { $0.createTrackInAppClickRequest(inAppMessageContext: inAppMessageContext,
clickedUrl: clickedUrl) }
return send(iterableRequestResult: result)
}

func track(inAppClose inAppMessageContext: InAppMessageContext, source: InAppCloseSource?, clickedUrl: String?) -> Future<SendRequestValue, SendRequestError> {
send(iterableRequestResult: createRequestCreator().createTrackInAppCloseRequest(inAppMessageContext: inAppMessageContext, source: source, clickedUrl: clickedUrl))
let result = createRequestCreator().flatMap { $0.createTrackInAppCloseRequest(inAppMessageContext: inAppMessageContext,
source: source,
clickedUrl: clickedUrl) }
return send(iterableRequestResult: result)
}

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

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

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

func inAppConsume(inAppMessageContext: InAppMessageContext, source: InAppDeleteSource?) -> Future<SendRequestValue, SendRequestError> {
send(iterableRequestResult: createRequestCreator().createTrackInAppConsumeRequest(inAppMessageContext: inAppMessageContext, source: source))
let result = createRequestCreator().flatMap { $0.createTrackInAppConsumeRequest(inAppMessageContext: inAppMessageContext,
source: source) }
return send(iterableRequestResult: result)
}
}

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

// deprecated - will be removed in version 6.3.x or above
func track(inAppClick messageId: String, clickedUrl: String) -> Future<SendRequestValue, SendRequestError> {
send(iterableRequestResult: createRequestCreator().createTrackInAppClickRequest(messageId, clickedUrl: clickedUrl))
let result = createRequestCreator().flatMap { $0.createTrackInAppClickRequest(messageId,
clickedUrl: clickedUrl) }
return send(iterableRequestResult: result)
}
}
8 changes: 1 addition & 7 deletions swift-sdk/Internal/ApiClientProtocol.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,7 @@
import Foundation

protocol ApiClientProtocol: AnyObject {
func register(hexToken: String,
appName: String,
deviceId: String,
sdkVersion: String?,
deviceAttributes: [String: String],
pushServicePlatform: String,
notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError>
func register(registerTokenInfo: RegisterTokenInfo, notificationsEnabled: Bool) -> Future<SendRequestValue, SendRequestError>

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

Expand Down
2 changes: 2 additions & 0 deletions swift-sdk/Internal/Auth.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,5 @@ struct Auth {
case none
}
}

extension Auth: Codable {}
10 changes: 10 additions & 0 deletions swift-sdk/Internal/ClassExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ extension Array {
}
}

extension Array where Element: Comparable {
func isAscending() -> Bool {
return zip(self, self.dropFirst()).allSatisfy(<=)
}

func isDescending() -> Bool {
return zip(self, self.dropFirst()).allSatisfy(>=)
}
}

extension Dictionary where Key == AnyHashable, Value == Any {
func getValue(for key: JsonKey) -> Any? {
self[key.jsonKey]
Expand Down
Loading

0 comments on commit 71480c5

Please sign in to comment.