Skip to content

Commit 02cfafe

Browse files
committed
feat: Implement Rokt event handling in iOS Flutter wrapper SDK
Signed-off-by: Thomson Thomas <thomson.thomas@rokt.com>
1 parent 559b50e commit 02cfafe

2 files changed

Lines changed: 111 additions & 1 deletion

File tree

ios/Classes/RoktEventHandler.swift

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
//
2+
// RoktEventHandler.swift
3+
// rokt_sdk
4+
//
5+
// Copyright 2020 Rokt Pte Ltd
6+
//
7+
// Licensed under the Rokt Software Development Kit (SDK) Terms of Use
8+
// Version 2.0 (the "License");
9+
//
10+
// You may not use this file except in compliance with the License.
11+
//
12+
// You may obtain a copy of the License at https://rokt.com/sdk-license-2-0/
13+
14+
import Foundation
15+
import Flutter
16+
import mParticle_Apple_SDK
17+
18+
class RoktEventHandler: NSObject, FlutterStreamHandler {
19+
20+
private var eventListeners: [String: [FlutterEventSink]] = [:]
21+
private let EVENT_CHANNEL_NAME = "MPRoktEvents"
22+
23+
init(messenger: FlutterBinaryMessenger) {
24+
super.init()
25+
setupEventChannel(messenger: messenger)
26+
}
27+
28+
private func setupEventChannel(messenger: FlutterBinaryMessenger) {
29+
let eventChannel = FlutterEventChannel(name: EVENT_CHANNEL_NAME, binaryMessenger: messenger)
30+
eventChannel.setStreamHandler(self)
31+
}
32+
33+
func onListen(withArguments arguments: Any?, eventSink: @escaping FlutterEventSink) -> FlutterError? {
34+
let key = String(describing: arguments ?? "nil")
35+
var sinks = eventListeners[key] ?? []
36+
sinks.append(eventSink)
37+
eventListeners[key] = sinks
38+
return nil
39+
}
40+
41+
func onCancel(withArguments arguments: Any?) -> FlutterError? {
42+
let key = String(describing: arguments ?? "nil")
43+
if var sinks = eventListeners[key], !sinks.isEmpty {
44+
sinks.removeLast()
45+
if sinks.isEmpty {
46+
eventListeners.removeValue(forKey: key)
47+
} else {
48+
eventListeners[key] = sinks
49+
}
50+
}
51+
return nil
52+
}
53+
54+
55+
func subscribeToEvents(identifier: String) {
56+
MParticle.sharedInstance().rokt.events(identifier) { event in
57+
var params: [String: String] = [:]
58+
59+
params["event"] = String(describing: type(of: event)).replacingOccurrences(of: "MPRokt", with: "").replacingOccurrences(of: "Event", with: "")
60+
params["identifier"] = identifier
61+
62+
if let placementId = event.roktPlacementId {
63+
params["placementId"] = placementId
64+
}
65+
66+
switch event {
67+
case let initCompleteEvent as MPRoktInitCompleteEvent:
68+
params["status"] = initCompleteEvent.success ? "true" : "false"
69+
case let openUrlEvent as MPRoktOpenUrlEvent:
70+
params["url"] = openUrlEvent.url
71+
case let cartItemInstantPurchaseEvent as MPRoktCartItemInstantPurchaseEvent:
72+
params["cartItemId"] = cartItemInstantPurchaseEvent.cartItemId
73+
params["catalogItemId"] = cartItemInstantPurchaseEvent.catalogItemId
74+
params["currency"] = cartItemInstantPurchaseEvent.currency
75+
params["description"] = cartItemInstantPurchaseEvent.cartItemDescription
76+
params["linkedProductId"] = cartItemInstantPurchaseEvent.linkedProductId
77+
params["totalPrice"] = cartItemInstantPurchaseEvent.totalPrice.stringValue
78+
params["quantity"] = cartItemInstantPurchaseEvent.quantity.stringValue
79+
params["unitPrice"] = cartItemInstantPurchaseEvent.unitPrice.stringValue
80+
default:
81+
break
82+
}
83+
84+
eventListeners.values.joined().forEach { listener in
85+
listener(params)
86+
}
87+
}
88+
}
89+
}
90+
91+
private extension MPRoktEvent {
92+
var roktPlacementId: String? {
93+
switch self {
94+
case let event as MPRokt.FirstPositiveEngagement: return event.placementId
95+
case let event as MPRokt.OfferEngagement: return event.placementId
96+
case let event as MPRokt.PlacementClosed: return event.placementId
97+
case let event as MPRokt.PlacementCompleted: return event.placementId
98+
case let event as MPRokt.PlacementFailure: return event.placementId
99+
case let event as MPRokt.PlacementInteractive: return event.placementId
100+
case let event as MPRokt.PlacementReady: return event.placementId
101+
case let event as MPRokt.PositiveEngagement: return event.placementId
102+
case let event as MPRokt.OpenUrl: return event.placementId
103+
case let event as MPRokt.CartItemInstantPurchase: return event.placementId
104+
default: return nil
105+
}
106+
}
107+
}

ios/Classes/SwiftMparticleFlutterSdkPlugin.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ public class SwiftMparticleFlutterSdkPlugin: NSObject, FlutterPlugin {
88
let roktLayoutFactory: RoktLayoutFactory
99
let channel: FlutterMethodChannel
1010
let registrar: FlutterPluginRegistrar
11+
private let roktEventHandler: RoktEventHandler
1112

1213
init(messenger: FlutterBinaryMessenger, registrar: FlutterPluginRegistrar) {
1314
self.roktLayoutFactory = RoktLayoutFactory(messenger: messenger)
1415
self.registrar = registrar
1516
self.channel = FlutterMethodChannel(name: "mparticle_flutter_sdk", binaryMessenger: messenger)
17+
self.roktEventHandler = RoktEventHandler(messenger: messenger)
1618
}
1719

1820
public static func register(with registrar: FlutterPluginRegistrar) {
@@ -537,7 +539,8 @@ public class SwiftMparticleFlutterSdkPlugin: NSObject, FlutterPlugin {
537539
registerPartnerFonts(typefaces)
538540
}
539541

540-
MParticle.sharedInstance().rokt.selectPlacements(placementId, attributes: attributes, placements: placeholders, config: roktConfig, callbacks: callback)
542+
roktEventHandler.subscribeToEvents(identifier: placementId)
543+
MParticle.sharedInstance().rokt.selectPlacements(placementId, attributes: attributes, embeddedViews: placeholders, config: roktConfig, callbacks: callback)
541544
result(true)
542545
} else {
543546
print("Incorrect argument for \(call.method) iOS method")

0 commit comments

Comments
 (0)