Skip to content

Commit

Permalink
Extends InApp messages callback with show and error trigger
Browse files Browse the repository at this point in the history
  • Loading branch information
Ankmara authored Jun 25, 2024
1 parent 5958f30 commit f0a1ec5
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 5 deletions.
11 changes: 11 additions & 0 deletions Documentation/in-app-messages.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,17 @@ class MyInAppDelegate: InAppMessageActionDelegate {
// On in-app click, the button contains button text and button URL and the interaction is true
// On in-app close, the button is null, and the interaction is false.
}

// Method called when in-app message is shown.
func inAppMessageShown(message: ExponeaSDK.InAppMessage) {
// Here goes your code
}

// Method called when any error occurs while showing in-app message.
func inAppMessageError(message: ExponeaSDK.InAppMessage?, errorMessage: String) {
// Here goes your code
// In-app message could be NULL if error is not related to in-app message.
}
}

```
Expand Down
11 changes: 11 additions & 0 deletions ExponeaSDK/Example/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -168,4 +168,15 @@ class InAppDelegate: InAppMessageActionDelegate {
Exponea.shared.trackInAppMessageClose(message: message, isUserInteraction: false)
}
}

func inAppMessageShown(message: ExponeaSDK.InAppMessage) {
Exponea.logger.log(.verbose, message: "In app message \(message.name) has been shown")
}

func inAppMessageError(message: ExponeaSDK.InAppMessage?, errorMessage: String) {
Exponea.logger.log(
.verbose,
message: "Error occurred '\(errorMessage)' while showing in app message \(message?.name ?? "<no_name>")"
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ final class InAppMessagesManager: InAppMessagesManagerType {
.verbose,
message: "[InApp] Only logging in-app message for control group '\(message.name)'"
)
self.trackInAppMessage(message)
self.trackInAppMessageShown(message)
callback?(nil)
} else {
self.showInAppMessage(message, callback: callback)
Expand Down Expand Up @@ -188,7 +188,7 @@ final class InAppMessagesManager: InAppMessagesManagerType {
.verbose,
message: "[InApp] Only logging in-app message for control group '\(message.name)'"
)
self.trackInAppMessage(message)
self.trackInAppMessageShown(message)
callback?(nil)
return
}
Expand Down Expand Up @@ -249,20 +249,29 @@ final class InAppMessagesManager: InAppMessagesManagerType {
},
presentedCallback: { presented, error in
if presented == nil && error != nil {
self.trackingConsentManager.trackInAppMessageError(message: message, error: error!, mode: .CONSIDER_CONSENT)
self.trackInAppMessageError(message, error!)
} else if presented != nil {
self.trackInAppMessage(message)
self.trackInAppMessageShown(message)
}
callback?(presented)
}
)
}

private func trackInAppMessageError(
_ message: InAppMessage,
_ error: String
) {
self.trackingConsentManager.trackInAppMessageError(message: message, error: error, mode: .CONSIDER_CONSENT)
Exponea.shared.inAppMessagesDelegate.inAppMessageError(message: message, errorMessage: error)
}

private func trackInAppMessage(
private func trackInAppMessageShown(
_ message: InAppMessage
) {
displayStatusStore.didDisplay(message, at: Date())
trackingConsentManager.trackInAppMessageShown(message: message, mode: .CONSIDER_CONSENT)
Exponea.shared.inAppMessagesDelegate.inAppMessageShown(message: message)
Exponea.shared.telemetryManager?.report(
eventWithType: .showInAppMessage,
properties: ["messageType": message.rawMessageType ?? "null"]
Expand Down Expand Up @@ -501,6 +510,8 @@ public protocol InAppMessageActionDelegate: AnyObject {
button: InAppMessageButton?,
interaction: Bool
)
func inAppMessageShown(message: InAppMessage)
func inAppMessageError(message: InAppMessage?, errorMessage: String)
}

public struct InAppMessageButton: Codable {
Expand All @@ -513,4 +524,6 @@ public class DefaultInAppDelegate: InAppMessageActionDelegate {
public let trackActions = true

public func inAppMessageAction(with message: InAppMessage, button: InAppMessageButton?, interaction: Bool) {}
public func inAppMessageShown(message: InAppMessage) {}
public func inAppMessageError(message: InAppMessage?, errorMessage: String) {}
}
10 changes: 10 additions & 0 deletions ExponeaSDK/ExponeaSDKTests/Mocking/InAppMessageDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ class InAppMessageDelegate: InAppMessageActionDelegate {
let overrideDefaultBehavior: Bool
let trackActions: Bool
var inAppMessageActionCalled: Bool = false
var inAppMessageShownCalled: Bool = false
var inAppMessageErrorCalled: Bool = false
var trackClickInActionCallback: Bool = false
var inAppMessageManager: InAppMessagesManager?
var trackingConsentManager: TrackingConsentManagerType?
Expand Down Expand Up @@ -46,4 +48,12 @@ class InAppMessageDelegate: InAppMessageActionDelegate {
}
}
}

func inAppMessageShown(message: ExponeaSDK.InAppMessage) {
inAppMessageShownCalled = true
}

func inAppMessageError(message: ExponeaSDK.InAppMessage?, errorMessage: String) {
inAppMessageErrorCalled = true
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,100 @@ class InAppMessagesManagerSpec: QuickSpec {
]))
expect(inAppDelegate.inAppMessageActionCalled).to(equal(true))
}

it("should track show event when delegate is setup without tracking") {
let inAppDelegate = InAppMessageDelegate(
overrideDefaultBehavior: false,
trackActions: false,
trackingConsentManager: trackingConsentManager
)
Exponea.shared.inAppMessagesDelegate = inAppDelegate
waitUntil(timeout: .seconds(5)) { done in manager.showInAppMessage(
for: [.eventType("session_start")]
) { _ in done() } }
expect(trackingManager.trackedInappEvents).to(equal([
MockTrackingManager.CallData(
event: .show,
message: SampleInAppMessage.getSampleInAppMessage()
)
]))
expect(inAppDelegate.inAppMessageShownCalled).to(equal(true))
}

it("should track show event when delegate is setup with custom behaviour") {
let inAppDelegate = InAppMessageDelegate(
overrideDefaultBehavior: true,
trackActions: false,
trackingConsentManager: trackingConsentManager
)
Exponea.shared.inAppMessagesDelegate = inAppDelegate
waitUntil(timeout: .seconds(5)) { done in manager.showInAppMessage(
for: [.eventType("session_start")]
) { _ in done() } }
expect(trackingManager.trackedInappEvents).to(equal([
MockTrackingManager.CallData(
event: .show,
message: SampleInAppMessage.getSampleInAppMessage()
)
]))
expect(inAppDelegate.inAppMessageShownCalled).to(equal(true))
}

it("should track error event when delegate is setup without tracking") {
let inAppDelegate = InAppMessageDelegate(
overrideDefaultBehavior: false,
trackActions: false,
trackingConsentManager: trackingConsentManager
)
Exponea.shared.inAppMessagesDelegate = inAppDelegate
var alreadyDone = false
waitUntil(timeout: .seconds(5)) { done in
manager.showInAppMessage(for: [.eventType("session_start")]) { _ in
if alreadyDone {
return
}
alreadyDone = true
done()
}
}
trackingManager.trackedInappEvents.removeAll()
presenter.presentedMessages[0].presentedCallback!(nil, "Error occured")
expect(trackingManager.trackedInappEvents).to(equal([
MockTrackingManager.CallData(
event: .error(message: "Error occured"),
message: SampleInAppMessage.getSampleInAppMessage()
)
]))
expect(inAppDelegate.inAppMessageErrorCalled).to(equal(true))
}

it("should track error event when delegate is setup with custom behaviour") {
let inAppDelegate = InAppMessageDelegate(
overrideDefaultBehavior: true,
trackActions: false,
trackingConsentManager: trackingConsentManager
)
Exponea.shared.inAppMessagesDelegate = inAppDelegate
var alreadyDone = false
waitUntil(timeout: .seconds(5)) { done in
manager.showInAppMessage(for: [.eventType("session_start")]) { _ in
if alreadyDone {
return
}
alreadyDone = true
done()
}
}
trackingManager.trackedInappEvents.removeAll()
presenter.presentedMessages[0].presentedCallback!(nil, "Error occured")
expect(trackingManager.trackedInappEvents).to(equal([
MockTrackingManager.CallData(
event: .error(message: "Error occured"),
message: SampleInAppMessage.getSampleInAppMessage()
)
]))
expect(inAppDelegate.inAppMessageErrorCalled).to(equal(true))
}
}

context("default action performing") {
Expand Down

0 comments on commit f0a1ec5

Please sign in to comment.