Skip to content

Commit 2852a67

Browse files
fix: read AppGroup ID from configure function (RMCCX-9504)
1 parent 9e0588b commit 2852a67

11 files changed

Lines changed: 50 additions & 36 deletions

File tree

Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ EXTERNAL SOURCES:
3838
SPEC CHECKSUMS:
3939
Nimble: b279b3ca9e094508778aab5c76417be158d3ad04
4040
Quick: 749aa754fd1e7d984f2000fe051e18a3a9809179
41-
RSDKUtils: 5ea71ba3d42b66fb3ae8934161acdbeb275a3d59
41+
RSDKUtils: 3d8215bd4579b42974c676979aee5fd2a90adb1a
4242
SwiftLint: 3fe909719babe5537c552ee8181c0031392be933
4343

4444
PODFILE CHECKSUM: 9e64d5c93a55bc21549225402cc5218dd558e1db
4545

46-
COCOAPODS: 1.15.2
46+
COCOAPODS: 1.16.2

Sample/EventLogger/EventLoggerView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ struct EventLoggerView: View {
4747
init(interactor: EventLogging) {
4848
self.interactor = interactor
4949
let appConfig = interactor.getConfiguration()
50-
REventLogger.shared.configure(apiKey: appConfig.apiKey, apiUrl: appConfig.apiEndpoint)
50+
REventLogger.shared.configure(apiKey: appConfig.apiKey, apiUrl: appConfig.apiEndpoint, appGroupId: nil)
5151
}
5252

5353
var body: some View {

Sources/REventLogger/DataStorage/REventsStorage.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import Foundation
22

33
#if SWIFT_PACKAGE
44
import class RSDKUtilsMain.AtomicGetSet
5-
#else
6-
import class RSDKUtils.AtomicGetSet
75
#endif
86

97
protocol REventDataCacheable {

Sources/REventLogger/DependencyManager/DependencyManager.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import Foundation
2-
#if canImport(RSDKUtils)
3-
import RSDKUtils // Cocoapods version
4-
#else
2+
#if canImport(RSDKUtilsMain)
53
import RSDKUtilsMain
64
#endif
75

@@ -10,7 +8,7 @@ internal enum MainContainerFactory {
108

119
private typealias ContainerElement = TypedDependencyManager.ContainerElement
1210

13-
static func create(dependencyManager manager: TypedDependencyManager) -> TypedDependencyManager.Container {
11+
static func create(dependencyManager manager: TypedDependencyManager, appGroupId: String?) -> TypedDependencyManager.Container {
1412

1513
let elements = [
1614
ContainerElement(type: NetworkManager.self, factory: {
@@ -20,12 +18,20 @@ internal enum MainContainerFactory {
2018
REventLoggerSender(networkManager: manager.resolve(type: NetworkManager.self )!)
2119
}),
2220
ContainerElement(type: REventDataCacheable.self, factory: {
23-
REventsStorage(userDefaults: UserDefaults(suiteName: "group." + REventLoggerEnvironment().appId) ?? UserDefaults.standard)
21+
var userDefaults = UserDefaults.standard
22+
if let appGroupId,
23+
let sharedUserdefaults = UserDefaults(suiteName: appGroupId) {
24+
userDefaults = sharedUserdefaults
25+
}
26+
return REventsStorage(userDefaults: userDefaults)
2427
}),
2528
ContainerElement(type: REventExpirationCacheable.self, factory: { EventLoggerCache(ttlStorage: UserDefaults.standard)
2629
}),
2730
ContainerElement(type: AppLifeCycleListener.self, factory: {
2831
AppLifeCycleManager()
32+
}),
33+
ContainerElement(type: REventLoggerEnvironment.self, factory: {
34+
REventLoggerEnvironment()
2935
})
3036
]
3137
return TypedDependencyManager.Container(elements)

Sources/REventLogger/EventLoggerModule.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
11
import Foundation
22

3-
#if SWIFT_PACKAGE
4-
import RSDKUtilsMain
5-
#else
6-
import RSDKUtils
7-
#endif
8-
93
final class REventLoggerModule {
104
private let eventsStorage: REventDataCacheable
115
private let eventsSender: REventLoggerSendable
126
private let eventsCache: REventExpirationCacheable
137
private var appLifeCycleListener: AppLifeCycleListener
8+
private let appBundle: REventLoggerEnvironment
149
private let loggerQueue = DispatchQueue(label: "eventLogger", qos: .utility)
1510

1611
init(eventsStorage: REventDataCacheable,
1712
eventsSender: REventLoggerSendable,
1813
eventsCache: REventExpirationCacheable,
19-
appLifeCycleListener: AppLifeCycleListener) {
14+
appLifeCycleListener: AppLifeCycleListener,
15+
appBundle: REventLoggerEnvironment) {
2016
self.eventsStorage = eventsStorage
2117
self.eventsSender = eventsSender
2218
self.eventsCache = eventsCache
2319
self.appLifeCycleListener = appLifeCycleListener
20+
self.appBundle = appBundle
2421
self.appLifeCycleListener.appBecameActiveObserver = { [weak self] in
2522
self?.checkEventsExpirationAndStorage()
2623
}
@@ -45,20 +42,25 @@ final class REventLoggerModule {
4542
var isNewEvent = true
4643

4744
loggerQueue.async { [weak self] in
45+
guard let self else { return }
4846
var event = REvent(eventType,
4947
sourceName: sourceName,
5048
sourceVersion: sourceVersion,
5149
errorCode: errorCode,
5250
errorMessage: errorMessage,
5351
info: info)
5452
let eventId = event.eventId
55-
if let storedEvent = self?.eventsStorage.retrieveEvent(eventId) {
53+
if let storedEvent = self.eventsStorage.retrieveEvent(eventId) {
5654
isNewEvent = false
5755
event = storedEvent
5856
event.updateOccurrenceCount()
5957
}
60-
self?.eventsStorage.insertOrUpdateEvent(eventId, event: event)
61-
self?.sendEventIfNeeded(eventType, eventId, event, isNewEvent, completion)
58+
self.eventsStorage.insertOrUpdateEvent(eventId, event: event)
59+
// Don't send events if it's app extension
60+
guard !self.appBundle.isAppExtension else {
61+
return
62+
}
63+
self.sendEventIfNeeded(eventType, eventId, event, isNewEvent, completion)
6264
}
6365
}
6466

Sources/REventLogger/REventLogger.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import Foundation
22

3-
#if canImport(RSDKUtils)
4-
import RSDKUtils // Cocoapods version
5-
#else
3+
#if canImport(RSDKUtilsMain)
64
import RSDKUtilsMain
75
#endif
86

97
struct EventLoggerConfiguration {
108
let apiKey: String
119
let apiUrl: String
10+
let appGroupId: String?
1211
}
1312

1413
/// Event Logger that sends the custom events to the Event Logger Service
@@ -30,6 +29,7 @@ public final class REventLogger {
3029
/// - apiUrl: a API Endpoint
3130
public func configure(apiKey: String?,
3231
apiUrl: String?,
32+
appGroupId: String?,
3333
onCompletion: ((Bool, String) -> Void)? = nil) {
3434
guard configuration == nil else {
3535
Logger.debug("EventLogger is already configured")
@@ -42,7 +42,7 @@ public final class REventLogger {
4242
return
4343
}
4444

45-
configuration = EventLoggerConfiguration(apiKey: apiKey, apiUrl: apiUrl)
45+
configuration = EventLoggerConfiguration(apiKey: apiKey, apiUrl: apiUrl, appGroupId: appGroupId)
4646
configureModules(dependencyManager: resolveDependency())
4747
eventLogger?.configure(apiConfiguration: configuration)
4848
isConfigured = true
@@ -93,7 +93,7 @@ public final class REventLogger {
9393

9494
private func resolveDependency() -> TypedDependencyManager {
9595
let manager = TypedDependencyManager()
96-
let mainContainer = MainContainerFactory.create(dependencyManager: manager)
96+
let mainContainer = MainContainerFactory.create(dependencyManager: manager, appGroupId: configuration?.appGroupId)
9797
manager.appendContainer(mainContainer)
9898
return manager
9999
}
@@ -103,14 +103,16 @@ public final class REventLogger {
103103
guard let dataStorage = dependencyManager.resolve(type: REventDataCacheable.self),
104104
let eventsSender = dependencyManager.resolve(type: REventLoggerSendable.self),
105105
let eventsCache = dependencyManager.resolve(type: REventExpirationCacheable.self),
106-
let appLifeCycleManager = dependencyManager.resolve(type: AppLifeCycleListener.self)
106+
let appLifeCycleManager = dependencyManager.resolve(type: AppLifeCycleListener.self),
107+
let appBundle = dependencyManager.resolve(type: REventLoggerEnvironment.self)
107108
else {
108109
Logger.debug("❌ Unable to resolve dependencies of EventLogger")
109110
return
110111
}
111112
eventLogger = REventLoggerModule(eventsStorage: dataStorage,
112113
eventsSender: eventsSender,
113114
eventsCache: eventsCache,
114-
appLifeCycleListener: appLifeCycleManager)
115+
appLifeCycleListener: appLifeCycleManager,
116+
appBundle: appBundle)
115117
}
116118
}

Sources/REventLogger/REventLoggerEnvironment.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ final class REventLoggerEnvironment {
6060
return rmcSDKsVersion
6161
}
6262

63+
var isAppExtension: Bool {
64+
bundle.bundleURL.pathExtension == "appex"
65+
}
66+
6367
private func getRMCSDKsVersion() -> [String: String]? {
6468
guard let path = Bundle.rmcBundle?.path(forResource: BundleKeys.rmcVersionsInfoList, ofType: "plist") else {
6569
return nil

Sources/RSDKUtilsMain/Extensions/Bundle+EnvironmentInformation.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import WatchKit
1414
func sdkVersion() -> String
1515
func devicePlatform() -> String
1616
func deviceBrand() -> String
17+
var bundleURL: URL { get }
1718
}
1819

1920
extension Bundle: BundleProtocol {

Tests/Tests/REventLogger/REventLoggerModuleSpec.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class REventLoggerModuleSpec: QuickSpec {
2626
eventLoggerModule = REventLoggerModule(eventsStorage: mockEventStorage,
2727
eventsSender: mockEventsSender,
2828
eventsCache: mockEventsCache,
29-
appLifeCycleListener: mockAppLifeCycleListener)
29+
appLifeCycleListener: mockAppLifeCycleListener, appBundle: REventLoggerEnvironment())
3030
}
3131
context("isEventValid method") {
3232
it("will return true for a valid event") {
@@ -99,7 +99,7 @@ class REventLoggerModuleSpec: QuickSpec {
9999
context("configure method") {
100100
it("will configure the api key and api url if valid value is sent") {
101101
eventLoggerModule.configure(apiConfiguration: EventLoggerConfiguration(apiKey: REventLoggerMockData.apiKey,
102-
apiUrl: REventLoggerMockData.apiUrl))
102+
apiUrl: REventLoggerMockData.apiUrl, appGroupId: nil))
103103
expect(mockEventsSender.didConfigure).to(beTrue())
104104
}
105105
it("will not configure api Key and url if valid values is not sent") {

Tests/Tests/REventLogger/REventLoggerSenderSpec.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class REventLoggerSenderSpec: QuickSpec {
1717
let mockResponse: [String: Any] = [:]
1818
let eventSender = REventLoggerSender(networkManager: NetworkManager(session: MockURLSession(json: mockResponse)))
1919
eventSender.updateApiConfiguration(EventLoggerConfiguration(apiKey: REventLoggerMockData.apiKey,
20-
apiUrl: REventLoggerMockData.apiUrl))
20+
apiUrl: REventLoggerMockData.apiUrl, appGroupId: nil))
2121
waitUntil { done in
2222
eventSender.sendEvents(events: [REventLoggerMockData.REventModel, REventLoggerMockData.REventModel1],
2323
onCompletion: { result in
@@ -36,7 +36,7 @@ class REventLoggerSenderSpec: QuickSpec {
3636
it("will receive bad request error") {
3737
let eventSender = REventLoggerSender(networkManager: NetworkManager(session: MockURLSession(statusCode: 400)))
3838
eventSender.updateApiConfiguration(EventLoggerConfiguration(apiKey: REventLoggerMockData.apiKey,
39-
apiUrl: REventLoggerMockData.apiUrl))
39+
apiUrl: REventLoggerMockData.apiUrl, appGroupId: nil))
4040
waitUntil { done in
4141
eventSender.sendEvents(events: [REventLoggerMockData.REventModel], onCompletion: { result in
4242
guard case .failure(let error) = result else {
@@ -53,7 +53,7 @@ class REventLoggerSenderSpec: QuickSpec {
5353
it("will receive response data nil error") {
5454
let eventSender = REventLoggerSender(networkManager: NetworkManager(session: MockURLSession()))
5555
eventSender.updateApiConfiguration(EventLoggerConfiguration(apiKey: REventLoggerMockData.apiKey,
56-
apiUrl: REventLoggerMockData.apiUrl))
56+
apiUrl: REventLoggerMockData.apiUrl, appGroupId: nil))
5757
waitUntil { done in
5858
eventSender.sendEvents(events: [REventLoggerMockData.REventModel1], onCompletion: { result in
5959
guard case .failure(let error) = result else {
@@ -69,7 +69,7 @@ class REventLoggerSenderSpec: QuickSpec {
6969
it("will receive invalid url error") {
7070
let eventSender = REventLoggerSender(networkManager: NetworkManager(session: MockURLSession()))
7171
eventSender.updateApiConfiguration(EventLoggerConfiguration(apiKey: REventLoggerMockData.apiKey,
72-
apiUrl: ""))
72+
apiUrl: "", appGroupId: nil))
7373
waitUntil { done in
7474
eventSender.sendEvents(events: [REventLoggerMockData.REventModel2], onCompletion: { result in
7575
guard case .failure(let error) = result else {
@@ -85,7 +85,7 @@ class REventLoggerSenderSpec: QuickSpec {
8585
it("will not retry for error code 500") {
8686
let eventSender = REventLoggerSender(networkManager: NetworkManager(session: MockURLSession(statusCode: 500)))
8787
eventSender.updateApiConfiguration(EventLoggerConfiguration(apiKey: REventLoggerMockData.apiKey,
88-
apiUrl: REventLoggerMockData.apiUrl))
88+
apiUrl: REventLoggerMockData.apiUrl, appGroupId: nil))
8989
eventSender.sendEvents(events: [REventLoggerMockData.REventModel2], onCompletion: { _ in})
9090
expect(eventSender.scheduledTask).toAfterTimeout(beNil(), timeout: 0.1)
9191
}
@@ -94,7 +94,7 @@ class REventLoggerSenderSpec: QuickSpec {
9494
let mockSession = MockURLSession(error: URLError(.notConnectedToInternet) as NSError)
9595
let eventSender = REventLoggerSender(networkManager: NetworkManager(session: mockSession))
9696
eventSender.updateApiConfiguration(EventLoggerConfiguration(apiKey: REventLoggerMockData.apiKey,
97-
apiUrl: REventLoggerMockData.apiUrl))
97+
apiUrl: REventLoggerMockData.apiUrl, appGroupId: nil))
9898
eventSender.sendEvents(events: [REventLoggerMockData.REventModel2], onCompletion: { _ in})
9999
expect(eventSender.scheduledTask).toEventuallyNot(beNil())
100100
}
@@ -103,7 +103,7 @@ class REventLoggerSenderSpec: QuickSpec {
103103
let mockSession = MockURLSession(error: URLError(.networkConnectionLost) as NSError)
104104
let eventSender = REventLoggerSender(networkManager: NetworkManager(session: mockSession))
105105
eventSender.updateApiConfiguration(EventLoggerConfiguration(apiKey: REventLoggerMockData.apiKey,
106-
apiUrl: REventLoggerMockData.apiUrl))
106+
apiUrl: REventLoggerMockData.apiUrl, appGroupId: nil))
107107
eventSender.sendEvents(events: [REventLoggerMockData.REventModel2], onCompletion: { _ in})
108108
expect(eventSender.scheduledTask).toEventuallyNot(beNil())
109109
}

0 commit comments

Comments
 (0)