diff --git a/IntegrationTests/Sources/main.swift b/IntegrationTests/Sources/main.swift index 8bc732923..0ff1c5090 100644 --- a/IntegrationTests/Sources/main.swift +++ b/IntegrationTests/Sources/main.swift @@ -1,35 +1,16 @@ import Foundation import mParticle_Apple_SDK_NoLocation -// Listener for tracking upload events -class EventUploadWaiter: NSObject, MPListenerProtocol { - private var uploadCompletedSemaphore: DispatchSemaphore? +// Helper for triggering uploads and waiting for completion +class EventUploadWaiter { var mparticle = MParticle.sharedInstance() @discardableResult - func wait(timeout: Int = 5) -> Bool { + func wait(timeout: UInt32 = 5) -> Bool { mparticle.upload() - let semaphore = DispatchSemaphore(value: 0) - uploadCompletedSemaphore = semaphore - - let timeoutTime = DispatchTime.now() + .seconds(timeout) - let result = semaphore.wait(timeout: timeoutTime) - - uploadCompletedSemaphore = nil - - return result == .success + sleep(timeout) + return true } - - func onNetworkRequestFinished(_ type: MPEndpoint, - url: String, - body: NSObject, - responseCode: Int) { - if type == .events { - uploadCompletedSemaphore?.signal() - } - } - - func onNetworkRequestStarted(_ type: MPEndpoint, url: String, body: NSObject) {} } // Test 1: Simple Event @@ -455,9 +436,8 @@ networkOptions.pinningDisabled = true; options.networkOptions = networkOptions -// Register listener for tracking upload events +// Create upload waiter for triggering uploads and waiting for completion let uploadWaiter = EventUploadWaiter() -MPListenerController.sharedInstance().addSdkListener(uploadWaiter) let mparticle = MParticle.sharedInstance() mparticle.start(with: options) diff --git a/MIGRATING.md b/MIGRATING.md index d7128dead..bc2b86183 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -4,6 +4,10 @@ This document provides migration guidance for breaking changes in the mParticle ## Migrating from versions < 9.0.0 +### Removed MPListenerController + +The `MPListenerController` class has been removed. The SDK no longer invokes any listener callbacks. + ### Removed Deprecated UIApplicationDelegate Methods Apple has deprecated several `UIApplicationDelegate` protocol methods in favor of the modern `UIScene` lifecycle introduced in iOS 13. The mParticle SDK previously provided wrapper methods for these deprecated delegate methods, but these have been removed as they are scheduled for removal by Apple in iOS 27. diff --git a/UnitTests/MParticle+PrivateMethods.h b/UnitTests/MParticle+PrivateMethods.h index a292c5d9a..62a4162aa 100644 --- a/UnitTests/MParticle+PrivateMethods.h +++ b/UnitTests/MParticle+PrivateMethods.h @@ -1,7 +1,6 @@ #import "SettingsProvider.h" #import "MParticleSwift.h" #import "MPDataPlanFilter.h" -#import "MPListenerController.h" #import "AppEnvironmentProvider.h" #import "MPAppNotificationHandler.h" @@ -55,7 +54,6 @@ @property (nonatomic, strong) SceneDelegateHandler *sceneDelegateHandler; @property (nonatomic, strong) id settingsProvider; @property (nonatomic, strong, nullable) id dataPlanFilter; -@property (nonatomic, strong, nonnull) id listenerController; @property (nonatomic, strong) id stateMachine; @property (nonatomic, strong) id persistenceController; @property (nonatomic, strong, nonnull) id notificationController; diff --git a/UnitTests/Mocks/MPListenerControllerMock.swift b/UnitTests/Mocks/MPListenerControllerMock.swift deleted file mode 100644 index 376e321f0..000000000 --- a/UnitTests/Mocks/MPListenerControllerMock.swift +++ /dev/null @@ -1,112 +0,0 @@ -import XCTest - -class MPListenerControllerMock: NSObject, MPListenerControllerProtocol { - var onAPICalledCalled = false - - var onAPICalledApiNames = [Selector]() - - var onAPICalledApiName: Selector? { - return onAPICalledApiNames.first - } - - var onAPICalledParameter1: NSObject? - var onAPICalledExpectation: XCTestExpectation? - - func onAPICalled(_ apiName: Selector) { - onAPICalledCalled = true - onAPICalledApiNames.append(apiName) - onAPICalledExpectation?.fulfill() - } - - func onAPICalled(_ apiName: Selector, parameter1: NSObject?) { - onAPICalledCalled = true - onAPICalledApiNames.append(apiName) - onAPICalledParameter1 = parameter1 - onAPICalledExpectation?.fulfill() - } - - var onAPICalledParameter2: NSObject? - - func onAPICalled(_ apiName: Selector, parameter1: NSObject?, parameter2: NSObject?) { - onAPICalledCalled = true - onAPICalledApiNames.append(apiName) - onAPICalledParameter1 = parameter1 - onAPICalledParameter2 = parameter2 - onAPICalledExpectation?.fulfill() - } - - var onAPICalledParameter3: NSObject? - - func onAPICalled(_ apiName: Selector, parameter1: NSObject?, parameter2: NSObject?, parameter3: NSObject?) { - onAPICalledCalled = true - onAPICalledApiNames.append(apiName) - onAPICalledParameter1 = parameter1 - onAPICalledParameter2 = parameter2 - onAPICalledParameter3 = parameter3 - onAPICalledExpectation?.fulfill() - } -} - -extension MPListenerControllerMock { - - /// Verifies that the listener was called with the expected selector and parameters. - /// Automatically checks `onAPICalledCalled`, the selector, and up to three parameters. - func assertCalled( - _ expectedSelector: Selector, - param1 expectedParam1: NSObject? = nil, - param2 expectedParam2: NSObject? = nil, - param3 expectedParam3: NSObject? = nil, - file: StaticString = #file, - line: UInt = #line - ) { - XCTAssertTrue(onAPICalledCalled, "Expected onAPICalled to be called", file: file, line: line) - - guard let actualSelector = onAPICalledApiName else { - XCTFail("Expected API name \(expectedSelector), but none was recorded", file: file, line: line) - return - } - XCTAssertEqual( - NSStringFromSelector(actualSelector), - NSStringFromSelector(expectedSelector), - "Expected API selector to match", - file: file, - line: line - ) - - if let expectedParam1 { - XCTAssertEqual( - onAPICalledParameter1, - expectedParam1, - "Expected param1 to match for \(expectedSelector)", - file: file, - line: line - ) - } - - if let expectedParam2 { - XCTAssertEqual( - onAPICalledParameter2, - expectedParam2, - "Expected param2 to match for \(expectedSelector)", - file: file, - line: line - ) - } - - if let expectedParam3 { - XCTAssertEqual( - onAPICalledParameter3, - expectedParam3, - "Expected param3 to match for \(expectedSelector)", - file: file, - line: line - ) - } - } - - /// Verifies that no API call occurred. - func assertNotCalled(file: StaticString = #file, line: UInt = #line) { - XCTAssertFalse(onAPICalledCalled, "Expected onAPICalled NOT to be called", file: file, line: line) - XCTAssertTrue(onAPICalledApiNames.isEmpty, "Expected no recorded API names", file: file, line: line) - } -} diff --git a/UnitTests/SwiftTests/MParticle/MParticleCommerceEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleCommerceEventTests.swift index 427aba607..e47c504ad 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleCommerceEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleCommerceEventTests.swift @@ -11,7 +11,6 @@ final class MParticleCommerceEventTests: MParticleTestBase { XCTAssertNotNil(commerceEvent.timestamp) XCTAssertTrue(backendController.logCommerceEventCalled) - XCTAssertTrue(listenerController.onAPICalledParameter1 === commerceEvent) XCTAssertTrue(executor.executeOnMessageQueueAsync) } @@ -23,10 +22,6 @@ final class MParticleCommerceEventTests: MParticleTestBase { // Verify event timestamp added XCTAssertNotNil(commerceEvent.timestamp) - // Verify listener was called - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCommerceEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === commerceEvent) - // Verify backend was called XCTAssertTrue(backendController.logCommerceEventCalled) XCTAssertTrue(backendController.logCommerceEventParam === commerceEvent) @@ -53,10 +48,6 @@ final class MParticleCommerceEventTests: MParticleTestBase { // Verify event timestamp added XCTAssertNotNil(commerceEvent.timestamp) - // Verify listener was called - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCommerceEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === commerceEvent) - // Verify backend was called XCTAssertTrue(backendController.logCommerceEventCalled) XCTAssertTrue(backendController.logCommerceEventParam === commerceEvent) diff --git a/UnitTests/SwiftTests/MParticle/MParticleCustomEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleCustomEventTests.swift index 20fa83d65..683bbf31c 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleCustomEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleCustomEventTests.swift @@ -16,10 +16,6 @@ final class MParticleCustomEventTests: MParticleTestBase { // Verify event timing ended XCTAssertNil(event.endTime) - // Verify listener was called - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCustomEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === event) - // Verify backend was called XCTAssertTrue(backendController.logEventCalled) XCTAssertTrue(backendController.logEventEventParam === event) @@ -44,10 +40,6 @@ final class MParticleCustomEventTests: MParticleTestBase { // Verify event timing ended XCTAssertNil(event.endTime) - // Verify listener was called - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCustomEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === event) - // Verify backend was called XCTAssertTrue(backendController.logEventCalled) XCTAssertTrue(backendController.logEventEventParam === event) diff --git a/UnitTests/SwiftTests/MParticle/MParticleErrorTests.swift b/UnitTests/SwiftTests/MParticle/MParticleErrorTests.swift index 929f38ea6..4beba3a34 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleErrorTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleErrorTests.swift @@ -57,7 +57,6 @@ final class MParticleErrorTests: MParticleTestBase { mparticle.logError(errorMessage) XCTAssertTrue(executor.executeOnMessageQueueAsync) - listenerController.assertCalled(#selector(mparticle.logError(_:eventInfo:))) XCTAssertTrue(backendController.logErrorCalled) XCTAssertNil(backendController.logErrorExceptionParam) @@ -78,7 +77,6 @@ final class MParticleErrorTests: MParticleTestBase { mparticle.logError(errorMessage, eventInfo: keyValueDict) XCTAssertTrue(executor.executeOnMessageQueueAsync) - listenerController.assertCalled(#selector(mparticle.logError(_:eventInfo:))) XCTAssertTrue(backendController.logErrorCalled) XCTAssertNil(backendController.logErrorExceptionParam) diff --git a/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift index 81a08ac85..8605d365a 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleEventTests.swift @@ -3,27 +3,11 @@ import mParticle_Apple_SDK_NoLocation final class MParticleEventTests: MParticleTestBase { - func test_logEvent_callsLogCustomEvent() { - mparticle.logEvent(event) - wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCustomEvent:") - } - - func test_logEvent_callsLogCommerceEvent() { - mparticle.logEvent(commerceEvent) - wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logCommerceEvent:") - } - func test_logEvent_blocksEvent_whenFilterReturnsNil() { dataPlanFilter.transformEventForBaseEventReturnValue = nil mparticle.logEvent(baseEvent) - // Verify listener was called - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === baseEvent) - // Verify backend was called XCTAssertTrue(backendController.logBaseEventCalled) XCTAssertTrue(backendController.logBaseEventEventParam === baseEvent) @@ -47,10 +31,6 @@ final class MParticleEventTests: MParticleTestBase { mparticle.logEvent(baseEvent) - // Verify listener was called - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === baseEvent) - // Verify backend was called XCTAssertTrue(backendController.logBaseEventCalled) XCTAssertTrue(backendController.logBaseEventEventParam === baseEvent) @@ -145,9 +125,6 @@ final class MParticleEventTests: MParticleTestBase { XCTAssertTrue(backendController.eventWithNameCalled) XCTAssertEqual(backendController.eventWithNameEventNameParam, event.name) - - XCTAssertTrue(listenerController.onAPICalledCalled) - XCTAssertTrue(listenerController.onAPICalledParameter1 === event) } func test_logEvent_createsNewEvent_whenNotFound() { @@ -157,11 +134,5 @@ final class MParticleEventTests: MParticleTestBase { XCTAssertTrue(backendController.eventWithNameCalled) XCTAssertEqual(backendController.eventWithNameEventNameParam, event.name) - - XCTAssertTrue(listenerController.onAPICalledCalled) - let createdEvent: MPEvent = (listenerController.onAPICalledParameter1 as? MPBaseEvent)! as! MPEvent - XCTAssertEqual(createdEvent.name, event.name) - XCTAssertEqual(createdEvent.type, event.type) - XCTAssertEqual(createdEvent.customAttributes as! [String: String], event.customAttributes as! [String: String]) } } diff --git a/UnitTests/SwiftTests/MParticle/MParticleKitBatchTests.swift b/UnitTests/SwiftTests/MParticle/MParticleKitBatchTests.swift index 323c8a8e8..be4ae9eef 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleKitBatchTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleKitBatchTests.swift @@ -43,7 +43,6 @@ final class MParticleKitBatchTests: MParticleTestBase { kitContainer.kitsInitialized = true mparticle.executeKitsInitializedBlocks() - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "executeKitsInitializedBlocks") XCTAssertTrue(executor.executeOnMainAsync) XCTAssertTrue(kitContainer.forwardSDKCallCalled) XCTAssertEqual(kitContainer.forwardSDKCallSelectorParam?.description, "logBatch:") diff --git a/UnitTests/SwiftTests/MParticle/MParticleLTVTests.swift b/UnitTests/SwiftTests/MParticle/MParticleLTVTests.swift index c5fffcf12..c52b3e316 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleLTVTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleLTVTests.swift @@ -26,9 +26,6 @@ final class MParticleLTVTests: MParticleTestBase { XCTAssertEqual(attrs["currency"] as? String, "USD") XCTAssertEqual(attrs.count, 4) - // Listener controller should be notified - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logLTVIncrease:eventName:eventInfo:") - // Backend completion handler should be stored XCTAssertTrue(backendController.logEventCalled) let completion = backendController.logEventCompletionHandler! @@ -54,12 +51,6 @@ final class MParticleLTVTests: MParticleTestBase { XCTAssertEqual(attrs["$MethodName"] as? String, "LogLTVIncrease") XCTAssertEqual(attrs.count, 2) - // Listener controller should be notified - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logLTVIncrease:eventName:eventInfo:") - XCTAssertEqual(listenerController.onAPICalledParameter1 as? Double, amount) - XCTAssertEqual(listenerController.onAPICalledParameter2 as? String, name) - XCTAssertNil(listenerController.onAPICalledParameter3) - // Backend completion handler should be stored XCTAssertTrue(backendController.logEventCalled) let completion = backendController.logEventCompletionHandler! diff --git a/UnitTests/SwiftTests/MParticle/MParticleRuntimeValuesTests.swift b/UnitTests/SwiftTests/MParticle/MParticleRuntimeValuesTests.swift index a82613a79..e471992ea 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleRuntimeValuesTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleRuntimeValuesTests.swift @@ -3,12 +3,6 @@ import mParticle_Apple_SDK_NoLocation final class MParticleRuntimeValuesTests: MParticleTestBase { - func test_setSharedInstance_notifiesListener() { - MParticle.setSharedInstance(mparticle) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "setSharedInstance:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === mparticle) - } - func test_setOptOutCompletion_logsMessage_onSuccess() { mparticle.setOptOutCompletion(.success, optOut: true) assertReceivedMessage("Set Opt Out: 1") diff --git a/UnitTests/SwiftTests/MParticle/MParticleScreenEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleScreenEventTests.swift index a50d5bc54..34d3abdb1 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleScreenEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleScreenEventTests.swift @@ -7,8 +7,6 @@ final class MParticleScreenEventTests: MParticleTestBase { mparticle.logScreenEvent(event) XCTAssertTrue(executor.executeOnMessageQueueAsync) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logScreenEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === event) XCTAssertTrue(backendController.logScreenCalled) XCTAssertTrue(backendController.logScreenEventParam === event) @@ -25,8 +23,6 @@ final class MParticleScreenEventTests: MParticleTestBase { mparticle.logScreenEvent(event) XCTAssertTrue(executor.executeOnMessageQueueAsync) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logScreenEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === event) XCTAssertTrue(backendController.logScreenCalled) XCTAssertTrue(backendController.logScreenEventParam === event) @@ -52,7 +48,6 @@ final class MParticleScreenEventTests: MParticleTestBase { assertReceivedMessage("Screen name is required.") XCTAssertFalse(backendController.eventWithNameCalled) XCTAssertFalse(executor.executeOnMessageQueueAsync) - XCTAssertFalse(listenerController.onAPICalledCalled) XCTAssertFalse(backendController.logScreenCalled) } @@ -66,8 +61,6 @@ final class MParticleScreenEventTests: MParticleTestBase { XCTAssertEqual(backendController.eventWithNameEventNameParam, testName) XCTAssertTrue(executor.executeOnMessageQueueAsync) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logScreenEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === event) XCTAssertTrue(backendController.logScreenCalled) XCTAssertNotNil(backendController.logScreenCompletionHandler) backendController.logScreenCompletionHandler!(event, .success) @@ -98,8 +91,6 @@ final class MParticleScreenEventTests: MParticleTestBase { XCTAssertEqual(backendController.eventWithNameEventNameParam, testName) XCTAssertTrue(executor.executeOnMessageQueueAsync) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "logScreenEvent:") - XCTAssertEqual(listenerController.onAPICalledParameter1, mockMPNavEvent) XCTAssertTrue(backendController.logScreenCalled) XCTAssertNotNil(backendController.logScreenCompletionHandler) backendController.logScreenCompletionHandler!(mockMPNavEvent, .success) diff --git a/UnitTests/SwiftTests/MParticle/MParticleTestBase.swift b/UnitTests/SwiftTests/MParticle/MParticleTestBase.swift index 19dd3f772..b7e97848e 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleTestBase.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleTestBase.swift @@ -4,7 +4,6 @@ import mParticle_Apple_SDK_NoLocation class MParticleTestBase: XCTestCase { var receivedMessage: String? var mparticle: MParticle! - var listenerController: MPListenerControllerMock! var kitContainer: MPKitContainerMock! var executor: ExecutorMock! var backendController: MPBackendControllerMock! @@ -45,9 +44,6 @@ class MParticleTestBase: XCTestCase { mparticle = MParticle() mparticle.logLevel = .verbose mparticle.customLogger = customLogger - listenerController = MPListenerControllerMock() - listenerController.onAPICalledExpectation = XCTestExpectation() - mparticle.listenerController = listenerController kitContainer = MPKitContainerMock() mparticle.setKitContainer(kitContainer) diff --git a/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift b/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift index af4784917..cee5507ea 100644 --- a/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift +++ b/UnitTests/SwiftTests/MParticle/MParticleTimedEventTests.swift @@ -20,8 +20,6 @@ final class MParticleTimedEventTests: MParticleTestBase { func test_beginTimedEvent_invokesDependencies_andExecutesCompletionHandler() { mparticle.beginTimedEvent(event) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "beginTimedEvent:") - XCTAssertEqual(listenerController.onAPICalledParameter1, event) XCTAssertTrue(backendController.beginTimedEventCalled) XCTAssertEqual(backendController.beginTimedEventEventParam, event) XCTAssertNotNil(backendController.beginTimedEventCompletionHandler) @@ -34,14 +32,10 @@ final class MParticleTimedEventTests: MParticleTestBase { mparticle.endTimedEvent(event) - wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1) - XCTAssertNil(event.duration) XCTAssertNil(event.endTime) XCTAssertTrue(executor.executeOnMessageQueueAsync) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "endTimedEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === event) XCTAssertTrue(backendController.logEventCalled) XCTAssertTrue(backendController.logEventEventParam === event) @@ -53,15 +47,11 @@ final class MParticleTimedEventTests: MParticleTestBase { dataPlanFilter.transformEventReturnValue = nil mparticle.endTimedEvent(event) - - wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1) XCTAssertNil(event.duration) XCTAssertNil(event.endTime) XCTAssertTrue(executor.executeOnMessageQueueAsync) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "endTimedEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === event) XCTAssertTrue(backendController.logEventCalled) XCTAssertTrue(backendController.logEventEventParam === event) @@ -74,15 +64,9 @@ final class MParticleTimedEventTests: MParticleTestBase { mparticle.dataPlanFilter = dataPlanFilter mparticle.endTimedEvent(event) - - wait(for: [listenerController.onAPICalledExpectation!], timeout: 0.1) XCTAssertNil(event.duration) XCTAssertNil(event.endTime) - - XCTAssertTrue(executor.executeOnMessageQueueAsync) - XCTAssertEqual(listenerController.onAPICalledApiName?.description, "endTimedEvent:") - XCTAssertTrue(listenerController.onAPICalledParameter1 === event) XCTAssertTrue(backendController.logEventCalled) XCTAssertTrue(backendController.logEventEventParam === event) diff --git a/mParticle-Apple-SDK.xcodeproj/project.pbxproj b/mParticle-Apple-SDK.xcodeproj/project.pbxproj index 5449e6a96..e959bc713 100644 --- a/mParticle-Apple-SDK.xcodeproj/project.pbxproj +++ b/mParticle-Apple-SDK.xcodeproj/project.pbxproj @@ -21,7 +21,6 @@ 356752932E60928B00DEEE23 /* MPStateMachineMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 356752922E60928500DEEE23 /* MPStateMachineMock.swift */; }; 356D4A5A2E58B09D00CB69FE /* SettingsProviderMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 356D4A582E58B09D00CB69FE /* SettingsProviderMock.swift */; }; 356D4A5D2E58B25900CB69FE /* MPDataPlanFilterMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 356D4A5B2E58B25500CB69FE /* MPDataPlanFilterMock.swift */; }; - 356D4A5F2E5CAB0000CB69FE /* MPListenerControllerMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 356D4A5E2E5CAB0000CB69FE /* MPListenerControllerMock.swift */; }; 359247692F19A11B00C9A21E /* MPDeviceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79CAC29CE019F00E7489F /* MPDeviceTests.m */; }; 359BAFF92E56330200A8A704 /* SettingsProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 359BAFF82E56330200A8A704 /* SettingsProvider.h */; }; 359BAFFC2E56335300A8A704 /* SettingsProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 359BAFFB2E56335300A8A704 /* SettingsProvider.m */; }; @@ -111,7 +110,6 @@ 53A79D0229CE23F700E7489F /* mParticle.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79C2729CDFB4800E7489F /* mParticle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D0329CE23F700E7489F /* FilteredMPIdentityApiRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79C3C29CDFB4800E7489F /* FilteredMPIdentityApiRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D0429CE23F700E7489F /* MPBaseEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79C2429CDFB4800E7489F /* MPBaseEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 53A79D0529CE23F700E7489F /* MPListenerController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79C3029CDFB4800E7489F /* MPListenerController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D0629CE23F700E7489F /* MPProduct+Dictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79C4229CDFB4800E7489F /* MPProduct+Dictionary.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D0729CE23F700E7489F /* MPKitRegister.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79C4129CDFB4800E7489F /* MPKitRegister.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D0829CE23F700E7489F /* MPTransactionAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79C2E29CDFB4800E7489F /* MPTransactionAttributes.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -249,7 +247,6 @@ 53A79DB529CE23F700E7489F /* MPBackendController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AF429CDFB1F00E7489F /* MPBackendController.m */; }; 53A79DB629CE23F700E7489F /* MPForwardQueueItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B5D29CDFB1F00E7489F /* MPForwardQueueItem.m */; }; 53A79DB729CE23F700E7489F /* MPEventProjection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B5829CDFB1F00E7489F /* MPEventProjection.mm */; }; - 53A79DB829CE23F700E7489F /* MPListenerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B6329CDFB1F00E7489F /* MPListenerController.m */; }; 53A79DB929CE23F700E7489F /* MPKitContainer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B5029CDFB1F00E7489F /* MPKitContainer.mm */; }; 53A79DBA29CE23F700E7489F /* MPUploadBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B1229CDFB1F00E7489F /* MPUploadBuilder.m */; }; 53A79DBC29CE23F700E7489F /* MPBaseProjection.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B5329CDFB1F00E7489F /* MPBaseProjection.m */; }; @@ -335,7 +332,6 @@ 356752922E60928500DEEE23 /* MPStateMachineMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPStateMachineMock.swift; sourceTree = ""; }; 356D4A582E58B09D00CB69FE /* SettingsProviderMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsProviderMock.swift; sourceTree = ""; }; 356D4A5B2E58B25500CB69FE /* MPDataPlanFilterMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDataPlanFilterMock.swift; sourceTree = ""; }; - 356D4A5E2E5CAB0000CB69FE /* MPListenerControllerMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPListenerControllerMock.swift; sourceTree = ""; }; 359BAFEA2E55EE0C00A8A704 /* MParticle+PrivateMethods.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MParticle+PrivateMethods.h"; sourceTree = ""; }; 359BAFF82E56330200A8A704 /* SettingsProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SettingsProvider.h; sourceTree = ""; }; 359BAFFB2E56335300A8A704 /* SettingsProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SettingsProvider.m; sourceTree = ""; }; @@ -474,7 +470,6 @@ 53A79B5F29CDFB1F00E7489F /* MPKitConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPKitConfiguration.h; sourceTree = ""; }; 53A79B6029CDFB1F00E7489F /* MPKitFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPKitFilter.h; sourceTree = ""; }; 53A79B6129CDFB1F00E7489F /* MPBaseProjection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPBaseProjection.h; sourceTree = ""; }; - 53A79B6329CDFB1F00E7489F /* MPListenerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPListenerController.m; sourceTree = ""; }; 53A79B6429CDFB1F00E7489F /* MPIConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPIConstants.m; sourceTree = ""; }; 53A79C2329CDFB4800E7489F /* MPEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEvent.h; sourceTree = ""; }; 53A79C2429CDFB4800E7489F /* MPBaseEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPBaseEvent.h; sourceTree = ""; }; @@ -488,7 +483,6 @@ 53A79C2D29CDFB4800E7489F /* MPKitAPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPKitAPI.h; sourceTree = ""; }; 53A79C2E29CDFB4800E7489F /* MPTransactionAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTransactionAttributes.h; sourceTree = ""; }; 53A79C2F29CDFB4800E7489F /* MPCommerceEventInstruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCommerceEventInstruction.h; sourceTree = ""; }; - 53A79C3029CDFB4800E7489F /* MPListenerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPListenerController.h; sourceTree = ""; }; 53A79C3129CDFB4800E7489F /* MPIdentityApi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIdentityApi.h; sourceTree = ""; }; 53A79C3329CDFB4800E7489F /* NSDictionary+MPCaseInsensitive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+MPCaseInsensitive.h"; sourceTree = ""; }; 53A79C3429CDFB4800E7489F /* MParticleUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MParticleUser.h; sourceTree = ""; }; @@ -665,7 +659,6 @@ 356752922E60928500DEEE23 /* MPStateMachineMock.swift */, 3567528E2E5F7FF100DEEE23 /* MPBackendControllerMock.swift */, 356D4A5B2E58B25500CB69FE /* MPDataPlanFilterMock.swift */, - 356D4A5E2E5CAB0000CB69FE /* MPListenerControllerMock.swift */, 359BB0052E57A56300A8A704 /* MPUserDefaultsMock.swift */, 356D4A582E58B09D00CB69FE /* SettingsProviderMock.swift */, 727801DD2EB0FE8400BDAD98 /* MPNotificationControllerMock.swift */, @@ -736,7 +729,6 @@ 53A79A9729CDFB1E00E7489F /* Identity */, 53A79B4A29CDFB1F00E7489F /* Kits */, 53A79AFD29CDFB1F00E7489F /* Libraries */, - 53A79B6229CDFB1F00E7489F /* Listener */, 53A79B4529CDFB1F00E7489F /* Logger */, 53A79AA729CDFB1E00E7489F /* Network */, 53A79B3329CDFB1F00E7489F /* Notifications */, @@ -978,14 +970,6 @@ path = Kits; sourceTree = ""; }; - 53A79B6229CDFB1F00E7489F /* Listener */ = { - isa = PBXGroup; - children = ( - 53A79B6329CDFB1F00E7489F /* MPListenerController.m */, - ); - path = Listener; - sourceTree = ""; - }; 53A79C2229CDFB4800E7489F /* Include */ = { isa = PBXGroup; children = ( @@ -1003,7 +987,6 @@ 53A79C2D29CDFB4800E7489F /* MPKitAPI.h */, 53A79C2E29CDFB4800E7489F /* MPTransactionAttributes.h */, 53A79C2F29CDFB4800E7489F /* MPCommerceEventInstruction.h */, - 53A79C3029CDFB4800E7489F /* MPListenerController.h */, 53A79C3129CDFB4800E7489F /* MPIdentityApi.h */, 53A79C3329CDFB4800E7489F /* NSDictionary+MPCaseInsensitive.h */, 53A79C3429CDFB4800E7489F /* MParticleUser.h */, @@ -1201,7 +1184,6 @@ 53A79D0229CE23F700E7489F /* mParticle.h in Headers */, 53A79D0329CE23F700E7489F /* FilteredMPIdentityApiRequest.h in Headers */, 53A79D0429CE23F700E7489F /* MPBaseEvent.h in Headers */, - 53A79D0529CE23F700E7489F /* MPListenerController.h in Headers */, 53A79D0629CE23F700E7489F /* MPProduct+Dictionary.h in Headers */, 53A79D0729CE23F700E7489F /* MPKitRegister.h in Headers */, 53A79D0829CE23F700E7489F /* MPTransactionAttributes.h in Headers */, @@ -1453,7 +1435,6 @@ 534CD28C29CE2CE1008452B3 /* MPUserDefaultsTests.m in Sources */, 7231B82F2EB95D96001565E5 /* MParticleEventTests.swift in Sources */, 534CD28D29CE2CE1008452B3 /* MPUploadBuilderTests.m in Sources */, - 356D4A5F2E5CAB0000CB69FE /* MPListenerControllerMock.swift in Sources */, 534CD28E29CE2CE1008452B3 /* MPBaseTestCase.m in Sources */, 35329FEC2E54C483009AC4FD /* MPNetworkOptions+MParticlePrivateTests.swift in Sources */, 7231B8352EB95F9F001565E5 /* MParticleBreadcrumbTests.swift in Sources */, @@ -1589,7 +1570,6 @@ 53A79DB529CE23F700E7489F /* MPBackendController.m in Sources */, 53A79DB629CE23F700E7489F /* MPForwardQueueItem.m in Sources */, 53A79DB729CE23F700E7489F /* MPEventProjection.mm in Sources */, - 53A79DB829CE23F700E7489F /* MPListenerController.m in Sources */, 53A79DB929CE23F700E7489F /* MPKitContainer.mm in Sources */, D33C8B362B8510C20012EDFD /* MPAudience.m in Sources */, 53A79DBA29CE23F700E7489F /* MPUploadBuilder.m in Sources */, diff --git a/mParticle-Apple-SDK/Identity/MPIdentityApiManager.m b/mParticle-Apple-SDK/Identity/MPIdentityApiManager.m index 35ce38d5d..0407009f1 100644 --- a/mParticle-Apple-SDK/Identity/MPIdentityApiManager.m +++ b/mParticle-Apple-SDK/Identity/MPIdentityApiManager.m @@ -8,7 +8,6 @@ #import "MPNetworkCommunication.h" #import "MPBackendController.h" #import "mParticle.h" -#import "MPListenerController.h" @interface MParticle () @@ -26,32 +25,24 @@ @interface MPIdentityApiManager () @implementation MPIdentityApiManager - (void)identify:(MPIdentityApiRequest *)identifyRequest completion:(nullable MPIdentityApiManagerCallback)completion { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:identifyRequest parameter2:completion]; - [[MParticle sharedInstance].backendController.networkCommunication identify:identifyRequest completion:^(MPIdentityHTTPBaseSuccessResponse * _Nonnull httpResponse, NSError * _Nullable error) { completion(httpResponse, error); }]; } - (void)loginRequest:(MPIdentityApiRequest *)loginRequest completion:(nullable MPIdentityApiManagerCallback)completion { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:loginRequest parameter2:completion]; - [[MParticle sharedInstance].backendController.networkCommunication login:loginRequest completion:^(MPIdentityHTTPBaseSuccessResponse * _Nonnull httpResponse, NSError * _Nullable error) { completion(httpResponse, error); }]; } - (void)logout:(MPIdentityApiRequest *)logoutRequest completion:(nullable MPIdentityApiManagerCallback)completion { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:logoutRequest parameter2:completion]; - [[MParticle sharedInstance].backendController.networkCommunication logout:logoutRequest completion:^(MPIdentityHTTPBaseSuccessResponse * _Nonnull httpResponse, NSError * _Nullable error) { completion(httpResponse, error); }]; } - (void)modify:(MPIdentityApiRequest *)modifyRequest completion:(nullable MPIdentityApiManagerModifyCallback)completion { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:modifyRequest parameter2:completion]; - [[MParticle sharedInstance].backendController.networkCommunication modify:modifyRequest completion:^(MPIdentityHTTPModifySuccessResponse * _Nonnull httpResponse, NSError * _Nullable error) { completion(httpResponse, error); }]; diff --git a/mParticle-Apple-SDK/Identity/MParticleUser.m b/mParticle-Apple-SDK/Identity/MParticleUser.m index 3f42d96c4..78009135c 100644 --- a/mParticle-Apple-SDK/Identity/MParticleUser.m +++ b/mParticle-Apple-SDK/Identity/MParticleUser.m @@ -88,8 +88,6 @@ -(NSDictionary*) userAttributes -(void) setUserAttributes:(NSDictionary *)userAttributes { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:userAttributes]; - NSDictionary *existingUserAttributes = self.userAttributes; [existingUserAttributes enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { [self removeUserAttribute:key]; @@ -128,7 +126,6 @@ - (void)setIdentitySync:(NSString *)identityString identityType:(MPIdentity)iden } - (void)setIdentitySync:(NSString *)identityString identityType:(MPIdentity)identityType timestamp:(NSDate *)timestamp { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:identityString parameter2:@(identityType) parameter3:timestamp]; if ([MPEnum isUserIdentity:identityType]) { __weak MParticleUser *weakSelf = self; [self.backendController setUserIdentity:identityString @@ -219,8 +216,6 @@ - (BOOL)forwardLegacyUserIdentityToKitContainer:(NSString *)identityString ident - (nullable NSNumber *)incrementUserAttribute:(NSString *)key byValue:(NSNumber *)value { dispatch_async([MParticle messageQueue], ^{ - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:key parameter2:value]; - MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.optOut) { return; @@ -270,8 +265,6 @@ - (nullable NSNumber *)incrementUserAttribute:(NSString *)key byValue:(NSNumber } - (void)setUserAttribute:(nonnull NSString *)key value:(nonnull id)value { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:key parameter2:value]; - if ([value isKindOfClass:[NSString class]] && (((NSString *)value).length <= 0)) { MPILogDebug(@"User attribute not updated. Please use removeUserAttribute."); @@ -318,8 +311,6 @@ - (void)setUserAttribute:(nonnull NSString *)key value:(nonnull id)value { } - (void)setUserAttributeList:(nonnull NSString *)key values:(nonnull NSArray *)values { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:key parameter2:values]; - if (values.count == 0) { MPILogDebug(@"User attribute not updated. Please use removeUserAttribute."); return; @@ -372,8 +363,6 @@ - (void)setUserAttributeList:(nonnull NSString *)key values:(nonnull NSArray -#import "MPListenerProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -@protocol MPListenerControllerProtocol - -- (void)onAPICalled:(SEL)apiName; -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1; -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1 parameter2:(nullable NSObject *)parameter2; -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1 parameter2:(nullable NSObject *)parameter2 parameter3:(nullable NSObject *)parameter3; - -@end - -@interface MPListenerController : NSObject - -/** - * Returns the shared instance object. - * @returns the Singleton instance of the MPListener class. - */ -+ (instancetype)sharedInstance; - -/** - * Adds a listener to the SDK to receive any MPListenerProtocol calls from the API to that object - * @param sdkListener An instance of a class that implements the MPListenerProtocol - */ -- (void)addSdkListener:(id)sdkListener; - -/** - * Removes a listener from the SDK to no longer receive any MPListenerProtocol calls from the API to that object - * If you don't remove the Listener we will retain a zombie reference of your object and it will never be released - * @param sdkListener An instance of a class that implements the MPListenerProtocol - */ -- (void)removeSdkListener:(id)sdkListener; - -/** - * Indicates that an API method was called. This includes invocations both from external sources (your code) - * and those which originated from within the SDK - * @param apiName the name of the API method - * @param parameter1 to parameter4 are the arguments sent to this api, such as the MPEvent in logEvent - */ -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1 parameter2:(nullable NSObject *)parameter2 parameter3:(nullable NSObject *)parameter3 parameter4:(nullable NSObject *)parameter4; -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1 parameter2:(nullable NSObject *)parameter2 parameter3:(nullable NSObject *)parameter3; -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1 parameter2:(nullable NSObject *)parameter2; -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1; -- (void)onAPICalled:(SEL)apiName; - -/** - * Indicates that a new Database entry has been created - * @param tableName the name of the table - * @param primaryKey a unique identifier for the database row - * @param message the database entry in JSON form - */ -- (void)onEntityStored:(MPDatabaseTable)tableName primaryKey:(NSNumber *)primaryKey message:(NSString *)message; - -/** - * Indicates that a Network Request has been started. Network Requests for a given Endpoint are performed - * synchronously, so the next invocation of onNetworkRequestFinished of the same Endpoint will be linked - * @param type the type of network request, see Endpoint - * @param url the URL of the request - * @param body the response body in JSON form - */ -- (void)onNetworkRequestStarted:(MPEndpoint)type url:(NSString *)url body:(NSObject *)body; - -/** - * Indicates that a Network Request has completed. - * @param type the type of network request, see Endpoint - * @param url the URL of the request - * @param body the response body in JSON form - * @param responseCode the HTTP response code - */ -- (void)onNetworkRequestFinished:(MPEndpoint)type url:(NSString *)url body:(NSObject *)body responseCode:(NSInteger)responseCode; - -/** - * Indicates that a Kit's API method has been invoked and that the name of the Kit's method is different - * than the method containing this method's invocation - * @param methodName the name of the Kit's method being called - * @param kitId the Id of the kit - * @param used whether the Kit's method returned ReportingMessages, or null if return type is void - * @param objects the arguments supplied to the Kit - */ -- (void)onKitApiCalled:(NSString *)methodName kitId:(int)kitId used:(BOOL)used objects:(NSArray *)objects; - -/** - * Indicates that a Kit module, with kitId, has been included in the source files - * @param kitId the id of the kit, corresponds with a {@see com.mparticle.MParticle.ServiceProviders} - */ -- (void)onKitDetected:(int)kitId; - -/** - * Indicates that a Configuration for a kit with kitId is being applied - * @param kitId the id of the kit, corresponds with a {@see com.mparticle.MParticle.ServiceProviders} - * @param configuration the kit - */ -- (void)onKitConfigReceived:(int)kitId configuration:(NSDictionary *)configuration; - -/** - * Indicates that a kit with kitId was successfully started - * @param kitId the id of the kit, corresponds with a {@see com.mparticle.MParticle.ServiceProviders} - */ -- (void)onKitStarted:(int)kitId; - -/** - * Indicates that either an attempt to start a kit was unsuccessful, or a started kit was stopped. - * Possibilities for why this may happen include: {@see MParticleUser}'s loggedIn status or - * {@see com.mparticle.consent.ConsentState} required it to be stopped, the Kit crashed, or a - * configuration was received that excluded the kit - * @param kitId the id of the kit, corresponds with a {@see com.mparticle.MParticle.ServiceProviders} - * @param reason a message containing the reason a kit was stopped - */ -- (void)onKitExcluded:(int)kitId reason:(NSString *)reason; - -/** - * Indicates that state of a Session may have changed - * @param session the current {@see InternalSession} instance - */ -- (void)onSessionUpdated:(nullable MParticleSession *)session; - -/** - * Indicates that an alias request has completed. - * @param aliasResponse the alias response object - */ -- (void)onAliasRequestFinished:(nullable MPAliasResponse *)aliasResponse; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/mParticle-Apple-SDK/Include/mParticle.h b/mParticle-Apple-SDK/Include/mParticle.h index 0a3055c5d..524fac830 100644 --- a/mParticle-Apple-SDK/Include/mParticle.h +++ b/mParticle-Apple-SDK/Include/mParticle.h @@ -4,6 +4,7 @@ #import "MPEnums.h" #import "MPEvent.h" #import "MPExtensionProtocol.h" +#import "MPListenerProtocol.h" #import #import "MPKitExecStatus.h" #import "MPKitRegister.h" @@ -16,7 +17,6 @@ #import "MPIdentityApi.h" #import "MPKitAPI.h" #import "MPConsentState.h" -#import "MPListenerController.h" #import "MPForwardRecord.h" #import #import "MPStateMachine.h" @@ -26,6 +26,7 @@ #import "MPNotificationController.h" #import "MPNetworkCommunication.h" #import "MPPersistenceController.h" +#import "MPListenerProtocol.h" #import "MPRokt.h" #if TARGET_OS_IOS == 1 diff --git a/mParticle-Apple-SDK/Listener/MPListenerController.m b/mParticle-Apple-SDK/Listener/MPListenerController.m deleted file mode 100644 index 63c5cc6b2..000000000 --- a/mParticle-Apple-SDK/Listener/MPListenerController.m +++ /dev/null @@ -1,258 +0,0 @@ -#import "MPListenerController.h" -#import "MPIConstants.h" - -static MPListenerController *_sharedInstance = nil; -static dispatch_once_t predicate; - -@interface MPListenerController () - -@property (nonatomic, strong) NSMutableArray> *sdkListeners; - -@end - -@implementation MPListenerController - -#pragma mark Initialization -- (instancetype)init -{ - self = [super init]; - if (self) { - _sdkListeners = [NSMutableArray array]; - } - return self; -} - -+ (MPListenerController *)sharedInstance { - dispatch_once(&predicate, ^{ - _sharedInstance = [[MPListenerController alloc] init]; - }); - - return _sharedInstance; -} - -#pragma mark Private methods -- (void)addSdkListener:(id)sdkListener { - [self.sdkListeners addObject:sdkListener]; -} - -- (void)removeSdkListener:(id)sdkListener { - if (self.sdkListeners) { - [self.sdkListeners removeObject:sdkListener]; - } -} - -- (void)onAPICalled:(SEL)apiName { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onAPICalled:stackTrace:isExternal:objects:)]) { - NSArray *stackTrace = [NSThread callStackSymbols]; - NSMutableArray *parameters = [NSMutableArray array]; - - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onAPICalled:NSStringFromSelector(apiName) stackTrace:stackTrace isExternal:true objects:parameters]; - }); - } - } -} - -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1 { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onAPICalled:stackTrace:isExternal:objects:)]) { - NSArray *stackTrace = [NSThread callStackSymbols]; - NSMutableArray *parameters = [NSMutableArray array]; - if (parameter1) { - [parameters addObject:parameter1]; - } else { - [parameters addObject:[NSNull null]]; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onAPICalled:NSStringFromSelector(apiName) stackTrace:stackTrace isExternal:true objects:parameters]; - }); - } - } -} - -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1 parameter2:(nullable NSObject *)parameter2 { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onAPICalled:stackTrace:isExternal:objects:)]) { - NSArray *stackTrace = [NSThread callStackSymbols]; - NSMutableArray *parameters = [NSMutableArray array]; - if (parameter1) { - [parameters addObject:parameter1]; - } else { - [parameters addObject:[NSNull null]]; - } - if (parameter2) { - [parameters addObject:parameter2]; - } else { - [parameters addObject:[NSNull null]]; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onAPICalled:NSStringFromSelector(apiName) stackTrace:stackTrace isExternal:true objects:parameters]; - }); - } - } -} - -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1 parameter2:(nullable NSObject *)parameter2 parameter3:(nullable NSObject *)parameter3 { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onAPICalled:stackTrace:isExternal:objects:)]) { - NSArray *stackTrace = [NSThread callStackSymbols]; - NSMutableArray *parameters = [NSMutableArray array]; - if (parameter1) { - [parameters addObject:parameter1]; - } else { - [parameters addObject:[NSNull null]]; - } - if (parameter2) { - [parameters addObject:parameter2]; - } else { - [parameters addObject:[NSNull null]]; - } - if (parameter3) { - [parameters addObject:parameter3]; - } else { - [parameters addObject:[NSNull null]]; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onAPICalled:NSStringFromSelector(apiName) stackTrace:stackTrace isExternal:true objects:parameters]; - }); - } - } -} - -- (void)onAPICalled:(SEL)apiName parameter1:(nullable NSObject *)parameter1 parameter2:(nullable NSObject *)parameter2 parameter3:(nullable NSObject *)parameter3 parameter4:(nullable NSObject *)parameter4 { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onAPICalled:stackTrace:isExternal:objects:)]) { - NSArray *stackTrace = [NSThread callStackSymbols]; - NSMutableArray *parameters = [NSMutableArray array]; - if (parameter1) { - [parameters addObject:parameter1]; - } else { - [parameters addObject:[NSNull null]]; - } - if (parameter2) { - [parameters addObject:parameter2]; - } else { - [parameters addObject:[NSNull null]]; - } - if (parameter3) { - [parameters addObject:parameter3]; - } else { - [parameters addObject:[NSNull null]]; - } - if (parameter4) { - [parameters addObject:parameter4]; - } else { - [parameters addObject:[NSNull null]]; - } - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onAPICalled:NSStringFromSelector(apiName) stackTrace:stackTrace isExternal:true objects:parameters]; - }); - } - } -} - -- (void)onEntityStored:(MPDatabaseTable)tableName primaryKey:(nonnull NSNumber *)primaryKey message:(nonnull NSString *)message { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onEntityStored:primaryKey:message:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onEntityStored:tableName primaryKey:primaryKey message:message]; - }); - } - } -} - -- (void)onNetworkRequestStarted:(MPEndpoint)type url:(nonnull NSString *)url body:(nonnull NSObject *)body { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onNetworkRequestStarted:url:body:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onNetworkRequestStarted:type url:url body:body]; - }); - } - } -} - -- (void)onNetworkRequestFinished:(MPEndpoint)type url:(nonnull NSString *)url body:(nonnull NSObject *)body responseCode:(NSInteger)responseCode { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onNetworkRequestFinished:url:body:responseCode:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onNetworkRequestFinished:type url:url body:body responseCode:responseCode]; - }); - } - } -} - -- (void)onKitApiCalled:(nonnull NSString *)methodName kitId:(int)kitId used:(BOOL)used objects:(nonnull NSArray *)objects { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onKitApiCalled:kitId:used:objects:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onKitApiCalled:methodName kitId:kitId used:used objects:objects]; - }); - } - } -} - -- (void)onKitDetected:(int)kitId { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onKitDetected:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onKitDetected:kitId]; - }); - } - } -} - -- (void)onKitConfigReceived:(int)kitId configuration:(nonnull NSDictionary *)configuration { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onKitConfigReceived:configuration:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onKitConfigReceived:kitId configuration:configuration]; - }); - } - } -} - -- (void)onKitStarted:(int)kitId { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onKitStarted:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onKitStarted:kitId]; - }); - } - } -} - -- (void)onKitExcluded:(int)kitId reason:(nonnull NSString *)reason { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onKitExcluded:reason:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onKitExcluded:kitId reason:reason]; - }); - } - } -} - -- (void)onSessionUpdated:(nullable MParticleSession *)session { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onSessionUpdated:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onSessionUpdated:session]; - }); - } - } -} - -- (void)onAliasRequestFinished:(nullable MPAliasResponse *)aliasResponse { - for (iddelegate in self.sdkListeners) { - if ([delegate respondsToSelector:@selector(onAliasRequestFinished:)]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [delegate onAliasRequestFinished:aliasResponse]; - }); - } - } -} - -@end diff --git a/mParticle-Apple-SDK/MPBackendController.m b/mParticle-Apple-SDK/MPBackendController.m index e8186c8a7..76769aee0 100644 --- a/mParticle-Apple-SDK/MPBackendController.m +++ b/mParticle-Apple-SDK/MPBackendController.m @@ -22,7 +22,6 @@ #import "MPCommerceEvent+Dictionary.h" #import "MPKitContainer.h" #import "MPURLRequestBuilder.h" -#import "MPListenerController.h" #import "MPIdentityCaching.h" #import "MParticleSwift.h" #import "MPNetworkCommunication.h" @@ -477,8 +476,6 @@ - (void)requestConfig:(void(^ _Nullable)(BOOL uploadBatch))completionHandler { } - (void)setUserAttributeChange:(MPUserAttributeChange *)userAttributeChange completionHandler:(void (^)(NSString *key, id value, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:userAttributeChange]; - if ([MParticle sharedInstance].stateMachine.optOut) { if (completionHandler) { completionHandler(userAttributeChange.key, userAttributeChange.value, MPExecStatusOptOut); @@ -1089,8 +1086,6 @@ - (NSNumber *)incrementSessionAttribute:(MPSession *)session key:(NSString *)key } - (NSNumber *)incrementUserAttribute:(NSString *)key byValue:(NSNumber *)value { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:key parameter2:value]; - NSAssert([key isKindOfClass:[NSString class]], @"'key' must be a string."); NSAssert([value isKindOfClass:[NSNumber class]], @"'value' must be a number."); @@ -1139,8 +1134,6 @@ - (NSNumber *)incrementUserAttribute:(NSString *)key byValue:(NSNumber *)value { } - (void)leaveBreadcrumb:(MPEvent *)event completionHandler:(void (^)(MPEvent *event, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:event]; - event.messageType = MPMessageTypeBreadcrumb; MPExecStatus execStatus = MPExecStatusFail; @@ -1166,8 +1159,6 @@ - (void)leaveBreadcrumb:(MPEvent *)event completionHandler:(void (^)(MPEvent *ev } - (void)logError:(NSString *)message exception:(NSException *)exception topmostContext:(id)topmostContext eventInfo:(NSDictionary *)eventInfo completionHandler:(void (^)(NSString *message, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:message parameter2:exception parameter3:topmostContext parameter4:eventInfo]; - NSString *execMessage = exception ? exception.name : message; MPExecStatus execStatus = MPExecStatusFail; @@ -1288,8 +1279,6 @@ - (void)logCrash:(NSString *)message stackTrace:(NSString *)stackTrace plCrashR } - (void)logBaseEvent:(MPBaseEvent *)event completionHandler:(void (^)(MPBaseEvent *event, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:event]; - if (event.shouldBeginSession) { NSDate *date = event.timestamp ?: [NSDate date]; [self beginSessionWithIsManual:!MParticle.sharedInstance.automaticSessionTracking date:date]; @@ -1316,8 +1305,6 @@ - (void)logBaseEvent:(MPBaseEvent *)event completionHandler:(void (^)(MPBaseEven } - (void)logEvent:(MPEvent *)event completionHandler:(void (^)(MPEvent *event, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:event]; - event.messageType = MPMessageTypeEvent; [self logBaseEvent:event @@ -1331,8 +1318,6 @@ - (void)logEvent:(MPEvent *)event completionHandler:(void (^)(MPEvent *event, MP } - (void)logCommerceEvent:(MPCommerceEvent *)commerceEvent completionHandler:(void (^)(MPCommerceEvent *commerceEvent, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:commerceEvent]; - commerceEvent.messageType = MPMessageTypeCommerceEvent; [self logBaseEvent:commerceEvent @@ -1342,8 +1327,6 @@ - (void)logCommerceEvent:(MPCommerceEvent *)commerceEvent completionHandler:(voi } - (void)logNetworkPerformanceMeasurement:(MPNetworkPerformance *)networkPerformance completionHandler:(void (^)(MPNetworkPerformance *networkPerformance, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:networkPerformance]; - MPExecStatus execStatus = MPExecStatusFail; NSDictionary *messageInfo = [networkPerformance dictionaryRepresentation]; @@ -1362,8 +1345,6 @@ - (void)logNetworkPerformanceMeasurement:(MPNetworkPerformance *)networkPerforma } - (void)logScreen:(MPEvent *)event completionHandler:(void (^)(MPEvent *event, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:event]; - event.messageType = MPMessageTypeScreenView; MPExecStatus execStatus = MPExecStatusFail; @@ -1399,8 +1380,6 @@ - (void)logScreen:(MPEvent *)event completionHandler:(void (^)(MPEvent *event, M - (void)setOptOut:(BOOL)optOutStatus completionHandler:(void (^)(BOOL optOut, MPExecStatus execStatus))completionHandler { dispatch_async([MParticle messageQueue], ^{ - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:@(optOutStatus)]; - MPExecStatus execStatus = MPExecStatusFail; [MParticle sharedInstance].stateMachine.optOut = optOutStatus; @@ -1446,8 +1425,6 @@ - (MPExecStatus)setSessionAttribute:(MPSession *)session key:(NSString *)key val } - (void)startWithKey:(NSString *)apiKey secret:(NSString *)secret networkOptions:(nullable MPNetworkOptions *)networkOptions firstRun:(BOOL)firstRun installationType:(MPInstallationType)installationType proxyAppDelegate:(BOOL)proxyAppDelegate startKitsAsync:(BOOL)startKitsAsync consentState:(MPConsentState *)consentState completionHandler:(dispatch_block_t)completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:apiKey parameter2:secret parameter3:@(firstRun) parameter4:consentState]; - if (![MPStateMachine_PRIVATE isAppExtension]) { if (proxyAppDelegate) { [self proxyOriginalAppDelegate]; @@ -1640,8 +1617,6 @@ - (MPExecStatus)checkForKitsAndUploadWithCompletionHandler:(void (^ _Nullable)(B } - (void)setUserTag:(NSString *)key timestamp:(NSDate *)timestamp completionHandler:(void (^)(NSString *key, id value, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:key parameter2:timestamp]; - NSString *keyCopy = [key mutableCopy]; BOOL validKey = !MPIsNull(keyCopy) && [keyCopy isKindOfClass:[NSString class]]; if (!validKey) { @@ -1658,8 +1633,6 @@ - (void)setUserTag:(NSString *)key timestamp:(NSDate *)timestamp completionHandl } - (void)setUserAttribute:(NSString *)key value:(id)value timestamp:(NSDate *)timestamp completionHandler:(void (^)(NSString *key, id value, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:key parameter2:value parameter3:timestamp]; - NSString *keyCopy = [key mutableCopy]; BOOL validKey = !MPIsNull(keyCopy) && [keyCopy isKindOfClass:[NSString class]]; if (!validKey) { @@ -1684,8 +1657,6 @@ - (void)setUserAttribute:(NSString *)key value:(id)value timestamp:(NSDate *)tim } - (void)setUserAttribute:(nonnull NSString *)key values:(nullable NSArray *)values timestamp:(NSDate *)timestamp completionHandler:(void (^ _Nullable)(NSString * _Nonnull key, NSArray * _Nullable values, MPExecStatus execStatus))completionHandler { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:key parameter2:values parameter3:timestamp]; - NSString *keyCopy = [key mutableCopy]; BOOL validKey = !MPIsNull(keyCopy) && [keyCopy isKindOfClass:[NSString class]]; @@ -1714,8 +1685,6 @@ - (void)setUserAttribute:(nonnull NSString *)key values:(nullable NSArray *)connector withCo }]; } - [MPListenerController.sharedInstance onNetworkRequestStarted:MPEndpointConfig url:self.configURL.url.absoluteString body:@[]]; - connector = connector ? connector : [self makeConnector]; NSObject *response = [connector responseFromGetRequestToURL:self.configURL]; NSData *data = response.data; @@ -499,7 +497,6 @@ - (void)requestConfig:(nullable NSObject *)connector withCo [userDefaults setConfiguration:[userDefaults getConfiguration] eTag:userDefaults[kMPHTTPETagHeaderKey] requestTimestamp:[[NSDate date] timeIntervalSince1970] currentAge:ageString.doubleValue maxAge:maxAge]; completionHandler(YES); - [MPListenerController.sharedInstance onNetworkRequestFinished:MPEndpointConfig url:self.configURL.url.absoluteString body:[NSDictionary dictionary] responseCode:responseCode]; return; } @@ -508,7 +505,6 @@ - (void)requestConfig:(nullable NSObject *)connector withCo if (!data && success) { completionHandler(NO); MPILogWarning(@"Failed config request"); - [MPListenerController.sharedInstance onNetworkRequestFinished:MPEndpointConfig url:self.configURL.url.absoluteString body:[NSDictionary dictionary] responseCode:HTTPStatusCodeNoContent]; return; } @@ -526,7 +522,6 @@ - (void)requestConfig:(nullable NSObject *)connector withCo } } - [MPListenerController.sharedInstance onNetworkRequestFinished:MPEndpointConfig url:(self.configURL.url.absoluteString ?: @"") body:(configurationDictionary ?: @{}) responseCode:responseCode]; if (success && configurationDictionary) { NSDictionary *headersDictionary = [httpResponse allHeaderFields]; NSString *eTag = headersDictionary[kMPHTTPETagHeaderKey]; @@ -697,8 +692,6 @@ - (BOOL)performMessageUpload:(MPUpload *)upload { } NSTimeInterval start = [[NSDate date] timeIntervalSince1970]; - [MPListenerController.sharedInstance onNetworkRequestStarted:MPEndpointEvents url:eventURL.url.absoluteString body:@[uploadString, zipUploadData]]; - NSObject *response = [connector responseFromPostRequestToURL:eventURL message:uploadString serializedParams:zipUploadData @@ -718,7 +711,6 @@ - (BOOL)performMessageUpload:(MPUpload *)upload { } BOOL success = isSuccessCode && data && [data length] > 0; - [MPListenerController.sharedInstance onNetworkRequestFinished:MPEndpointEvents url:eventURL.url.absoluteString body:response.data responseCode:responseCode]; if (success) { @try { NSError *serializationError = nil; @@ -771,7 +763,6 @@ - (BOOL)performAliasUpload:(MPUpload *)upload { NSTimeInterval start = [[NSDate date] timeIntervalSince1970]; MPILogVerbose(@"Alias request:\nURL: %@ \nBody:%@", aliasURL.url, uploadString); - [MPListenerController.sharedInstance onNetworkRequestStarted:MPEndpointAlias url:aliasURL.url.absoluteString body:@[uploadString, upload.uploadData]]; NSObject *response = [connector responseFromPostRequestToURL:aliasURL message:uploadString @@ -789,8 +780,6 @@ - (BOOL)performAliasUpload:(MPUpload *)upload { [[MParticle sharedInstance].persistenceController deleteUpload:upload]; } - [MPListenerController.sharedInstance onNetworkRequestFinished:MPEndpointAlias url:aliasURL.url.absoluteString body:response.data responseCode:responseCode]; - NSString *responseString = [[NSString alloc] initWithData:response.data encoding:NSUTF8StringEncoding]; if (responseString != nil && responseString.length > 0) { MPILogVerbose(@"Alias response:\n%@", responseString); @@ -830,18 +819,15 @@ - (BOOL)performAliasUpload:(MPUpload *)upload { // 429, 503 if (responseCode == HTTPStatusCodeServiceUnavailable || responseCode == HTTPStatusCodeTooManyRequests) { aliasResponse.willRetry = YES; - [MPListenerController.sharedInstance onAliasRequestFinished:aliasResponse]; [self throttleWithHTTPResponse:httpResponse uploadType:upload.uploadType]; return YES; } //5xx, 0, 999, -1, etc if (!isSuccessCode && !isInvalidCode) { - [MPListenerController.sharedInstance onAliasRequestFinished:aliasResponse]; return YES; } - [MPListenerController.sharedInstance onAliasRequestFinished:aliasResponse]; return NO; } @@ -927,8 +913,6 @@ - (void)identityApiRequestWithURL:(NSURL*)url identityRequest:(MPIdentityHTTPBas MPILogVerbose(@"Identity request:\nURL: %@ \nBody:%@", url, jsonRequest); - [MPListenerController.sharedInstance onNetworkRequestStarted:endpointType url:url.absoluteString body:data]; - BOOL success = NO; NSError *error = nil; NSDictionary *responseDictionary = nil; @@ -1040,7 +1024,6 @@ - (void)identityApiRequestWithURL:(NSURL*)url identityRequest:(MPIdentityHTTPBas self.identifying = NO; - [MPListenerController.sharedInstance onNetworkRequestFinished:endpointType url:(url.absoluteString ?: @"") body:(responseDictionary ?: @{}) responseCode:responseCode]; if (success) { if (responseString) { MPILogVerbose(@"Identity response:\n%@", responseString); diff --git a/mParticle-Apple-SDK/Persistence/MPPersistenceController.mm b/mParticle-Apple-SDK/Persistence/MPPersistenceController.mm index 3ce74d153..86737ed6b 100644 --- a/mParticle-Apple-SDK/Persistence/MPPersistenceController.mm +++ b/mParticle-Apple-SDK/Persistence/MPPersistenceController.mm @@ -15,7 +15,6 @@ #import "MPIConstants.h" #import "MPConsentSerialization.h" #import -#import "MPListenerProtocol.h" #import "MPKitFilter.h" #import "MPApplication.h" #import "MParticleSwift.h" @@ -1401,8 +1400,6 @@ - (void)saveBreadcrumb:(MPMessage *)message { if (sqlite3_step(preparedStatement) != SQLITE_DONE) { MPILogError(@"Error while storing breadcrumb: %s", sqlite3_errmsg(mParticleDB)); - } else { - [MPListenerController.sharedInstance onEntityStored:MPDatabaseTableBreadcrumbs primaryKey:@(message.messageId) message:message.description]; } sqlite3_clear_bindings(preparedStatement); @@ -1548,8 +1545,6 @@ - (void)saveIntegrationAttributes:(nonnull MPIntegrationAttributes *)integration sqlite3_clear_bindings(preparedStatement); sqlite3_finalize(preparedStatement); return; - } else { - [MPListenerController.sharedInstance onEntityStored:MPDatabaseTableAttributes primaryKey:integrationAttributes.integrationId message:integrationAttributes.description]; } sqlite3_clear_bindings(preparedStatement); @@ -1617,8 +1612,6 @@ - (void)saveMessage:(MPMessage *)message { message.messageId = sqlite3_last_insert_rowid(mParticleDB); - [MPListenerController.sharedInstance onEntityStored:MPDatabaseTableMessages primaryKey:@(message.messageId) message:message.description]; - sqlite3_clear_bindings(preparedStatement); } else { MPILogError(@"could not prepare statemnt: %s\n", sqlite3_errmsg(mParticleDB)); @@ -1661,8 +1654,6 @@ - (void)saveSession:(MPSession *)session { } session.sessionId = sqlite3_last_insert_rowid(mParticleDB); - - [MPListenerController.sharedInstance onEntityStored:MPDatabaseTableSessions primaryKey:@(session.sessionId) message:session.description]; sqlite3_clear_bindings(preparedStatement); } else { @@ -1730,8 +1721,6 @@ - (void)saveUpload:(nonnull MPUpload *)upload { } upload.uploadId = sqlite3_last_insert_rowid(mParticleDB); - - [MPListenerController.sharedInstance onEntityStored:MPDatabaseTableUploads primaryKey:@(upload.uploadId) message:upload.description]; sqlite3_clear_bindings(preparedStatement); } else { diff --git a/mParticle-Apple-SDK/mParticle.m b/mParticle-Apple-SDK/mParticle.m index 58b3bf871..94b7c1555 100644 --- a/mParticle-Apple-SDK/mParticle.m +++ b/mParticle-Apple-SDK/mParticle.m @@ -69,7 +69,6 @@ @interface MParticle() *disabledKits; @property (nonatomic, strong) id settingsProvider; -@property (nonatomic, strong, nonnull) id listenerController; @property (nonatomic, strong, nonnull) id notificationController; @property (nonatomic, strong, nonnull) id appEnvironmentProvider; @end @@ -96,7 +95,6 @@ @implementation MParticle @synthesize kitContainer = _kitContainer; @synthesize appNotificationHandler = _appNotificationHandler; @synthesize settingsProvider = _settingsProvider; -@synthesize listenerController = _listenerController; static id executor; MPLog* logger; @synthesize sceneDelegateHandler = _sceneDelegateHandler; @@ -154,7 +152,6 @@ - (instancetype)init { _appNotificationHandler = (id)[[MPAppNotificationHandler alloc] init]; _stateMachine = [[MPStateMachine_PRIVATE alloc] init]; _webView = [[MParticleWebView_PRIVATE alloc] initWithMessageQueue:executor.messageQueue]; - _listenerController = MPListenerController.sharedInstance; _appEnvironmentProvider = [[AppEnvironmentProvider alloc] init]; _notificationController = [[MPNotificationController_PRIVATE alloc] init]; logger = [[MPLog alloc] initWithLogLevel:_stateMachine.logLevel]; @@ -343,8 +340,6 @@ + (instancetype)sharedInstance { + (void)setSharedInstance:(MParticle *)instance { predicate = 0; // resets the once_token so dispatch_once will run again _sharedInstance = instance; - - [instance.listenerController onAPICalled:_cmd parameter1:instance]; } - (void)identifyNoDispatchCallback:(MPIdentityApiResult * _Nullable)apiResult @@ -436,8 +431,6 @@ - (void)startWithOptions:(MParticleOptions *)options { } sdkInitialized = YES; - [self.listenerController onAPICalled:_cmd parameter1:options]; - [self.webView startWithCustomUserAgent:options.customUserAgent shouldCollect:options.collectUserAgent defaultUserAgentOverride:options.defaultAgent]; _backendController = [[MPBackendController_PRIVATE alloc] initWithDelegate:self]; @@ -734,8 +727,6 @@ - (void)beginTimedEventCompletionHandler:(MPEvent *)event execStatus:(MPExecStat } - (void)beginTimedEvent:(MPEvent *)event { - [self.listenerController onAPICalled:_cmd parameter1:event]; - [self.backendController beginTimedEvent:event completionHandler:^(MPEvent *event, MPExecStatus execStatus) { [self beginTimedEventCompletionHandler:event execStatus:execStatus]; @@ -772,8 +763,6 @@ - (void)logEventCallback:(MPEvent *)event execStatus:(MPExecStatus)execStatus { - (void)endTimedEvent:(MPEvent *)event { [event endTiming]; [executor executeOnMessage: ^{ - [self.listenerController onAPICalled:_cmd parameter1:event]; - [self.backendController logEvent:event completionHandler:^(MPEvent *event, MPExecStatus execStatus) { [self logEventCallback:event execStatus:execStatus]; @@ -795,8 +784,6 @@ - (void)logEvent:(MPBaseEvent *)event { #pragma clang diagnostic pop } else { [executor executeOnMessage: ^{ - [self.listenerController onAPICalled:_cmd parameter1:event]; - [self.backendController logBaseEvent:event completionHandler:^(MPBaseEvent *event, MPExecStatus execStatus) { }]; @@ -828,8 +815,6 @@ - (void)logCustomEvent:(MPEvent *)event { [event endTiming]; [executor executeOnMessage: ^{ - [self.listenerController onAPICalled:_cmd parameter1:event]; - [self.backendController logEvent:event completionHandler:^(MPEvent *event, MPExecStatus execStatus) { }]; @@ -934,8 +919,6 @@ - (void)logScreenCallback:(MPEvent *)event execStatus:(MPExecStatus)execStatus { - (void)logScreenEvent:(MPEvent *)event { [executor executeOnMessage: ^{ - [self.listenerController onAPICalled:_cmd parameter1:event]; - [self.backendController logScreen:event completionHandler:^(MPEvent *event, MPExecStatus execStatus) { [self logScreenCallback:event execStatus:execStatus]; @@ -1038,8 +1021,6 @@ - (void)leaveBreadcrumb:(NSString *)breadcrumbName eventInfo:(NSDictionary *)e } [executor executeOnMessage: ^{ - [self.listenerController onAPICalled:_cmd parameter1:message]; - [self.backendController logError:message exception:nil topmostContext:nil @@ -1114,8 +1093,6 @@ - (void)logExceptionCallback:(NSException * _Nonnull)exception execStatus:(MPExe - (void)logException:(NSException *)exception topmostContext:(id)topmostContext { [executor executeOnMessage: ^{ - [self.listenerController onAPICalled:_cmd parameter1:exception]; - [self.backendController logError:nil exception:exception topmostContext:topmostContext @@ -1144,8 +1121,6 @@ - (void)logCrash:(nullable NSString *)message } [executor executeOnMessage: ^{ - [self.listenerController onAPICalled:_cmd parameter1:message]; - [self.backendController logCrash:message stackTrace:stackTrace plCrashReport:plCrashReport @@ -1170,8 +1145,6 @@ - (void)logCommerceEvent:(MPCommerceEvent *)commerceEvent { } [executor executeOnMessage: ^{ - [self.listenerController onAPICalled:_cmd parameter1:commerceEvent]; - [self.backendController logCommerceEvent:commerceEvent completionHandler:^(MPCommerceEvent *commerceEvent, MPExecStatus execStatus) { [self logCommerceEventCallback:commerceEvent execStatus:execStatus]; @@ -1224,8 +1197,6 @@ - (void)logLTVIncrease:(double)increaseAmount eventName:(NSString *)eventName ev MPEvent *event = [[MPEvent alloc] initWithName:eventName type:MPEventTypeTransaction]; event.customAttributes = eventDictionary; - [self.listenerController onAPICalled:_cmd parameter1:@(increaseAmount) parameter2:eventName parameter3:eventInfo]; - [self.backendController logEvent:event completionHandler:^(MPEvent *event, MPExecStatus execStatus) { [self logLTVIncreaseCallback:event execStatus:execStatus]; @@ -1234,8 +1205,6 @@ - (void)logLTVIncrease:(double)increaseAmount eventName:(NSString *)eventName ev #pragma mark Extensions + (BOOL)registerExtension:(nonnull id)extension { - [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:extension]; - NSAssert(extension != nil, @"Required parameter. It cannot be nil."); BOOL registrationSuccessful = NO; @@ -1248,16 +1217,12 @@ + (BOOL)registerExtension:(nonnull id)extension { #pragma mark Integration attributes - (nonnull MPKitExecStatus *)setIntegrationAttributes:(nonnull NSDictionary *)attributes forKit:(nonnull NSNumber *)integrationId { - NSDictionary *attributesCopy = [attributes copy]; __block MPKitReturnCode returnCode = MPKitReturnCodeSuccess; MPIntegrationAttributes *integrationAttributes = [[MPIntegrationAttributes alloc] initWithIntegrationId:integrationId attributes:attributes]; if (integrationAttributes) { [executor executeOnMessage: ^{ - - [self.listenerController onAPICalled:_cmd parameter1:attributesCopy parameter2:integrationId]; - [[MParticle sharedInstance].persistenceController saveIntegrationAttributes:integrationAttributes]; }]; @@ -1270,8 +1235,6 @@ - (nonnull MPKitExecStatus *)setIntegrationAttributes:(nonnull NSDictionary