diff --git a/UnitTests/MPRoktTests.m b/UnitTests/MPRoktTests.m new file mode 100644 index 000000000..92be07851 --- /dev/null +++ b/UnitTests/MPRoktTests.m @@ -0,0 +1,158 @@ +#import +#import +#import "MParticle.h" +#import "MPKitContainer.h" +#import "MPForwardQueueParameters.h" + +@interface MPRokt (Testing) +@end + +@interface MPRoktTests : XCTestCase +@property (nonatomic, strong) MPRokt *rokt; +@end + +@implementation MPRoktTests + +- (void)setUp { + [super setUp]; + self.rokt = [[MPRokt alloc] init]; +} + +- (void)tearDown { + self.rokt = nil; + [super tearDown]; +} + +- (void)testSelectPlacementsSimpleWithValidParameters { + id mockInstance = OCMClassMock([MParticle class]); + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; + [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; + + // Set up test parameters + NSString *viewName = @"testView"; + NSDictionary *attributes = @{@"key": @"value"}; + + // Set up expectations for kit container + XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for async operation"]; + SEL roktSelector = @selector(executeWithViewName:attributes:placements:onLoad:onUnLoad:onShouldShowLoadingIndicator:onShouldHideLoadingIndicator:onEmbeddedSizeChange:filteredUser:); + OCMExpect([mockContainer forwardSDKCall:roktSelector + event:nil + parameters:[OCMArg checkWithBlock:^BOOL(MPForwardQueueParameters *params) { + XCTAssertEqualObjects(params[0], viewName); + XCTAssertEqualObjects(params[1], attributes); + XCTAssertNil(params[2]); + XCTAssertNil(params[3]); + XCTAssertNil(params[4]); + XCTAssertNil(params[5]); + XCTAssertNil(params[6]); + XCTAssertNil(params[7]); + return true; + }] + messageType:MPMessageTypeEvent + userInfo:nil]).andDo(^(NSInvocation *invocation) { + [expectation fulfill]; + }); + + // Execute method + [self.rokt selectPlacements:viewName + attributes:attributes]; + + // Wait for async operation + [self waitForExpectationsWithTimeout:1.0 handler:nil]; + + // Verify + OCMVerifyAll(mockContainer); +} + +- (void)testSelectPlacementsExpandedWithValidParameters { + id mockInstance = OCMClassMock([MParticle class]); + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; + [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; + + // Set up test parameters + NSString *viewName = @"testView"; + NSDictionary *attributes = @{@"key": @"value"}; + NSDictionary *placements = @{@"placement": @"test"}; + void (^onLoad)(void) = ^{}; + void (^onUnLoad)(void) = ^{}; + void (^onShouldShowLoadingIndicator)(void) = ^{}; + void (^onShouldHideLoadingIndicator)(void) = ^{}; + void (^onEmbeddedSizeChange)(NSString *, CGFloat) = ^(NSString *p, CGFloat s){}; + + // Set up expectations for kit container + XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for async operation"]; + SEL roktSelector = @selector(executeWithViewName:attributes:placements:onLoad:onUnLoad:onShouldShowLoadingIndicator:onShouldHideLoadingIndicator:onEmbeddedSizeChange:filteredUser:); + OCMExpect([mockContainer forwardSDKCall:roktSelector + event:nil + parameters:[OCMArg checkWithBlock:^BOOL(MPForwardQueueParameters *params) { + XCTAssertEqualObjects(params[0], viewName); + XCTAssertEqualObjects(params[1], attributes); + XCTAssertEqualObjects(params[2], placements); + XCTAssertTrue(params[3] != nil); + XCTAssertTrue(params[4] != nil); + XCTAssertTrue(params[5] != nil); + XCTAssertTrue(params[6] != nil); + XCTAssertTrue(params[7] != nil); + return true; + }] + messageType:MPMessageTypeEvent + userInfo:nil]).andDo(^(NSInvocation *invocation) { + [expectation fulfill]; + }); + + // Execute method + [self.rokt selectPlacements:viewName + attributes:attributes + placements:placements + onLoad:onLoad + onUnLoad:onUnLoad + onShouldShowLoadingIndicator:onShouldShowLoadingIndicator + onShouldHideLoadingIndicator:onShouldHideLoadingIndicator + onEmbeddedSizeChange:onEmbeddedSizeChange]; + + // Wait for async operation + [self waitForExpectationsWithTimeout:1.0 handler:nil]; + + // Verify + OCMVerifyAll(mockContainer); +} + +- (void)testSelectPlacementsExpandedWithNilParameters { + id mockInstance = OCMClassMock([MParticle class]); + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; + [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; + + // Execute method with nil parameters + [self.rokt selectPlacements:nil + attributes:nil + placements:nil + onLoad:nil + onUnLoad:nil + onShouldShowLoadingIndicator:nil + onShouldHideLoadingIndicator:nil + onEmbeddedSizeChange:nil]; + + // Wait for async operation + XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for async operation"]; + + // Verify the call is still forwarded with nil parameters + SEL roktSelector = @selector(executeWithViewName:attributes:placements:onLoad:onUnLoad:onShouldShowLoadingIndicator:onShouldHideLoadingIndicator:onEmbeddedSizeChange:filteredUser:); + OCMExpect([mockContainer forwardSDKCall:roktSelector + event:nil + parameters:[OCMArg any] + messageType:MPMessageTypeEvent + userInfo:nil]).andDo(^(NSInvocation *invocation) { + [expectation fulfill]; + }); + + // Wait for async operation + [self waitForExpectationsWithTimeout:1.0 handler:nil]; + + // Verify + OCMVerifyAll(mockContainer); +} + +@end diff --git a/mParticle-Apple-SDK.xcodeproj/project.pbxproj b/mParticle-Apple-SDK.xcodeproj/project.pbxproj index bf769679c..9f49ff319 100644 --- a/mParticle-Apple-SDK.xcodeproj/project.pbxproj +++ b/mParticle-Apple-SDK.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 53; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -460,17 +460,19 @@ 53E20DC82CBFFCD200146A97 /* NSArray+MPCaseInsensitiveTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E20DC62CBFFCD200146A97 /* NSArray+MPCaseInsensitiveTests.swift */; }; 53FDD1BD2AE871AF003D5FA1 /* MPIHasher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FDD1BC2AE871AF003D5FA1 /* MPIHasher.swift */; }; 53FDD1BE2AE871AF003D5FA1 /* MPIHasher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FDD1BC2AE871AF003D5FA1 /* MPIHasher.swift */; }; + 7E15B2062D94617900C1FF3E /* MPRoktTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E15B2052D94617900C1FF3E /* MPRoktTests.m */; }; + 7E15B2072D94617900C1FF3E /* MPRoktTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E15B2052D94617900C1FF3E /* MPRoktTests.m */; }; D30CD0CB2CFF5FB100F5148A /* MPStateMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0629CDFB1F00E7489F /* MPStateMachine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D33C8B332B8510C20012EDFD /* MPAudience.h in Headers */ = {isa = PBXBuildFile; fileRef = D33C8B312B8510C20012EDFD /* MPAudience.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D33C8B342B8510C20012EDFD /* MPAudience.h in Headers */ = {isa = PBXBuildFile; fileRef = D33C8B312B8510C20012EDFD /* MPAudience.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D33C8B352B8510C20012EDFD /* MPAudience.m in Sources */ = {isa = PBXBuildFile; fileRef = D33C8B322B8510C20012EDFD /* MPAudience.m */; }; + D33C8B362B8510C20012EDFD /* MPAudience.m in Sources */ = {isa = PBXBuildFile; fileRef = D33C8B322B8510C20012EDFD /* MPAudience.m */; }; D34286092D3806E600FEC2C8 /* MPUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34286082D3806CF00FEC2C8 /* MPUserDefaults.swift */; }; D342860A2D3806E600FEC2C8 /* MPUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34286082D3806CF00FEC2C8 /* MPUserDefaults.swift */; }; D342860F2D419CB800FEC2C8 /* MPUploadSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D342860E2D419CA700FEC2C8 /* MPUploadSettings.swift */; }; D34286102D419CB800FEC2C8 /* MPUploadSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D342860E2D419CA700FEC2C8 /* MPUploadSettings.swift */; }; D356E0242CFE08ED0020898D /* MPResponseConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D356E0232CFE08ED0020898D /* MPResponseConfig.swift */; }; D356E0252CFE08ED0020898D /* MPResponseConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D356E0232CFE08ED0020898D /* MPResponseConfig.swift */; }; - D33C8B332B8510C20012EDFD /* MPAudience.h in Headers */ = {isa = PBXBuildFile; fileRef = D33C8B312B8510C20012EDFD /* MPAudience.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D33C8B342B8510C20012EDFD /* MPAudience.h in Headers */ = {isa = PBXBuildFile; fileRef = D33C8B312B8510C20012EDFD /* MPAudience.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D33C8B352B8510C20012EDFD /* MPAudience.m in Sources */ = {isa = PBXBuildFile; fileRef = D33C8B322B8510C20012EDFD /* MPAudience.m */; }; - D33C8B362B8510C20012EDFD /* MPAudience.m in Sources */ = {isa = PBXBuildFile; fileRef = D33C8B322B8510C20012EDFD /* MPAudience.m */; }; D3724C192AE02AF60074CD67 /* mParticle_Apple_SDK_NoLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = D3724C182AE02AF60074CD67 /* mParticle_Apple_SDK_NoLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; D3961CD62CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3961CD52CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift */; }; D3961CD72CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3961CD52CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift */; }; @@ -761,11 +763,12 @@ 53B33E892A4606CD00CC8A19 /* MPSideloadedKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPSideloadedKit.swift; sourceTree = ""; }; 53E20DC62CBFFCD200146A97 /* NSArray+MPCaseInsensitiveTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSArray+MPCaseInsensitiveTests.swift"; sourceTree = ""; }; 53FDD1BC2AE871AF003D5FA1 /* MPIHasher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPIHasher.swift; sourceTree = ""; }; + 7E15B2052D94617900C1FF3E /* MPRoktTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPRoktTests.m; sourceTree = ""; }; + D33C8B312B8510C20012EDFD /* MPAudience.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPAudience.h; sourceTree = ""; }; + D33C8B322B8510C20012EDFD /* MPAudience.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPAudience.m; sourceTree = ""; }; D34286082D3806CF00FEC2C8 /* MPUserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPUserDefaults.swift; sourceTree = ""; }; D342860E2D419CA700FEC2C8 /* MPUploadSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPUploadSettings.swift; sourceTree = ""; }; D356E0232CFE08ED0020898D /* MPResponseConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPResponseConfig.swift; sourceTree = ""; }; - D33C8B312B8510C20012EDFD /* MPAudience.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPAudience.h; sourceTree = ""; }; - D33C8B322B8510C20012EDFD /* MPAudience.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPAudience.m; sourceTree = ""; }; D3724C182AE02AF60074CD67 /* mParticle_Apple_SDK_NoLocation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mParticle_Apple_SDK_NoLocation.h; sourceTree = ""; }; D3961CD52CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSArray+MPCaseInsensitive.swift"; sourceTree = ""; }; D3961CDD2CC0B7E4003B3194 /* NSString+MPPercentEscape.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSString+MPPercentEscape.swift"; sourceTree = ""; }; @@ -1088,6 +1091,7 @@ 53A79B4A29CDFB1F00E7489F /* Kits */ = { isa = PBXGroup; children = ( + 53A79B5F29CDFB1F00E7489F /* MPKitConfiguration.h */, 53A79B4B29CDFB1F00E7489F /* MPDataPlanFilter.m */, 53A79B4C29CDFB1F00E7489F /* MPKitRegister.m */, 53A79B4D29CDFB1F00E7489F /* MPKitExecStatus.m */, @@ -1107,7 +1111,6 @@ 53A79B5C29CDFB1F00E7489F /* MPKitAPI.m */, 53A79B5D29CDFB1F00E7489F /* MPForwardQueueItem.m */, 53A79B5E29CDFB1F00E7489F /* MPKitActivity.h */, - 53A79B5F29CDFB1F00E7489F /* MPKitConfiguration.h */, 53A79B6029CDFB1F00E7489F /* MPKitFilter.h */, 53A79B6129CDFB1F00E7489F /* MPBaseProjection.h */, 53B33E892A4606CD00CC8A19 /* MPSideloadedKit.swift */, @@ -1248,6 +1251,7 @@ 53A79CB529CE019F00E7489F /* MPAppNotificationHandlerTests.m */, 53A79CB629CE019F00E7489F /* MPKitRegisterTests.m */, 53A79CB729CE019F00E7489F /* HasherTests.m */, + 7E15B2052D94617900C1FF3E /* MPRoktTests.m */, 531BCF392B28A83E00F5C573 /* MPIdentityCachingTests.m */, ); path = UnitTests; @@ -1321,9 +1325,9 @@ 53A79BFB29CDFB2100E7489F /* MPAppDelegateProxy.h in Headers */, 53A79B9929CDFB2000E7489F /* MPIConstants.h in Headers */, 53A79B7129CDFB2000E7489F /* MPBackendController.h in Headers */, - 53A79C1D29CDFB2100E7489F /* MPKitConfiguration.h in Headers */, 53A79B7929CDFB2000E7489F /* MPConnectorResponseProtocol.h in Headers */, 53A79B7C29CDFB2000E7489F /* MPConnectorFactoryProtocol.h in Headers */, + 53A79C1D29CDFB2100E7489F /* MPKitConfiguration.h in Headers */, 53A79B7D29CDFB2000E7489F /* MPNetworkCommunication.h in Headers */, 53A79B7F29CDFB2000E7489F /* MPURL.h in Headers */, 53A79B8829CDFB2000E7489F /* MPDataModelAbstract.h in Headers */, @@ -1410,11 +1414,11 @@ 53A79D2A29CE23F700E7489F /* MPAppDelegateProxy.h in Headers */, 53A79D2C29CE23F700E7489F /* MPIConstants.h in Headers */, 53A79D2E29CE23F700E7489F /* MPBackendController.h in Headers */, - 53A79D2F29CE23F700E7489F /* MPKitConfiguration.h in Headers */, 53A79D3029CE23F700E7489F /* MPConnectorResponseProtocol.h in Headers */, 53A79D3229CE23F700E7489F /* MPConnectorFactoryProtocol.h in Headers */, 53A79D3329CE23F700E7489F /* MPNetworkCommunication.h in Headers */, 53A79D3429CE23F700E7489F /* MPURL.h in Headers */, + 53A79D2F29CE23F700E7489F /* MPKitConfiguration.h in Headers */, 53A79D3529CE23F700E7489F /* MPDataModelAbstract.h in Headers */, 53A79D3629CE23F700E7489F /* MPNetworkPerformance.h in Headers */, 53A79D3729CE23F700E7489F /* MPIntegrationAttributes.h in Headers */, @@ -1670,6 +1674,7 @@ 534CD29429CE2CE1008452B3 /* MPKitContainerTests.m in Sources */, 534CD29529CE2CE1008452B3 /* MPBase_Attribute_Event_ProjectionTests.m in Sources */, 534CD29629CE2CE1008452B3 /* MPConsumerInfoTests.m in Sources */, + 7E15B2062D94617900C1FF3E /* MPRoktTests.m in Sources */, 534CD29729CE2CE1008452B3 /* MPURLRequestBuilderTests.m in Sources */, 534CD29829CE2CE1008452B3 /* MPForwardQueueItemTests.m in Sources */, 534CD29929CE2CE1008452B3 /* MPDateFormatterTests.m in Sources */, @@ -1842,6 +1847,7 @@ 53A79CD529CE019F00E7489F /* MPKitContainerTests.m in Sources */, 53A79CBC29CE019F00E7489F /* MPBase_Attribute_Event_ProjectionTests.m in Sources */, 53A79CEA29CE019F00E7489F /* MPConsumerInfoTests.m in Sources */, + 7E15B2072D94617900C1FF3E /* MPRoktTests.m in Sources */, 53A79CDD29CE019F00E7489F /* MPURLRequestBuilderTests.m in Sources */, 53A79CDE29CE019F00E7489F /* MPForwardQueueItemTests.m in Sources */, 53A79CDF29CE019F00E7489F /* MPDateFormatterTests.m in Sources */, diff --git a/mParticle-Apple-SDK/Include/MPKitProtocol.h b/mParticle-Apple-SDK/Include/MPKitProtocol.h index 4c6a17821..1f62c05bc 100644 --- a/mParticle-Apple-SDK/Include/MPKitProtocol.h +++ b/mParticle-Apple-SDK/Include/MPKitProtocol.h @@ -132,6 +132,17 @@ - (nullable NSString *)surveyURLWithUserAttributes:(nonnull NSDictionary *)userAttributes; - (BOOL) shouldDelayMParticleUpload; - (nonnull NSArray *)logBatch:(nonnull NSDictionary *)batch; + +#pragma mark First Party Kits +- (nonnull MPKitExecStatus *)executeWithViewName:(NSString * _Nullable)viewName + attributes:(NSDictionary * _Nonnull)attributes + placements:(NSDictionary * _Nullable)placements + onLoad:(void (^ _Nullable)(void))onLoad + onUnLoad:(void (^ _Nullable)(void))onUnLoad + onShouldShowLoadingIndicator:(void (^ _Nullable)(void))onShouldShowLoadingIndicator + onShouldHideLoadingIndicator:(void (^ _Nullable)(void))onShouldHideLoadingIndicator + onEmbeddedSizeChange:(void (^ _Nullable)(NSString * _Nonnull, CGFloat))onEmbeddedSizeChange + filteredUser:(FilteredMParticleUser * _Nonnull)filteredUser; @end #endif diff --git a/mParticle-Apple-SDK/Include/mParticle.h b/mParticle-Apple-SDK/Include/mParticle.h index f78f0e2f0..fdade0721 100644 --- a/mParticle-Apple-SDK/Include/mParticle.h +++ b/mParticle-Apple-SDK/Include/mParticle.h @@ -85,6 +85,22 @@ NS_ASSUME_NONNULL_BEGIN @end +@interface MPRokt : NSObject + +- (void)selectPlacements:(NSString *)identifier + attributes:(NSDictionary * _Nullable)attributes; + +- (void)selectPlacements:(NSString *)identifier + attributes:(NSDictionary * _Nullable)attributes + placements:(NSDictionary * _Nullable)placements + onLoad:(void (^ _Nullable)(void))onLoad + onUnLoad:(void (^ _Nullable)(void))onUnLoad +onShouldShowLoadingIndicator:(void (^ _Nullable)(void))onShouldShowLoadingIndicator +onShouldHideLoadingIndicator:(void (^ _Nullable)(void))onShouldHideLoadingIndicator + onEmbeddedSizeChange:(void (^ _Nullable)(NSString * _Nonnull, CGFloat))onEmbeddedSizeChange; + +@end + /** Allows you to override the default HTTPS hosts and certificates used by the SDK. */ @@ -485,6 +501,12 @@ Defaults to false. Prevents the eventsHost above from overwriting the alias endp */ @property (nonatomic, strong, readonly) MPIdentityApi * identity; +/** + This property is an instance of MPRokt. It allows you to access the Rokt SDK through mParticle + @see MPRokt + */ +@property (nonatomic, strong, readonly) MPRokt * rokt; + /** If set to YES development logs will be output to the console, if set to NO the development logs will be suppressed. This property works in conjunction with diff --git a/mParticle-Apple-SDK/Kits/MPKitContainer.mm b/mParticle-Apple-SDK/Kits/MPKitContainer.mm index 8c5443c33..019082ab1 100644 --- a/mParticle-Apple-SDK/Kits/MPKitContainer.mm +++ b/mParticle-Apple-SDK/Kits/MPKitContainer.mm @@ -2288,6 +2288,20 @@ - (void)attemptToLogEventToKit:(id)kitRegister kitFilter return; } execStatus = [kitRegister.wrapperInstance logEvent:((MPEvent *)kitFilter.forwardEvent)]; + } else if (selector == @selector(executeWithViewName:attributes:placements:onLoad:onUnLoad:onShouldShowLoadingIndicator:onShouldHideLoadingIndicator:onEmbeddedSizeChange:filteredUser:)) { + if (kitFilter.shouldFilter) { + return; + } + FilteredMParticleUser *filteredUser = [[FilteredMParticleUser alloc] initWithMParticleUser:[[[MParticle sharedInstance] identity] currentUser] kitConfiguration:self.kitConfigurations[kitRegister.code]]; + execStatus = [kitRegister.wrapperInstance executeWithViewName:parameters[0] + attributes:parameters[1] + placements:parameters[2] + onLoad:parameters[3] + onUnLoad:parameters[4] + onShouldShowLoadingIndicator:parameters[5] + onShouldHideLoadingIndicator:parameters[6] + onEmbeddedSizeChange:parameters[7] + filteredUser:filteredUser]; } else if (selector == @selector(logScreen:)) { if (!kitFilter.forwardEvent || ![kitFilter.forwardEvent isKindOfClass:[MPEvent class]]) { return; diff --git a/mParticle-Apple-SDK/mParticle.m b/mParticle-Apple-SDK/mParticle.m index 860f6db44..728936c97 100644 --- a/mParticle-Apple-SDK/mParticle.m +++ b/mParticle-Apple-SDK/mParticle.m @@ -159,6 +159,72 @@ - (NSString *)description { @implementation MPDataPlanOptions @end +@implementation MPRokt + +- (void)selectPlacements:(NSString *)identifier + attributes:(NSDictionary * _Nullable)attributes { + for (NSString *key in attributes) { + [[MParticle sharedInstance].identity.currentUser setUserAttribute:key value:attributes[key]]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + // Forwarding call to kits + MPForwardQueueParameters *queueParameters = [[MPForwardQueueParameters alloc] init]; + [queueParameters addParameter:identifier]; + [queueParameters addParameter:attributes]; + [queueParameters addParameter:nil]; + [queueParameters addParameter:nil]; + [queueParameters addParameter:nil]; + [queueParameters addParameter:nil]; + [queueParameters addParameter:nil]; + [queueParameters addParameter:nil]; + + SEL roktSelector = @selector(executeWithViewName:attributes:placements:onLoad:onUnLoad:onShouldShowLoadingIndicator:onShouldHideLoadingIndicator:onEmbeddedSizeChange:filteredUser:); + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:roktSelector + event:nil + parameters:queueParameters + messageType:MPMessageTypeEvent + userInfo:nil + ]; + }); +} + +- (void)selectPlacements:(NSString *)identifier + attributes:(NSDictionary * _Nullable)attributes + placements:(NSDictionary * _Nullable)placements + onLoad:(void (^ _Nullable)(void))onLoad + onUnLoad:(void (^ _Nullable)(void))onUnLoad +onShouldShowLoadingIndicator:(void (^ _Nullable)(void))onShouldShowLoadingIndicator +onShouldHideLoadingIndicator:(void (^ _Nullable)(void))onShouldHideLoadingIndicator + onEmbeddedSizeChange:(void (^ _Nullable)(NSString * _Nonnull, CGFloat))onEmbeddedSizeChange { + for (NSString *key in attributes) { + [[MParticle sharedInstance].identity.currentUser setUserAttribute:key value:attributes[key]]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + // Forwarding call to kits + MPForwardQueueParameters *queueParameters = [[MPForwardQueueParameters alloc] init]; + [queueParameters addParameter:identifier]; + [queueParameters addParameter:attributes]; + [queueParameters addParameter:placements]; + [queueParameters addParameter:onLoad]; + [queueParameters addParameter:onUnLoad]; + [queueParameters addParameter:onShouldShowLoadingIndicator]; + [queueParameters addParameter:onShouldHideLoadingIndicator]; + [queueParameters addParameter:onEmbeddedSizeChange]; + + SEL roktSelector = @selector(executeWithViewName:attributes:placements:onLoad:onUnLoad:onShouldShowLoadingIndicator:onShouldHideLoadingIndicator:onEmbeddedSizeChange:filteredUser:); + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:roktSelector + event:nil + parameters:queueParameters + messageType:MPMessageTypeEvent + userInfo:nil + ]; + }); +} + +@end + @interface MParticleOptions () @property (nonatomic, readwrite) BOOL isProxyAppDelegateSet; @@ -267,6 +333,7 @@ @interface MPBackendController_PRIVATE () @implementation MParticle @synthesize identity = _identity; +@synthesize rokt = _rokt; @synthesize optOut = _optOut; @synthesize persistenceController = _persistenceController; @synthesize stateMachine = _stateMachine; @@ -414,6 +481,15 @@ - (MPIdentityApi *)identity { return _identity; } +- (MPRokt *)rokt { + if (_rokt) { + return _rokt; + } + + _rokt = [[MPRokt alloc] init]; + return _rokt; +} + - (MPEnvironment)environment { return [MPStateMachine_PRIVATE environment]; }