diff --git a/Scripts/release.sh b/Scripts/release.sh index db423d2dd..ab40c3e2c 100755 --- a/Scripts/release.sh +++ b/Scripts/release.sh @@ -7,6 +7,7 @@ NOTES="$2" # Update constant in codebase sed -i '' 's/NSString \*const kMParticleSDKVersion = @".*/NSString *const kMParticleSDKVersion = @"'"$VERSION"'";/' mParticle-Apple-SDK/MPIConstants.m +sed -i '' 's/let kMParticleSDKVersion = ".*/let kMParticleSDKVersion = "'"$VERSION"'"/' mParticle-Apple-SDK/MPConstants.swift # Update framework plist file /usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $VERSION" Framework/Info.plist diff --git a/UnitTests/MPAppNotificationHandlerTests.m b/UnitTests/MPAppNotificationHandlerTests.m index 344785aea..e38707cf5 100644 --- a/UnitTests/MPAppNotificationHandlerTests.m +++ b/UnitTests/MPAppNotificationHandlerTests.m @@ -9,7 +9,7 @@ @interface MParticle () + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, strong, readonly) MPAppNotificationHandler *appNotificationHandler; @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; diff --git a/UnitTests/MPBackendControllerTests.m b/UnitTests/MPBackendControllerTests.m index ab73dc64c..2b5be603f 100644 --- a/UnitTests/MPBackendControllerTests.m +++ b/UnitTests/MPBackendControllerTests.m @@ -15,10 +15,11 @@ #import "mParticle.h" #import "MPKitContainer.h" #import "MPKitConfiguration.h" -#import "MPResponseConfig.h" +#import "MParticleSwift.h" #import "MPBaseTestCase.h" #import "MPIUserDefaults.h" #import "MPDevice.h" +#import "MPLaunchInfo.h" #if TARGET_OS_IOS == 1 #import @@ -47,10 +48,10 @@ @interface MPIdentityApi () @interface MParticle (Tests) + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong, nonnull) MPBackendController *backendController; +@property (nonatomic, strong, nonnull) MPBackendController_PRIVATE *backendController; @property (nonatomic, strong) MPPersistenceController *persistenceController; -@property (nonatomic, strong) MPStateMachine *stateMachine; -@property (nonatomic, strong) MPKitContainer *kitContainer; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong) MPKitContainer_PRIVATE *kitContainer_PRIVATE; @property (nonatomic, strong, nullable) NSString *dataPlanId; @property (nonatomic, strong, nullable) NSNumber *dataPlanVersion; @property (nonatomic, strong, nonnull) MParticleOptions *options; @@ -58,16 +59,16 @@ + (dispatch_queue_t)messageQueue; @end #pragma mark - MPKitContainer category for unit tests -@interface MPKitContainer(Tests) +@interface MPKitContainer_PRIVATE(Tests) - (id)startKit:(NSNumber *)integrationId configuration:(MPKitConfiguration *)kitConfiguration; @end #pragma mark - MPBackendController+Tests category -@interface MPBackendController(Tests) +@interface MPBackendController_PRIVATE(Tests) -@property (nonatomic, strong) MPNetworkCommunication *networkCommunication; +@property (nonatomic, strong) MPNetworkCommunication_PRIVATE *networkCommunication; @property (nonatomic, strong) NSMutableDictionary *userAttributes; @property (nonatomic, strong) NSMutableArray *userIdentities; @@ -75,7 +76,7 @@ - (NSString *)caseInsensitiveKeyInDictionary:(NSDictionary *)dictionary withKey: - (void)cleanUp; - (void)handleApplicationDidFinishLaunching:(NSNotification *)notification; - (void)handleApplicationDidBecomeActive:(NSNotification *)notification; -- (void)logRemoteNotificationWithNotificationController:(MPNotificationController *const)notificationController; +- (void)logRemoteNotificationWithNotificationController:(MPNotificationController_PRIVATE *const)notificationController; - (void)parseConfigResponse:(NSDictionary *)configurationDictionary; - (void)parseResponseHeader:(NSDictionary *)responseDictionary session:(MPSession *)session; - (NSNumber *)previousSessionSuccessfullyClosed; @@ -102,9 +103,9 @@ @interface MPBackendControllerTests : MPBaseTestCase )[MParticle sharedInstance]]; + [MParticle sharedInstance].backendController = [[MPBackendController_PRIVATE alloc] initWithDelegate:(id)[MParticle sharedInstance]]; self.backendController = [MParticle sharedInstance].backendController; [self notificationController]; } @@ -186,12 +187,12 @@ - (NSDictionary *)remoteNotificationDictionary { return remoteNotificationDictionary; } -- (MPNotificationController *)notificationController { +- (MPNotificationController_PRIVATE *)notificationController { if (_notificationController) { return _notificationController; } - _notificationController = [[MPNotificationController alloc] init]; + _notificationController = [[MPNotificationController_PRIVATE alloc] init]; return _notificationController; } @@ -233,7 +234,7 @@ - (void)testEndSession { self.session = self.backendController.session; NSMutableArray *sessions = [persistence fetchSessions]; MPSession *session = [sessions lastObject]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; XCTAssertEqualObjects(session, stateMachine.currentSession, @"Current session and last session in the database are not equal."); NSDictionary *messagesDictionary = [persistence fetchMessagesForUploading]; @@ -296,7 +297,7 @@ - (void)testAutomaticSessionEnd { self.session = self.backendController.session; NSMutableArray *sessions = [persistence fetchSessions]; MPSession *session = [sessions lastObject]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; XCTAssertEqualObjects(session, stateMachine.currentSession, @"Current session and last session in the database are not equal."); NSDictionary *messagesDictionary = [persistence fetchMessagesForUploading]; @@ -332,7 +333,7 @@ - (void)testBackgroundBlock { self.session = self.backendController.session; NSMutableArray *sessions = [persistence fetchSessions]; MPSession *session = [sessions lastObject]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; XCTAssertEqualObjects(session, stateMachine.currentSession, @"Current session and last session in the database are not equal."); NSDictionary *messagesDictionary = [persistence fetchMessagesForUploading]; @@ -373,14 +374,14 @@ - (void)testSessionStartTimestamp { - (void)testCheckAttributeValueEmpty { NSError *error = nil; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:@"foo" + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:@"foo" value:[NSNull null] error:&error]; XCTAssertTrue(success); XCTAssertNil(error); error = nil; - [MPBackendController checkAttribute:[NSDictionary dictionary] key:@"foo" + [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:@"foo" value:@"" error:&error]; XCTAssertTrue(success); @@ -389,14 +390,14 @@ - (void)testCheckAttributeValueEmpty { - (void)testCheckAttributeStringAttribute { NSError *error = nil; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:@"foo" value:@"bar" error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:@"foo" value:@"bar" error:&error]; XCTAssert(success); XCTAssertNil(error); } - (void)testCheckAttributeNumberAttribute { NSError *error = nil; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:@"foo" value:@123.0 error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:@"foo" value:@123.0 error:&error]; XCTAssert(success); XCTAssertNil(error); } @@ -404,7 +405,7 @@ - (void)testCheckAttributeNumberAttribute { - (void)testCheckAttributeArrayAttribute { NSError *error = nil; NSArray *arrayValue = @[ @"foo", @"bar"]; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:@"foo" value:arrayValue error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:@"foo" value:arrayValue error:&error]; XCTAssert(success); XCTAssertNil(error); } @@ -414,7 +415,7 @@ - (void)testCheckAttributeArrayValuesTooLongAttribute { id mockValue = [OCMockObject mockForClass:[NSString class]]; OCMStub([mockValue length]).andReturn(LIMIT_ATTR_VALUE_LENGTH); NSArray *arrayValue = @[@"foo", mockValue]; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:@"foo" value:arrayValue error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:@"foo" value:arrayValue error:&error]; XCTAssertFalse(success); XCTAssertNotNil(error); XCTAssertEqual(kExceededAttributeValueMaximumLength, error.code); @@ -425,7 +426,7 @@ - (void)testCheckAttributeArrayValueInvalidLongAttribute { id mockValue = [OCMockObject mockForClass:[NSString class]]; OCMStub([mockValue length]).andReturn(LIMIT_ATTR_VALUE_LENGTH); NSArray *arrayValue = @[@"foo", @10.0]; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:@"foo" value:arrayValue error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:@"foo" value:arrayValue error:&error]; XCTAssertFalse(success); XCTAssertNotNil(error); XCTAssertEqual(kInvalidDataType, error.code); @@ -436,7 +437,7 @@ - (void)testCheckAttributeNoMaximum { id mockAttributes = [OCMockObject mockForClass:[NSMutableDictionary class]]; OCMStub([mockAttributes count]).andReturn(200); NSError *error = nil; - BOOL success = [MPBackendController checkAttribute:mockAttributes key:@"foo" value:@"bar" error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:mockAttributes key:@"foo" value:@"bar" error:&error]; XCTAssertTrue(success); XCTAssertNil(error); } @@ -446,7 +447,7 @@ - (void)testCheckAttributeKeyTooLong { OCMStub([mockKey length]).andReturn(LIMIT_ATTR_KEY_LENGTH+1); NSError *error = nil; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:mockKey value:@"foo" error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:mockKey value:@"foo" error:&error]; XCTAssertFalse(success); XCTAssertNotNil(error); XCTAssertEqual(kExceededAttributeKeyMaximumLength, error.code); @@ -457,7 +458,7 @@ - (void)testCheckAttributeValueTooLong { OCMStub([mockValue length]).andReturn(LIMIT_ATTR_VALUE_LENGTH+1); OCMStub([mockValue stringByTrimmingCharactersInSet:OCMOCK_ANY]).andReturn(@"foo"); NSError *error = nil; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:@"foo" value:mockValue error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:@"foo" value:mockValue error:&error]; XCTAssertFalse(success); XCTAssertNotNil(error); XCTAssertEqual(kExceededAttributeValueMaximumLength, error.code); @@ -466,7 +467,7 @@ - (void)testCheckAttributeValueTooLong { - (void)testCheckAttributeValueNil { NSError *error = nil; NSString *nilValue = nil; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:@"foo" value:nilValue error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:@"foo" value:nilValue error:&error]; XCTAssertFalse(success); XCTAssertNotNil(error); XCTAssertEqual(kNilAttributeValue, error.code); @@ -475,14 +476,14 @@ - (void)testCheckAttributeValueNil { - (void)testCheckAttributeKeyNullNil { NSError *error = nil; NSString *nilKey = (NSString*)[NSNull null]; - BOOL success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:nilKey value:@"foo" error:&error]; + BOOL success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:nilKey value:@"foo" error:&error]; XCTAssertFalse(success); XCTAssertNotNil(error); XCTAssertEqual(kInvalidKey, error.code); error = nil; nilKey = nil; - success = [MPBackendController checkAttribute:[NSDictionary dictionary] key:nilKey value:@"foo" error:&error]; + success = [MPBackendController_PRIVATE checkAttribute:[NSDictionary dictionary] key:nilKey value:@"foo" error:&error]; XCTAssertFalse(success); XCTAssertNotNil(error); XCTAssertEqual(kInvalidKey, error.code); @@ -704,7 +705,7 @@ - (void)testRampUpload { NSArray *uploads = [persistence fetchUploads]; XCTAssertGreaterThan(uploads.count, 0, @"Failed to retrieve messages to be uploaded."); - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; [stateMachine configureRampPercentage:@100]; XCTAssertFalse(stateMachine.dataRamped, @"Data ramp is not respecting 100 percent upper limit."); @@ -726,7 +727,7 @@ - (void)testDidBecomeActiveWithAppLink { [self.backendController beginSession]; }); self.session = self.backendController.session; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSURL *url = [NSURL URLWithString:@"fb487730798014455://applinks?al_applink_data=%7B%22user_agent%22%3A%22Bolts%20iOS%201.0.0%22%2C%22target_url%22%3A%22http%3A%5C%2F%5C%2Fexample.com%5C%2Fapplinks%22%2C%22extras%22%3A%7B%22myapp_token%22%3A%22t0kEn%22%7D%7D"]; NSString *sourceApplication = @"com.mParticle.UnitTest"; @@ -773,7 +774,7 @@ - (void)testSetIdentityToNil { }]; NSDictionary *identities = [MParticle sharedInstance].identity.currentUser.identities; XCTAssertEqualObjects(@"foo", [identities objectForKey:@(MPUserIdentityEmail)]); - [[self backendController] setUserIdentity:(id)[NSNull null] identityType:MPUserIdentityEmail + [[self backendController] setUserIdentity:nil identityType:MPUserIdentityEmail timestamp:[NSDate date] completionHandler:^(NSString * _Nullable identityString, MPUserIdentity identityType, MPExecStatus execStatus) { @@ -818,7 +819,7 @@ - (void)testDidBecomeActive { [self.backendController beginSession]; }); self.session = self.backendController.session; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSURL *url = [NSURL URLWithString:@"particlebox://unit_test"]; NSString *sourceApplication = @"com.mParticle.UnitTest"; @@ -865,7 +866,7 @@ - (void)testPreviousForegroundTime { [self.backendController beginSession]; }); self.session = self.backendController.session; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSURL *url = [NSURL URLWithString:@"particlebox://unit_test"]; NSString *sourceApplication = @"com.mParticle.UnitTest"; @@ -911,7 +912,7 @@ - (void)testIsLaunchCheck { [self.backendController beginSession]; }); self.session = self.backendController.session; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSURL *url = [NSURL URLWithString:@"particlebox://unit_test"]; NSString *sourceApplication = @"com.mParticle.UnitTest"; @@ -1057,12 +1058,12 @@ - (void)testSetUserTagFromUser { } - (void)testSetUserAttributeKits { - if (![MPKitContainer registeredKits]) { + if (![MPKitContainer_PRIVATE registeredKits]) { MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"KitTest" className:@"MPKitTestClassNoStartImmediately"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; kitRegister = [[MPKitRegister alloc] initWithName:@"KitSecondTest" className:@"MPKitSecondTestClass"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; NSDictionary *configuration1 = @{ @"id":@42, @@ -1897,7 +1898,7 @@ - (void)testLogCrashTruncatePlCrashReportField { NSString *message = @"crash report"; NSString *stackTrace = @"stack track from crash report"; NSString *plCrashReport = @"plcrash report test string"; - MPStateMachine *stateMachine = [[MPStateMachine alloc] init]; + MPStateMachine_PRIVATE *stateMachine = [[MPStateMachine_PRIVATE alloc] init]; id mockStateMachine = OCMPartialMock(stateMachine); [[[mockStateMachine stub] andReturnValue:OCMOCK_VALUE(@7)] crashMaxPLReportLength]; @@ -1949,7 +1950,7 @@ - (void)testLogCrashTruncatePlCrashReportFieldNil { NSString *message = @"crash report"; NSString *stackTrace = @"stack track from crash report"; NSString *plCrashReport = @"plcrash report test string"; - MPStateMachine *stateMachine = [[MPStateMachine alloc] init]; + MPStateMachine_PRIVATE *stateMachine = [[MPStateMachine_PRIVATE alloc] init]; id mockStateMachine = OCMPartialMock(stateMachine); [[[(id)mockStateMachine stub] andReturn:nil] crashMaxPLReportLength]; @@ -2071,7 +2072,7 @@ - (void)testPersistanceMaxAgeCleanup { options.persistenceMaxAgeSeconds = @(maxAge); // 24 hours instance.options = options; - MPBackendController *backendController = [[MPBackendController alloc] init]; + MPBackendController_PRIVATE *backendController = [[MPBackendController_PRIVATE alloc] init]; MPPersistenceController *persistenceController = [[MPPersistenceController alloc] init]; id mockPersistenceController = OCMPartialMock(persistenceController); diff --git a/UnitTests/MPBaseTestCase.m b/UnitTests/MPBaseTestCase.m index e5283f878..d58ea2f0b 100644 --- a/UnitTests/MPBaseTestCase.m +++ b/UnitTests/MPBaseTestCase.m @@ -10,6 +10,7 @@ #import "MPNetworkCommunication.h" #import "MPConnectorProtocol.h" #import "MPConnectorFactoryProtocol.h" +#import "MPIConstants.h" @interface MParticle (Tests) @property (nonatomic, strong) MPPersistenceController *persistenceController; @@ -42,13 +43,13 @@ - (void)setUpWithCompletionHandler:(void (^)(NSError * _Nullable))completion { } [instance reset:^{ - MPNetworkCommunication.connectorFactory = [[MPTestConnectorFactory alloc] init]; + MPNetworkCommunication_PRIVATE.connectorFactory = [[MPTestConnectorFactory alloc] init]; completion(nil); }]; } - (void)tearDown { - MPNetworkCommunication.connectorFactory = nil; + MPNetworkCommunication_PRIVATE.connectorFactory = nil; [super tearDown]; } diff --git a/UnitTests/MPDataModelTests.m b/UnitTests/MPDataModelTests.m index 96c205a7d..bcf01ea4e 100644 --- a/UnitTests/MPDataModelTests.m +++ b/UnitTests/MPDataModelTests.m @@ -11,7 +11,7 @@ @interface MParticle () -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @end diff --git a/UnitTests/MPEventTests.m b/UnitTests/MPEventTests.m index 70b178911..8af4e084e 100644 --- a/UnitTests/MPEventTests.m +++ b/UnitTests/MPEventTests.m @@ -13,8 +13,8 @@ #pragma mark - MParticle+Tests category @interface MParticle (Tests) -@property (nonatomic, strong, nonnull) MPBackendController *backendController; -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong, nonnull) MPBackendController_PRIVATE *backendController; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @end @@ -146,7 +146,7 @@ - (void)testInvalidTypes { - (void)testDictionaryRepresentation { MPSession *session = [[MPSession alloc] initWithStartTime:[[NSDate date] timeIntervalSince1970] userId:[MPPersistenceController mpId]]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.currentSession = session; NSNumber *eventDuration = @2; @@ -180,7 +180,7 @@ - (void)testDictionaryRepresentation { - (void)testDictionaryRepresentationWithDictionaryValues { MPSession *session = [[MPSession alloc] initWithStartTime:[[NSDate date] timeIntervalSince1970] userId:[MPPersistenceController mpId]]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.currentSession = session; NSNumber *eventDuration = @2; @@ -215,7 +215,7 @@ - (void)testDictionaryRepresentationWithDictionaryValues { - (void)testDictionaryRepresentationWithDictionaryValuesContainingDictionary { MPSession *session = [[MPSession alloc] initWithStartTime:[[NSDate date] timeIntervalSince1970] userId:[MPPersistenceController mpId]]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.currentSession = session; NSNumber *eventDuration = @2; @@ -250,7 +250,7 @@ - (void)testDictionaryRepresentationWithDictionaryValuesContainingDictionary { - (void)testDictionaryRepresentationWithNullValues { MPSession *session = [[MPSession alloc] initWithStartTime:[[NSDate date] timeIntervalSince1970] userId:[MPPersistenceController mpId]]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.currentSession = session; NSNumber *eventDuration = @2; diff --git a/UnitTests/MPIUserDefaultsTests.m b/UnitTests/MPIUserDefaultsTests.m index dc1a44be9..ef3353cc1 100644 --- a/UnitTests/MPIUserDefaultsTests.m +++ b/UnitTests/MPIUserDefaultsTests.m @@ -10,13 +10,13 @@ @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong) MPStateMachine *stateMachine; -@property (nonatomic, strong) MPKitContainer *kitContainer; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong) MPKitContainer_PRIVATE *kitContainer_PRIVATE; @end @interface MPIUserDefaultsTests : MPBaseTestCase { - MPKitContainer *kitContainer; + MPKitContainer_PRIVATE *kitContainer; } @end @@ -29,12 +29,12 @@ - (void)setUp { [MParticle sharedInstance].stateMachine.apiKey = @"unit_test_app_key"; [MParticle sharedInstance].stateMachine.secret = @"unit_test_secret"; - [MParticle sharedInstance].kitContainer = [[MPKitContainer alloc] init]; - kitContainer = [MParticle sharedInstance].kitContainer; + [MParticle sharedInstance].kitContainer_PRIVATE = [[MPKitContainer_PRIVATE alloc] init]; + kitContainer = [MParticle sharedInstance].kitContainer_PRIVATE; } - (void)tearDown { - for (MPKitRegister *kitRegister in [MPKitContainer registeredKits]) { + for (MPKitRegister *kitRegister in [MPKitContainer_PRIVATE registeredKits]) { kitRegister.wrapperInstance = nil; } kitContainer = nil; @@ -471,7 +471,7 @@ - (void)testConfigParameters { XCTAssertNotNil(firstParameters); MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"KitTest" className:@"MPKitTestClassNoStartImmediately"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; XCTAssertEqualObjects(responseConfiguration, [[MPIUserDefaults standardUserDefaults] getConfiguration]); XCTAssertTrue([[MPIUserDefaults standardUserDefaults] isConfigurationParametersOutdated]); diff --git a/UnitTests/MPIdentityTests.m b/UnitTests/MPIdentityTests.m index 653dde739..04c717680 100644 --- a/UnitTests/MPIdentityTests.m +++ b/UnitTests/MPIdentityTests.m @@ -23,7 +23,7 @@ typedef NS_ENUM(NSUInteger, MPIdentityRequestType) { }; @interface MPIdentityTests : MPBaseTestCase { - MPKitContainer *kitContainer; + MPKitContainer_PRIVATE *kitContainer; } @end @@ -43,7 +43,7 @@ - (void)onModifyRequestComplete:(MPIdentityApiRequest *)request httpResponse:(MP - (NSArray *)sortedUserArrayByLastSeen:(NSMutableArray *)userArray; @end -@interface MPNetworkCommunication () +@interface MPNetworkCommunication_PRIVATE () - (void)modifyWithIdentityChanges:(NSArray *)identityChanges blockOtherRequests:(BOOL)blockOtherRequests completion:(nullable MPIdentityApiManagerModifyCallback)completion; - (void)identityApiRequestWithURL:(NSURL*)url identityRequest:(MPIdentityHTTPBaseRequest *_Nonnull)identityRequest blockOtherRequests: (BOOL) blockOtherRequests completion:(nullable MPIdentityApiManagerCallback)completion; @end @@ -58,7 +58,7 @@ - (instancetype)initWithIdentities:(NSDictionary *)identities; @interface MParticle () -@property (nonatomic, strong) MPKitContainer *kitContainer; +@property (nonatomic, strong) MPKitContainer_PRIVATE *kitContainer_PRIVATE; @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; @end @@ -502,7 +502,7 @@ - (void)testConstructIdentityApiRequestWithAuthorizedATTStatus { } - (void)testNoEmptyModifyRequests { - MPNetworkCommunication *network = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *network = [[MPNetworkCommunication_PRIVATE alloc] init]; id partialMock = OCMPartialMock(network); @@ -614,8 +614,8 @@ - (void)testIdentifyIdentityRequestCompleteWithKits { [[[mockPersistenceController stub] andReturn:@"42"] mpId]; id mockInstance = OCMClassMock([MParticle class]); - id mockContainer = OCMClassMock([MPKitContainer class]); - [[[mockInstance stub] andReturn:mockContainer] kitContainer]; + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; id mockUser = OCMClassMock([MParticleUser class]); @@ -646,8 +646,8 @@ - (void)testLoginIdentityRequestCompleteWithKits { [[[mockPersistenceController stub] andReturn:@"42"] mpId]; id mockInstance = OCMClassMock([MParticle class]); - id mockContainer = OCMClassMock([MPKitContainer class]); - [[[mockInstance stub] andReturn:mockContainer] kitContainer]; + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; id mockUser = OCMClassMock([MParticleUser class]); @@ -678,8 +678,8 @@ - (void)testLogoutIdentityRequestCompleteWithKits { [[[mockPersistenceController stub] andReturn:@"42"] mpId]; id mockInstance = OCMClassMock([MParticle class]); - id mockContainer = OCMClassMock([MPKitContainer class]); - [[[mockInstance stub] andReturn:mockContainer] kitContainer]; + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; id mockUser = OCMClassMock([MParticleUser class]); @@ -706,8 +706,8 @@ - (void)testIdentifyIdentityRequestCompleteWithKitsAndNoUserChange { [[[mockPersistenceController stub] andReturn:@"42"] mpId]; id mockInstance = OCMClassMock([MParticle class]); - id mockContainer = OCMClassMock([MPKitContainer class]); - [[[mockInstance stub] andReturn:mockContainer] kitContainer]; + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; id mockUser = OCMClassMock([MParticleUser class]); @@ -738,8 +738,8 @@ - (void)testLoginIdentityRequestCompleteWithKitsAndNoUserChange { [[[mockPersistenceController stub] andReturn:@"42"] mpId]; id mockInstance = OCMClassMock([MParticle class]); - id mockContainer = OCMClassMock([MPKitContainer class]); - [[[mockInstance stub] andReturn:mockContainer] kitContainer]; + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; id mockUser = OCMClassMock([MParticleUser class]); @@ -770,8 +770,8 @@ - (void)testLogoutIdentityRequestCompleteWithKitsAndNoUserChange { [[[mockPersistenceController stub] andReturn:@"42"] mpId]; id mockInstance = OCMClassMock([MParticle class]); - id mockContainer = OCMClassMock([MPKitContainer class]); - [[[mockInstance stub] andReturn:mockContainer] kitContainer]; + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; id mockUser = OCMClassMock([MParticleUser class]); @@ -798,8 +798,8 @@ - (void)testMPIdZeroToMPId { [[[mockPersistenceController stub] andReturn:@"0"] mpId]; id mockInstance = OCMClassMock([MParticle class]); - id mockContainer = OCMClassMock([MPKitContainer class]); - [[[mockInstance stub] andReturn:mockContainer] kitContainer]; + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; [[[mockInstance stub] andReturn:mockPersistenceController] persistenceController]; [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; @@ -855,8 +855,8 @@ - (void)testModifyRequestComplete { - (void)testModifyRequestCompleteWithKits { id mockInstance = OCMClassMock([MParticle class]); - id mockContainer = OCMClassMock([MPKitContainer class]); - [[[mockInstance stub] andReturn:mockContainer] kitContainer]; + id mockContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [[[mockInstance stub] andReturn:mockContainer] kitContainer_PRIVATE]; [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; id mockUser = OCMClassMock([MParticleUser class]); diff --git a/UnitTests/MPKitAPITests.m b/UnitTests/MPKitAPITests.m index 3896c20f7..c383965a8 100644 --- a/UnitTests/MPKitAPITests.m +++ b/UnitTests/MPKitAPITests.m @@ -13,7 +13,7 @@ #import "MPIUserDefaults.h" #import "MPIConstants.h" -@interface MPKitContainer () +@interface MPKitContainer_PRIVATE () - (id)startKit:(NSNumber *)integrationId configuration:(MPKitConfiguration *)kitConfiguration; @@ -22,13 +22,13 @@ @interface MPKitContainer () @interface MParticle () + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong) MPBackendController *backendController; +@property (nonatomic, strong) MPBackendController_PRIVATE *backendController; @property (nonatomic, strong) MPPersistenceController *persistenceController; -@property (nonatomic, strong) MPKitContainer *kitContainer; +@property (nonatomic, strong) MPKitContainer_PRIVATE *kitContainer_PRIVATE; @end -@interface MPBackendController () +@interface MPBackendController_PRIVATE () - (void)clearUserAttributes; @@ -46,7 +46,7 @@ - (id)initWithKitCode:(NSNumber *)integrationId; @interface MPKitAPITests : MPBaseTestCase @property (nonatomic) MPKitAPI *kitApi; -@property (nonatomic) MPKitContainer *kitContainer; +@property (nonatomic) MPKitContainer_PRIVATE *kitContainer; @end @@ -55,15 +55,15 @@ @implementation MPKitAPITests - (void)setUp { [super setUp]; - [MParticle sharedInstance].kitContainer = [[MPKitContainer alloc] init]; - _kitContainer = [MParticle sharedInstance].kitContainer; + [MParticle sharedInstance].kitContainer_PRIVATE = [[MPKitContainer_PRIVATE alloc] init]; + _kitContainer = [MParticle sharedInstance].kitContainer_PRIVATE; [MParticle sharedInstance].persistenceController = [[MPPersistenceController alloc] init]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; if (!registeredKits) { MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"KitTest" className:@"MPKitTestClassNoStartImmediately"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; NSDictionary *configuration = @{ @"id":@42, @@ -83,7 +83,7 @@ - (void)testIntegrationAttributes { XCTestExpectation *expectation = [self expectationWithDescription:@"Integration attributes"]; MParticle *mParticle = [MParticle sharedInstance]; - mParticle.backendController = [[MPBackendController alloc] initWithDelegate:(id)mParticle]; + mParticle.backendController = [[MPBackendController_PRIVATE alloc] initWithDelegate:(id)mParticle]; [[MParticle sharedInstance] setIntegrationAttributes:@{@"Test key":@"Test value"} forKit:@42]; dispatch_sync([MParticle messageQueue], ^{ @@ -154,7 +154,7 @@ - (void)testUserIdentities { - (void)testUserAttributeFromCache { XCTestExpectation *expectation = [self expectationWithDescription:@"Integration attributes"]; MParticle *mParticle = [MParticle sharedInstance]; - mParticle.backendController = [[MPBackendController alloc] initWithDelegate:(id)mParticle]; + mParticle.backendController = [[MPBackendController_PRIVATE alloc] initWithDelegate:(id)mParticle]; MParticleUser *currentUser = [[MParticle sharedInstance].identity currentUser]; NSDictionary *userAttributes = @{ @@ -199,7 +199,7 @@ - (void)testUserAttributeFromCache { - (void)testUserAttributeManuallySet { XCTestExpectation *expectation = [self expectationWithDescription:@"Integration attributes"]; MParticle *mParticle = [MParticle sharedInstance]; - mParticle.backendController = [[MPBackendController alloc] initWithDelegate:(id)mParticle]; + mParticle.backendController = [[MPBackendController_PRIVATE alloc] initWithDelegate:(id)mParticle]; MParticleUser *currentUser = [[MParticle sharedInstance].identity currentUser]; NSDictionary *userAttributes = @{ diff --git a/UnitTests/MPKitActivityTests.m b/UnitTests/MPKitActivityTests.m index b5487e8fd..ce7e99e28 100644 --- a/UnitTests/MPKitActivityTests.m +++ b/UnitTests/MPKitActivityTests.m @@ -8,16 +8,17 @@ #import "MPStateMachine.h" #import #import "MPBaseTestCase.h" +#import "MParticle.h" @interface MParticle () -@property (nonatomic, strong) MPStateMachine *stateMachine; -@property (nonatomic, strong) MPKitContainer *kitContainer; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong) MPKitContainer_PRIVATE *kitContainer_PRIVATE; @end #pragma mark - MPKitContainer category for unit tests -@interface MPKitContainer(Tests) +@interface MPKitContainer_PRIVATE(Tests) - (id)startKit:(NSNumber *)integrationId configuration:(MPKitConfiguration *)kitConfiguration; + (NSMutableSet > *)kitsRegistry; @@ -43,20 +44,20 @@ - (void)setUp { [MParticle sharedInstance].stateMachine.apiKey = @"unit_test_app_key"; [MParticle sharedInstance].stateMachine.secret = @"unit_test_secret"; - [MParticle sharedInstance].kitContainer = [[MPKitContainer alloc] init]; + [MParticle sharedInstance].kitContainer_PRIVATE = [[MPKitContainer_PRIVATE alloc] init]; MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"KitTest" className:@"MPKitTestClassNoStartImmediately"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; NSDictionary *configuration = @{@"id": @42, @"as": @{@"appId":@"MyAppId"}}; MPKitConfiguration *kitConfiguration = [[MPKitConfiguration alloc] initWithDictionary:configuration]; - [[[MParticle sharedInstance].kitContainer startKit:@42 configuration:kitConfiguration] start]; + [[[MParticle sharedInstance].kitContainer_PRIVATE startKit:@42 configuration:kitConfiguration] start]; } - (void)tearDown { _kitActivity = nil; // Ensure registeredKits is empty - [MPKitContainer.kitsRegistry removeAllObjects]; + [MPKitContainer_PRIVATE.kitsRegistry removeAllObjects]; [super tearDown]; } @@ -90,11 +91,11 @@ - (void)testKitAlreadyStarted { }; NSArray *kitConfigs = @[configuration]; - [[MParticle sharedInstance].kitContainer configureKits:nil]; - [[MParticle sharedInstance].kitContainer configureKits:kitConfigs]; + [[MParticle sharedInstance].kitContainer_PRIVATE configureKits:nil]; + [[MParticle sharedInstance].kitContainer_PRIVATE configureKits:kitConfigs]; MPKitConfiguration *kitConfiguration = [[MPKitConfiguration alloc] initWithDictionary:configuration]; - [[MParticle sharedInstance].kitContainer startKit:@42 configuration:kitConfiguration]; + [[MParticle sharedInstance].kitContainer_PRIVATE startKit:@42 configuration:kitConfiguration]; BOOL isKitActive = [self.kitActivity isKitActive:@42]; XCTAssertTrue(isKitActive); diff --git a/UnitTests/MPKitContainerTests.m b/UnitTests/MPKitContainerTests.m index 512e3c05a..7ed668f75 100644 --- a/UnitTests/MPKitContainerTests.m +++ b/UnitTests/MPKitContainerTests.m @@ -1,5 +1,6 @@ #import #import +#import "mParticle.h" #import "MPKitContainer.h" #import "MPIConstants.h" #import "MPForwardQueueItem.h" @@ -22,7 +23,6 @@ #import "MPKitConfiguration.h" #import "MPIUserDefaults.h" #import "MPForwardQueueParameters.h" -#import "MPResponseConfig.h" #import "MPConsentKitFilter.h" #import "MPPersistenceController.h" #import "MPBaseTestCase.h" @@ -34,8 +34,9 @@ @interface MParticle () + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong) MPStateMachine *stateMachine; -@property (nonatomic, strong) MPKitContainer *kitContainer; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong) MPKitContainer_PRIVATE *kitContainer_PRIVATE; +@property (nonatomic, strong, readonly) MPBackendController_PRIVATE *backendController; @end @@ -46,7 +47,7 @@ @interface MParticleUser () @end #pragma mark - MPKitContainer category for unit tests -@interface MPKitContainer(Tests) +@interface MPKitContainer_PRIVATE(Tests) @property (nonatomic, strong) NSMutableArray *forwardQueue; @property (nonatomic, unsafe_unretained) BOOL kitsInitialized; @@ -75,7 +76,7 @@ - (void)attemptToLogEventToKit:(id)kitRegister kitFilter #pragma mark - MPKitContainerTests @interface MPKitContainerTests : MPBaseTestCase { - MPKitContainer *kitContainer; + MPKitContainer_PRIVATE *kitContainer; } @end @@ -89,19 +90,19 @@ - (void)setUp { [MParticle sharedInstance].stateMachine.apiKey = @"unit_test_app_key"; [MParticle sharedInstance].stateMachine.secret = @"unit_test_secret"; - [MParticle sharedInstance].kitContainer = [[MPKitContainer alloc] init]; - kitContainer = [MParticle sharedInstance].kitContainer; + [MParticle sharedInstance].kitContainer_PRIVATE = [[MPKitContainer_PRIVATE alloc] init]; + kitContainer = [MParticle sharedInstance].kitContainer_PRIVATE; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; if (!registeredKits) { MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"KitTest" className:@"MPKitTestClassNoStartImmediately"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; kitRegister = [[MPKitRegister alloc] initWithName:@"KitSecondTest" className:@"MPKitSecondTestClass"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; NSDictionary *configuration = @{ @"id":@42, @@ -118,12 +119,12 @@ - (void)setUp { id kitAppsFlyer = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; if (!kitAppsFlyer) { MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; } } - (void)tearDown { - for (MPKitRegister *kitRegister in [MPKitContainer registeredKits]) { + for (MPKitRegister *kitRegister in [MPKitContainer_PRIVATE registeredKits]) { kitRegister.wrapperInstance = nil; } kitContainer = nil; @@ -186,12 +187,12 @@ - (void)testUpdateKitConfiguration { kMPRemoteConfigExceptionHandlingModeKey:kMPRemoteConfigExceptionHandlingModeForce, kMPRemoteConfigSessionTimeoutKey:@112}; - MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration]; - + MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration stateMachine:[MParticle sharedInstance].stateMachine backendController:[MParticle sharedInstance].backendController]; + NSTimeInterval requestTimestamp = [[NSDate date] timeIntervalSince1970]; [[MPIUserDefaults standardUserDefaults] setConfiguration:configuration eTag:eTag requestTimestamp:requestTimestamp currentAge:@"0" maxAge:nil]; - XCTAssertEqualObjects(responseConfig.configuration, [MPResponseConfig restore].configuration); + XCTAssertEqualObjects(responseConfig.configuration, [MPIUserDefaults restore].configuration); NSArray *directoryContents = [[MPIUserDefaults standardUserDefaults] getKitConfigurations]; for (NSDictionary *kitConfigurationDictionary in directoryContents) { @@ -237,12 +238,12 @@ - (void)testRemoveKitConfiguration { kMPRemoteConfigExceptionHandlingModeKey:kMPRemoteConfigExceptionHandlingModeForce, kMPRemoteConfigSessionTimeoutKey:@112}; - MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration]; - + MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration stateMachine:[MParticle sharedInstance].stateMachine backendController:[MParticle sharedInstance].backendController]; + NSTimeInterval requestTimestamp = [[NSDate date] timeIntervalSince1970]; [[MPIUserDefaults standardUserDefaults] setConfiguration:configuration eTag:eTag requestTimestamp:requestTimestamp currentAge:@"0" maxAge:nil]; - XCTAssertEqualObjects(responseConfig.configuration, [MPResponseConfig restore].configuration); + XCTAssertEqualObjects(responseConfig.configuration, [MPIUserDefaults restore].configuration); dispatch_sync(dispatch_get_main_queue(), ^{ }); XCTAssertEqual(@"cool app key", [self->kitContainer.kitConfigurations objectForKey:@(42)].configuration[@"appId"]); @@ -269,12 +270,12 @@ - (void)testRemoveKitConfiguration { kMPRemoteConfigExceptionHandlingModeKey:kMPRemoteConfigExceptionHandlingModeForce, kMPRemoteConfigSessionTimeoutKey:@112}; - responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration]; - + responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration stateMachine:[MParticle sharedInstance].stateMachine backendController:[MParticle sharedInstance].backendController]; + requestTimestamp = [[NSDate date] timeIntervalSince1970]; [[MPIUserDefaults standardUserDefaults] setConfiguration:configuration eTag:eTag requestTimestamp:requestTimestamp currentAge:@"0" maxAge:nil]; - XCTAssertEqualObjects(responseConfig.configuration, [MPResponseConfig restore].configuration); + XCTAssertEqualObjects(responseConfig.configuration, [MPIUserDefaults restore].configuration); XCTAssertEqual(@"cool app key", [self->kitContainer.kitConfigurations objectForKey:@(42)].configuration[@"appId"]); @@ -506,7 +507,7 @@ - (void)testFilterEventType { @"modality":@"sprinting"}; event.category = @"Olympic Games"; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [[registeredKits objectsPassingTest:^BOOL(id _Nonnull obj, BOOL * _Nonnull stop) { if ([obj conformsToProtocol:@protocol(MPExtensionKitProtocol)]) { id kitExtension = (id)obj; @@ -801,7 +802,7 @@ - (void)testFilterMessageType { @"modality":@"sprinting"}; event.category = @"Olympic Games"; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [[registeredKits objectsPassingTest:^BOOL(id _Nonnull obj, BOOL * _Nonnull stop) { if ([obj conformsToProtocol:@protocol(MPExtensionKitProtocol)]) { id kitExtension = (id)obj; @@ -837,7 +838,7 @@ - (void)testFilterEventTypeNavigation { MPEvent *event = [[MPEvent alloc] initWithName:@"Dinosaur Run" type:MPEventTypeNavigation]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [[registeredKits objectsPassingTest:^BOOL(id _Nonnull obj, BOOL * _Nonnull stop) { if ([obj conformsToProtocol:@protocol(MPExtensionKitProtocol)]) { id kitExtension = (id)obj; @@ -882,7 +883,7 @@ - (void)testFilterEventNameAndAttributes { @"modality":@"sprinting"}; event.category = @"Olympic Games"; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [[registeredKits objectsPassingTest:^BOOL(id _Nonnull obj, BOOL * _Nonnull stop) { if ([obj conformsToProtocol:@protocol(MPExtensionKitProtocol)]) { id kitExtension = (id)obj; @@ -949,7 +950,7 @@ - (void)testFilterForSelector { [kitContainer configureKits:nil]; [kitContainer configureKits:configurations]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 42"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -974,7 +975,7 @@ - (void)testFilterForUserAttribute { [kitContainer configureKits:nil]; [kitContainer configureKits:configurations]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 42"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -1069,7 +1070,7 @@ - (void)testFilterForUserAttributes { [kitContainer configureKits:nil]; [kitContainer configureKits:configurations]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 42"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -1112,7 +1113,7 @@ - (void)testFilterForUserIdentity { [kitContainer configureKits:nil]; [kitContainer configureKits:configurations]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 42"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -1145,7 +1146,7 @@ - (void)testFilterCommerceEvent_EventType { [kitContainer configureKits:nil]; [kitContainer configureKits:configurations]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [registeredKits anyObject]; MPProduct *product = [[MPProduct alloc] initWithName:@"DeLorean" sku:@"OutATime" quantity:@1 price:@4.32]; @@ -1198,7 +1199,7 @@ - (void)testFilterCommerceEvent_EntityType { [kitContainer configureKits:nil]; [kitContainer configureKits:configurations]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [registeredKits anyObject]; MPProduct *product = [[MPProduct alloc] initWithName:@"DeLorean" sku:@"OutATime" quantity:@1 price:@4.32]; @@ -1262,7 +1263,7 @@ - (void)testFilterCommerceEvent_Other { [kitContainer configureKits:nil]; [kitContainer configureKits:configurations]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [registeredKits anyObject]; MPProduct *product = [[MPProduct alloc] initWithName:@"DeLorean" sku:@"OutATime" quantity:@1 price:@4.32]; @@ -1327,7 +1328,7 @@ - (void)testFilterCommerceEvent_TransactionAttributes { [kitContainer configureKits:nil]; [kitContainer configureKits:configurations]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 42"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2103,7 +2104,7 @@ - (void)testAttributeHashProjection { } - (void)testAllocation { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; XCTAssertNotNil(localKitContainer); } @@ -2190,7 +2191,7 @@ - (void)testExpandedCommerceEventProjection { } - (void)testShouldDelayUploadMaxTime { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; [localKitContainer setKitsInitialized:NO]; XCTAssertFalse([localKitContainer shouldDelayUpload:0]); XCTAssertTrue([localKitContainer shouldDelayUpload:10000]); @@ -2210,11 +2211,11 @@ - (void)testIsDisabledByConsentKitFilterGPDR { filter.filterItems = [filterItems copy]; - BOOL isDisabled = [[MParticle sharedInstance].kitContainer isDisabledByConsentKitFilter:filter]; + BOOL isDisabled = [[MParticle sharedInstance].kitContainer_PRIVATE isDisabledByConsentKitFilter:filter]; XCTAssertTrue(isDisabled); filter.shouldIncludeOnMatch = NO; - isDisabled = [[MParticle sharedInstance].kitContainer isDisabledByConsentKitFilter:filter]; + isDisabled = [[MParticle sharedInstance].kitContainer_PRIVATE isDisabledByConsentKitFilter:filter]; XCTAssertFalse(isDisabled); filter.shouldIncludeOnMatch = YES; @@ -2241,11 +2242,11 @@ - (void)testIsDisabledByConsentKitFilterGPDR { [MPPersistenceController setConsentState:state forMpid:[MPPersistenceController mpId]]; MParticle.sharedInstance.identity.currentUser.consentState = state; - isDisabled = [[MParticle sharedInstance].kitContainer isDisabledByConsentKitFilter:filter]; + isDisabled = [[MParticle sharedInstance].kitContainer_PRIVATE isDisabledByConsentKitFilter:filter]; XCTAssertFalse(isDisabled); filter.shouldIncludeOnMatch = NO; - isDisabled = [[MParticle sharedInstance].kitContainer isDisabledByConsentKitFilter:filter]; + isDisabled = [[MParticle sharedInstance].kitContainer_PRIVATE isDisabledByConsentKitFilter:filter]; XCTAssertTrue(isDisabled); } @@ -2281,33 +2282,33 @@ - (void)testIsDisabledByConsentKitFilterCCPA { [MPPersistenceController setConsentState:state forMpid:[MPPersistenceController mpId]]; MParticle.sharedInstance.identity.currentUser.consentState = state; - BOOL isDisabled = [[MParticle sharedInstance].kitContainer isDisabledByConsentKitFilter:filter]; + BOOL isDisabled = [[MParticle sharedInstance].kitContainer_PRIVATE isDisabledByConsentKitFilter:filter]; XCTAssertFalse(isDisabled); filter.shouldIncludeOnMatch = NO; - isDisabled = [[MParticle sharedInstance].kitContainer isDisabledByConsentKitFilter:filter]; + isDisabled = [[MParticle sharedInstance].kitContainer_PRIVATE isDisabledByConsentKitFilter:filter]; XCTAssertTrue(isDisabled); } - (void)testInitializeKitsWhenNilSupportedKits { - MPKitContainer *kitContainer = [[MPKitContainer alloc] init]; - MPKitContainer *mockKitContainer = OCMPartialMock(kitContainer); + MPKitContainer_PRIVATE *kitContainer = [[MPKitContainer_PRIVATE alloc] init]; + MPKitContainer_PRIVATE *mockKitContainer = OCMPartialMock(kitContainer); [[[(id)mockKitContainer stub] andReturn:nil] supportedKits]; [mockKitContainer initializeKits]; XCTAssertTrue(mockKitContainer.kitsInitialized); } - (void)testInitializeKitsWhenEmptySupportedKits { - MPKitContainer *kitContainer = [[MPKitContainer alloc] init]; - MPKitContainer *mockKitContainer = OCMPartialMock(kitContainer); + MPKitContainer_PRIVATE *kitContainer = [[MPKitContainer_PRIVATE alloc] init]; + MPKitContainer_PRIVATE *mockKitContainer = OCMPartialMock(kitContainer); [[[(id)mockKitContainer stub] andReturn: @[] ] supportedKits]; [mockKitContainer initializeKits]; XCTAssertTrue(mockKitContainer.kitsInitialized); } - (void)testInitializeKitsWhenNonemptySupportedKits { - MPKitContainer *kitContainer = [[MPKitContainer alloc] init]; - MPKitContainer *mockKitContainer = OCMPartialMock(kitContainer); + MPKitContainer_PRIVATE *kitContainer = [[MPKitContainer_PRIVATE alloc] init]; + MPKitContainer_PRIVATE *mockKitContainer = OCMPartialMock(kitContainer); [[[(id)mockKitContainer stub] andReturn: @[@123] ] supportedKits]; [mockKitContainer initializeKits]; XCTAssertFalse(mockKitContainer.kitsInitialized); @@ -2317,7 +2318,7 @@ - (void)testInitializeKitsWhenNonemptySupportedKits { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - (void)testAttemptToLogEventToKit { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; MPEvent *event = [[MPEvent alloc] initWithName:@"test_string" type:MPEventTypeOther]; event.customAttributes = @{@"plan":@"premium"}; @@ -2340,7 +2341,7 @@ - (void)testAttemptToLogEventToKit { #pragma clang diagnostic pop - (void)testAttemptToLogBaseEventToKit { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; MPEvent *event = [[MPEvent alloc] initWithName:@"test_string" type:MPEventTypeOther]; event.customAttributes = @{@"plan":@"premium"}; @@ -2359,7 +2360,7 @@ - (void)testAttemptToLogBaseEventToKit { } - (void)testAttemptToLogBaseEventMediaTypeToKit { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; MPEvent *event = [[MPEvent alloc] initWithName:@"test_string" type:MPEventTypeMedia]; event.customAttributes = @{@"plan":@"premium"}; @@ -2378,7 +2379,7 @@ - (void)testAttemptToLogBaseEventMediaTypeToKit { } - (void)testAttemptToSetOptOutToKitTrue { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"]; id kitWrapperMock = OCMProtocolMock(@protocol(MPKitProtocol)); @@ -2397,7 +2398,7 @@ - (void)testAttemptToSetOptOutToKitTrue { } - (void)testAttemptToSetOptOutToKitFalse { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"]; id kitWrapperMock = OCMProtocolMock(@protocol(MPKitProtocol)); @@ -2417,7 +2418,7 @@ - (void)testAttemptToSetOptOutToKitFalse { } - (void)testAttemptToLegacyOpenURLToKit { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; SEL selector = @selector(openURL:sourceApplication:annotation:); MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"]; @@ -2439,7 +2440,7 @@ - (void)testAttemptToLegacyOpenURLToKit { } - (void)testAttemptToOpenURLToKit { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; SEL selector = @selector(openURL:options:); MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"]; @@ -2465,7 +2466,7 @@ - (void)testAttemptToOpenURLToKit { } - (void)testAttemptToContinueUserActivityToKit { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; SEL selector = @selector(continueUserActivity:restorationHandler:); MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"]; @@ -2491,7 +2492,7 @@ - (void)testAttemptToContinueUserActivityToKit { } - (void)testAttemptToSurveyToKit { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; MPForwardQueueParameters *queueParameters = [[MPForwardQueueParameters alloc] init]; NSURL *url = [NSURL URLWithString:@"mparticle://baseurl?query"]; @@ -2512,7 +2513,7 @@ - (void)testAttemptToSurveyToKit { } - (void)testAttemptToShouldDelayEventToKit { - MPKitContainer *localKitContainer = [[MPKitContainer alloc] init]; + MPKitContainer_PRIVATE *localKitContainer = [[MPKitContainer_PRIVATE alloc] init]; MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"]; id kitWrapperMock = OCMProtocolMock(@protocol(MPKitProtocol)); @@ -2612,7 +2613,7 @@ - (void)testForwardEventToSideloadedKit { - (void)testAppInfoContainsSideloadKitsFlag { [[MPIUserDefaults standardUserDefaults] setSideloadedKitsCount:3]; - NSDictionary *dict = [[[MPApplication alloc] init] dictionaryRepresentation]; + NSDictionary *dict = [[[MPApplication_PRIVATE alloc] init] dictionaryRepresentation]; XCTAssertEqualObjects(dict[@"sideloaded_kits_count"], @3); } @@ -2630,7 +2631,7 @@ - (void)testFilterEventTypeForSideloadedKit { @"modality":@"sprinting"}; event.category = @"Olympic Games"; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2655,7 +2656,7 @@ - (void)testFilterMessageTypeForSideloadedKit { @"modality":@"sprinting"}; event.category = @"Olympic Games"; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2675,7 +2676,7 @@ - (void)testFilterEventTypeNavigationForSideloadedKitForSideloadedKit { MPEvent *event = [[MPEvent alloc] initWithName:@"Dinosaur Run" type:MPEventTypeNavigation]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2703,7 +2704,7 @@ - (void)testFilterEventNameForSideloadedKit { @"modality":@"sprinting"}; event.category = @"Olympic Games"; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2726,7 +2727,7 @@ - (void)testFilterEventNameAndAttributesForSideloadedKit { @"modality":@"sprinting"}; event.category = @"Olympic Games"; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2744,7 +2745,7 @@ - (void)testFilterForSelectorForSideloadedKit { kitContainer.sideloadedKits = @[sideloadedKit1]; [kitContainer initializeKits]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2759,7 +2760,7 @@ - (void)testFilterForUserAttributeForSideloadedKit { kitContainer.sideloadedKits = @[sideloadedKit1]; [kitContainer initializeKits]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2831,7 +2832,7 @@ - (void)testFilterForUserAttributesForSideloadedKit { @"growl":@"loud", @"teeth":@"sharp"}; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2862,7 +2863,7 @@ - (void)testFilterForUserIdentityForSideloadedKit { kitContainer.sideloadedKits = @[sideloadedKit1]; [kitContainer initializeKits]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; @@ -2885,7 +2886,7 @@ - (void)testFilterCommerceEvent_EventTypeForSideloadedKit { kitContainer.sideloadedKits = @[sideloadedKit1]; [kitContainer initializeKits]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [registeredKits anyObject]; MPProduct *product = [[MPProduct alloc] initWithName:@"DeLorean" sku:@"OutATime" quantity:@1 price:@4.32]; @@ -2928,7 +2929,7 @@ - (void)testFilterCommerceEvent_EntityTypeForSideloadedKit { kitContainer.sideloadedKits = @[sideloadedKit1]; [kitContainer initializeKits]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [registeredKits anyObject]; MPProduct *product = [[MPProduct alloc] initWithName:@"DeLorean" sku:@"OutATime" quantity:@1 price:@4.32]; @@ -2980,7 +2981,7 @@ - (void)testFilterCommerceEvent_OtherForSideloadedKit { kitContainer.sideloadedKits = @[sideloadedKit1]; [kitContainer initializeKits]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; id registeredKit = [registeredKits anyObject]; MPProduct *product = [[MPProduct alloc] initWithName:@"DeLorean" sku:@"OutATime" quantity:@1 price:@4.32]; @@ -3033,7 +3034,7 @@ - (void)testFilterCommerceEvent_TransactionAttributesForSideloadedKit { kitContainer.sideloadedKits = @[sideloadedKit1]; [kitContainer initializeKits]; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == 1000000000"]; id registeredKit = [[registeredKits filteredSetUsingPredicate:predicate] anyObject]; diff --git a/UnitTests/MPMessageBuilderTests.m b/UnitTests/MPMessageBuilderTests.m index 8af32e2d9..6c7caf20a 100644 --- a/UnitTests/MPMessageBuilderTests.m +++ b/UnitTests/MPMessageBuilderTests.m @@ -1,6 +1,7 @@ #import #import #import "MPMessageBuilder.h" +#import "mParticle.h" #import "MPIConstants.h" #import "MPSession.h" #import "MPMessage.h" @@ -13,21 +14,21 @@ #import "MPCommerceEvent.h" #import "MPCommerceEvent+Dictionary.h" #import "NSDictionary+MPCaseInsensitive.h" -#import "MPUserAttributeChange.h" +#import "MParticleSwift.h" #import "MPPersistenceController.h" -#import "mParticle.h" #import "MPBaseTestCase.h" #import "MPStateMachine.h" +#import "MParticleReachability.h" NSString *const kMPStateInformationKey = @"cs"; @interface MParticle () -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @end -@interface MPStateMachine () +@interface MPStateMachine_PRIVATE () @property (nonatomic, strong) MParticleReachability *reachability; diff --git a/UnitTests/MPNetworkCommunication+Tests.h b/UnitTests/MPNetworkCommunication+Tests.h index c3c870db6..397703b33 100644 --- a/UnitTests/MPNetworkCommunication+Tests.h +++ b/UnitTests/MPNetworkCommunication+Tests.h @@ -5,7 +5,7 @@ extern NSString * _Nonnull const kMPURLHostEventSubdomain; extern NSString * _Nonnull const kMPURLHostIdentitySubdomain; -@interface MPNetworkCommunication(Tests) +@interface MPNetworkCommunication_PRIVATE(Tests) - (nonnull NSString *)defaultHostWithSubdomain:(nonnull NSString *)subdomain apiKey:(nonnull NSString *)apiKey enableDirectRouting:(BOOL)enableDirectRouting; - (nonnull NSString *)defaultEventHost; diff --git a/UnitTests/MPNetworkCommunicationTests.m b/UnitTests/MPNetworkCommunicationTests.m index ae528189f..531511218 100644 --- a/UnitTests/MPNetworkCommunicationTests.m +++ b/UnitTests/MPNetworkCommunicationTests.m @@ -14,17 +14,18 @@ #import "MPStateMachine.h" #import "MPDevice.h" #import "MParticleSwift.h" +#import "MPIConstants.h" @interface MParticle () -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, strong) MPPersistenceController *persistenceController; @property (nonatomic, strong, readwrite) MPNetworkOptions *networkOptions; - (void)logKitBatch:(NSString *)batch; @end -@interface MPNetworkCommunication () +@interface MPNetworkCommunication_PRIVATE () - (NSNumber *)maxAgeForCache:(nonnull NSString *)cache; - (BOOL)performMessageUpload:(MPUpload *)upload; @@ -61,7 +62,7 @@ - (NSDictionary *)infoDictionary { - (void)testConfigURL { [self swizzleInstanceMethodForInstancesOfClass:[NSBundle class] selector:@selector(infoDictionary)]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *configURL = [networkCommunication configURL].url; [self deswizzle]; @@ -75,7 +76,7 @@ - (void)testConfigURLWithOptions { MPNetworkOptions *options = [[MPNetworkOptions alloc] init]; options.configHost = @"config.mpproxy.example.com"; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *configURL = [networkCommunication configURL].url; [self deswizzle]; @@ -90,7 +91,7 @@ - (void)testConfigURLWithOptionsAndOverride { options.configHost = @"config.mpproxy.example.com"; options.overridesConfigSubdirectory = true; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *configURL = [networkCommunication configURL].url; [self deswizzle]; @@ -103,7 +104,7 @@ - (void)testConfigURLWithOptionsAndOverride { - (void)testModifyURL { [self swizzleInstanceMethodForInstancesOfClass:[NSBundle class] selector:@selector(infoDictionary)]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *modifyURL = [networkCommunication modifyURL].url; [self deswizzle]; @@ -118,7 +119,7 @@ - (void)testModifyURLWithOptions { options.identityHost = @"identity.mpproxy.example.com"; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *modifyURL = [networkCommunication modifyURL].url; [self deswizzle]; @@ -129,7 +130,7 @@ - (void)testModifyURLWithOptions { - (void)testModifyURLWithOptionsAndTrackingOverride { [self swizzleInstanceMethodForInstancesOfClass:[NSBundle class] selector:@selector(infoDictionary)]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.attAuthorizationStatus = @(MPATTAuthorizationStatusAuthorized); MPNetworkOptions *options = [[MPNetworkOptions alloc] init]; @@ -137,7 +138,7 @@ - (void)testModifyURLWithOptionsAndTrackingOverride { options.identityTrackingHost = @"identity-tracking.mpproxy.example.com"; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *modifyURL = [networkCommunication modifyURL].url; [self deswizzle]; @@ -148,7 +149,7 @@ - (void)testModifyURLWithOptionsAndTrackingOverride { - (void)testEventURLWithOptionsAndOverrideAndEventsOnlyAndTrackingHost { [self swizzleInstanceMethodForInstancesOfClass:[NSBundle class] selector:@selector(infoDictionary)]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.attAuthorizationStatus = @(MPATTAuthorizationStatusAuthorized); MPNetworkOptions *options = [[MPNetworkOptions alloc] init]; @@ -157,7 +158,7 @@ - (void)testEventURLWithOptionsAndOverrideAndEventsOnlyAndTrackingHost { options.eventsOnly = true; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:nil dataPlanVersion:nil uploadSettings:[MPUploadSettings currentUploadSettings]]; NSURL *eventURL = [networkCommunication eventURLForUpload:upload].url; @@ -172,7 +173,7 @@ - (void)testEventURLWithOptionsAndOverrideAndEventsOnlyAndTrackingHost { - (void)testAliasURL { [self swizzleInstanceMethodForInstancesOfClass:[NSBundle class] selector:@selector(infoDictionary)]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:nil dataPlanVersion:nil uploadSettings:[MPUploadSettings currentUploadSettings]]; NSURL *aliasURL = [networkCommunication aliasURLForUpload:upload].url; @@ -188,7 +189,7 @@ - (void)testAliasURLWithOptions { options.eventsHost = @"events.mpproxy.example.com"; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:nil dataPlanVersion:nil uploadSettings:[MPUploadSettings currentUploadSettings]]; NSURL *aliasURL = [networkCommunication aliasURLForUpload:upload].url; @@ -205,7 +206,7 @@ - (void)testAliasURLWithOptionsAndOverride { options.overridesEventsSubdirectory = true; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:nil dataPlanVersion:nil uploadSettings:[MPUploadSettings currentUploadSettings]]; NSURL *aliasURL = [networkCommunication aliasURLForUpload:upload].url; @@ -224,7 +225,7 @@ - (void)testAliasURLWithEventsOnly { options.eventsOnly = true; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:nil dataPlanVersion:nil uploadSettings:[MPUploadSettings currentUploadSettings]]; NSURL *aliasURL = [networkCommunication aliasURLForUpload:upload].url; @@ -242,7 +243,7 @@ - (void)testAliasURLWithOptionsAndEventsOnly { options.eventsOnly = true; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:nil dataPlanVersion:nil uploadSettings:[MPUploadSettings currentUploadSettings]]; NSURL *aliasURL = [networkCommunication aliasURLForUpload:upload].url; @@ -261,7 +262,7 @@ - (void)testAliasURLWithOptionsAndOverrideAndEventsOnly { options.eventsOnly = true; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:nil dataPlanVersion:nil uploadSettings:[MPUploadSettings currentUploadSettings]]; NSURL *aliasURL = [networkCommunication aliasURLForUpload:upload].url; @@ -275,7 +276,7 @@ - (void)testAliasURLWithOptionsAndOverrideAndEventsOnly { - (void)testAliasURLWithOptionsAndOverrideAndEventsOnlyAndTrackingHost { [self swizzleInstanceMethodForInstancesOfClass:[NSBundle class] selector:@selector(infoDictionary)]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.attAuthorizationStatus = @(MPATTAuthorizationStatusAuthorized); MPNetworkOptions *options = [[MPNetworkOptions alloc] init]; @@ -287,7 +288,7 @@ - (void)testAliasURLWithOptionsAndOverrideAndEventsOnlyAndTrackingHost { options.eventsOnly = true; [MParticle sharedInstance].networkOptions = options; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:nil dataPlanVersion:nil uploadSettings:[MPUploadSettings currentUploadSettings]]; NSURL *aliasURL = [networkCommunication aliasURLForUpload:upload].url; @@ -300,7 +301,7 @@ - (void)testAliasURLWithOptionsAndOverrideAndEventsOnlyAndTrackingHost { } - (void)testEmptyUploadsArray { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSArray *uploads = @[]; __block BOOL handlerCalled = NO; [networkCommunication upload:uploads completionHandler:^{ @@ -310,7 +311,7 @@ - (void)testEmptyUploadsArray { } - (void)testUploadsArrayZipFail { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:@1 uploadDictionary:@{} dataPlanId:@"test" dataPlanVersion:@(1) uploadSettings:[MPUploadSettings currentUploadSettings]]; NSArray *uploads = @[upload]; id mockZip = OCMClassMock([MPZip_PRIVATE class]); @@ -325,7 +326,7 @@ - (void)testUploadsArrayZipFail { - (void)testUploadsArrayZipSucceedWithATTNotDetermined { [[MParticle sharedInstance] setATTStatus:MPATTAuthorizationStatusNotDetermined withATTStatusTimestampMillis:nil]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:@1 uploadDictionary:@{kMPDeviceInformationKey: @{}} dataPlanId:@"test" dataPlanVersion:@(1) uploadSettings:[MPUploadSettings currentUploadSettings]]; NSArray *uploads = @[upload]; id mockZip = OCMClassMock([MPZip_PRIVATE class]); @@ -342,7 +343,7 @@ - (void)testUploadsArrayZipSucceedWithATTNotDetermined { - (void)testUploadsArrayZipSucceedWithATTRestricted { [[MParticle sharedInstance] setATTStatus:MPATTAuthorizationStatusRestricted withATTStatusTimestampMillis:nil]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:@1 uploadDictionary:@{kMPDeviceInformationKey: @{}} dataPlanId:@"test" dataPlanVersion:@(1) uploadSettings:[MPUploadSettings currentUploadSettings]]; NSArray *uploads = @[upload]; id mockZip = OCMClassMock([MPZip_PRIVATE class]); @@ -359,7 +360,7 @@ - (void)testUploadsArrayZipSucceedWithATTRestricted { - (void)testUploadsArrayZipSucceedWithATTDenied { [[MParticle sharedInstance] setATTStatus:MPATTAuthorizationStatusDenied withATTStatusTimestampMillis:nil]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:@1 uploadDictionary:@{kMPDeviceInformationKey: @{}} dataPlanId:@"test" dataPlanVersion:@(1) uploadSettings:[MPUploadSettings currentUploadSettings]]; NSArray *uploads = @[upload]; id mockZip = OCMClassMock([MPZip_PRIVATE class]); @@ -376,7 +377,7 @@ - (void)testUploadsArrayZipSucceedWithATTDenied { - (void)testUploadsArrayZipSucceedWithATTAuthorized { [[MParticle sharedInstance] setATTStatus:MPATTAuthorizationStatusAuthorized withATTStatusTimestampMillis:nil]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:@1 uploadDictionary:@{kMPDeviceInformationKey: @{}} dataPlanId:@"test" dataPlanVersion:@(1) uploadSettings:[MPUploadSettings currentUploadSettings]]; NSArray *uploads = @[upload]; id mockZip = OCMClassMock([MPZip_PRIVATE class]); @@ -415,7 +416,7 @@ - (void)shouldStopEvents:(int)returnCode shouldStop:(BOOL)shouldStop { id mockConnector = OCMClassMock([MPConnector class]); [[[mockConnector stub] andReturn:response] responseFromPostRequestToURL:OCMOCK_ANY message:OCMOCK_ANY serializedParams:OCMOCK_ANY secret:OCMOCK_ANY]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; id mockNetworkCommunication = OCMPartialMock(networkCommunication); [[[mockNetworkCommunication stub] andReturn:mockConnector] makeConnector]; @@ -450,7 +451,7 @@ - (void)shouldStopAlias:(int)returnCode shouldStop:(BOOL)shouldStop { id mockConnector = OCMClassMock([MPConnector class]); [[[mockConnector stub] andReturn:response] responseFromPostRequestToURL:OCMOCK_ANY message:OCMOCK_ANY serializedParams:OCMOCK_ANY secret:OCMOCK_ANY]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; id mockNetworkCommunication = OCMPartialMock(networkCommunication); [[[mockNetworkCommunication stub] andReturn:mockConnector] makeConnector]; @@ -471,7 +472,7 @@ - (void)testOfflineUpload { id mockConnector = OCMClassMock([MPConnector class]); [[[mockConnector stub] andReturn:response] responseFromPostRequestToURL:OCMOCK_ANY message:OCMOCK_ANY serializedParams:OCMOCK_ANY secret:OCMOCK_ANY]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; id mockNetworkCommunication = OCMPartialMock(networkCommunication); [[[mockNetworkCommunication stub] andReturn:mockConnector] makeConnector]; @@ -503,7 +504,7 @@ - (void)testUploadSuccessDeletion { id mockConnector = OCMClassMock([MPConnector class]); [[[mockConnector stub] andReturn:response] responseFromPostRequestToURL:OCMOCK_ANY message:OCMOCK_ANY serializedParams:OCMOCK_ANY secret:OCMOCK_ANY]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; id mockNetworkCommunication = OCMPartialMock(networkCommunication); [[[mockNetworkCommunication stub] andReturn:mockConnector] makeConnector]; @@ -545,7 +546,7 @@ - (void)testUploadInvalidDeletion { id mockConnector = OCMClassMock([MPConnector class]); [[[mockConnector stub] andReturn:response] responseFromPostRequestToURL:OCMOCK_ANY message:OCMOCK_ANY serializedParams:OCMOCK_ANY secret:OCMOCK_ANY]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; id mockNetworkCommunication = OCMPartialMock(networkCommunication); [[[mockNetworkCommunication stub] andReturn:mockConnector] makeConnector]; @@ -581,7 +582,7 @@ - (void)testRequestConfigWithDefaultMaxAge { XCTAssertEqualObjects(configProvisioned, nil); XCTAssertEqualObjects(maxAge, nil); - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *configURL = [networkCommunication configURL].url; MPConnector *connector = [[MPConnector alloc] init]; @@ -637,7 +638,7 @@ - (void)testRequestConfigWithManualMaxAge { MPIUserDefaults *userDefaults = [MPIUserDefaults standardUserDefaults]; userDefaults[kMPConfigProvisionedTimestampKey] = @5555; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *configURL = [networkCommunication configURL].url; MPConnector *connector = [[MPConnector alloc] init]; @@ -689,7 +690,7 @@ - (void)testRequestConfigWithManualMaxAge { } - (void)testRequestConfigWithManualMaxAgeAndInitialAge { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *configURL = [networkCommunication configURL].url; MPConnector *connector = [[MPConnector alloc] init]; @@ -752,7 +753,7 @@ - (void)testRequestConfigWithManualMaxAgeOverMaxAllowed { MPIUserDefaults *userDefaults = [MPIUserDefaults standardUserDefaults]; userDefaults[kMPConfigProvisionedTimestampKey] = @5555; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *configURL = [networkCommunication configURL].url; MPConnector *connector = [[MPConnector alloc] init]; @@ -809,7 +810,7 @@ - (void)testRequestConfigWithComplexCacheControlHeader { MPIUserDefaults *userDefaults = [MPIUserDefaults standardUserDefaults]; userDefaults[kMPConfigProvisionedTimestampKey] = @5555; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSURL *configURL = [networkCommunication configURL].url; MPConnector *connector = [[MPConnector alloc] init]; @@ -862,42 +863,42 @@ - (void)testRequestConfigWithComplexCacheControlHeader { } - (void)testMaxAgeForCacheEmptyString { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSString *test1 = @""; XCTAssertEqualObjects([networkCommunication maxAgeForCache:test1], nil); } - (void)testMaxAgeForCacheSimple { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSString *test2 = @"max-age=12"; XCTAssertEqualObjects([networkCommunication maxAgeForCache:test2], @12); } - (void)testMaxAgeForCacheMultiValue1 { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSString *test3 = @"max-age=13, max-stale=7"; XCTAssertEqualObjects([networkCommunication maxAgeForCache:test3], @13); } - (void)testMaxAgeForCacheMultiValue2 { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSString *test4 = @"max-stale=34, max-age=14"; XCTAssertEqualObjects([networkCommunication maxAgeForCache:test4], @14); } - (void)testMaxAgeForCacheMultiValue3 { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSString *test4 = @"max-stale=33434344, max-age=15, min-fresh=3553553"; XCTAssertEqualObjects([networkCommunication maxAgeForCache:test4], @15); } - (void)testMaxAgeForCacheCapitalization { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; NSString *test5 = @"max-stale=34, MAX-age=16, min-fresh=3553553"; XCTAssertEqualObjects([networkCommunication maxAgeForCache:test5], @16); @@ -914,8 +915,8 @@ - (void)testPodURLRoutingAndTrackingURL { @[@"st1-k77ivhkbbqf4ce0s3y12zpcthyn1ixfyu", @"nativesdks.st1.mparticle.com", @"identity.st1.mparticle.com", @"tracking-nativesdks.st1.mparticle.com", @"tracking-identity.st1.mparticle.com"], @[@"us3-w1y2y8yj8q58d5bx9u2dvtxzl4cpa7cuf", @"nativesdks.us3.mparticle.com", @"identity.us3.mparticle.com", @"tracking-nativesdks.us3.mparticle.com", @"tracking-identity.us3.mparticle.com"] ]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSString *oldEventHost = @"nativesdks.mparticle.com"; NSString *oldIdentityHost = @"identity.mparticle.com"; diff --git a/UnitTests/MPNotificationController+Tests.h b/UnitTests/MPNotificationController+Tests.h index a13197c7b..6ef0bc11c 100644 --- a/UnitTests/MPNotificationController+Tests.h +++ b/UnitTests/MPNotificationController+Tests.h @@ -1,6 +1,6 @@ #import "MPNotificationController.h" -@interface MPNotificationController(Tests) +@interface MPNotificationController_PRIVATE(Tests) - (void)handleApplicationDidFinishLaunching:(NSNotification *)notification; - (void)handleApplicationDidEnterBackground:(NSNotification *)notification; diff --git a/UnitTests/MPPersistenceControllerTests.mm b/UnitTests/MPPersistenceControllerTests.mm index 423fb0ccf..f8b9989a3 100644 --- a/UnitTests/MPPersistenceControllerTests.mm +++ b/UnitTests/MPPersistenceControllerTests.mm @@ -22,7 +22,7 @@ @interface MParticle () + (dispatch_queue_t)messageQueue; @property (nonatomic, strong) MPPersistenceController *persistenceController; -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, strong, nullable) NSString *dataPlanId; @property (nonatomic, strong, nullable) NSNumber *dataPlanVersion; @@ -46,7 +46,7 @@ - (void)setUp { [super setUp]; [MParticle sharedInstance].persistenceController = [[MPPersistenceController alloc] init]; - MPStateMachine *stateMachine = [[MPStateMachine alloc] init]; + MPStateMachine_PRIVATE *stateMachine = [[MPStateMachine_PRIVATE alloc] init]; stateMachine.apiKey = @"test_key"; stateMachine.secret = @"test_secret"; [MParticle sharedInstance].stateMachine = stateMachine; diff --git a/UnitTests/MPResponseConfigTests.m b/UnitTests/MPResponseConfigTests.m index 90fafbb35..3c44032f1 100644 --- a/UnitTests/MPResponseConfigTests.m +++ b/UnitTests/MPResponseConfigTests.m @@ -1,16 +1,17 @@ #import -#import "MPResponseConfig.h" +#import "mParticle.h" +#import "MParticleSwift.h" #import "MPIConstants.h" #import "MPStateMachine.h" -#import "mParticle.h" #import "MPIUserDefaults.h" #import "MPBaseTestCase.h" @interface MParticle () + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, strong, nonnull) MParticleOptions *options; +@property (nonatomic, strong, readonly) MPBackendController_PRIVATE *backendController; @end @@ -28,7 +29,8 @@ - (void)testInstance { kMPRemoteConfigExceptionHandlingModeKey:kMPRemoteConfigExceptionHandlingModeIgnore, kMPRemoteConfigSessionTimeoutKey:@112}; - MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration]; + MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration stateMachine:[MParticle sharedInstance].stateMachine backendController:[MParticle sharedInstance].backendController]; + XCTAssertNotNil(responseConfig, @"Should not have been nil."); } @@ -36,11 +38,7 @@ - (void)testInvalidConfigurations { XCTestExpectation *expectation = [self expectationWithDescription:@"Test instance"]; dispatch_async([MParticle messageQueue], ^{ NSDictionary *configuration = nil; - MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration]; - XCTAssertNil(responseConfig, @"Should have been nil."); - - configuration = (NSDictionary *)[NSNull null]; - responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration]; + MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration stateMachine:[MParticle sharedInstance].stateMachine backendController:[MParticle sharedInstance].backendController]; XCTAssertNil(responseConfig, @"Should have been nil."); [expectation fulfill]; }); @@ -54,7 +52,7 @@ - (void)testUpdateCustomModuleSettingsOnRestore { options:NSJSONReadingMutableContainers error:nil]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.customModules = nil; NSDictionary *configuration = @{kMPRemoteConfigKitsKey:[NSNull null], kMPRemoteConfigCustomModuleSettingsKey:cmsDict, @@ -64,7 +62,7 @@ - (void)testUpdateCustomModuleSettingsOnRestore { kMPRemoteConfigSessionTimeoutKey:@112}; XCTAssertNil(stateMachine.customModules); - MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration dataReceivedFromServer:NO]; + MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration stateMachine:[MParticle sharedInstance].stateMachine backendController:[MParticle sharedInstance].backendController]; XCTAssertNotNil(responseConfig); XCTAssertNotNil(stateMachine.customModules); XCTAssertEqual(1, [stateMachine.customModules count]); @@ -89,7 +87,7 @@ - (void)testSaveRestore { kMPRemoteConfigExceptionHandlingModeKey:kMPRemoteConfigExceptionHandlingModeForce, kMPRemoteConfigSessionTimeoutKey:@112}; - MPResponseConfig *restoredResponseConfig = [MPResponseConfig restore]; + MPResponseConfig *restoredResponseConfig = [MPIUserDefaults restore]; XCTAssertNotNil(restoredResponseConfig); XCTAssertEqualObjects(restoredResponseConfig.configuration, configuration); @@ -99,17 +97,6 @@ - (void)testSaveRestore { [self waitForExpectationsWithTimeout:DEFAULT_TIMEOUT handler:nil]; } -- (void)testResponseConfigEncoding { - NSDictionary *configuration = @{kMPRemoteConfigRampKey:@100, - kMPRemoteConfigExceptionHandlingModeKey:kMPRemoteConfigExceptionHandlingModeForce, - kMPRemoteConfigSessionTimeoutKey:@112}; - - MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration]; - - MPResponseConfig *persistedResponseConfig = [self attemptSecureEncodingwithClass:[MPResponseConfig class] Object:responseConfig]; - XCTAssertEqualObjects(responseConfig.configuration, persistedResponseConfig.configuration, @"Response Config should have been a match."); -} - - (void)testShouldDeleteDueToMaxConfigAgeWhenNil { MParticleOptions *options = [MParticleOptions optionsWithKey:@"test" secret:@"test"]; options.configMaxAgeSeconds = nil; @@ -124,10 +111,10 @@ - (void)testShouldDeleteDueToMaxConfigAgeWhenNil { NSTimeInterval requestTimestamp = [[NSDate date] timeIntervalSince1970]; [[MPIUserDefaults standardUserDefaults] setConfiguration:configuration eTag:eTag requestTimestamp:requestTimestamp currentAge:@"0" maxAge:nil]; - XCTAssertFalse([MPResponseConfig isOlderThanConfigMaxAgeSeconds]); + XCTAssertFalse([MPIUserDefaults isOlderThanConfigMaxAgeSeconds]); [[MPIUserDefaults standardUserDefaults] setConfiguration:configuration eTag:eTag requestTimestamp:(requestTimestamp - 10000.0) currentAge:@"0" maxAge:nil]; - XCTAssertFalse([MPResponseConfig isOlderThanConfigMaxAgeSeconds]); + XCTAssertFalse([MPIUserDefaults isOlderThanConfigMaxAgeSeconds]); [expectation fulfill]; }); @@ -149,10 +136,10 @@ - (void)testShouldDeleteDueToMaxConfigAge { NSTimeInterval requestTimestamp = [[NSDate date] timeIntervalSince1970]; [[MPIUserDefaults standardUserDefaults] setConfiguration:configuration eTag:eTag requestTimestamp:requestTimestamp currentAge:@"0" maxAge:nil]; - XCTAssertFalse([MPResponseConfig isOlderThanConfigMaxAgeSeconds]); + XCTAssertFalse([MPIUserDefaults isOlderThanConfigMaxAgeSeconds]); [[MPIUserDefaults standardUserDefaults] setConfiguration:configuration eTag:eTag requestTimestamp:(requestTimestamp - 100.0) currentAge:@"0" maxAge:nil]; - XCTAssertTrue([MPResponseConfig isOlderThanConfigMaxAgeSeconds]); + XCTAssertTrue([MPIUserDefaults isOlderThanConfigMaxAgeSeconds]); [expectation fulfill]; }); @@ -177,9 +164,9 @@ - (void)testDeleteDueToMaxConfigAge { [[MPIUserDefaults standardUserDefaults] setConfiguration:configuration eTag:eTag requestTimestamp:requestTimestamp currentAge:@"0" maxAge:nil]; XCTAssertNotNil([[MPIUserDefaults standardUserDefaults] getConfiguration]); - XCTAssertTrue([MPResponseConfig isOlderThanConfigMaxAgeSeconds]); - if ([MPResponseConfig isOlderThanConfigMaxAgeSeconds]) { - [MPResponseConfig deleteConfig]; + XCTAssertTrue([MPIUserDefaults isOlderThanConfigMaxAgeSeconds]); + if ([MPIUserDefaults isOlderThanConfigMaxAgeSeconds]) { + [MPIUserDefaults deleteConfig]; } XCTAssertNil([[MPIUserDefaults standardUserDefaults] getConfiguration]); diff --git a/UnitTests/MPResponseEventsTest.m b/UnitTests/MPResponseEventsTest.m index 297a11204..975fb7a3b 100644 --- a/UnitTests/MPResponseEventsTest.m +++ b/UnitTests/MPResponseEventsTest.m @@ -5,10 +5,11 @@ #import "MPBaseTestCase.h" #import "mParticle.h" #import "MPNetworkCommunication.h" +#import "MPIConstants.h" @interface MParticle () -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @end @@ -19,7 +20,7 @@ @interface MPResponseEventsTest : MPBaseTestCase @implementation MPResponseEventsTest - (void)testParseConfiguration { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSNumber *originalMpId = @10; NSString *originalDas = @"aaaaaaaaa"; @@ -59,7 +60,7 @@ - (void)testParseConfiguration { kMPRemoteConfigUniqueIdentifierKey: newDas }}; - [MPNetworkCommunication parseConfiguration:response]; + [MPNetworkCommunication_PRIVATE parseConfiguration:response]; XCTAssertEqualObjects([MPPersistenceController mpId], originalMpId); XCTAssertEqualObjects(stateMachine.consumerInfo.uniqueIdentifier, originalDas); XCTAssertTrue(areEqual(stateMachine.consumerInfo.cookiesDictionaryRepresentation, originalCookies)); diff --git a/UnitTests/MPStateMachineTests.m b/UnitTests/MPStateMachineTests.m index cfb341ed0..4240ffc70 100644 --- a/UnitTests/MPStateMachineTests.m +++ b/UnitTests/MPStateMachineTests.m @@ -9,9 +9,10 @@ #import "MPBaseTestCase.h" #import "MPStateMachine.h" #import "MPKitContainer.h" +#import "MPLaunchInfo.h" #pragma mark - MPStateMachine category -@interface MPStateMachine(Tests) +@interface MPStateMachine_PRIVATE(Tests) - (void)handleApplicationDidEnterBackground:(NSNotification *)notification; - (void)handleApplicationWillEnterForeground:(NSNotification *)notification; @@ -23,8 +24,8 @@ - (void)resetTriggers; @interface MParticle () -@property (nonatomic, strong) MPStateMachine *stateMachine; -@property (nonatomic, strong) MPKitContainer * kitContainer; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong) MPKitContainer_PRIVATE *kitContainer_PRIVATE; @end @@ -36,7 +37,7 @@ @interface MPStateMachineTests : MPBaseTestCase @implementation MPStateMachineTests - (void)testOptOut { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.optOut = YES; XCTAssertTrue(stateMachine.optOut, @"OptOut is not being set."); @@ -45,7 +46,7 @@ - (void)testOptOut { } - (void)testRamp { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; [stateMachine configureRampPercentage:@100]; XCTAssertFalse(stateMachine.dataRamped, @"Data ramp is not respecting 100 percent upper limit."); @@ -57,7 +58,7 @@ - (void)testRamp { } - (void)testConfigureTriggers { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSString *hashEvent1 = [MPIHasher hashTriggerEventName:@"Button Tapped" eventType:@"Transaction"]; NSString *hashEvent2 = [MPIHasher hashTriggerEventName:@"Post Liked" eventType:@"Social"]; @@ -82,7 +83,7 @@ - (void)testConfigureTriggers { } - (void)testNullConfigureTriggers { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSString *hashEvent1 = [MPIHasher hashTriggerEventName:@"Button Tapped" eventType:@"Transaction"]; NSString *hashEvent2 = [MPIHasher hashTriggerEventName:@"Post Liked" eventType:@"Social"]; @@ -128,29 +129,29 @@ - (void)testNullConfigureTriggers { - (void)testStateTransitions { XCTestExpectation *expectation = [self expectationWithDescription:@"State transitions"]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; MPLaunchInfo *launchInfo = [[MPLaunchInfo alloc] initWithURL:[NSURL URLWithString:@"http://mparticle.com"] options:@{@"Launching":@"WooHoo"}]; stateMachine.launchInfo = launchInfo; XCTAssertFalse(stateMachine.backgrounded, @"Should have been false."); XCTAssertNotNil(stateMachine.launchInfo, @"Should not have been nil."); - XCTAssertFalse([MPStateMachine runningInBackground], @"Should have been false."); + XCTAssertFalse([MPStateMachine_PRIVATE runningInBackground], @"Should have been false."); [stateMachine handleApplicationDidEnterBackground:nil]; dispatch_async(dispatch_get_main_queue(), ^{ - [MPStateMachine setRunningInBackground:YES]; + [MPStateMachine_PRIVATE setRunningInBackground:YES]; XCTAssertTrue(stateMachine.backgrounded, @"Should have been true."); XCTAssertNil(stateMachine.launchInfo, @"Should have been nil."); - XCTAssertTrue([MPStateMachine runningInBackground], @"Should have been true."); + XCTAssertTrue([MPStateMachine_PRIVATE runningInBackground], @"Should have been true."); [stateMachine handleApplicationWillEnterForeground:nil]; dispatch_async(dispatch_get_main_queue(), ^{ - [MPStateMachine setRunningInBackground:NO]; + [MPStateMachine_PRIVATE setRunningInBackground:NO]; XCTAssertFalse(stateMachine.backgrounded, @"Should have been false."); - XCTAssertFalse([MPStateMachine runningInBackground], @"Should have been false."); + XCTAssertFalse([MPStateMachine_PRIVATE runningInBackground], @"Should have been false."); [expectation fulfill]; }); }); @@ -161,7 +162,7 @@ - (void)testStateTransitions { } - (void)testRamping { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; [stateMachine configureRampPercentage:@0]; XCTAssertTrue(stateMachine.dataRamped, @"Should have been true."); @@ -172,7 +173,7 @@ - (void)testRamping { - (void)testEventAndMessageTriggers { NSDictionary *configuration = @{@"evts":@[@"events"], @"dts":@[@"messages"]}; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; [stateMachine configureTriggers:configuration]; XCTAssertNotNil(stateMachine.triggerEventTypes, @"Should not have been nil."); XCTAssertNotNil(stateMachine.triggerMessageTypes, @"Should not have been nil."); @@ -183,23 +184,23 @@ - (void)testEventAndMessageTriggers { } - (void)testEnvironment { - [MPStateMachine setEnvironment:MPEnvironmentAutoDetect]; - MPEnvironment environment = [MPStateMachine environment]; + [MPStateMachine_PRIVATE setEnvironment:MPEnvironmentAutoDetect]; + MPEnvironment environment = [MPStateMachine_PRIVATE environment]; XCTAssertEqual(environment, MPEnvironmentDevelopment, @"Should have been equal."); - [MPStateMachine setEnvironment:MPEnvironmentDevelopment]; - environment = [MPStateMachine environment]; + [MPStateMachine_PRIVATE setEnvironment:MPEnvironmentDevelopment]; + environment = [MPStateMachine_PRIVATE environment]; XCTAssertEqual(environment, MPEnvironmentDevelopment, @"Should have been equal."); } - (void)testSetLocation { #if TARGET_OS_IOS == 1 #ifndef MPARTICLE_LOCATION_DISABLE - id mockKitContainer = OCMClassMock([MPKitContainer class]); - [MParticle sharedInstance].kitContainer = mockKitContainer; + id mockKitContainer = OCMClassMock([MPKitContainer_PRIVATE class]); + [MParticle sharedInstance].kitContainer_PRIVATE = mockKitContainer; XCTestExpectation *expectation = [self expectationWithDescription:@"Set Location"]; - MPKitContainer *kitContainer = [MParticle sharedInstance].kitContainer; + MPKitContainer_PRIVATE *kitContainer = [MParticle sharedInstance].kitContainer_PRIVATE; [MParticle sharedInstance].location = [[CLLocation alloc] init]; @@ -219,4 +220,18 @@ - (void)testSetLocation { #endif } +#if TARGET_OS_IOS == 1 +- (void)testRequestAttribution { + XCTestExpectation *expectation = [self expectationWithDescription:@"Request Attribution"]; + void (^searchAdsCompletion)(void) = ^{ + [expectation fulfill]; + }; + + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; + + [stateMachine requestAttributionDetailsWithBlock:searchAdsCompletion requestsCompleted:0]; + [self waitForExpectationsWithTimeout:DEFAULT_TIMEOUT handler:nil]; +} +#endif + @end diff --git a/UnitTests/MPURLRequestBuilderTests.m b/UnitTests/MPURLRequestBuilderTests.m index 558d1e487..4275a1c92 100644 --- a/UnitTests/MPURLRequestBuilderTests.m +++ b/UnitTests/MPURLRequestBuilderTests.m @@ -1,5 +1,6 @@ #import #import +#import "mParticle.h" #import "MPURLRequestBuilder.h" #import "MPStateMachine.h" #import "MPIConstants.h" @@ -14,17 +15,18 @@ #import "MPMessage.h" #import "MPBaseTestCase.h" #import "MPKitConfiguration.h" -#import "MParticleWebView.h" #import "MPExtensionProtocol.h" #import "MPURL.h" #import "MPUpload.h" +#import "MParticleSwift.h" + @interface MParticle () + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong) MPStateMachine *stateMachine; -@property (nonatomic, strong) MPKitContainer *kitContainer; -@property (nonatomic, strong) MParticleWebView *webView; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong) MPKitContainer_PRIVATE *kitContainer_PRIVATE; +@property (nonatomic, strong) MParticleWebView_PRIVATE *webView; @end @@ -41,7 +43,7 @@ - (NSString *)signatureRelativePath:(NSString *)relativePath url:(NSURL *)url; @end #pragma mark - MPKitContainer category for unit tests -@interface MPKitContainer(Tests) +@interface MPKitContainer_PRIVATE(Tests) - (id)startKit:(NSNumber *)integrationId configuration:(MPKitConfiguration *)kitConfiguration; @@ -49,7 +51,7 @@ @interface MPKitContainer(Tests) #pragma mark - MPURLRequestBuilderTests @interface MPURLRequestBuilderTests : MPBaseTestCase { - MPKitContainer *kitContainer; + MPKitContainer_PRIVATE *kitContainer; } @end @@ -64,19 +66,19 @@ - (void)setUp { [MParticle sharedInstance].stateMachine.apiKey = @"unit_test_app_key"; [MParticle sharedInstance].stateMachine.secret = @"unit_test_secret"; - [MParticle sharedInstance].kitContainer = [[MPKitContainer alloc] init]; - kitContainer = [MParticle sharedInstance].kitContainer; + [MParticle sharedInstance].kitContainer_PRIVATE = [[MPKitContainer_PRIVATE alloc] init]; + kitContainer = [MParticle sharedInstance].kitContainer_PRIVATE; - NSSet> *registeredKits = [MPKitContainer registeredKits]; + NSSet> *registeredKits = [MPKitContainer_PRIVATE registeredKits]; if (!registeredKits) { MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"KitTest" className:@"MPKitTestClassNoStartImmediately"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; kitRegister = [[MPKitRegister alloc] initWithName:@"KitSecondTest" className:@"MPKitSecondTestClass"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"]; - [MPKitContainer registerKit:kitRegister]; + [MPKitContainer_PRIVATE registerKit:kitRegister]; NSDictionary *configuration = @{ @"id":@42, @@ -102,7 +104,7 @@ - (void)testCustomUserAgent { XCTestExpectation *expectation = [self expectationWithDescription:@"User-Agent"]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPMessage *message = [[MPMessage alloc] initWithSession:nil messageType:@"e" messageInfo:@{@"key":@"value"} uploadStatus:MPUploadStatusBatch UUID:[[NSUUID UUID] UUIDString] timestamp:[[NSDate date] timeIntervalSince1970] userId:[MPPersistenceController mpId] dataPlanId:@"test" dataPlanVersion:@(1)]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:@"test" dataPlanVersion:@(1) uploadSettings:[MPUploadSettings currentUploadSettings]]; @@ -129,7 +131,7 @@ - (void)testDisableCollectUserAgent { XCTestExpectation *expectation = [self expectationWithDescription:@"User-Agent"]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPMessage *message = [[MPMessage alloc] initWithSession:nil messageType:@"e" messageInfo:@{@"key":@"value"} uploadStatus:MPUploadStatusBatch UUID:[[NSUUID UUID] UUIDString] timestamp:[[NSDate date] timeIntervalSince1970] userId:[MPPersistenceController mpId] dataPlanId:@"test" dataPlanVersion:@(1)]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:@"test" dataPlanVersion:@(1) uploadSettings:[MPUploadSettings currentUploadSettings]]; @@ -153,7 +155,7 @@ - (void)testDisableCollectUserAgent { - (void)testHMACSha256Encode { NSURL *baseURL = [NSURL URLWithString:@"http://mparticle.com"]; MPURLRequestBuilder *urlRequestBuilder = [MPURLRequestBuilder newBuilderWithURL:[[MPURL alloc] initWithURL:baseURL defaultURL:baseURL]]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSString *message = @"The Quick Brown Fox Jumps Over The Lazy Dog."; NSString *referenceEncodedMessage = @"ceefdfeab2fe404a7cbb75f6f6a01443286fab507eb85c213fce3d812e8b615c"; @@ -165,7 +167,7 @@ - (void)testHMACSha256Encode { - (void)testInvalidHMACSha256Encode { NSURL *baseURL = [NSURL URLWithString:@"http://mparticle.com"]; MPURLRequestBuilder *urlRequestBuilder = [MPURLRequestBuilder newBuilderWithURL:[[MPURL alloc] initWithURL:baseURL defaultURL:baseURL]]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSString *message = nil; NSString *encodedMessage = [urlRequestBuilder hmacSha256Encode:message key:stateMachine.apiKey]; @@ -181,7 +183,7 @@ - (void)testInvalidHMACSha256Encode { } - (void)testURLRequestComposition { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPURLRequestBuilder *urlRequestBuilder = [MPURLRequestBuilder newBuilderWithURL:[networkCommunication configURL] message:nil httpMethod:@"GET"]; NSMutableURLRequest *asyncURLRequest = [urlRequestBuilder build]; @@ -249,7 +251,7 @@ - (void)testEtag { NSTimeInterval requestTimestamp = [[NSDate date] timeIntervalSince1970]; [[MPIUserDefaults standardUserDefaults] setConfiguration:responseConfiguration eTag:eTag requestTimestamp:requestTimestamp currentAge:@"0" maxAge:nil]; - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPURLRequestBuilder *urlRequestBuilder = [MPURLRequestBuilder newBuilderWithURL:[networkCommunication configURL] message:nil httpMethod:@"GET"]; NSMutableURLRequest *asyncURLRequest = [urlRequestBuilder build]; @@ -369,19 +371,19 @@ - (void)testInvalidURLs { - (void)testEventRequest { MParticle *sharedInstance = [MParticle sharedInstance]; - MParticleWebView *webview = sharedInstance.webView; + MParticleWebView_PRIVATE *webview = sharedInstance.webView; NSString *agent = @"Example resolved agent"; id mockWebView = OCMPartialMock(webview); [[[mockWebView stub] andReturn:agent] userAgent]; - id mockKitContainer = OCMClassMock([MPKitContainer class]); + id mockKitContainer = OCMClassMock([MPKitContainer_PRIVATE class]); NSNumber *mockKitId = @42; [[[mockKitContainer stub] andReturn:@[mockKitId]] configuredKitsRegistry]; id mockMParticle = OCMPartialMock(sharedInstance); [[[mockMParticle stub] andReturn:mockWebView] webView]; - [[[mockMParticle stub] andReturn:mockKitContainer] kitContainer]; + [[[mockMParticle stub] andReturn:mockKitContainer] kitContainer_PRIVATE]; NSDictionary *configuration1 = @{ @"id":@42, @@ -391,12 +393,12 @@ - (void)testEventRequest { }; NSArray *kitConfigs = @[configuration1]; - [[MParticle sharedInstance].kitContainer configureKits:nil]; - [[MParticle sharedInstance].kitContainer configureKits:kitConfigs]; + [[MParticle sharedInstance].kitContainer_PRIVATE configureKits:nil]; + [[MParticle sharedInstance].kitContainer_PRIVATE configureKits:kitConfigs]; XCTAssertEqual([MPURLRequestBuilder requestTimeout], 10, @"Should have been equal."); - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPMessage *message = [[MPMessage alloc] initWithSession:nil messageType:@"e" messageInfo:@{@"key":@"value"} uploadStatus:MPUploadStatusBatch UUID:[[NSUUID UUID] UUIDString] timestamp:[[NSDate date] timeIntervalSince1970] userId:[MPPersistenceController mpId] dataPlanId:@"test" dataPlanVersion:@(1)]; MPUpload *upload = [[MPUpload alloc] initWithSessionId:nil uploadDictionary:@{} dataPlanId:@"test" dataPlanVersion:@(1) uploadSettings:[MPUploadSettings currentUploadSettings]]; @@ -434,7 +436,7 @@ - (void)testEventRequest { } - (void)testSignatureRelativePath { - MPNetworkCommunication *networkCommunication = [[MPNetworkCommunication alloc] init]; + MPNetworkCommunication_PRIVATE *networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; MPNetworkOptions *networkOptions = [[MPNetworkOptions alloc] init]; MParticle *sharedInstance = [MParticle sharedInstance]; id mockMParticle = OCMPartialMock(sharedInstance); diff --git a/UnitTests/MPUploadBuilderTests.m b/UnitTests/MPUploadBuilderTests.m index 534bb1c36..de2d28a22 100644 --- a/UnitTests/MPUploadBuilderTests.m +++ b/UnitTests/MPUploadBuilderTests.m @@ -15,7 +15,7 @@ @interface MParticle () @property (nonatomic, strong) MPPersistenceController *persistenceController; -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, strong, nullable) NSString *dataPlanId; @property (nonatomic, strong, nullable) NSNumber *dataPlanVersion; @property (nonatomic, strong) MParticleOptions *options; diff --git a/UnitTests/MPUserAttributeChangeTests.m b/UnitTests/MPUserAttributeChangeTests.m index d46d8a44e..827d098c6 100644 --- a/UnitTests/MPUserAttributeChangeTests.m +++ b/UnitTests/MPUserAttributeChangeTests.m @@ -1,5 +1,5 @@ #import -#import "MPUserAttributeChange.h" +#import "MParticleSwift.h" #import "MPBaseTestCase.h" @interface MPUserAttributeChangeTests : MPBaseTestCase @@ -34,7 +34,7 @@ - (void)testInstance { XCTAssertNil(userAttributeChange.timestamp); XCTAssertEqualObjects(userAttributeChange.userAttributes, userAttributes); XCTAssertNil(userAttributeChange.value); - XCTAssertEqualObjects(userAttributeChange.valueToLog, [NSNull null]); + XCTAssertNil(userAttributeChange.valueToLog); XCTAssertTrue(userAttributeChange.changed); XCTAssertTrue(userAttributeChange.deleted); XCTAssertTrue(userAttributeChange.isArray); diff --git a/UnitTests/MPUserIdentityChangeTests.m b/UnitTests/MPUserIdentityChangeTests.m index 4fb621cb7..171eca910 100644 --- a/UnitTests/MPUserIdentityChangeTests.m +++ b/UnitTests/MPUserIdentityChangeTests.m @@ -1,15 +1,15 @@ #import -#import "MPUserIdentityChange.h" #import "MPIdentityApiRequest.h" #import "MParticleUser.h" #import "mParticle.h" #import "MPIUserDefaults.h" #import "MPIConstants.h" #import "MPBackendController.h" +#import "MParticleSwift.h" #import "MPBaseTestCase.h" @interface MParticle () -@property (nonatomic, strong, nonnull) MPBackendController *backendController; +@property (nonatomic, strong, nonnull) MPBackendController_PRIVATE *backendController; @end @interface MPUserIdentityChangeTests : MPBaseTestCase @@ -20,7 +20,7 @@ @implementation MPUserIdentityChangeTests - (void)testUserIdentityRequest { MParticle *mParticle = [MParticle sharedInstance]; - mParticle.backendController = [[MPBackendController alloc] initWithDelegate:(id)mParticle]; + mParticle.backendController = [[MPBackendController_PRIVATE alloc] initWithDelegate:(id)mParticle]; MParticleUser *currentUser = [[MParticle sharedInstance].identity currentUser]; @@ -37,7 +37,7 @@ - (void)testUserIdentityRequest { - (void)testSelectedUserIdentityRequest { MParticle *mParticle = [MParticle sharedInstance]; - mParticle.backendController = [[MPBackendController alloc] initWithDelegate:(id)mParticle]; + mParticle.backendController = [[MPBackendController_PRIVATE alloc] initWithDelegate:(id)mParticle]; NSNumber *selectedUserID = [NSNumber numberWithInteger:58591]; @@ -64,7 +64,7 @@ - (void)testUserIdentityInstance { NSDate *date = [NSDate date]; // New user identity - MPUserIdentityInstance *userIdentity = [[MPUserIdentityInstance alloc] initWithType:MPUserIdentityCustomerId value:@"The Most Interesting Man in the World" dateFirstSet:date isFirstTimeSet:YES]; + MPUserIdentityInstance_PRIVATE *userIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithType:MPUserIdentityCustomerId value:@"The Most Interesting Man in the World" dateFirstSet:date isFirstTimeSet:YES]; XCTAssertNotNil(userIdentity); XCTAssertEqual(userIdentity.type, MPUserIdentityCustomerId); XCTAssertEqualObjects(userIdentity.value, @"The Most Interesting Man in the World"); @@ -79,7 +79,7 @@ - (void)testUserIdentityInstance { XCTAssertEqualObjects(dictionary[@"f"], @(YES)); // Delete user identity - userIdentity = [[MPUserIdentityInstance alloc] initWithType:MPUserIdentityCustomerId value:nil dateFirstSet:date isFirstTimeSet:NO]; + userIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithType:MPUserIdentityCustomerId value:nil dateFirstSet:date isFirstTimeSet:NO]; XCTAssertNotNil(userIdentity); XCTAssertEqual(userIdentity.type, MPUserIdentityCustomerId); XCTAssertNil(userIdentity.value); @@ -102,30 +102,43 @@ - (void)testUserIdentityInstanceWithDictionary { @"dfs":MPMilliseconds([date timeIntervalSince1970]), @"f":@YES}; - MPUserIdentityInstance *userIdentity = [[MPUserIdentityInstance alloc] initWithUserIdentityDictionary:userIdentityDictionary]; + MPUserIdentityInstance_PRIVATE *userIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithUserIdentityDictionary:userIdentityDictionary]; XCTAssertNotNil(userIdentity); XCTAssertEqual(userIdentity.type, MPUserIdentityCustomerId); XCTAssertEqualObjects(userIdentity.value, @"The Most Interesting Man in the World"); XCTAssertEqualWithAccuracy([userIdentity.dateFirstSet timeIntervalSince1970], [date timeIntervalSince1970], 0.01); XCTAssertTrue(userIdentity.isFirstTimeSet); + + + userIdentityDictionary = @{@"n":@(MPUserIdentityOther2), + @"i":@"34353234", + @"dfs":MPMilliseconds([date timeIntervalSince1970]), + @"f":@YES}; + + userIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithUserIdentityDictionary:userIdentityDictionary]; + XCTAssertNotNil(userIdentity); + XCTAssertEqual(userIdentity.type, MPUserIdentityOther2); + XCTAssertEqualObjects(userIdentity.value, @"34353234"); + XCTAssertEqualWithAccuracy([userIdentity.dateFirstSet timeIntervalSince1970], [date timeIntervalSince1970], 0.01); + XCTAssertTrue(userIdentity.isFirstTimeSet); } - (void)testUserIdentityChange { NSDate *date = [NSDate date]; - MPUserIdentityInstance *userIdentityNew = [[MPUserIdentityInstance alloc] initWithType:MPUserIdentityCustomerId value:@"The Most Interesting Man in the World" dateFirstSet:date isFirstTimeSet:NO]; - MPUserIdentityInstance *userIdentityOld = [[MPUserIdentityInstance alloc] initWithType:MPUserIdentityCustomerId value:@"The Least Interesting Man in the World" dateFirstSet:[NSDate distantPast] isFirstTimeSet:YES]; + MPUserIdentityInstance_PRIVATE *newUserIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithType:MPUserIdentityCustomerId value:@"The Most Interesting Man in the World" dateFirstSet:date isFirstTimeSet:NO]; + MPUserIdentityInstance_PRIVATE *oldUserIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithType:MPUserIdentityCustomerId value:@"The Least Interesting Man in the World" dateFirstSet:[NSDate distantPast] isFirstTimeSet:YES]; - MPUserIdentityChange *userIdentityChange = [[MPUserIdentityChange alloc] initWithNewUserIdentity:userIdentityNew oldUserIdentity:userIdentityOld timestamp:date userIdentities:nil]; + MPUserIdentityChange_PRIVATE *userIdentityChange = [[MPUserIdentityChange_PRIVATE alloc] initWithNewUserIdentity:newUserIdentity oldUserIdentity:oldUserIdentity timestamp:date userIdentities:nil]; XCTAssertNotNil(userIdentityChange); - XCTAssertNotNil(userIdentityChange.userIdentityNew); - XCTAssertNotNil(userIdentityChange.userIdentityOld); + XCTAssertNotNil(userIdentityChange.newUserIdentity); + XCTAssertNotNil(userIdentityChange.oldUserIdentity); XCTAssertNotNil(userIdentityChange.timestamp); XCTAssertTrue(userIdentityChange.changed); - userIdentityChange = [[MPUserIdentityChange alloc] initWithNewUserIdentity:userIdentityNew oldUserIdentity:nil timestamp:nil userIdentities:nil]; + userIdentityChange = [[MPUserIdentityChange_PRIVATE alloc] initWithNewUserIdentity:newUserIdentity oldUserIdentity:nil timestamp:nil userIdentities:nil]; XCTAssertNotNil(userIdentityChange); - XCTAssertNotNil(userIdentityChange.userIdentityNew); - XCTAssertNil(userIdentityChange.userIdentityOld); + XCTAssertNotNil(userIdentityChange.newUserIdentity); + XCTAssertNil(userIdentityChange.oldUserIdentity); XCTAssertNotNil(userIdentityChange.timestamp); XCTAssertTrue(userIdentityChange.changed); } @@ -138,13 +151,32 @@ - (void)testIdenticalUserIdentityChange { } ]; - MPUserIdentityInstance *userIdentityNew = [[MPUserIdentityInstance alloc] initWithType:MPUserIdentityCustomerId value:@"The Most Interesting Man in the World" dateFirstSet:[NSDate date] isFirstTimeSet:NO]; - MPUserIdentityChange *userIdentityChange = [[MPUserIdentityChange alloc] initWithNewUserIdentity:userIdentityNew userIdentities:userIdentities]; + MPUserIdentityInstance_PRIVATE *newUserIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithType:MPUserIdentityCustomerId value:@"The Most Interesting Man in the World" dateFirstSet:[NSDate date] isFirstTimeSet:NO]; + MPUserIdentityChange_PRIVATE *userIdentityChange = [[MPUserIdentityChange_PRIVATE alloc] initWithNewUserIdentity:newUserIdentity userIdentities:userIdentities]; XCTAssertNotNil(userIdentityChange); - XCTAssertNotNil(userIdentityChange.userIdentityNew); - XCTAssertNil(userIdentityChange.userIdentityOld); + XCTAssertNotNil(userIdentityChange.newUserIdentity); + XCTAssertNil(userIdentityChange.oldUserIdentity); XCTAssertNotNil(userIdentityChange.timestamp); XCTAssertFalse(userIdentityChange.changed); } +- (void)testUserIdentityChangeTimestampBehavior { + + MPUserIdentityInstance_PRIVATE *newUserIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithType:MPUserIdentityCustomerId value:@"test1" dateFirstSet:[NSDate date] isFirstTimeSet:NO]; + MPUserIdentityInstance_PRIVATE *oldUserIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithType:MPUserIdentityCustomerId value:@"test2" dateFirstSet:[NSDate distantPast] isFirstTimeSet:YES]; + + // Set date on init + NSDate *date1 = [NSDate date]; + MPUserIdentityChange_PRIVATE *userIdentityChange1 = [[MPUserIdentityChange_PRIVATE alloc] initWithNewUserIdentity:newUserIdentity oldUserIdentity:oldUserIdentity timestamp:date1 userIdentities:nil]; + XCTAssertEqualObjects(userIdentityChange1.timestamp, date1); + + // Date is created on get + MPUserIdentityChange_PRIVATE *userIdentityChange2 = [[MPUserIdentityChange_PRIVATE alloc] initWithNewUserIdentity:newUserIdentity oldUserIdentity:oldUserIdentity timestamp:nil userIdentities:nil]; + NSTimeInterval timestamp = userIdentityChange2.timestamp.timeIntervalSince1970; + XCTAssertNotNil(userIdentityChange2.timestamp); + [NSThread sleepForTimeInterval:0.5]; + XCTAssertEqual(timestamp, userIdentityChange2.timestamp.timeIntervalSince1970); + XCTAssertNotNil(userIdentityChange2.timestamp); +} + @end diff --git a/UnitTests/MParticleTests.m b/UnitTests/MParticleTests.m index e273cb551..6a15fb74c 100644 --- a/UnitTests/MParticleTests.m +++ b/UnitTests/MParticleTests.m @@ -6,7 +6,6 @@ #import "MPSession.h" #import "MPBackendController.h" #import "MPURLRequestBuilder.h" -#import "MParticleWebView.h" #import "MPPersistenceController.h" #import "MPIUserDefaults.h" #import "MPURL.h" @@ -17,16 +16,16 @@ #import "MPKitConfiguration.h" #import "MParticleSwift.h" #import +#import "MPIConstants.h" @interface MParticle () + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong) MPStateMachine *stateMachine; -@property (nonatomic, strong) MPBackendController *backendController; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong) MPBackendController_PRIVATE *backendController; @property (nonatomic, strong) MParticleOptions *options; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; - (BOOL)isValidBridgeName:(NSString *)bridgeName; - (void)handleWebviewCommand:(NSString *)command dictionary:(NSDictionary *)dictionary; -@property (nonatomic, strong) MParticleWebView *webView; +@property (nonatomic, strong) MParticleWebView_PRIVATE *webView; @end @interface MParticleUser () @@ -34,7 +33,7 @@ - (void)setIdentitySync:(NSString *)identityString identityType:(MPIdentity)iden - (void)setUserId:(NSNumber *)userId; @end -@interface MPKitContainer () +@interface MPKitContainer_PRIVATE () @property (nonatomic, strong) NSMutableDictionary *kitConfigurations; + (NSMutableSet > *)kitsRegistry; @end @@ -54,7 +53,7 @@ - (void)setUp { lastNotification = nil; // Ensure registeredKits is empty - [MPKitContainer.kitsRegistry removeAllObjects]; + [MPKitContainer_PRIVATE.kitsRegistry removeAllObjects]; } - (void)tearDown { @@ -93,7 +92,7 @@ - (void)testResetInstance { - (void)testOptOut { MParticle *instance = [MParticle sharedInstance]; - instance.stateMachine = [[MPStateMachine alloc] init]; + instance.stateMachine = [[MPStateMachine_PRIVATE alloc] init]; XCTAssertFalse(instance.optOut, "By Default Opt Out should be set to false"); @@ -106,7 +105,7 @@ - (void)testOptOut { - (void)testOptOutEndsSession { MParticle *instance = [MParticle sharedInstance]; - instance.stateMachine = [[MPStateMachine alloc] init]; + instance.stateMachine = [[MPStateMachine_PRIVATE alloc] init]; instance.optOut = YES; MParticleSession *session = instance.currentSession; @@ -412,7 +411,7 @@ - (void)testIsValidBridgeName { #if TARGET_OS_IOS == 1 - (void)testWebviewLogEvent { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); MPEvent *testEvent = [[MPEvent alloc] initWithName:@"foo webview event 1" type:MPEventTypeNavigation]; testEvent.customAttributes = @{@"foo webview event attribute 1":@"foo webview event attribute value 1"}; @@ -441,7 +440,7 @@ - (void)testWebviewLogEvent { } - (void)testWebviewLogScreenEvent { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); MPEvent *testEvent = [[MPEvent alloc] initWithName:@"foo Page View" type:MPEventTypeNavigation]; testEvent.customAttributes = @{@"foo webview event attribute 1":@"foo webview event attribute value 1"}; @@ -470,7 +469,7 @@ - (void)testWebviewLogScreenEvent { } - (void)testWebviewLogCommerceAttributes { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); MPProduct *testProduct = [[MPProduct alloc] initWithName:@"foo product 1" sku:@"12345" quantity:@1 price:@19.95]; MPCommerceEvent *testEvent = [[MPCommerceEvent alloc] initWithAction:MPCommerceEventActionAddToCart product:testProduct]; @@ -516,7 +515,7 @@ - (void)testWebviewLogCommerceAttributes { } - (void)testWebviewLogCommerceInvalidArray { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); [[mockBackend reject] logCommerceEvent:[OCMArg any] completionHandler:[OCMArg any]]; @@ -549,7 +548,7 @@ - (void)testWebviewLogCommerceInvalidArray { } - (void)testWebviewLogCommerceInvalidArrayValues { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); [[mockBackend reject] logCommerceEvent:[OCMArg any] completionHandler:[OCMArg any]]; @@ -581,7 +580,7 @@ - (void)testWebviewLogCommerceInvalidArrayValues { } - (void)testWebviewLogCommerceNull { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); [[[mockBackend expect] ignoringNonObjectArgs] logCommerceEvent:[OCMArg checkWithBlock:^BOOL(id value) { XCTAssert([value isKindOfClass:[MPCommerceEvent class]]); @@ -620,7 +619,7 @@ - (void)testWebviewLogCommerceNull { [mockBackend verifyWithDelay:5]; } - (void)testTrackNotificationsDefault { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); MParticle *instance = [[MParticle alloc] init]; id mockInstance = OCMPartialMock(instance); @@ -633,7 +632,7 @@ - (void)testTrackNotificationsDefault { } - (void)testTrackNotificationsOff { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); MParticle *instance = [[MParticle alloc] init]; id mockInstance = OCMPartialMock(instance); @@ -647,7 +646,7 @@ - (void)testTrackNotificationsOff { } - (void)testTrackNotificationsOn { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); MParticle *instance = [[MParticle alloc] init]; id mockInstance = OCMPartialMock(instance); @@ -709,7 +708,7 @@ - (void)testLogNotificationWithUserInfo { [[[mockInstance stub] andReturnValue:OCMOCK_VALUE(NO)] trackNotifications]; [[[mockInstance stub] andReturn:mockInstance] sharedInstance]; - id mockBackendController = OCMClassMock([MPBackendController class]); + id mockBackendController = OCMClassMock([MPBackendController_PRIVATE class]); instance.backendController = mockBackendController; NSNotification *testNotification = [[NSNotification alloc] initWithName:@"tester" object:self userInfo:@{@"foo-notif-key-1":@"foo-notif-value-1"}]; @@ -727,7 +726,7 @@ - (void)testATTAuthorizationStatusNotDetermined { MParticleOptions *options = [MParticleOptions optionsWithKey:@"unit-test-key" secret:@"unit-test-secret"]; options.attStatus = @(MPATTAuthorizationStatusNotDetermined); [instance startWithOptions:options]; - MPStateMachine *stateMachine = instance.stateMachine; + MPStateMachine_PRIVATE *stateMachine = instance.stateMachine; XCTAssertEqual(stateMachine.attAuthorizationStatus.integerValue, MPATTAuthorizationStatusNotDetermined); XCTAssert(stateMachine.attAuthorizationTimestamp); } @@ -737,7 +736,7 @@ - (void)testATTAuthorizationStatusRestricted { MParticleOptions *options = [MParticleOptions optionsWithKey:@"unit-test-key" secret:@"unit-test-secret"]; options.attStatus = @(MPATTAuthorizationStatusRestricted); [instance startWithOptions:options]; - MPStateMachine *stateMachine = instance.stateMachine; + MPStateMachine_PRIVATE *stateMachine = instance.stateMachine; XCTAssertEqual(stateMachine.attAuthorizationStatus.integerValue, MPATTAuthorizationStatusRestricted); XCTAssert(stateMachine.attAuthorizationTimestamp); } @@ -747,7 +746,7 @@ - (void)testATTAuthorizationStatusDenied { MParticleOptions *options = [MParticleOptions optionsWithKey:@"unit-test-key" secret:@"unit-test-secret"]; options.attStatus = @(MPATTAuthorizationStatusDenied); [instance startWithOptions:options]; - MPStateMachine *stateMachine = instance.stateMachine; + MPStateMachine_PRIVATE *stateMachine = instance.stateMachine; XCTAssertEqual(stateMachine.attAuthorizationStatus.integerValue, MPATTAuthorizationStatusDenied); XCTAssert(stateMachine.attAuthorizationTimestamp); } @@ -757,7 +756,7 @@ - (void)testATTAuthorizationStatusAuthorized { MParticleOptions *options = [MParticleOptions optionsWithKey:@"unit-test-key" secret:@"unit-test-secret"]; options.attStatus = @(MPATTAuthorizationStatusAuthorized); [instance startWithOptions:options]; - MPStateMachine *stateMachine = instance.stateMachine; + MPStateMachine_PRIVATE *stateMachine = instance.stateMachine; XCTAssertEqual(stateMachine.attAuthorizationStatus.integerValue, MPATTAuthorizationStatusAuthorized); XCTAssert(stateMachine.attAuthorizationTimestamp); } @@ -769,7 +768,7 @@ - (void)testattAuthorizationStatusWithTimestamp { options.attStatus = @(MPATTAuthorizationStatusRestricted); options.attStatusTimestampMillis = testTimestamp; [instance startWithOptions:options]; - MPStateMachine *stateMachine = instance.stateMachine; + MPStateMachine_PRIVATE *stateMachine = instance.stateMachine; XCTAssertEqual(stateMachine.attAuthorizationStatus.integerValue, MPATTAuthorizationStatusRestricted); XCTAssertEqual(instance.stateMachine.attAuthorizationTimestamp.doubleValue, testTimestamp.doubleValue); } @@ -980,7 +979,7 @@ - (void)testSetATTStatusRemoveIDFA { } - (void)testUserAgentDefault { - id mockWebView = OCMClassMock([MParticleWebView class]); + id mockWebView = OCMClassMock([MParticleWebView_PRIVATE class]); #if TARGET_OS_IOS == 1 [[[mockWebView stub] andReturn:@"Example resolved agent"] userAgent]; #else @@ -1003,7 +1002,7 @@ - (void)testUserAgentDefault { - (void)testUserAgentCustom { NSString *customAgent = @"Foo 1.2.3 Like Bar"; - id mockWebView = OCMClassMock([MParticleWebView class]); + id mockWebView = OCMClassMock([MParticleWebView_PRIVATE class]); [[[mockWebView stub] andReturn:customAgent] userAgent]; id mockMParticle = OCMPartialMock([MParticle sharedInstance]); [[[mockMParticle stub] andReturn:mockWebView] webView]; @@ -1018,14 +1017,14 @@ - (void)testUserAgentCustom { - (void)testUploadInterval { MParticle *instance = [MParticle sharedInstance]; - instance.backendController = [[MPBackendController alloc] init]; + instance.backendController = [[MPBackendController_PRIVATE alloc] init]; XCTAssertEqual(instance.uploadInterval, DEFAULT_DEBUG_UPLOAD_INTERVAL); } - (void)testSetUploadInterval { MParticle *instance = [MParticle sharedInstance]; - instance.backendController = [[MPBackendController alloc] init]; + instance.backendController = [[MPBackendController_PRIVATE alloc] init]; NSTimeInterval testInterval = 800.0; instance.uploadInterval = testInterval; @@ -1039,7 +1038,7 @@ - (void)testSetUploadInterval { #pragma mark Error, Exception, and Crash Handling Tests - (void)testLogCrash { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); NSString *message = @"crash report"; NSString *stackTrace = @"stack track from crash report"; @@ -1057,7 +1056,7 @@ - (void)testLogCrash { } - (void)testLogCrashNilMessage { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); NSString *message = nil; NSString *stackTrace = @"stack track from crash report"; @@ -1075,7 +1074,7 @@ - (void)testLogCrashNilMessage { } - (void)testLogCrashNilStackTrace { - id mockBackend = OCMClassMock([MPBackendController class]); + id mockBackend = OCMClassMock([MPBackendController_PRIVATE class]); NSString *message = @"crash report"; NSString *stackTrace = nil; @@ -1147,8 +1146,8 @@ - (void)testSwitchWorkspaceSideloadedKits { [[MParticle sharedInstance] startWithOptions:options1]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, WORKSPACE_SWITCHING_DELAY), dispatch_get_main_queue(), ^{ - XCTAssertEqual(MPKitContainer.registeredKits.count, 1); - XCTAssertEqualObjects(MPKitContainer.registeredKits.anyObject.wrapperInstance, kitTestSideloaded1); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 1); + XCTAssertEqualObjects(MPKitContainer_PRIVATE.registeredKits.anyObject.wrapperInstance, kitTestSideloaded1); // Switch workspace with a new sideloaded kit MParticleOptions *options2 = [MParticleOptions optionsWithKey:@"unit-test-key" secret:@"unit-test-secret"]; @@ -1158,15 +1157,15 @@ - (void)testSwitchWorkspaceSideloadedKits { [[MParticle sharedInstance] switchWorkspaceWithOptions:options2]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, WORKSPACE_SWITCHING_DELAY), dispatch_get_main_queue(), ^{ - XCTAssertEqual(MPKitContainer.registeredKits.count, 1); - XCTAssertEqualObjects(MPKitContainer.registeredKits.anyObject.wrapperInstance, kitTestSideloaded2); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 1); + XCTAssertEqualObjects(MPKitContainer_PRIVATE.registeredKits.anyObject.wrapperInstance, kitTestSideloaded2); // Switch workspace with no sideloaded kits MParticleOptions *options3 = [MParticleOptions optionsWithKey:@"unit-test-key" secret:@"unit-test-secret"]; [[MParticle sharedInstance] switchWorkspaceWithOptions:options3]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, WORKSPACE_SWITCHING_DELAY), dispatch_get_main_queue(), ^{ - XCTAssertEqual(MPKitContainer.registeredKits.count, 0); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 0); [expectation fulfill]; }); @@ -1180,20 +1179,20 @@ - (void)testSwitchWorkspaceSideloadedKits { - (void)testSwitchWorkspaceKitsNoConfigurations { XCTestExpectation *expectation = [self expectationWithDescription:@"async work"]; - XCTAssertEqual(MPKitContainer.registeredKits.count, 0); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 0); [MParticle registerExtension:[[MPKitRegister alloc] initWithName:@"TestKitNoStop" className:@"MPKitTestClassNoStartImmediately"]]; [MParticle registerExtension:[[MPKitRegister alloc] initWithName:@"TestKitWithStop" className:@"MPKitTestClassNoStartImmediatelyWithStop"]]; - XCTAssertEqual(MPKitContainer.registeredKits.count, 2); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 2); MParticleOptions *options = [MParticleOptions optionsWithKey:@"unit-test-key" secret:@"unit-test-secret"]; [[MParticle sharedInstance] startWithOptions:options]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, WORKSPACE_SWITCHING_DELAY), dispatch_get_main_queue(), ^{ - XCTAssertEqual(MPKitContainer.registeredKits.count, 2); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 2); [[MParticle sharedInstance] switchWorkspaceWithOptions:options]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, WORKSPACE_SWITCHING_DELAY), dispatch_get_main_queue(), ^{ - XCTAssertEqual(MPKitContainer.registeredKits.count, 2); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 2); [expectation fulfill]; }); }); @@ -1205,7 +1204,7 @@ - (void)testSwitchWorkspaceKitsNoConfigurations { - (void)testSwitchWorkspaceKitsWithoutStop { XCTestExpectation *expectation = [self expectationWithDescription:@"async work"]; - XCTAssertEqual(MPKitContainer.registeredKits.count, 0); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 0); MPKitRegister *registerNoStop = [[MPKitRegister alloc] initWithName:@"TestKitNoStop" className:@"MPKitTestClassNoStartImmediately"]; [MParticle registerExtension:registerNoStop]; @@ -1214,14 +1213,14 @@ - (void)testSwitchWorkspaceKitsWithoutStop { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, WORKSPACE_SWITCHING_DELAY), dispatch_get_main_queue(), ^{ registerNoStop.wrapperInstance = [[MPKitTestClassNoStartImmediately alloc] init]; - [MParticle sharedInstance].kitContainer.kitConfigurations[@42] = [[MPKitConfiguration alloc] init]; + [MParticle sharedInstance].kitContainer_PRIVATE.kitConfigurations[@42] = [[MPKitConfiguration alloc] init]; - XCTAssertEqual(MPKitContainer.registeredKits.count, 1); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 1); [[MParticle sharedInstance] switchWorkspaceWithOptions:options]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, WORKSPACE_SWITCHING_DELAY), dispatch_get_main_queue(), ^{ - XCTAssertEqual(MPKitContainer.registeredKits.count, 0); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 0); [expectation fulfill]; }); }); @@ -1233,7 +1232,7 @@ - (void)testSwitchWorkspaceKitsWithoutStop { - (void)testSwitchWorkspaceKitsWithStop { XCTestExpectation *expectation = [self expectationWithDescription:@"async work"]; - XCTAssertEqual(MPKitContainer.registeredKits.count, 0); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 0); MPKitRegister *registerWithStop = [[MPKitRegister alloc] initWithName:@"TestKitWithStop" className:@"MPKitTestClassNoStartImmediatelyWithStop"]; [MParticle registerExtension:registerWithStop]; @@ -1242,14 +1241,14 @@ - (void)testSwitchWorkspaceKitsWithStop { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, WORKSPACE_SWITCHING_DELAY), dispatch_get_main_queue(), ^{ registerWithStop.wrapperInstance = [[MPKitTestClassNoStartImmediatelyWithStop alloc] init]; - [MParticle sharedInstance].kitContainer.kitConfigurations[@43] = [[MPKitConfiguration alloc] init]; + [MParticle sharedInstance].kitContainer_PRIVATE.kitConfigurations[@43] = [[MPKitConfiguration alloc] init]; - XCTAssertEqual(MPKitContainer.registeredKits.count, 1); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 1); [[MParticle sharedInstance] switchWorkspaceWithOptions:options]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, WORKSPACE_SWITCHING_DELAY), dispatch_get_main_queue(), ^{ - XCTAssertEqual(MPKitContainer.registeredKits.count, 1); + XCTAssertEqual(MPKitContainer_PRIVATE.registeredKits.count, 1); [expectation fulfill]; }); }); diff --git a/UnitTests/MParticleWebViewTests.m b/UnitTests/MParticleWebViewTests.m index 838022526..31a6a6e8b 100644 --- a/UnitTests/MParticleWebViewTests.m +++ b/UnitTests/MParticleWebViewTests.m @@ -1,41 +1,29 @@ #import #import -#import "MParticleWebView.h" #import "mParticle.h" #import "MPApplication.h" +#import "MParticleSwift.h" #import -@interface MPApplication () -+ (void)setMockApplication:(id)mockApplication; -@end - -@interface MParticleWebView () - -- (void)evaluateAgent; -- (BOOL)canAndShouldCollect; - +@interface MParticleWebView_PRIVATE () @property (nonatomic) NSDate *initializedDate; -@property (nonatomic) NSString *resolvedAgent; +@property (nonatomic) NSString *resolvedUserAgent; @property (nonatomic, assign) BOOL isCollecting; -@property (nonatomic, assign) int retryCount; - #if TARGET_OS_IOS == 1 @property (nonatomic) WKWebView *webView; #endif - @end @interface MParticleWebViewTests : XCTestCase - -@property (nonatomic, strong) MParticleWebView *webView; - +@property (nonatomic, strong) MParticleWebView_PRIVATE *webView; @end @implementation MParticleWebViewTests - (void)setUp { // Put setup code here. This method is called before the invocation of each test method in the class. - _webView = [[MParticleWebView alloc] init]; + dispatch_queue_t messageQueue = dispatch_queue_create("com.mparticle.messageQueue", DISPATCH_QUEUE_SERIAL); + _webView = [[MParticleWebView_PRIVATE alloc] initWithMessageQueue:messageQueue]; } - (void)tearDown { @@ -48,62 +36,51 @@ - (void)testInit { } - (void)testUserAgentCustom { - [_webView startWithCustomUserAgent:@"Test User Agent" shouldCollect:NO defaultAgentOverride:nil]; + [_webView startWithCustomUserAgent:@"Test User Agent" shouldCollect:NO defaultUserAgentOverride:nil]; XCTAssertEqualObjects(_webView.userAgent, @"Test User Agent"); } - (void)testUserAgentDisabled { - [_webView startWithCustomUserAgent:nil shouldCollect:NO defaultAgentOverride:nil]; + [_webView startWithCustomUserAgent:nil shouldCollect:NO defaultUserAgentOverride:nil]; NSString *defaultAgent = [NSString stringWithFormat:@"mParticle Apple SDK/%@", MParticle.sharedInstance.version]; XCTAssertEqualObjects(_webView.userAgent, defaultAgent); } - (void)testUserAgentDefaultOverride { - [_webView startWithCustomUserAgent:nil shouldCollect:NO defaultAgentOverride:@"Test User Agent"]; + [_webView startWithCustomUserAgent:nil shouldCollect:NO defaultUserAgentOverride:@"Test User Agent"]; NSString *defaultAgent = [NSString stringWithFormat:@"mParticle Apple SDK/%@", MParticle.sharedInstance.version]; XCTAssertNotEqualObjects(_webView.userAgent, defaultAgent); XCTAssertEqualObjects(_webView.userAgent, @"Test User Agent"); } -- (void)testUserAgentCapture { - MParticleWebView *mockWebView = OCMPartialMock(_webView); -#if TARGET_OS_IOS == 1 - [[(id)mockWebView expect] evaluateAgent]; -#else - [[(id)mockWebView reject] evaluateAgent]; -#endif - [mockWebView startWithCustomUserAgent:nil shouldCollect:YES defaultAgentOverride:nil]; - [(id)mockWebView verify]; -} - - (void)testShouldCollectResolved { - _webView.resolvedAgent = @"Test User Agent"; + _webView.resolvedUserAgent = @"Test User Agent"; XCTAssertFalse([_webView shouldDelayUpload:5]); } - (void)testShouldCollectPending { - _webView.resolvedAgent = nil; + _webView.resolvedUserAgent = nil; _webView.isCollecting = YES; _webView.initializedDate = [NSDate date]; XCTAssertTrue([_webView shouldDelayUpload:5]); } - (void)testShouldCollectNoDate { - _webView.resolvedAgent = nil; + _webView.resolvedUserAgent = nil; _webView.isCollecting = YES; _webView.initializedDate = nil; XCTAssertFalse([_webView shouldDelayUpload:5]); } - (void)testShouldCollectTooLong { - _webView.resolvedAgent = nil; + _webView.resolvedUserAgent = nil; _webView.isCollecting = YES; _webView.initializedDate = [NSDate dateWithTimeIntervalSinceNow:-6]; XCTAssertFalse([_webView shouldDelayUpload:5]); } - (void)testShouldCollectTimeLeft { - _webView.resolvedAgent = nil; + _webView.resolvedUserAgent = nil; _webView.isCollecting = YES; _webView.initializedDate = [NSDate dateWithTimeIntervalSinceNow:-4]; XCTAssertTrue([_webView shouldDelayUpload:5]); @@ -111,21 +88,7 @@ - (void)testShouldCollectTimeLeft { - (void)testOriginalDefaultAgent { NSString *defaultAgent = [NSString stringWithFormat:@"mParticle Apple SDK/%@", MParticle.sharedInstance.version]; - XCTAssertEqualObjects(_webView.originalDefaultAgent, defaultAgent); -} - -- (void)testBackgroundCollection { - id mockApplication = OCMClassMock([UIApplication class]); - OCMStub([mockApplication applicationState]).andReturn(UIApplicationStateBackground); - [MPApplication setMockApplication:mockApplication]; - MParticleWebView *mockWebView = OCMPartialMock(_webView); -#if TARGET_OS_IOS == 1 - [[(id)mockWebView expect] evaluateAgent]; -#else - [[(id)mockWebView reject] evaluateAgent]; -#endif - [mockWebView startWithCustomUserAgent:nil shouldCollect:YES defaultAgentOverride:nil]; - [(id)mockWebView verify]; + XCTAssertEqualObjects(_webView.originalDefaultUserAgent, defaultAgent); } @end diff --git a/mParticle-Apple-SDK.xcodeproj/project.pbxproj b/mParticle-Apple-SDK.xcodeproj/project.pbxproj index 36aa424f5..75043e4ec 100644 --- a/mParticle-Apple-SDK.xcodeproj/project.pbxproj +++ b/mParticle-Apple-SDK.xcodeproj/project.pbxproj @@ -7,12 +7,22 @@ objects = { /* Begin PBXBuildFile section */ + 530D247F2CFF70B0000FE7E3 /* MPUserIdentityInstance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530D247E2CFF70A5000FE7E3 /* MPUserIdentityInstance.swift */; }; + 530D24802CFF70B0000FE7E3 /* MPUserIdentityInstance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530D247E2CFF70A5000FE7E3 /* MPUserIdentityInstance.swift */; }; + 530D24822CFF72D9000FE7E3 /* MPConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530D24812CFF72D4000FE7E3 /* MPConstants.swift */; }; + 530D24832CFF72D9000FE7E3 /* MPConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530D24812CFF72D4000FE7E3 /* MPConstants.swift */; }; + 530D24852CFF78EB000FE7E3 /* MPUserIdentityChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530D24842CFF78E7000FE7E3 /* MPUserIdentityChange.swift */; }; + 530D24862CFF78EB000FE7E3 /* MPUserIdentityChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530D24842CFF78E7000FE7E3 /* MPUserIdentityChange.swift */; }; 531BCF342B28A23400F5C573 /* MPIdentityCaching.h in Headers */ = {isa = PBXBuildFile; fileRef = 531BCF322B28A23400F5C573 /* MPIdentityCaching.h */; }; 531BCF352B28A23400F5C573 /* MPIdentityCaching.h in Headers */ = {isa = PBXBuildFile; fileRef = 531BCF322B28A23400F5C573 /* MPIdentityCaching.h */; }; 531BCF362B28A23400F5C573 /* MPIdentityCaching.m in Sources */ = {isa = PBXBuildFile; fileRef = 531BCF332B28A23400F5C573 /* MPIdentityCaching.m */; }; 531BCF372B28A23400F5C573 /* MPIdentityCaching.m in Sources */ = {isa = PBXBuildFile; fileRef = 531BCF332B28A23400F5C573 /* MPIdentityCaching.m */; }; 531BCF3A2B28A83E00F5C573 /* MPIdentityCachingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 531BCF392B28A83E00F5C573 /* MPIdentityCachingTests.m */; }; 531BCF3B2B28A83E00F5C573 /* MPIdentityCachingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 531BCF392B28A83E00F5C573 /* MPIdentityCachingTests.m */; }; + 534C11B32D08A73700466F71 /* MParticleWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534C11B22D08A73100466F71 /* MParticleWebView.swift */; }; + 534C11B42D08A73700466F71 /* MParticleWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534C11B22D08A73100466F71 /* MParticleWebView.swift */; }; + 534C11B62D08F53D00466F71 /* MPUserAttributeChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534C11B52D08F53D00466F71 /* MPUserAttributeChange.swift */; }; + 534C11B72D08F53D00466F71 /* MPUserAttributeChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 534C11B52D08F53D00466F71 /* MPUserAttributeChange.swift */; }; 534CD25C29CE2877008452B3 /* NSNumber+MPFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2629CDFB1F00E7489F /* NSNumber+MPFormatter.swift */; }; 534CD25E29CE2BF1008452B3 /* MParticleSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = 534CD25D29CE2BF1008452B3 /* MParticleSwift.h */; }; 534CD25F29CE2BF1008452B3 /* MParticleSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = 534CD25D29CE2BF1008452B3 /* MParticleSwift.h */; }; @@ -97,7 +107,7 @@ 53A79B6E29CDFB2000E7489F /* MPIdentityDTO.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AA029CDFB1E00E7489F /* MPIdentityDTO.h */; }; 53A79B6F29CDFB2000E7489F /* MPIdentityApi.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AA129CDFB1E00E7489F /* MPIdentityApi.m */; }; 53A79B7029CDFB2000E7489F /* MPIdentityApiManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AA229CDFB1E00E7489F /* MPIdentityApiManager.m */; }; - 53A79B7129CDFB2000E7489F /* MPBackendController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AA329CDFB1E00E7489F /* MPBackendController.h */; }; + 53A79B7129CDFB2000E7489F /* MPBackendController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AA329CDFB1E00E7489F /* MPBackendController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79B7429CDFB2000E7489F /* MPURLRequestBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AA829CDFB1E00E7489F /* MPURLRequestBuilder.h */; }; 53A79B7529CDFB2000E7489F /* MPNetworkCommunication.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AA929CDFB1E00E7489F /* MPNetworkCommunication.m */; }; 53A79B7629CDFB2000E7489F /* MPURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AAA29CDFB1E00E7489F /* MPURL.m */; }; @@ -107,7 +117,7 @@ 53A79B7A29CDFB2000E7489F /* MPConnector.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AAE29CDFB1E00E7489F /* MPConnector.m */; }; 53A79B7B29CDFB2000E7489F /* MPConnectorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AAF29CDFB1E00E7489F /* MPConnectorProtocol.h */; }; 53A79B7C29CDFB2000E7489F /* MPConnectorFactoryProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB029CDFB1E00E7489F /* MPConnectorFactoryProtocol.h */; }; - 53A79B7D29CDFB2000E7489F /* MPNetworkCommunication.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB129CDFB1E00E7489F /* MPNetworkCommunication.h */; }; + 53A79B7D29CDFB2000E7489F /* MPNetworkCommunication.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB129CDFB1E00E7489F /* MPNetworkCommunication.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79B7E29CDFB2000E7489F /* MPURLRequestBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AB229CDFB1E00E7489F /* MPURLRequestBuilder.m */; }; 53A79B7F29CDFB2000E7489F /* MPURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB329CDFB1E00E7489F /* MPURL.h */; }; 53A79B8029CDFB2000E7489F /* MPNetworkPerformance.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AB429CDFB1E00E7489F /* MPNetworkPerformance.m */; }; @@ -148,36 +158,25 @@ 53A79BC729CDFB2000E7489F /* MPMessageBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B0229CDFB1F00E7489F /* MPMessageBuilder.m */; }; 53A79BC829CDFB2000E7489F /* MPStateMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B0329CDFB1F00E7489F /* MPStateMachine.m */; }; 53A79BC929CDFB2000E7489F /* MPIUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0429CDFB1F00E7489F /* MPIUserDefaults.h */; }; - 53A79BCB29CDFB2000E7489F /* MPStateMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0629CDFB1F00E7489F /* MPStateMachine.h */; }; 53A79BCE29CDFB2000E7489F /* NSDictionary+MPCaseInsensitive.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B0929CDFB1F00E7489F /* NSDictionary+MPCaseInsensitive.m */; }; - 53A79BD129CDFB2000E7489F /* MPResponseConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0C29CDFB1F00E7489F /* MPResponseConfig.h */; }; 53A79BD229CDFB2000E7489F /* MPApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B0D29CDFB1F00E7489F /* MPApplication.m */; }; - 53A79BD629CDFB2000E7489F /* MPSearchAdsAttribution.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1129CDFB1F00E7489F /* MPSearchAdsAttribution.h */; }; 53A79BD729CDFB2000E7489F /* MPUploadBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B1229CDFB1F00E7489F /* MPUploadBuilder.m */; }; - 53A79BD929CDFB2000E7489F /* MPUserIdentityChange.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B1429CDFB1F00E7489F /* MPUserIdentityChange.m */; }; 53A79BDA29CDFB2000E7489F /* MPDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B1529CDFB1F00E7489F /* MPDevice.m */; }; - 53A79BDB29CDFB2000E7489F /* MParticleWebView.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1629CDFB1F00E7489F /* MParticleWebView.h */; }; 53A79BDC29CDFB2000E7489F /* MPLaunchInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1729CDFB1F00E7489F /* MPLaunchInfo.h */; }; - 53A79BDE29CDFB2000E7489F /* MPUserAttributeChange.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1929CDFB1F00E7489F /* MPUserAttributeChange.h */; }; 53A79BDF29CDFB2000E7489F /* MPMessageBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1A29CDFB1F00E7489F /* MPMessageBuilder.h */; }; 53A79BE229CDFB2000E7489F /* MPIUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B1D29CDFB1F00E7489F /* MPIUserDefaults.m */; }; 53A79BE329CDFB2000E7489F /* MPBracket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B1E29CDFB1F00E7489F /* MPBracket.cpp */; }; - 53A79BE529CDFB2000E7489F /* MPResponseConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2029CDFB1F00E7489F /* MPResponseConfig.m */; }; - 53A79BE729CDFB2000E7489F /* MPSearchAdsAttribution.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2229CDFB1F00E7489F /* MPSearchAdsAttribution.m */; }; 53A79BE829CDFB2000E7489F /* MPUploadBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2329CDFB1F00E7489F /* MPUploadBuilder.h */; }; - 53A79BE929CDFB2000E7489F /* MPApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2429CDFB1F00E7489F /* MPApplication.h */; }; + 53A79BE929CDFB2000E7489F /* MPApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2429CDFB1F00E7489F /* MPApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79BEB29CDFB2000E7489F /* NSNumber+MPFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2629CDFB1F00E7489F /* NSNumber+MPFormatter.swift */; }; - 53A79BEC29CDFB2000E7489F /* MPUserAttributeChange.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2729CDFB1F00E7489F /* MPUserAttributeChange.m */; }; 53A79BEE29CDFB2000E7489F /* MPLaunchInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2929CDFB1F00E7489F /* MPLaunchInfo.m */; }; - 53A79BEF29CDFB2000E7489F /* MParticleWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2A29CDFB1F00E7489F /* MParticleWebView.m */; }; 53A79BF029CDFB2000E7489F /* MPDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2B29CDFB1F00E7489F /* MPDevice.h */; }; 53A79BF129CDFB2000E7489F /* MPBracket.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2C29CDFB1F00E7489F /* MPBracket.h */; }; - 53A79BF229CDFB2000E7489F /* MPUserIdentityChange.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2D29CDFB1F00E7489F /* MPUserIdentityChange.h */; }; 53A79BF329CDFB2000E7489F /* MPCustomModulePreference.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2F29CDFB1F00E7489F /* MPCustomModulePreference.h */; }; 53A79BF429CDFB2000E7489F /* MPCustomModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B3029CDFB1F00E7489F /* MPCustomModule.h */; }; 53A79BF529CDFB2000E7489F /* MPCustomModulePreference.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B3129CDFB1F00E7489F /* MPCustomModulePreference.m */; }; 53A79BF629CDFB2000E7489F /* MPCustomModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B3229CDFB1F00E7489F /* MPCustomModule.m */; }; - 53A79BF729CDFB2000E7489F /* MPNotificationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B3429CDFB1F00E7489F /* MPNotificationController.h */; }; + 53A79BF729CDFB2000E7489F /* MPNotificationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B3429CDFB1F00E7489F /* MPNotificationController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79BF829CDFB2000E7489F /* MPNotificationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B3529CDFB1F00E7489F /* MPNotificationController.m */; }; 53A79BF929CDFB2100E7489F /* mParticle.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B3629CDFB1F00E7489F /* mParticle.m */; }; 53A79BFA29CDFB2100E7489F /* MPSurrogateAppDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B3829CDFB1F00E7489F /* MPSurrogateAppDelegate.h */; }; @@ -211,7 +210,7 @@ 53A79C1629CDFB2100E7489F /* MPEventProjection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B5829CDFB1F00E7489F /* MPEventProjection.mm */; }; 53A79C1729CDFB2100E7489F /* MPForwardQueueParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B5929CDFB1F00E7489F /* MPForwardQueueParameters.h */; }; 53A79C1829CDFB2100E7489F /* MPAttributeProjection.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B5A29CDFB1F00E7489F /* MPAttributeProjection.m */; }; - 53A79C1929CDFB2100E7489F /* MPKitContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B5B29CDFB1F00E7489F /* MPKitContainer.h */; }; + 53A79C1929CDFB2100E7489F /* MPKitContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B5B29CDFB1F00E7489F /* MPKitContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79C1A29CDFB2100E7489F /* MPKitAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B5C29CDFB1F00E7489F /* MPKitAPI.m */; }; 53A79C1B29CDFB2100E7489F /* MPForwardQueueItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B5D29CDFB1F00E7489F /* MPForwardQueueItem.m */; }; 53A79C1C29CDFB2100E7489F /* MPKitActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B5E29CDFB1F00E7489F /* MPKitActivity.h */; }; @@ -343,18 +342,16 @@ 53A79D2229CE23F700E7489F /* MPCommerceEventInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79C2F29CDFB4800E7489F /* MPCommerceEventInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D2329CE23F700E7489F /* MPTransactionAttributes+Dictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79C4429CDFB4800E7489F /* MPTransactionAttributes+Dictionary.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D2529CE23F700E7489F /* MPLaunchInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1729CDFB1F00E7489F /* MPLaunchInfo.h */; }; - 53A79D2729CE23F700E7489F /* MPApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2429CDFB1F00E7489F /* MPApplication.h */; }; + 53A79D2729CE23F700E7489F /* MPApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2429CDFB1F00E7489F /* MPApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D2829CE23F700E7489F /* MPCustomModulePreference.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2F29CDFB1F00E7489F /* MPCustomModulePreference.h */; }; 53A79D2929CE23F700E7489F /* MPDataModelProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AC229CDFB1E00E7489F /* MPDataModelProtocol.h */; }; 53A79D2A29CE23F700E7489F /* MPAppDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B3929CDFB1F00E7489F /* MPAppDelegateProxy.h */; }; - 53A79D2B29CE23F700E7489F /* MParticleWebView.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1629CDFB1F00E7489F /* MParticleWebView.h */; }; 53A79D2C29CE23F700E7489F /* MPIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79ACF29CDFB1F00E7489F /* MPIConstants.h */; }; - 53A79D2E29CE23F700E7489F /* MPBackendController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AA329CDFB1E00E7489F /* MPBackendController.h */; }; + 53A79D2E29CE23F700E7489F /* MPBackendController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AA329CDFB1E00E7489F /* MPBackendController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D2F29CE23F700E7489F /* MPKitConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B5F29CDFB1F00E7489F /* MPKitConfiguration.h */; }; 53A79D3029CE23F700E7489F /* MPConnectorResponseProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AAD29CDFB1E00E7489F /* MPConnectorResponseProtocol.h */; }; - 53A79D3129CE23F700E7489F /* MPSearchAdsAttribution.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1129CDFB1F00E7489F /* MPSearchAdsAttribution.h */; }; 53A79D3229CE23F700E7489F /* MPConnectorFactoryProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB029CDFB1E00E7489F /* MPConnectorFactoryProtocol.h */; }; - 53A79D3329CE23F700E7489F /* MPNetworkCommunication.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB129CDFB1E00E7489F /* MPNetworkCommunication.h */; }; + 53A79D3329CE23F700E7489F /* MPNetworkCommunication.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB129CDFB1E00E7489F /* MPNetworkCommunication.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D3429CE23F700E7489F /* MPURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB329CDFB1E00E7489F /* MPURL.h */; }; 53A79D3529CE23F700E7489F /* MPDataModelAbstract.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79ABE29CDFB1E00E7489F /* MPDataModelAbstract.h */; }; 53A79D3629CE23F700E7489F /* MPNetworkPerformance.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AAB29CDFB1E00E7489F /* MPNetworkPerformance.h */; }; @@ -365,7 +362,6 @@ 53A79D3B29CE23F700E7489F /* MPIUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0429CDFB1F00E7489F /* MPIUserDefaults.h */; }; 53A79D3C29CE23F700E7489F /* MPEventProjection.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B5629CDFB1F00E7489F /* MPEventProjection.h */; }; 53A79D3D29CE23F700E7489F /* MPUpload.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AC029CDFB1E00E7489F /* MPUpload.h */; }; - 53A79D3E29CE23F700E7489F /* MPResponseConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0C29CDFB1F00E7489F /* MPResponseConfig.h */; }; 53A79D3F29CE23F700E7489F /* MPConsumerInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79ACE29CDFB1F00E7489F /* MPConsumerInfo.h */; }; 53A79D4029CE23F700E7489F /* MPILogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B4629CDFB1F00E7489F /* MPILogger.h */; }; 53A79D4129CE23F700E7489F /* MPDatabaseMigrationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79ABA29CDFB1E00E7489F /* MPDatabaseMigrationController.h */; }; @@ -385,26 +381,22 @@ 53A79D5129CE23F700E7489F /* MParticleReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0029CDFB1F00E7489F /* MParticleReachability.h */; }; 53A79D5329CE23F700E7489F /* MPCustomModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B3029CDFB1F00E7489F /* MPCustomModule.h */; }; 53A79D5529CE23F700E7489F /* MPPersistenceController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79ABB29CDFB1E00E7489F /* MPPersistenceController.h */; }; - 53A79D5629CE23F700E7489F /* MPUserIdentityChange.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2D29CDFB1F00E7489F /* MPUserIdentityChange.h */; }; - 53A79D5729CE23F700E7489F /* MPUserAttributeChange.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1929CDFB1F00E7489F /* MPUserAttributeChange.h */; }; 53A79D5829CE23F700E7489F /* MPIdentityDTO.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AA029CDFB1E00E7489F /* MPIdentityDTO.h */; }; 53A79D5929CE23F700E7489F /* MPMessageBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B1A29CDFB1F00E7489F /* MPMessageBuilder.h */; }; 53A79D5A29CE23F700E7489F /* MPURLRequestBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AA829CDFB1E00E7489F /* MPURLRequestBuilder.h */; }; - 53A79D5B29CE23F700E7489F /* MPKitContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B5B29CDFB1F00E7489F /* MPKitContainer.h */; }; + 53A79D5B29CE23F700E7489F /* MPKitContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B5B29CDFB1F00E7489F /* MPKitContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D5C29CE23F700E7489F /* MPSurrogateAppDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B3829CDFB1F00E7489F /* MPSurrogateAppDelegate.h */; }; - 53A79D5D29CE23F700E7489F /* MPNotificationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B3429CDFB1F00E7489F /* MPNotificationController.h */; }; + 53A79D5D29CE23F700E7489F /* MPNotificationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B3429CDFB1F00E7489F /* MPNotificationController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D5E29CE23F700E7489F /* MPURLConnectionAssociate.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB629CDFB1E00E7489F /* MPURLConnectionAssociate.h */; }; 53A79D5F29CE23F700E7489F /* MPSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AC329CDFB1E00E7489F /* MPSession.h */; }; 53A79D6029CE23F700E7489F /* MPUploadBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B2329CDFB1F00E7489F /* MPUploadBuilder.h */; }; 53A79D6129CE23F700E7489F /* MPKitActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B5E29CDFB1F00E7489F /* MPKitActivity.h */; }; - 53A79D6229CE23F700E7489F /* MPStateMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0629CDFB1F00E7489F /* MPStateMachine.h */; }; + 53A79D6229CE23F700E7489F /* MPStateMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0629CDFB1F00E7489F /* MPStateMachine.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53A79D6329CE23F700E7489F /* MPMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79ACB29CDFB1E00E7489F /* MPMessage.h */; }; 53A79D6529CE23F700E7489F /* MPConnector.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79AB529CDFB1E00E7489F /* MPConnector.h */; }; 53A79D6729CE23F700E7489F /* MPForwardQueueParameters.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B5129CDFB1F00E7489F /* MPForwardQueueParameters.m */; }; 53A79D6829CE23F700E7489F /* MPDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B1529CDFB1F00E7489F /* MPDevice.m */; }; 53A79D6929CE23F700E7489F /* NSDictionary+MPCaseInsensitive.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B0929CDFB1F00E7489F /* NSDictionary+MPCaseInsensitive.m */; }; - 53A79D6A29CE23F700E7489F /* MPUserIdentityChange.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B1429CDFB1F00E7489F /* MPUserIdentityChange.m */; }; - 53A79D6B29CE23F700E7489F /* MParticleWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2A29CDFB1F00E7489F /* MParticleWebView.m */; }; 53A79D6C29CE23F700E7489F /* MPURLRequestBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AB229CDFB1E00E7489F /* MPURLRequestBuilder.m */; }; 53A79D6D29CE23F700E7489F /* MPCustomModulePreference.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B3129CDFB1F00E7489F /* MPCustomModulePreference.m */; }; 53A79D6E29CE23F700E7489F /* FilteredMPIdentityApiRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79A9B29CDFB1E00E7489F /* FilteredMPIdentityApiRequest.m */; }; @@ -422,7 +414,6 @@ 53A79D7B29CE23F700E7489F /* MPIConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B6429CDFB1F00E7489F /* MPIConstants.m */; }; 53A79D7C29CE23F700E7489F /* MPLaunchInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2929CDFB1F00E7489F /* MPLaunchInfo.m */; }; 53A79D7D29CE23F700E7489F /* MPPromotion.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B4129CDFB1F00E7489F /* MPPromotion.m */; }; - 53A79D7E29CE23F700E7489F /* MPSearchAdsAttribution.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2229CDFB1F00E7489F /* MPSearchAdsAttribution.m */; }; 53A79D8129CE23F700E7489F /* MPIdentityApiRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79A9829CDFB1E00E7489F /* MPIdentityApiRequest.m */; }; 53A79D8229CE23F700E7489F /* MPCommerceEvent.mm in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B4029CDFB1F00E7489F /* MPCommerceEvent.mm */; }; 53A79D8329CE23F700E7489F /* MPConsentSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AF729CDFB1F00E7489F /* MPConsentSerialization.m */; }; @@ -446,7 +437,6 @@ 53A79D9B29CE23F700E7489F /* MPIntegrationAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79ACD29CDFB1E00E7489F /* MPIntegrationAttributes.m */; }; 53A79D9C29CE23F700E7489F /* MPAliasRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79A9C29CDFB1E00E7489F /* MPAliasRequest.m */; }; 53A79D9D29CE23F700E7489F /* MParticleUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79A9A29CDFB1E00E7489F /* MParticleUser.m */; }; - 53A79D9E29CE23F700E7489F /* MPResponseConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2029CDFB1F00E7489F /* MPResponseConfig.m */; }; 53A79D9F29CE23F700E7489F /* MParticleReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AFF29CDFB1F00E7489F /* MParticleReachability.m */; }; 53A79DA029CE23F700E7489F /* MPKitExecStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B4D29CDFB1F00E7489F /* MPKitExecStatus.m */; }; 53A79DA129CE23F700E7489F /* MPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79ABF29CDFB1E00E7489F /* MPMessage.m */; }; @@ -473,7 +463,6 @@ 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 */; }; - 53A79DBE29CE23F700E7489F /* MPUserAttributeChange.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79B2729CDFB1F00E7489F /* MPUserAttributeChange.m */; }; 53A79DBF29CE23F700E7489F /* MPIdentityApiManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A79AA229CDFB1E00E7489F /* MPIdentityApiManager.m */; }; 53B28FB22C938C26009072FC /* MPLocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53B28FB12C938C26009072FC /* MPLocationManager.swift */; }; 53B28FB32C938C26009072FC /* MPLocationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53B28FB12C938C26009072FC /* MPLocationManager.swift */; }; @@ -483,6 +472,9 @@ 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 */; }; + D30CD0CB2CFF5FB100F5148A /* MPStateMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A79B0629CDFB1F00E7489F /* MPStateMachine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D356E0242CFE08ED0020898D /* MPResponseConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D356E0232CFE08ED0020898D /* MPResponseConfig.swift */; }; + D356E0252CFE08ED0020898D /* MPResponseConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D356E0232CFE08ED0020898D /* MPResponseConfig.swift */; }; 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 */; }; @@ -527,9 +519,14 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 530D247E2CFF70A5000FE7E3 /* MPUserIdentityInstance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPUserIdentityInstance.swift; sourceTree = ""; }; + 530D24812CFF72D4000FE7E3 /* MPConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPConstants.swift; sourceTree = ""; }; + 530D24842CFF78E7000FE7E3 /* MPUserIdentityChange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPUserIdentityChange.swift; sourceTree = ""; }; 531BCF322B28A23400F5C573 /* MPIdentityCaching.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPIdentityCaching.h; sourceTree = ""; }; 531BCF332B28A23400F5C573 /* MPIdentityCaching.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPIdentityCaching.m; sourceTree = ""; }; 531BCF392B28A83E00F5C573 /* MPIdentityCachingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPIdentityCachingTests.m; sourceTree = ""; }; + 534C11B22D08A73100466F71 /* MParticleWebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MParticleWebView.swift; sourceTree = ""; }; + 534C11B52D08F53D00466F71 /* MPUserAttributeChange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPUserAttributeChange.swift; sourceTree = ""; }; 534CD25D29CE2BF1008452B3 /* MParticleSwift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MParticleSwift.h; sourceTree = ""; }; 534CD2AA29CE2CE1008452B3 /* mParticle-Apple-SDK-NoLocationTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "mParticle-Apple-SDK-NoLocationTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 5399DDB72CA727E1006526E1 /* MPZip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPZip.swift; sourceTree = ""; }; @@ -599,29 +596,19 @@ 53A79B0429CDFB1F00E7489F /* MPIUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIUserDefaults.h; sourceTree = ""; }; 53A79B0629CDFB1F00E7489F /* MPStateMachine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPStateMachine.h; sourceTree = ""; }; 53A79B0929CDFB1F00E7489F /* NSDictionary+MPCaseInsensitive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+MPCaseInsensitive.m"; sourceTree = ""; }; - 53A79B0C29CDFB1F00E7489F /* MPResponseConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPResponseConfig.h; sourceTree = ""; }; 53A79B0D29CDFB1F00E7489F /* MPApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPApplication.m; sourceTree = ""; }; - 53A79B1129CDFB1F00E7489F /* MPSearchAdsAttribution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSearchAdsAttribution.h; sourceTree = ""; }; 53A79B1229CDFB1F00E7489F /* MPUploadBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPUploadBuilder.m; sourceTree = ""; }; - 53A79B1429CDFB1F00E7489F /* MPUserIdentityChange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPUserIdentityChange.m; sourceTree = ""; }; 53A79B1529CDFB1F00E7489F /* MPDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDevice.m; sourceTree = ""; }; - 53A79B1629CDFB1F00E7489F /* MParticleWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MParticleWebView.h; sourceTree = ""; }; 53A79B1729CDFB1F00E7489F /* MPLaunchInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPLaunchInfo.h; sourceTree = ""; }; - 53A79B1929CDFB1F00E7489F /* MPUserAttributeChange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPUserAttributeChange.h; sourceTree = ""; }; 53A79B1A29CDFB1F00E7489F /* MPMessageBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPMessageBuilder.h; sourceTree = ""; }; 53A79B1D29CDFB1F00E7489F /* MPIUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPIUserDefaults.m; sourceTree = ""; }; 53A79B1E29CDFB1F00E7489F /* MPBracket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MPBracket.cpp; sourceTree = ""; }; - 53A79B2029CDFB1F00E7489F /* MPResponseConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPResponseConfig.m; sourceTree = ""; }; - 53A79B2229CDFB1F00E7489F /* MPSearchAdsAttribution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSearchAdsAttribution.m; sourceTree = ""; }; 53A79B2329CDFB1F00E7489F /* MPUploadBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPUploadBuilder.h; sourceTree = ""; }; 53A79B2429CDFB1F00E7489F /* MPApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPApplication.h; sourceTree = ""; }; 53A79B2629CDFB1F00E7489F /* NSNumber+MPFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSNumber+MPFormatter.swift"; sourceTree = ""; }; - 53A79B2729CDFB1F00E7489F /* MPUserAttributeChange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPUserAttributeChange.m; sourceTree = ""; }; 53A79B2929CDFB1F00E7489F /* MPLaunchInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPLaunchInfo.m; sourceTree = ""; }; - 53A79B2A29CDFB1F00E7489F /* MParticleWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MParticleWebView.m; sourceTree = ""; }; 53A79B2B29CDFB1F00E7489F /* MPDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDevice.h; sourceTree = ""; }; 53A79B2C29CDFB1F00E7489F /* MPBracket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPBracket.h; sourceTree = ""; }; - 53A79B2D29CDFB1F00E7489F /* MPUserIdentityChange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPUserIdentityChange.h; sourceTree = ""; }; 53A79B2F29CDFB1F00E7489F /* MPCustomModulePreference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomModulePreference.h; sourceTree = ""; }; 53A79B3029CDFB1F00E7489F /* MPCustomModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomModule.h; sourceTree = ""; }; 53A79B3129CDFB1F00E7489F /* MPCustomModulePreference.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCustomModulePreference.m; sourceTree = ""; }; @@ -780,6 +767,7 @@ 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 = ""; }; + D356E0232CFE08ED0020898D /* MPResponseConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPResponseConfig.swift; 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 = ""; }; @@ -860,11 +848,12 @@ children = ( 53A79C2229CDFB4800E7489F /* Include */, 53A79B3629CDFB1F00E7489F /* mParticle.m */, - 53A79AA329CDFB1E00E7489F /* MPBackendController.h */, 53A79AF429CDFB1F00E7489F /* MPBackendController.m */, 53A79AD029CDFB1F00E7489F /* MPEnums.m */, 53A79ACF29CDFB1F00E7489F /* MPIConstants.h */, 53A79B6429CDFB1F00E7489F /* MPIConstants.m */, + 53A79B0329CDFB1F00E7489F /* MPStateMachine.m */, + 530D24812CFF72D4000FE7E3 /* MPConstants.swift */, 534CD25D29CE2BF1008452B3 /* MParticleSwift.h */, 53A79B3729CDFB1F00E7489F /* AppNotifications */, 53A79AF529CDFB1F00E7489F /* Consent */, @@ -889,6 +878,8 @@ 53A79A9729CDFB1E00E7489F /* Identity */ = { isa = PBXGroup; children = ( + 530D24842CFF78E7000FE7E3 /* MPUserIdentityChange.swift */, + 530D247E2CFF70A5000FE7E3 /* MPUserIdentityInstance.swift */, 53A79A9829CDFB1E00E7489F /* MPIdentityApiRequest.m */, 53A79A9929CDFB1E00E7489F /* MPAliasResponse.m */, 53A79A9A29CDFB1E00E7489F /* MParticleUser.m */, @@ -924,7 +915,6 @@ 53A79AAE29CDFB1E00E7489F /* MPConnector.m */, 53A79AAF29CDFB1E00E7489F /* MPConnectorProtocol.h */, 53A79AB029CDFB1E00E7489F /* MPConnectorFactoryProtocol.h */, - 53A79AB129CDFB1E00E7489F /* MPNetworkCommunication.h */, 53A79AB229CDFB1E00E7489F /* MPURLRequestBuilder.m */, 53A79AB329CDFB1E00E7489F /* MPURL.h */, 53A79AB429CDFB1E00E7489F /* MPNetworkPerformance.m */, @@ -1006,40 +996,30 @@ 53A79B0129CDFB1F00E7489F /* Utils */ = { isa = PBXGroup; children = ( + 534C11B22D08A73100466F71 /* MParticleWebView.swift */, 5399DDB72CA727E1006526E1 /* MPZip.swift */, 53A79B0229CDFB1F00E7489F /* MPMessageBuilder.m */, D3961CD52CB468DC003B3194 /* NSArray+MPCaseInsensitive.swift */, - 53A79B0329CDFB1F00E7489F /* MPStateMachine.m */, 53A79B0429CDFB1F00E7489F /* MPIUserDefaults.h */, D3CEDACA2CB027E1001B32DF /* MPConvertJS.swift */, - 53A79B0629CDFB1F00E7489F /* MPStateMachine.h */, 53A79B0929CDFB1F00E7489F /* NSDictionary+MPCaseInsensitive.m */, - 53A79B0C29CDFB1F00E7489F /* MPResponseConfig.h */, + D356E0232CFE08ED0020898D /* MPResponseConfig.swift */, D3CEDAC22C9DAC25001B32DF /* MPDateFormatter.swift */, 53A79B0D29CDFB1F00E7489F /* MPApplication.m */, D3961CDD2CC0B7E4003B3194 /* NSString+MPPercentEscape.swift */, - 53A79B1129CDFB1F00E7489F /* MPSearchAdsAttribution.h */, 53A79B1229CDFB1F00E7489F /* MPUploadBuilder.m */, - 53A79B1429CDFB1F00E7489F /* MPUserIdentityChange.m */, 53A79B1529CDFB1F00E7489F /* MPDevice.m */, - 53A79B1629CDFB1F00E7489F /* MParticleWebView.h */, 53A79B1729CDFB1F00E7489F /* MPLaunchInfo.h */, - 53A79B1929CDFB1F00E7489F /* MPUserAttributeChange.h */, 53A79B1A29CDFB1F00E7489F /* MPMessageBuilder.h */, 53A79B1D29CDFB1F00E7489F /* MPIUserDefaults.m */, 53A79B1E29CDFB1F00E7489F /* MPBracket.cpp */, - 53A79B2029CDFB1F00E7489F /* MPResponseConfig.m */, - 53A79B2229CDFB1F00E7489F /* MPSearchAdsAttribution.m */, 53A79B2329CDFB1F00E7489F /* MPUploadBuilder.h */, - 53A79B2429CDFB1F00E7489F /* MPApplication.h */, 53A79B2629CDFB1F00E7489F /* NSNumber+MPFormatter.swift */, - 53A79B2729CDFB1F00E7489F /* MPUserAttributeChange.m */, 53A79B2929CDFB1F00E7489F /* MPLaunchInfo.m */, - 53A79B2A29CDFB1F00E7489F /* MParticleWebView.m */, 53A79B2B29CDFB1F00E7489F /* MPDevice.h */, 53A79B2C29CDFB1F00E7489F /* MPBracket.h */, - 53A79B2D29CDFB1F00E7489F /* MPUserIdentityChange.h */, 53FDD1BC2AE871AF003D5FA1 /* MPIHasher.swift */, + 534C11B52D08F53D00466F71 /* MPUserAttributeChange.swift */, ); path = Utils; sourceTree = ""; @@ -1058,7 +1038,6 @@ 53A79B3329CDFB1F00E7489F /* Notifications */ = { isa = PBXGroup; children = ( - 53A79B3429CDFB1F00E7489F /* MPNotificationController.h */, 53A79B3529CDFB1F00E7489F /* MPNotificationController.m */, ); path = Notifications; @@ -1127,7 +1106,6 @@ 53A79B5829CDFB1F00E7489F /* MPEventProjection.mm */, 53A79B5929CDFB1F00E7489F /* MPForwardQueueParameters.h */, 53A79B5A29CDFB1F00E7489F /* MPAttributeProjection.m */, - 53A79B5B29CDFB1F00E7489F /* MPKitContainer.h */, 53A79B5C29CDFB1F00E7489F /* MPKitAPI.m */, 53A79B5D29CDFB1F00E7489F /* MPForwardQueueItem.m */, 53A79B5E29CDFB1F00E7489F /* MPKitActivity.h */, @@ -1180,7 +1158,13 @@ 53A79C4129CDFB4800E7489F /* MPKitRegister.h */, 53A79C4229CDFB4800E7489F /* MPProduct+Dictionary.h */, 53A79C4329CDFB4800E7489F /* MPProduct.h */, + 53A79B0629CDFB1F00E7489F /* MPStateMachine.h */, 53A79C4429CDFB4800E7489F /* MPTransactionAttributes+Dictionary.h */, + 53A79B5B29CDFB1F00E7489F /* MPKitContainer.h */, + 53A79AB129CDFB1E00E7489F /* MPNetworkCommunication.h */, + 53A79B2429CDFB1F00E7489F /* MPApplication.h */, + 53A79B3429CDFB1F00E7489F /* MPNotificationController.h */, + 53A79AA329CDFB1E00E7489F /* MPBackendController.h */, ); path = Include; sourceTree = ""; @@ -1331,15 +1315,14 @@ 53A79C6629CDFB4800E7489F /* MPTransactionAttributes+Dictionary.h in Headers */, 53A79BDC29CDFB2000E7489F /* MPLaunchInfo.h in Headers */, 53A79BE929CDFB2000E7489F /* MPApplication.h in Headers */, + D30CD0CB2CFF5FB100F5148A /* MPStateMachine.h in Headers */, 53A79BF329CDFB2000E7489F /* MPCustomModulePreference.h in Headers */, 53A79B8C29CDFB2000E7489F /* MPDataModelProtocol.h in Headers */, 53A79BFB29CDFB2100E7489F /* MPAppDelegateProxy.h in Headers */, - 53A79BDB29CDFB2000E7489F /* MParticleWebView.h in Headers */, 53A79B9929CDFB2000E7489F /* MPIConstants.h in Headers */, 53A79B7129CDFB2000E7489F /* MPBackendController.h in Headers */, 53A79C1D29CDFB2100E7489F /* MPKitConfiguration.h in Headers */, 53A79B7929CDFB2000E7489F /* MPConnectorResponseProtocol.h in Headers */, - 53A79BD629CDFB2000E7489F /* MPSearchAdsAttribution.h in Headers */, 53A79B7C29CDFB2000E7489F /* MPConnectorFactoryProtocol.h in Headers */, 53A79B7D29CDFB2000E7489F /* MPNetworkCommunication.h in Headers */, 53A79B7F29CDFB2000E7489F /* MPURL.h in Headers */, @@ -1353,7 +1336,6 @@ 53A79C1429CDFB2100E7489F /* MPEventProjection.h in Headers */, 534CD25E29CE2BF1008452B3 /* MParticleSwift.h in Headers */, 53A79B8A29CDFB2000E7489F /* MPUpload.h in Headers */, - 53A79BD129CDFB2000E7489F /* MPResponseConfig.h in Headers */, 53A79B9829CDFB2000E7489F /* MPConsumerInfo.h in Headers */, 53A79C0629CDFB2100E7489F /* MPILogger.h in Headers */, 53A79B8529CDFB2000E7489F /* MPDatabaseMigrationController.h in Headers */, @@ -1374,8 +1356,6 @@ 53A79BC629CDFB2000E7489F /* MParticleReachability.h in Headers */, 53A79BF429CDFB2000E7489F /* MPCustomModule.h in Headers */, 53A79B8629CDFB2000E7489F /* MPPersistenceController.h in Headers */, - 53A79BF229CDFB2000E7489F /* MPUserIdentityChange.h in Headers */, - 53A79BDE29CDFB2000E7489F /* MPUserAttributeChange.h in Headers */, 53A79B6E29CDFB2000E7489F /* MPIdentityDTO.h in Headers */, 53A79BDF29CDFB2000E7489F /* MPMessageBuilder.h in Headers */, 53A79B7429CDFB2000E7489F /* MPURLRequestBuilder.h in Headers */, @@ -1386,7 +1366,6 @@ 53A79B8D29CDFB2000E7489F /* MPSession.h in Headers */, 53A79BE829CDFB2000E7489F /* MPUploadBuilder.h in Headers */, 53A79C1C29CDFB2100E7489F /* MPKitActivity.h in Headers */, - 53A79BCB29CDFB2000E7489F /* MPStateMachine.h in Headers */, D3B3E2072AE029AE001AB58C /* mParticle_Apple_SDK.h in Headers */, 53A79B9529CDFB2000E7489F /* MPMessage.h in Headers */, 53A79B8129CDFB2000E7489F /* MPConnector.h in Headers */, @@ -1431,12 +1410,10 @@ 53A79D2829CE23F700E7489F /* MPCustomModulePreference.h in Headers */, 53A79D2929CE23F700E7489F /* MPDataModelProtocol.h in Headers */, 53A79D2A29CE23F700E7489F /* MPAppDelegateProxy.h in Headers */, - 53A79D2B29CE23F700E7489F /* MParticleWebView.h in Headers */, 53A79D2C29CE23F700E7489F /* MPIConstants.h in Headers */, 53A79D2E29CE23F700E7489F /* MPBackendController.h in Headers */, 53A79D2F29CE23F700E7489F /* MPKitConfiguration.h in Headers */, 53A79D3029CE23F700E7489F /* MPConnectorResponseProtocol.h in Headers */, - 53A79D3129CE23F700E7489F /* MPSearchAdsAttribution.h in Headers */, 53A79D3229CE23F700E7489F /* MPConnectorFactoryProtocol.h in Headers */, 53A79D3329CE23F700E7489F /* MPNetworkCommunication.h in Headers */, 53A79D3429CE23F700E7489F /* MPURL.h in Headers */, @@ -1450,7 +1427,6 @@ 53A79D3C29CE23F700E7489F /* MPEventProjection.h in Headers */, 534CD25F29CE2BF1008452B3 /* MParticleSwift.h in Headers */, 53A79D3D29CE23F700E7489F /* MPUpload.h in Headers */, - 53A79D3E29CE23F700E7489F /* MPResponseConfig.h in Headers */, 53A79D3F29CE23F700E7489F /* MPConsumerInfo.h in Headers */, 53A79D4029CE23F700E7489F /* MPILogger.h in Headers */, 53A79D4129CE23F700E7489F /* MPDatabaseMigrationController.h in Headers */, @@ -1471,8 +1447,6 @@ 53A79D5129CE23F700E7489F /* MParticleReachability.h in Headers */, 53A79D5329CE23F700E7489F /* MPCustomModule.h in Headers */, 53A79D5529CE23F700E7489F /* MPPersistenceController.h in Headers */, - 53A79D5629CE23F700E7489F /* MPUserIdentityChange.h in Headers */, - 53A79D5729CE23F700E7489F /* MPUserAttributeChange.h in Headers */, 53A79D5829CE23F700E7489F /* MPIdentityDTO.h in Headers */, 53A79D5929CE23F700E7489F /* MPMessageBuilder.h in Headers */, 53A79D5A29CE23F700E7489F /* MPURLRequestBuilder.h in Headers */, @@ -1721,13 +1695,13 @@ 53A79C0F29CDFB2100E7489F /* MPForwardQueueParameters.m in Sources */, 53A79BDA29CDFB2000E7489F /* MPDevice.m in Sources */, 53A79BCE29CDFB2000E7489F /* NSDictionary+MPCaseInsensitive.m in Sources */, - 53A79BD929CDFB2000E7489F /* MPUserIdentityChange.m in Sources */, - 53A79BEF29CDFB2000E7489F /* MParticleWebView.m in Sources */, 53A79B7E29CDFB2000E7489F /* MPURLRequestBuilder.m in Sources */, 53A79BF529CDFB2000E7489F /* MPCustomModulePreference.m in Sources */, + 530D24852CFF78EB000FE7E3 /* MPUserIdentityChange.swift in Sources */, 53A79B6929CDFB2000E7489F /* FilteredMPIdentityApiRequest.m in Sources */, 53A79BF929CDFB2100E7489F /* mParticle.m in Sources */, 53A79C0329CDFB2100E7489F /* MPProduct.m in Sources */, + 530D24802CFF70B0000FE7E3 /* MPUserIdentityInstance.swift in Sources */, 5399DDB82CA727E5006526E1 /* MPZip.swift in Sources */, 53A79B8329CDFB2000E7489F /* MPPersistenceController.mm in Sources */, 53A79BEB29CDFB2000E7489F /* NSNumber+MPFormatter.swift in Sources */, @@ -1743,9 +1717,10 @@ 531BCF362B28A23400F5C573 /* MPIdentityCaching.m in Sources */, 53A79B9129CDFB2000E7489F /* MParticleUserNotification.m in Sources */, 53A79C2129CDFB2100E7489F /* MPIConstants.m in Sources */, + 530D24832CFF72D9000FE7E3 /* MPConstants.swift in Sources */, 53A79BEE29CDFB2000E7489F /* MPLaunchInfo.m in Sources */, 53A79C0229CDFB2100E7489F /* MPPromotion.m in Sources */, - 53A79BE729CDFB2000E7489F /* MPSearchAdsAttribution.m in Sources */, + D356E0242CFE08ED0020898D /* MPResponseConfig.swift in Sources */, 53A79B6629CDFB2000E7489F /* MPIdentityApiRequest.m in Sources */, 53A79C0129CDFB2100E7489F /* MPCommerceEvent.mm in Sources */, 53A79BBF29CDFB2000E7489F /* MPConsentSerialization.m in Sources */, @@ -1760,6 +1735,7 @@ 53A79B8429CDFB2000E7489F /* MPDatabaseMigrationController.m in Sources */, 53A79BC029CDFB2000E7489F /* MPConsentKitFilter.m in Sources */, 53A79C0A29CDFB2100E7489F /* MPKitRegister.m in Sources */, + 534C11B42D08A73700466F71 /* MParticleWebView.swift in Sources */, 53A79B9429CDFB2000E7489F /* MPForwardRecord.m in Sources */, 53A79B7A29CDFB2000E7489F /* MPConnector.m in Sources */, 53A79B8B29CDFB2000E7489F /* MPBreadcrumb.m in Sources */, @@ -1775,7 +1751,6 @@ 53A79B6A29CDFB2000E7489F /* MPAliasRequest.m in Sources */, 53A79B6829CDFB2000E7489F /* MParticleUser.m in Sources */, 53B28FB22C938C26009072FC /* MPLocationManager.swift in Sources */, - 53A79BE529CDFB2000E7489F /* MPResponseConfig.m in Sources */, 53A79BC529CDFB2000E7489F /* MParticleReachability.m in Sources */, 53A79C0B29CDFB2100E7489F /* MPKitExecStatus.m in Sources */, 53A79B8929CDFB2000E7489F /* MPMessage.m in Sources */, @@ -1790,6 +1765,7 @@ 53A79BF829CDFB2000E7489F /* MPNotificationController.m in Sources */, 53A79C0829CDFB2100E7489F /* MPEvent.m in Sources */, 53A79B6729CDFB2000E7489F /* MPAliasResponse.m in Sources */, + 534C11B72D08F53D00466F71 /* MPUserAttributeChange.swift in Sources */, 53A79C1229CDFB2100E7489F /* MPKitFilter.m in Sources */, 53A79B7829CDFB2000E7489F /* MPURLConnectionAssociate.m in Sources */, 53A79C0529CDFB2100E7489F /* MPTransactionAttributes.m in Sources */, @@ -1804,7 +1780,6 @@ 53A79C0E29CDFB2100E7489F /* MPKitContainer.mm in Sources */, 53A79BD729CDFB2000E7489F /* MPUploadBuilder.m in Sources */, 53A79C1129CDFB2100E7489F /* MPBaseProjection.m in Sources */, - 53A79BEC29CDFB2000E7489F /* MPUserAttributeChange.m in Sources */, 53A79B7029CDFB2000E7489F /* MPIdentityApiManager.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1890,13 +1865,13 @@ 53A79D6729CE23F700E7489F /* MPForwardQueueParameters.m in Sources */, 53A79D6829CE23F700E7489F /* MPDevice.m in Sources */, 53A79D6929CE23F700E7489F /* NSDictionary+MPCaseInsensitive.m in Sources */, - 53A79D6A29CE23F700E7489F /* MPUserIdentityChange.m in Sources */, - 53A79D6B29CE23F700E7489F /* MParticleWebView.m in Sources */, 53A79D6C29CE23F700E7489F /* MPURLRequestBuilder.m in Sources */, 53A79D6D29CE23F700E7489F /* MPCustomModulePreference.m in Sources */, + 530D24862CFF78EB000FE7E3 /* MPUserIdentityChange.swift in Sources */, 53A79D6E29CE23F700E7489F /* FilteredMPIdentityApiRequest.m in Sources */, 53A79D6F29CE23F700E7489F /* mParticle.m in Sources */, 53A79D7029CE23F700E7489F /* MPProduct.m in Sources */, + 530D247F2CFF70B0000FE7E3 /* MPUserIdentityInstance.swift in Sources */, 5399DDB92CA727E5006526E1 /* MPZip.swift in Sources */, 53A79D7129CE23F700E7489F /* MPPersistenceController.mm in Sources */, 53A79D7329CE23F700E7489F /* FilteredMParticleUser.m in Sources */, @@ -1912,9 +1887,10 @@ 531BCF372B28A23400F5C573 /* MPIdentityCaching.m in Sources */, 53A79D7B29CE23F700E7489F /* MPIConstants.m in Sources */, 53A79D7C29CE23F700E7489F /* MPLaunchInfo.m in Sources */, + 530D24822CFF72D9000FE7E3 /* MPConstants.swift in Sources */, 53A79D7D29CE23F700E7489F /* MPPromotion.m in Sources */, 534CD25C29CE2877008452B3 /* NSNumber+MPFormatter.swift in Sources */, - 53A79D7E29CE23F700E7489F /* MPSearchAdsAttribution.m in Sources */, + D356E0252CFE08ED0020898D /* MPResponseConfig.swift in Sources */, 53A79D8129CE23F700E7489F /* MPIdentityApiRequest.m in Sources */, 53A79D8229CE23F700E7489F /* MPCommerceEvent.mm in Sources */, 53A79D8329CE23F700E7489F /* MPConsentSerialization.m in Sources */, @@ -1929,6 +1905,7 @@ D3CEDAC42C9DB0E0001B32DF /* MPDateFormatter.swift in Sources */, 53A79D9029CE23F700E7489F /* MPDatabaseMigrationController.m in Sources */, 53A79D9129CE23F700E7489F /* MPConsentKitFilter.m in Sources */, + 534C11B32D08A73700466F71 /* MParticleWebView.swift in Sources */, 53A79D9229CE23F700E7489F /* MPKitRegister.m in Sources */, 53A79D9329CE23F700E7489F /* MPForwardRecord.m in Sources */, 53A79D9429CE23F700E7489F /* MPConnector.m in Sources */, @@ -1945,7 +1922,6 @@ 53A79D9C29CE23F700E7489F /* MPAliasRequest.m in Sources */, 53A79D9D29CE23F700E7489F /* MParticleUser.m in Sources */, 53B28FB32C938C26009072FC /* MPLocationManager.swift in Sources */, - 53A79D9E29CE23F700E7489F /* MPResponseConfig.m in Sources */, 53A79D9F29CE23F700E7489F /* MParticleReachability.m in Sources */, 53A79DA029CE23F700E7489F /* MPKitExecStatus.m in Sources */, 53A79DA129CE23F700E7489F /* MPMessage.m in Sources */, @@ -1959,6 +1935,7 @@ 53A79DA929CE23F700E7489F /* MPAppNotificationHandler.m in Sources */, 53A79DAA29CE23F700E7489F /* MPNotificationController.m in Sources */, 53A79DAB29CE23F700E7489F /* MPEvent.m in Sources */, + 534C11B62D08F53D00466F71 /* MPUserAttributeChange.swift in Sources */, 53A79DAD29CE23F700E7489F /* MPAliasResponse.m in Sources */, 53A79DAE29CE23F700E7489F /* MPKitFilter.m in Sources */, 53A79DAF29CE23F700E7489F /* MPURLConnectionAssociate.m in Sources */, @@ -1973,7 +1950,6 @@ 53A79DB929CE23F700E7489F /* MPKitContainer.mm in Sources */, 53A79DBA29CE23F700E7489F /* MPUploadBuilder.m in Sources */, 53A79DBC29CE23F700E7489F /* MPBaseProjection.m in Sources */, - 53A79DBE29CE23F700E7489F /* MPUserAttributeChange.m in Sources */, 53A79DBF29CE23F700E7489F /* MPIdentityApiManager.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/mParticle-Apple-SDK/AppNotifications/MPAppDelegateProxy.h b/mParticle-Apple-SDK/AppNotifications/MPAppDelegateProxy.h index c8ea13baf..4f88fffc8 100644 --- a/mParticle-Apple-SDK/AppNotifications/MPAppDelegateProxy.h +++ b/mParticle-Apple-SDK/AppNotifications/MPAppDelegateProxy.h @@ -4,7 +4,7 @@ @class MPSurrogateAppDelegate; #if TARGET_OS_IOS == 1 -@class MPNotificationController; +@class MPNotificationController_PRIVATE; #endif @interface MPAppDelegateProxy : NSProxy diff --git a/mParticle-Apple-SDK/AppNotifications/MPAppNotificationHandler.m b/mParticle-Apple-SDK/AppNotifications/MPAppNotificationHandler.m index 1d5bec9a7..9e4b299a6 100644 --- a/mParticle-Apple-SDK/AppNotifications/MPAppNotificationHandler.m +++ b/mParticle-Apple-SDK/AppNotifications/MPAppNotificationHandler.m @@ -1,5 +1,4 @@ #import "MPAppNotificationHandler.h" -#import "MPStateMachine.h" #import "MPLaunchInfo.h" #import "MPForwardRecord.h" #import "MPPersistenceController.h" @@ -7,11 +6,10 @@ #import "MPKitContainer.h" #import "MPKitExecStatus.h" #import -#import "MPKitContainer.h" #import "MPForwardQueueParameters.h" #import "MPKitAPI.h" #import "MPApplication.h" -#import "MPBackendController.h" +#import "mParticle.h" #if TARGET_OS_IOS == 1 #import "MPNotificationController.h" @@ -23,10 +21,9 @@ @interface MParticle () -@property (nonatomic, strong, readonly) MPBackendController *backendController; +@property (nonatomic, strong, readonly) MPBackendController_PRIVATE *backendController; @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; + (dispatch_queue_t)messageQueue; @end @@ -57,8 +54,8 @@ - (void)didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { return; } - if (![MPStateMachine isAppExtension]) { - [MPNotificationController setDeviceToken:nil]; + if (![MPStateMachine_PRIVATE isAppExtension]) { + [MPNotificationController_PRIVATE setDeviceToken:nil]; } SEL failedRegistrationSelector = @selector(failedToRegisterForUserNotifications:); @@ -67,7 +64,7 @@ - (void)didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { [queueParameters addParameter:error]; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:failedRegistrationSelector + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:failedRegistrationSelector event:nil parameters:queueParameters messageType:MPMessageTypeUnknown @@ -91,8 +88,8 @@ - (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { return; } - if (![MPStateMachine isAppExtension]) { - [MPNotificationController setDeviceToken:deviceToken]; + if (![MPStateMachine_PRIVATE isAppExtension]) { + [MPNotificationController_PRIVATE setDeviceToken:deviceToken]; } SEL deviceTokenSelector = @selector(setDeviceToken:); @@ -101,7 +98,7 @@ - (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [queueParameters addParameter:deviceToken]; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:deviceTokenSelector + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:deviceTokenSelector event:nil parameters:queueParameters messageType:MPMessageTypePushRegistration @@ -122,7 +119,7 @@ - (void)handleActionWithIdentifier:(NSString *)identifier forRemoteNotification: [queueParameters addParameter:userInfo]; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:handleActionWithIdentifierSelector + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:handleActionWithIdentifierSelector event:nil parameters:queueParameters messageType:MPMessageTypeUnknown @@ -144,7 +141,7 @@ - (void)handleActionWithIdentifier:(NSString *)identifier forRemoteNotification: [queueParameters addParameter:responseInfo]; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:handleActionWithIdentifierSelector + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:handleActionWithIdentifierSelector event:nil parameters:queueParameters messageType:MPMessageTypeUnknown @@ -160,7 +157,7 @@ - (void) didReceiveRemoteNotification:(NSDictionary *)userInfo { if ([MParticle sharedInstance].trackNotifications) { if ([self is9]) { - UIApplicationState state = [MPApplication sharedUIApplication].applicationState; + UIApplicationState state = [MPApplication_PRIVATE sharedUIApplication].applicationState; if (state != UIApplicationStateActive || ![self hasContentAvail:userInfo]) { [[MParticle sharedInstance] logNotificationOpenedWithUserInfo:userInfo andActionIdentifier:nil]; }else { @@ -179,7 +176,7 @@ - (void) didReceiveRemoteNotification:(NSDictionary *)userInfo { [queueParameters addParameter:userInfo]; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:receivedNotificationSelector + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:receivedNotificationSelector event:nil parameters:queueParameters messageType:MPMessageTypePushNotification @@ -189,7 +186,7 @@ - (void) didReceiveRemoteNotification:(NSDictionary *)userInfo { } - (void)didUpdateUserActivity:(nonnull NSUserActivity *)userActivity { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.optOut) { return; } @@ -200,7 +197,7 @@ - (void)didUpdateUserActivity:(nonnull NSUserActivity *)userActivity { [queueParameters addParameter:userActivity]; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:didUpdateUserActivitySelector + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:didUpdateUserActivitySelector event:nil parameters:queueParameters messageType:MPMessageTypeUnknown @@ -222,7 +219,7 @@ - (void)userNotificationCenter:(nonnull UNUserNotificationCenter *)center willPr dispatch_async(dispatch_get_main_queue(), ^{ SEL userNotificationCenterWillPresentNotification = @selector(userNotificationCenter:willPresentNotification:); - NSArray> *activeKitsRegistry = [[MParticle sharedInstance].kitContainer activeKitsRegistry]; + NSArray> *activeKitsRegistry = [[MParticle sharedInstance].kitContainer_PRIVATE activeKitsRegistry]; for (id kitRegister in activeKitsRegistry) { if ([kitRegister.wrapperInstance respondsToSelector:userNotificationCenterWillPresentNotification]) { @@ -257,7 +254,7 @@ - (void)userNotificationCenter:(nonnull UNUserNotificationCenter *)center didRec dispatch_async(dispatch_get_main_queue(), ^{ SEL userNotificationCenterDidReceiveNotificationResponse = @selector(userNotificationCenter:didReceiveNotificationResponse:); - NSArray> *activeKitsRegistry = [[MParticle sharedInstance].kitContainer activeKitsRegistry]; + NSArray> *activeKitsRegistry = [[MParticle sharedInstance].kitContainer_PRIVATE activeKitsRegistry]; for (id kitRegister in activeKitsRegistry) { if ([kitRegister.wrapperInstance respondsToSelector:userNotificationCenterDidReceiveNotificationResponse]) { @@ -279,7 +276,7 @@ - (void)userNotificationCenter:(nonnull UNUserNotificationCenter *)center didRec #endif - (BOOL)continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(void(^ _Nonnull)(NSArray> * __nullable restorableObjects))restorationHandler { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.optOut) { return NO; } @@ -293,7 +290,7 @@ - (BOOL)continueUserActivity:(nonnull NSUserActivity *)userActivity restorationH [queueParameters addParameter:restorationHandler]; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:continueUserActivitySelector + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:continueUserActivitySelector event:nil parameters:queueParameters messageType:MPMessageTypeUnknown @@ -301,7 +298,7 @@ - (BOOL)continueUserActivity:(nonnull NSUserActivity *)userActivity restorationH ]; }); - NSSet> *registeredKitsRegistry = [MPKitContainer registeredKits]; + NSSet> *registeredKitsRegistry = [MPKitContainer_PRIVATE registeredKits]; BOOL handlingActivity = NO; for (id kitRegister in registeredKitsRegistry) { if ([kitRegister.wrapperInstance respondsToSelector:continueUserActivitySelector]) { @@ -314,7 +311,7 @@ - (BOOL)continueUserActivity:(nonnull NSUserActivity *)userActivity restorationH } - (void)openURL:(NSURL *)url options:(NSDictionary *)options { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.optOut) { return; } @@ -328,7 +325,7 @@ - (void)openURL:(NSURL *)url options:(NSDictionary *)options { [queueParameters addParameter:options]; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:openURLOptionsSelector + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:openURLOptionsSelector event:nil parameters:queueParameters messageType:MPMessageTypeUnknown @@ -338,7 +335,7 @@ - (void)openURL:(NSURL *)url options:(NSDictionary *)options { } - (void)openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.optOut) { return; } @@ -355,7 +352,7 @@ - (void)openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication ann [queueParameters addParameter:annotation]; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:openURLSourceAppAnnotationSelector + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:openURLSourceAppAnnotationSelector event:nil parameters:queueParameters messageType:MPMessageTypeUnknown diff --git a/mParticle-Apple-SDK/AppNotifications/MPSurrogateAppDelegate.m b/mParticle-Apple-SDK/AppNotifications/MPSurrogateAppDelegate.m index d0d4f3285..883d62927 100644 --- a/mParticle-Apple-SDK/AppNotifications/MPSurrogateAppDelegate.m +++ b/mParticle-Apple-SDK/AppNotifications/MPSurrogateAppDelegate.m @@ -2,12 +2,11 @@ #import "MPAppDelegateProxy.h" #import "MPNotificationController.h" #import "MPAppNotificationHandler.h" -#import "MPStateMachine.h" #import "mParticle.h" @interface MParticle () -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, strong, readonly) MPAppNotificationHandler *appNotificationHandler; @end diff --git a/mParticle-Apple-SDK/Data Model/MPIntegrationAttributes.m b/mParticle-Apple-SDK/Data Model/MPIntegrationAttributes.m index 45e045405..260b6ce28 100644 --- a/mParticle-Apple-SDK/Data Model/MPIntegrationAttributes.m +++ b/mParticle-Apple-SDK/Data Model/MPIntegrationAttributes.m @@ -1,7 +1,7 @@ #import "MPIntegrationAttributes.h" #import "MPILogger.h" #import "mParticle.h" -#import "MPStateMachine.h" +#import "MPIConstants.h" @implementation MPIntegrationAttributes diff --git a/mParticle-Apple-SDK/Data Model/MPUpload.m b/mParticle-Apple-SDK/Data Model/MPUpload.m index c628e2a2b..240b4c7ae 100644 --- a/mParticle-Apple-SDK/Data Model/MPUpload.m +++ b/mParticle-Apple-SDK/Data Model/MPUpload.m @@ -2,10 +2,9 @@ #import "MPSession.h" #import "MPIConstants.h" #import "mParticle.h" -#import "MPStateMachine.h" @interface MParticle() -@property (nonatomic, strong) MPStateMachine *stateMachine; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; @end @implementation MPUploadSettings diff --git a/mParticle-Apple-SDK/Event/MPBaseEvent.m b/mParticle-Apple-SDK/Event/MPBaseEvent.m index 972d073d9..a61c06f25 100644 --- a/mParticle-Apple-SDK/Event/MPBaseEvent.m +++ b/mParticle-Apple-SDK/Event/MPBaseEvent.m @@ -1,13 +1,12 @@ #import "MPBaseEvent.h" #import "MPIConstants.h" -#import "MPStateMachine.h" #import "MPSession.h" #import "mParticle.h" #import "MPILogger.h" @interface MParticle () -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @end diff --git a/mParticle-Apple-SDK/Event/MPEvent.m b/mParticle-Apple-SDK/Event/MPEvent.m index d8ad5e15b..7c56885cc 100644 --- a/mParticle-Apple-SDK/Event/MPEvent.m +++ b/mParticle-Apple-SDK/Event/MPEvent.m @@ -1,6 +1,5 @@ #import "MPEvent.h" #import "MPIConstants.h" -#import "MPStateMachine.h" #import "MPSession.h" #import "MPILogger.h" #import "MPProduct.h" @@ -9,7 +8,7 @@ @interface MParticle() -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @end diff --git a/mParticle-Apple-SDK/Identity/MPIdentityApi.m b/mParticle-Apple-SDK/Identity/MPIdentityApi.m index a608886db..36a41a00f 100644 --- a/mParticle-Apple-SDK/Identity/MPIdentityApi.m +++ b/mParticle-Apple-SDK/Identity/MPIdentityApi.m @@ -16,7 +16,6 @@ #import "MPKitContainer.h" #import "MPDevice.h" #import "MPUpload.h" -#import "MPStateMachine.h" typedef NS_ENUM(NSUInteger, MPIdentityRequestType) { MPIdentityRequestIdentify = 0, @@ -28,8 +27,7 @@ typedef NS_ENUM(NSUInteger, MPIdentityRequestType) { @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @end @@ -43,13 +41,13 @@ @interface MPIdentityApi () @interface MParticle () + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong, nonnull) MPBackendController *backendController; +@property (nonatomic, strong, nonnull) MPBackendController_PRIVATE *backendController; @property (nonatomic, strong, nullable) NSString *dataPlanId; @property (nonatomic, strong, nullable) NSNumber *dataPlanVersion; @end -@interface MPBackendController () +@interface MPBackendController_PRIVATE () - (NSMutableDictionary *)userAttributesForUserId:(NSNumber *)userId; @@ -62,7 +60,7 @@ - (void)setUserId:(NSNumber *)userId; - (void)setIsLoggedIn:(BOOL)isLoggedIn; @end -@interface MPKitContainer () +@interface MPKitContainer_PRIVATE () @property (nonatomic, strong) NSMutableDictionary *kitConfigurations; @@ -246,10 +244,10 @@ - (void)onMPIDChange:(MPIdentityApiRequest *)request httpResponse:(MPIdentityHTT }); } - NSArray *kitConfig = [[MParticle sharedInstance].kitContainer.originalConfig copy]; + NSArray *kitConfig = [[MParticle sharedInstance].kitContainer_PRIVATE.originalConfig copy]; if (kitConfig) { dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer configureKits:kitConfig]; + [[MParticle sharedInstance].kitContainer_PRIVATE configureKits:kitConfig]; }); } } @@ -258,7 +256,7 @@ - (void)forwardCallToKits:(MPIdentityApiRequest *)request identityRequestType:(M dispatch_async(dispatch_get_main_queue(), ^{ switch (identityRequestType) { case MPIdentityRequestIdentify: { - [[MParticle sharedInstance].kitContainer forwardIdentitySDKCall:@selector(onIdentifyComplete: request:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardIdentitySDKCall:@selector(onIdentifyComplete: request:) kitHandler:^(id kit, MPKitConfiguration *kitConfig) { FilteredMParticleUser *filteredUser = [[FilteredMParticleUser alloc] initWithMParticleUser:user kitConfiguration:kitConfig]; FilteredMPIdentityApiRequest *filteredRequest = [[FilteredMPIdentityApiRequest alloc] initWithIdentityRequest:request kitConfiguration:kitConfig]; @@ -267,7 +265,7 @@ - (void)forwardCallToKits:(MPIdentityApiRequest *)request identityRequestType:(M break; } case MPIdentityRequestLogin: { - [[MParticle sharedInstance].kitContainer forwardIdentitySDKCall:@selector(onLoginComplete: request:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardIdentitySDKCall:@selector(onLoginComplete: request:) kitHandler:^(id kit, MPKitConfiguration *kitConfig) { FilteredMParticleUser *filteredUser = [[FilteredMParticleUser alloc] initWithMParticleUser:user kitConfiguration:kitConfig]; FilteredMPIdentityApiRequest *filteredRequest = [[FilteredMPIdentityApiRequest alloc] initWithIdentityRequest:request kitConfiguration:kitConfig]; @@ -276,7 +274,7 @@ - (void)forwardCallToKits:(MPIdentityApiRequest *)request identityRequestType:(M break; } case MPIdentityRequestLogout: { - [[MParticle sharedInstance].kitContainer forwardIdentitySDKCall:@selector(onLogoutComplete: request:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardIdentitySDKCall:@selector(onLogoutComplete: request:) kitHandler:^(id kit, MPKitConfiguration *kitConfig) { FilteredMParticleUser *filteredUser = [[FilteredMParticleUser alloc] initWithMParticleUser:user kitConfiguration:kitConfig]; FilteredMPIdentityApiRequest *filteredRequest = [[FilteredMPIdentityApiRequest alloc] initWithIdentityRequest:request kitConfiguration:kitConfig]; @@ -285,7 +283,7 @@ - (void)forwardCallToKits:(MPIdentityApiRequest *)request identityRequestType:(M break; } case MPIdentityRequestModify: { - [[MParticle sharedInstance].kitContainer forwardIdentitySDKCall:@selector(onModifyComplete: request:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardIdentitySDKCall:@selector(onModifyComplete: request:) kitHandler:^(id kit, MPKitConfiguration *kitConfig) { FilteredMParticleUser *filteredUser = [[FilteredMParticleUser alloc] initWithMParticleUser:user kitConfiguration:kitConfig]; FilteredMPIdentityApiRequest *filteredRequest = [[FilteredMPIdentityApiRequest alloc] initWithIdentityRequest:request kitConfiguration:kitConfig]; diff --git a/mParticle-Apple-SDK/Identity/MPIdentityApiManager.m b/mParticle-Apple-SDK/Identity/MPIdentityApiManager.m index a588b1f4b..35ce38d5d 100644 --- a/mParticle-Apple-SDK/Identity/MPIdentityApiManager.m +++ b/mParticle-Apple-SDK/Identity/MPIdentityApiManager.m @@ -12,7 +12,7 @@ @interface MParticle () -@property (nonatomic, strong, nonnull) MPBackendController *backendController; +@property (nonatomic, strong, nonnull) MPBackendController_PRIVATE *backendController; @end diff --git a/mParticle-Apple-SDK/Identity/MPIdentityDTO.m b/mParticle-Apple-SDK/Identity/MPIdentityDTO.m index 4cb405b90..4a2f91d01 100644 --- a/mParticle-Apple-SDK/Identity/MPIdentityDTO.m +++ b/mParticle-Apple-SDK/Identity/MPIdentityDTO.m @@ -7,14 +7,13 @@ #import "MPDevice.h" #import "MPNotificationController.h" #import "MPPersistenceController.h" -#import "MPStateMachine.h" #import "MPConsumerInfo.h" #import "MPIUserDefaults.h" @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @end @@ -73,8 +72,8 @@ - (instancetype)initWithIdentityApiRequest:(MPIdentityApiRequest *)apiRequest { } #if TARGET_OS_IOS == 1 - if (![MPStateMachine isAppExtension]) { - NSData *deviceTokenData = [MPNotificationController deviceToken]; + if (![MPStateMachine_PRIVATE isAppExtension]) { + NSData *deviceTokenData = [MPNotificationController_PRIVATE deviceToken]; if (deviceTokenData) { NSString *deviceTokenString = [MPIUserDefaults stringFromDeviceToken:deviceTokenData]; if (deviceTokenString && [deviceTokenString length] > 0) { diff --git a/mParticle-Apple-SDK/Identity/MPUserIdentityChange.swift b/mParticle-Apple-SDK/Identity/MPUserIdentityChange.swift new file mode 100644 index 000000000..23348f437 --- /dev/null +++ b/mParticle-Apple-SDK/Identity/MPUserIdentityChange.swift @@ -0,0 +1,50 @@ +// +// MPUserIdentityChange.swift +// mParticle-Apple-SDK +// +// Created by Ben Baron on 12/3/24. +// + +@objc public final class MPUserIdentityChange_PRIVATE : NSObject { + + @objc public var newUserIdentity: MPUserIdentityInstance_PRIVATE? + @objc public var oldUserIdentity: MPUserIdentityInstance_PRIVATE? + @objc public private(set) var changed = false + + private var _timestamp: Date? + @objc public var timestamp: Date? { + get { + if _timestamp == nil { + _timestamp = Date() + } + return _timestamp + } + set { + _timestamp = newValue + } + } + + @objc public init(newUserIdentity: MPUserIdentityInstance_PRIVATE?, userIdentities: [[String : Any]]?) { + self.newUserIdentity = newUserIdentity + self.changed = true + + if let userIdentities = userIdentities { + for ui in userIdentities { + if let idTypeInt = ui[MessageKeys.kMPUserIdentityTypeKey] as? UInt, + let idType = MPUserIdentity(rawValue: idTypeInt), + let idValue = ui[MessageKeys.kMPUserIdentityIdKey] as? String, + idType == newUserIdentity?.type && idValue == newUserIdentity?.value { + + self.changed = false + break + } + } + } + } + + @objc public convenience init(newUserIdentity: MPUserIdentityInstance_PRIVATE?, oldUserIdentity: MPUserIdentityInstance_PRIVATE?, timestamp: Date?, userIdentities: [[String : Any]]?) { + self.init(newUserIdentity: newUserIdentity, userIdentities: userIdentities) + self.oldUserIdentity = oldUserIdentity + self.timestamp = timestamp + } +} diff --git a/mParticle-Apple-SDK/Identity/MPUserIdentityInstance.swift b/mParticle-Apple-SDK/Identity/MPUserIdentityInstance.swift new file mode 100644 index 000000000..20f959cc5 --- /dev/null +++ b/mParticle-Apple-SDK/Identity/MPUserIdentityInstance.swift @@ -0,0 +1,53 @@ +// +// MPUserIdentityInstance.swift +// mParticle-Apple-SDK +// +// Created by Ben Baron on 12/3/24. +// + +@objc public final class MPUserIdentityInstance_PRIVATE : NSObject { + + @objc public var value: String? + @objc public var dateFirstSet: Date? + @objc public var type: MPUserIdentity + @objc public var isFirstTimeSet = false + + @objc public init(type: MPUserIdentity, value: String?) { + self.type = type + self.value = value + } + + @objc public init(type: MPUserIdentity, value: String?, dateFirstSet: Date, isFirstTimeSet: Bool) { + self.type = type + self.value = value + self.dateFirstSet = dateFirstSet + self.isFirstTimeSet = isFirstTimeSet + } + + @objc public convenience init(userIdentityDictionary: [String : Any]) { + let typeInt = userIdentityDictionary[MessageKeys.kMPUserIdentityTypeKey] as? UInt ?? 0 + let type = MPUserIdentity(rawValue: typeInt) ?? .other + let value = userIdentityDictionary[MessageKeys.kMPUserIdentityIdKey] as? String + let firstSetMillis = userIdentityDictionary[MessageKeys.kMPDateUserIdentityWasFirstSet] as? Double ?? 0.0 + let dateFirstSet = Date(timeIntervalSince1970: firstSetMillis / 1000.0) + let isFirstSet = userIdentityDictionary[MessageKeys.kMPIsFirstTimeUserIdentityHasBeenSet] as? Bool ?? false + self.init(type: type, value: value, dateFirstSet: dateFirstSet, isFirstTimeSet: isFirstSet) + } + + // TODO: Change return type to [AnyHashable: Any] once no longer used by Obj-C callers + @objc public func dictionaryRepresentation() -> NSMutableDictionary { + var identityDictionary = [AnyHashable: Any]() + identityDictionary[MessageKeys.kMPUserIdentityTypeKey] = type.rawValue + identityDictionary[MessageKeys.kMPIsFirstTimeUserIdentityHasBeenSet] = isFirstTimeSet + + if let dateFirstSet = dateFirstSet { + identityDictionary[MessageKeys.kMPDateUserIdentityWasFirstSet] = MPMilliseconds(timestamp: dateFirstSet.timeIntervalSince1970) + } + + if let value = value { + identityDictionary[MessageKeys.kMPUserIdentityIdKey] = value + } + + return NSMutableDictionary(dictionary: identityDictionary) + } +} diff --git a/mParticle-Apple-SDK/Identity/MParticleUser.m b/mParticle-Apple-SDK/Identity/MParticleUser.m index 3e4f6d168..378a2ab65 100644 --- a/mParticle-Apple-SDK/Identity/MParticleUser.m +++ b/mParticle-Apple-SDK/Identity/MParticleUser.m @@ -3,33 +3,31 @@ // #import "MParticleUser.h" -#import "MPBackendController.h" -#import "MPStateMachine.h" -#import "MPKitContainer.h" #import "MPILogger.h" #import "mParticle.h" #import "MPPersistenceController.h" #import "MPIUserDefaults.h" #import "MPDataPlanFilter.h" +#import "MPIConstants.h" +#import "MPKitContainer.h" @interface MParticleUser () -@property (nonatomic, strong) MPBackendController *backendController; +@property (nonatomic, strong) MPBackendController_PRIVATE *backendController; @end @interface MParticle () + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong) MPBackendController *backendController; +@property (nonatomic, strong) MPBackendController_PRIVATE *backendController; @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, strong) MPDataPlanFilter *dataPlanFilter; @end -@interface MPKitContainer () +@interface MPKitContainer_PRIVATE () @property (nonatomic, strong) NSMutableDictionary *kitConfigurations; @@ -205,7 +203,7 @@ - (BOOL)forwardLegacyUserIdentityToKitContainer:(NSString *)identityString ident MPILogDebug(@"Set user identity: %@", identityString); if (MParticle.sharedInstance.dataPlanFilter == nil || ![MParticle.sharedInstance.dataPlanFilter isBlockedUserIdentityType:(MPIdentity)identityType]) { dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(setUserIdentity:identityType:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(setUserIdentity:identityType:) userIdentity:identityString identityType:identityType kitHandler:^(id kit, MPKitConfiguration *kitConfig) { @@ -222,7 +220,7 @@ - (nullable NSNumber *)incrementUserAttribute:(NSString *)key byValue:(NSNumber dispatch_async([MParticle messageQueue], ^{ [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:key parameter2:value]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.optOut) { return; } @@ -232,7 +230,7 @@ - (nullable NSNumber *)incrementUserAttribute:(NSString *)key byValue:(NSNumber MPILogDebug(@"User attribute %@ incremented by %@. New value: %@", key, value, newValue); if (MParticle.sharedInstance.dataPlanFilter == nil || ![MParticle.sharedInstance.dataPlanFilter isBlockedUserAttributeKey:key]) { dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(incrementUserAttribute:byValue:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(incrementUserAttribute:byValue:) userAttributeKey:key value:value kitHandler:^(id kit, MPKitConfiguration *kitConfig) { @@ -246,7 +244,7 @@ - (nullable NSNumber *)incrementUserAttribute:(NSString *)key byValue:(NSNumber } }]; - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(setUserAttribute:value:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(setUserAttribute:value:) userAttributeKey:key value:newValue kitHandler:^(id kit, MPKitConfiguration *kitConfig) { @@ -298,7 +296,7 @@ - (void)setUserAttribute:(nonnull NSString *)key value:(nonnull id)value { if (MParticle.sharedInstance.dataPlanFilter == nil || ![MParticle.sharedInstance.dataPlanFilter isBlockedUserAttributeKey:key]) { dispatch_async(dispatch_get_main_queue(), ^{ // Forwarding calls to kits - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(setUserAttribute:value:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(setUserAttribute:value:) userAttributeKey:key value:value kitHandler:^(id kit, MPKitConfiguration *kitConfig) { @@ -349,7 +347,7 @@ - (void)setUserAttributeList:(nonnull NSString *)key values:(nonnull NSArray kit, MPKitConfiguration *kitConfig) { @@ -389,7 +387,7 @@ - (void)setUserTag:(nonnull NSString *)tag { if (MParticle.sharedInstance.dataPlanFilter == nil || ![MParticle.sharedInstance.dataPlanFilter isBlockedUserAttributeKey:tag]) { // Forwarding calls to kits dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(setUserTag:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(setUserTag:) userAttributeKey:tag value:nil kitHandler:^(id kit, MPKitConfiguration *kitConfig) { @@ -427,7 +425,7 @@ - (void)removeUserAttribute:(nonnull NSString *)key { if (MParticle.sharedInstance.dataPlanFilter == nil ||![MParticle.sharedInstance.dataPlanFilter isBlockedUserAttributeKey:key]) { // Forwarding calls to kits dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:_cmd + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:_cmd userAttributeKey:key value:nil kitHandler:^(id kit, MPKitConfiguration *kitConfig) { @@ -453,15 +451,15 @@ - (void)setConsentState:(MPConsentState *)state { [MPPersistenceController setConsentState:state forMpid:self.userId]; - NSArray *kitConfig = [[MParticle sharedInstance].kitContainer.originalConfig copy]; + NSArray *kitConfig = [[MParticle sharedInstance].kitContainer_PRIVATE.originalConfig copy]; if (kitConfig) { dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer configureKits:kitConfig]; + [[MParticle sharedInstance].kitContainer_PRIVATE configureKits:kitConfig]; }); } dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(setConsentState:) consentState:state kitHandler:^(id _Nonnull kit, MPConsentState * _Nullable filteredConsentState, MPKitConfiguration * _Nonnull kitConfiguration) { + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(setConsentState:) consentState:state kitHandler:^(id _Nonnull kit, MPConsentState * _Nullable filteredConsentState, MPKitConfiguration * _Nonnull kitConfiguration) { MPKitExecStatus *status = [kit setConsentState:filteredConsentState]; if (!status.success) { MPILogError(@"Failed to set consent state for kit=%@", status.integrationId); diff --git a/mParticle-Apple-SDK/Utils/MPApplication.h b/mParticle-Apple-SDK/Include/MPApplication.h similarity index 95% rename from mParticle-Apple-SDK/Utils/MPApplication.h rename to mParticle-Apple-SDK/Include/MPApplication.h index 6b0185a4c..19ee70075 100644 --- a/mParticle-Apple-SDK/Utils/MPApplication.h +++ b/mParticle-Apple-SDK/Include/MPApplication.h @@ -1,11 +1,10 @@ -#import "MPIConstants.h" #import "MPEnums.h" @class UIApplication; extern NSString * _Nonnull const kMPApplicationInformationKey; -@interface MPApplication : NSObject +@interface MPApplication_PRIVATE : NSObject @property (nonatomic, strong, nonnull) NSNumber *lastUseDate; @property (nonatomic, strong, nullable) NSNumber *launchCount; diff --git a/mParticle-Apple-SDK/MPBackendController.h b/mParticle-Apple-SDK/Include/MPBackendController.h similarity index 95% rename from mParticle-Apple-SDK/MPBackendController.h rename to mParticle-Apple-SDK/Include/MPBackendController.h index 8a2955293..afb2f5292 100644 --- a/mParticle-Apple-SDK/MPBackendController.h +++ b/mParticle-Apple-SDK/Include/MPBackendController.h @@ -1,8 +1,6 @@ #import "MPEnums.h" -#import "MPNetworkCommunication.h" #if TARGET_OS_IOS == 1 - #import "MPNotificationController.h" #ifndef MPARTICLE_LOCATION_DISABLE #import #endif @@ -13,7 +11,7 @@ @class MPSession; @class MPMessage; @class MPNetworkPerformance; -@class MPNotificationController; +@class MPNotificationController_PRIVATE; @class MPBaseEvent; @class MPEvent; @class MPCommerceEvent; @@ -21,6 +19,8 @@ @class MParticleSession; @class MPUploadSettings; @class MPNetworkOptions; +@class MPNetworkCommunication_PRIVATE; + @protocol MPBackendControllerDelegate; @@ -56,17 +56,17 @@ extern const NSInteger kInvalidDataType; extern const NSTimeInterval kMPMaximumKitWaitTimeSeconds; extern const NSInteger kInvalidKey; -@interface MPBackendController : NSObject +@interface MPBackendController_PRIVATE : NSObject #if TARGET_OS_IOS == 1 -@property (nonatomic, strong, nonnull) MPNotificationController *notificationController; +@property (nonatomic, strong, nonnull) MPNotificationController_PRIVATE *notificationController; #endif @property (nonatomic, weak, nullable) id delegate; @property (nonatomic, strong, nullable) NSMutableSet *eventSet; -@property (nonatomic, strong, nullable) MPNetworkCommunication *networkCommunication; +@property (nonatomic, strong, nullable) MPNetworkCommunication_PRIVATE *networkCommunication; @property (strong, nullable) MPSession *session; @property (nonatomic, readwrite) NSTimeInterval sessionTimeout; @property (nonatomic) NSTimeInterval uploadInterval; diff --git a/mParticle-Apple-SDK/Kits/MPKitContainer.h b/mParticle-Apple-SDK/Include/MPKitContainer.h similarity index 96% rename from mParticle-Apple-SDK/Kits/MPKitContainer.h rename to mParticle-Apple-SDK/Include/MPKitContainer.h index 63a91e71f..fad6223d3 100644 --- a/mParticle-Apple-SDK/Kits/MPKitContainer.h +++ b/mParticle-Apple-SDK/Include/MPKitContainer.h @@ -1,7 +1,6 @@ #import #import "MPExtensionProtocol.h" #import "MPKitProtocol.h" -#import "mParticle.h" @class MPKitFilter; @class MPKitExecStatus; @@ -9,8 +8,10 @@ @class MPBaseEvent; @class MPForwardQueueParameters; @class MPKitConfiguration; +@class MPAttributionResult; +@class MPSideloadedKit; -@interface MPKitContainer : NSObject +@interface MPKitContainer_PRIVATE : NSObject @property (nonatomic, copy) void (^ _Nonnull attributionCompletionHandler)(MPAttributionResult *_Nullable attributionResult, NSError * _Nullable error); @property (nonatomic, strong, nonnull) NSMutableDictionary *attributionInfo; diff --git a/mParticle-Apple-SDK/Network/MPNetworkCommunication.h b/mParticle-Apple-SDK/Include/MPNetworkCommunication.h similarity index 97% rename from mParticle-Apple-SDK/Network/MPNetworkCommunication.h rename to mParticle-Apple-SDK/Include/MPNetworkCommunication.h index 34f545429..a471af32a 100644 --- a/mParticle-Apple-SDK/Network/MPNetworkCommunication.h +++ b/mParticle-Apple-SDK/Include/MPNetworkCommunication.h @@ -24,7 +24,7 @@ typedef void (^MPIdentityApiManagerCallback)(MPIdentityHTTPBaseSuccessResponse * typedef void (^MPIdentityApiManagerModifyCallback)(MPIdentityHTTPModifySuccessResponse *_Nullable httpResponse, NSError *_Nullable error); typedef void(^ _Nonnull MPConfigCompletionHandler)(BOOL success); -@interface MPNetworkCommunication : NSObject +@interface MPNetworkCommunication_PRIVATE : NSObject @property (nonatomic, strong, readonly, nullable) MPURL *configURL; @property (nonatomic, strong, readonly, nullable) MPURL *identifyURL; diff --git a/mParticle-Apple-SDK/Notifications/MPNotificationController.h b/mParticle-Apple-SDK/Include/MPNotificationController.h similarity index 76% rename from mParticle-Apple-SDK/Notifications/MPNotificationController.h rename to mParticle-Apple-SDK/Include/MPNotificationController.h index 2c3d0c557..65ad20258 100644 --- a/mParticle-Apple-SDK/Notifications/MPNotificationController.h +++ b/mParticle-Apple-SDK/Include/MPNotificationController.h @@ -1,7 +1,7 @@ #import #import -@interface MPNotificationController : NSObject +@interface MPNotificationController_PRIVATE : NSObject #if TARGET_OS_IOS == 1 + (nullable NSData *)deviceToken; diff --git a/mParticle-Apple-SDK/Utils/MPStateMachine.h b/mParticle-Apple-SDK/Include/MPStateMachine.h similarity index 88% rename from mParticle-Apple-SDK/Utils/MPStateMachine.h rename to mParticle-Apple-SDK/Include/MPStateMachine.h index debbd762a..75c6f5ed5 100644 --- a/mParticle-Apple-SDK/Utils/MPStateMachine.h +++ b/mParticle-Apple-SDK/Include/MPStateMachine.h @@ -1,10 +1,7 @@ -#import "MPIConstants.h" #import "MPEnums.h" -#import "MPLaunchInfo.h" -#import "MParticleReachability.h" @class MPSession; -@class MPNotificationController; +@class MPNotificationController_PRIVATE; @class MPConsumerInfo; #if TARGET_OS_IOS == 1 #ifndef MPARTICLE_LOCATION_DISABLE @@ -13,10 +10,10 @@ #endif #endif @class MPCustomModule; -@class MPSearchAdsAttribution; @class MPDataPlanOptions; +@class MPLaunchInfo; -@interface MPStateMachine : NSObject +@interface MPStateMachine_PRIVATE : NSObject @property (nonatomic, strong, nonnull) NSString *apiKey __attribute__((const)); @property (nonatomic, strong, nonnull) MPConsumerInfo *consumerInfo; @@ -44,17 +41,12 @@ @property (nonatomic, strong, readonly, nullable) NSArray *triggerMessageTypes; @property (nonatomic) MPILogLevel logLevel; @property (nonatomic) MPInstallationType installationType; -@property (nonatomic, readonly) MParticleNetworkStatus networkStatus; -@property (nonatomic) MPUploadStatus uploadStatus; @property (nonatomic, readonly) BOOL backgrounded; @property (nonatomic, readonly) BOOL dataRamped; @property (nonatomic) BOOL optOut; @property (nonatomic) NSNumber * _Nullable attAuthorizationStatus; @property (nonatomic) NSNumber * _Nullable attAuthorizationTimestamp; @property (nonatomic, strong, nonnull) NSNumber *aliasMaxWindow; -#if TARGET_OS_IOS == 1 -@property (nonatomic, strong, nonnull) MPSearchAdsAttribution *searchAttribution; -#endif @property (nonatomic, strong, nonnull) NSDictionary *searchAdsInfo; @property (nonatomic) BOOL automaticSessionTracking; @property (nonatomic) BOOL allowASR; @@ -75,5 +67,6 @@ - (void)configureDataBlocking:(nullable NSDictionary *)blockSettings; - (void)setMinUploadDate:(nullable NSDate *)date uploadType:(MPUploadType)uploadType; - (nonnull NSDate *)minUploadDateForUploadType:(MPUploadType)uploadType; +- (void)requestAttributionDetailsWithBlock:(void (^ _Nonnull)(void))completionHandler requestsCompleted:(int)requestsCompleted; @end diff --git a/mParticle-Apple-SDK/Include/mParticle.h b/mParticle-Apple-SDK/Include/mParticle.h index d19b60f11..5fda36b83 100644 --- a/mParticle-Apple-SDK/Include/mParticle.h +++ b/mParticle-Apple-SDK/Include/mParticle.h @@ -19,6 +19,12 @@ #import "MPListenerController.h" #import "MPForwardRecord.h" #import +#import "MPStateMachine.h" +#import "MPKitContainer.h" +#import "MPBackendController.h" +#import "MPApplication.h" +#import "MPNotificationController.h" +#import "MPNetworkCommunication.h" #if TARGET_OS_IOS == 1 #ifndef MPARTICLE_LOCATION_DISABLE @@ -34,6 +40,7 @@ NS_ASSUME_NONNULL_BEGIN @class MPSideloadedKit; +@class MPKitContainer; /** An SDK session. @@ -636,6 +643,16 @@ Defaults to false. Prevents the eventsHost above from overwriting the alias endp */ @property (nonatomic, readonly, nullable) NSNumber *persistenceMaxAgeSeconds; +/** + The instance which manages all initialized kits. For internal use only + */ +@property (nonatomic, strong, readonly) MPKitContainer_PRIVATE *kitContainer_PRIVATE; + +/** + The Kit Configuration needed should the initialization of kits need to be deferred until identity or consent is resolve. For internal use only + */ +@property (nonatomic, strong, nullable) NSArray *deferredKitConfiguration_PRIVATE; + #pragma mark - Initialization /** diff --git a/mParticle-Apple-SDK/Kits/MPKitAPI.m b/mParticle-Apple-SDK/Kits/MPKitAPI.m index 9fbdf72a6..658a0f877 100644 --- a/mParticle-Apple-SDK/Kits/MPKitAPI.m +++ b/mParticle-Apple-SDK/Kits/MPKitAPI.m @@ -4,11 +4,11 @@ #import "MPKitContainer.h" #import "MPILogger.h" #import "FilteredMParticleUser.h" +#import "mParticle.h" @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; @end @@ -19,7 +19,7 @@ @interface MPAttributionResult () @end -@interface MPKitContainer () +@interface MPKitContainer_PRIVATE () @property (nonatomic, strong, readonly) NSMutableDictionary *kitConfigurations; @@ -35,7 +35,7 @@ @implementation MPKitAPI - (NSString *)kitName { __block NSString *component = nil; - NSSet> *kits = [MPKitContainer registeredKits]; + NSSet> *kits = [MPKitContainer_PRIVATE registeredKits]; NSNumber *kitCode = _kitCode; if (kits && kitCode) { @@ -97,7 +97,7 @@ - (id)initWithKitCode:(NSNumber *)kitCode { } - (NSDictionary *)integrationAttributes { - NSDictionary *dictionary = [[MParticle sharedInstance].kitContainer integrationAttributesForKit:_kitCode]; + NSDictionary *dictionary = [[MParticle sharedInstance].kitContainer_PRIVATE integrationAttributesForKit:_kitCode]; return dictionary; } @@ -122,20 +122,20 @@ - (void)onAttributionCompleteWithResult:(MPAttributionResult *)result error:(NSE userInfo[MPKitAPIErrorKey] = errorMessage; NSError *attributionError = [NSError errorWithDomain:MPKitAPIErrorDomain code:0 userInfo:userInfo]; - [MParticle sharedInstance].kitContainer.attributionCompletionHandler(nil, attributionError); + [MParticle sharedInstance].kitContainer_PRIVATE.attributionCompletionHandler(nil, attributionError); return; } result.kitCode = _kitCode; result.kitName = [self kitName]; - [MParticle sharedInstance].kitContainer.attributionCompletionHandler(result, nil); + [MParticle sharedInstance].kitContainer_PRIVATE.attributionCompletionHandler(result, nil); } #pragma mark Kit Identity methods - (FilteredMParticleUser *_Nonnull)getCurrentUserWithKit:(id _Nonnull)kit { - return [[FilteredMParticleUser alloc] initWithMParticleUser:[[[MParticle sharedInstance] identity] currentUser] kitConfiguration:[MParticle sharedInstance].kitContainer.kitConfigurations[[[kit class] kitCode]]]; + return [[FilteredMParticleUser alloc] initWithMParticleUser:[[[MParticle sharedInstance] identity] currentUser] kitConfiguration:[MParticle sharedInstance].kitContainer_PRIVATE.kitConfigurations[[[kit class] kitCode]]]; } - (nullable NSNumber *)incrementUserAttribute:(NSString *_Nonnull)key byValue:(NSNumber *_Nonnull)value forUser:(FilteredMParticleUser *_Nonnull)filteredUser { diff --git a/mParticle-Apple-SDK/Kits/MPKitActivity.m b/mParticle-Apple-SDK/Kits/MPKitActivity.m index 1693865c9..745b68620 100644 --- a/mParticle-Apple-SDK/Kits/MPKitActivity.m +++ b/mParticle-Apple-SDK/Kits/MPKitActivity.m @@ -4,12 +4,7 @@ #import "MPKitContainer.h" #import "MPKitProtocol.h" #import "MPKitRegister.h" - -@interface MParticle () - -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; - -@end +#import "mParticle.h" #pragma mark - MPKitActivityMapping @interface MPKitActivityMapping : NSObject @@ -70,7 +65,7 @@ - (instancetype)init { #pragma mark Private methods - (void)kitInstanceAndConfiguration:(NSNumber *)integrationId handler:(void(^)(id instance, NSDictionary *configuration))handler { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == %@", integrationId]; - id kitRegister = [[[[MParticle sharedInstance].kitContainer activeKitsRegistry] filteredArrayUsingPredicate:predicate] firstObject]; + id kitRegister = [[[[MParticle sharedInstance].kitContainer_PRIVATE activeKitsRegistry] filteredArrayUsingPredicate:predicate] firstObject]; id wrapperInstance = kitRegister.wrapperInstance; id kitInstance = [wrapperInstance respondsToSelector:@selector(providerKitInstance)] ? [wrapperInstance providerKitInstance] : nil; @@ -82,7 +77,7 @@ - (void)kitInstanceAndConfiguration:(NSNumber *)integrationId handler:(void(^)(i #pragma mark Public methods - (BOOL)isKitActive:(nonnull NSNumber *)integrationId { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code == %@", integrationId]; - id kitRegister = [[[[MParticle sharedInstance].kitContainer activeKitsRegistry] filteredArrayUsingPredicate:predicate] firstObject]; + id kitRegister = [[[[MParticle sharedInstance].kitContainer_PRIVATE activeKitsRegistry] filteredArrayUsingPredicate:predicate] firstObject]; return kitRegister != nil; } diff --git a/mParticle-Apple-SDK/Kits/MPKitConfiguration.mm b/mParticle-Apple-SDK/Kits/MPKitConfiguration.mm index 292a101ce..a3050d972 100644 --- a/mParticle-Apple-SDK/Kits/MPKitConfiguration.mm +++ b/mParticle-Apple-SDK/Kits/MPKitConfiguration.mm @@ -1,7 +1,6 @@ #import "MPKitConfiguration.h" #import "MPIConstants.h" #import "MPEventProjection.h" -#import "MPStateMachine.h" #import "MPILogger.h" #import "MPConsentSerialization.h" #import "mParticle.h" diff --git a/mParticle-Apple-SDK/Kits/MPKitContainer.mm b/mParticle-Apple-SDK/Kits/MPKitContainer.mm index 37364fc87..af2ba6896 100644 --- a/mParticle-Apple-SDK/Kits/MPKitContainer.mm +++ b/mParticle-Apple-SDK/Kits/MPKitContainer.mm @@ -2,7 +2,6 @@ #import "MParticleSwift.h" #import "MPKitExecStatus.h" #import "MPEnums.h" -#import "MPStateMachine.h" #import "MPKitConfiguration.h" #import #import "MPForwardRecord.h" @@ -45,8 +44,7 @@ @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; + (dispatch_queue_t)messageQueue; @property (nonatomic, strong, nonnull) MParticleOptions *options; @property (nonatomic, strong) MPDataPlanFilter *dataPlanFilter; @@ -70,7 +68,7 @@ - (nullable instancetype)initWithInstance:(nonnull NSObject *)ins static const NSInteger sideloadedKitCodeStartValue = 1000000000; -@interface MPKitContainer () { +@interface MPKitContainer_PRIVATE () { dispatch_semaphore_t kitsSemaphore; std::map> brackets; NSInteger sideloadedKitCodeNextValue; @@ -82,12 +80,12 @@ @interface MPKitContainer () { @end -@implementation MPKitContainer +@implementation MPKitContainer_PRIVATE @synthesize kitsInitialized = _kitsInitialized; + (void)initialize { - if (self == [MPKitContainer class]) { + if (self == [MPKitContainer_PRIVATE class]) { kitsRegistry = [[NSMutableSet alloc] initWithCapacity:DEFAULT_ALLOCATION_FOR_KITS]; } } @@ -145,7 +143,7 @@ - (void)handleApplicationDidBecomeActive:(NSNotification *)notification { - (void)handleApplicationDidFinishLaunching:(NSNotification *)notification { dispatch_async(dispatch_get_main_queue(), ^{ - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.launchOptions = [notification userInfo]; SEL launchOptionsSelector = @selector(setLaunchOptions:); SEL startSelector = @selector(start); @@ -1107,9 +1105,9 @@ - (void)project:(id)kitRegister commerceEvent:(MPCommerc return; } - __weak MPKitContainer *weakSelf = self; + __weak MPKitContainer_PRIVATE *weakSelf = self; - __strong MPKitContainer *strongSelf = weakSelf; + __strong MPKitContainer_PRIVATE *strongSelf = weakSelf; if (strongSelf) { dispatch_semaphore_wait(strongSelf->kitsSemaphore, DISPATCH_TIME_FOREVER); } @@ -1607,9 +1605,9 @@ - (void)project:(id)kitRegister event:(MPEvent *const)ev return; } - __weak MPKitContainer *weakSelf = self; + __weak MPKitContainer_PRIVATE *weakSelf = self; - __strong MPKitContainer *strongSelf = weakSelf; + __strong MPKitContainer_PRIVATE *strongSelf = weakSelf; if (strongSelf) { dispatch_semaphore_wait(strongSelf->kitsSemaphore, DISPATCH_TIME_FOREVER); } @@ -1964,7 +1962,7 @@ - (void)removeKitsFromRegistryInvalidForWorkspaceSwitch { } - (void)configureKits:(NSArray *)kitConfigurations { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (MPIsNull(kitConfigurations) || stateMachine.optOut) { [self flushSerializedKits]; diff --git a/mParticle-Apple-SDK/Logger/MPLogger.swift b/mParticle-Apple-SDK/Logger/MPLogger.swift index 1bd34cf1a..b99fa524c 100644 --- a/mParticle-Apple-SDK/Logger/MPLogger.swift +++ b/mParticle-Apple-SDK/Logger/MPLogger.swift @@ -7,32 +7,32 @@ import Foundation -public struct MPLogger { +public struct MPLog { private static func MPLogger(loggerLevel: MPILogLevel, format: String, arguments: any CVarArg...) { if (MParticle.sharedInstance().logLevel.rawValue >= loggerLevel.rawValue && loggerLevel != .none) { - let msg = String.localizedStringWithFormat(format, arguments) + let msg = String.localizedStringWithFormat("mParticle -> \(format)", arguments) if let customLogger = MParticle.sharedInstance().customLogger { customLogger(msg) } else { - NSLog("%@", msg) + NSLog(msg) } } } - public static func MPLogError(format: String, arguments: any CVarArg...) { + public static func error(_ format: String, _ arguments: any CVarArg...) { MPLogger(loggerLevel: .error, format: format, arguments: arguments) } - public static func MPLogWarning(format: String, arguments: any CVarArg...) { + public static func warning(_ format: String, _ arguments: any CVarArg...) { MPLogger(loggerLevel: .warning, format: format, arguments: arguments) } - public static func MPLogDebug(format: String, arguments: any CVarArg...) { + public static func debug(_ format: String, _ arguments: any CVarArg...) { MPLogger(loggerLevel: .debug, format: format, arguments: arguments) } - public static func MPLogVerbose(format: String, arguments: any CVarArg...) { + public static func verbose(_ format: String, _ arguments: any CVarArg...) { MPLogger(loggerLevel: .verbose, format: format, arguments: arguments) } } diff --git a/mParticle-Apple-SDK/MPBackendController.m b/mParticle-Apple-SDK/MPBackendController.m index 4777289d7..f3910b443 100644 --- a/mParticle-Apple-SDK/MPBackendController.m +++ b/mParticle-Apple-SDK/MPBackendController.m @@ -18,21 +18,19 @@ #import "MPUploadBuilder.h" #import "MPILogger.h" #import "MPConsumerInfo.h" -#import "MPResponseConfig.h" #import "MPCommerceEvent.h" #import "MPCommerceEvent+Dictionary.h" #import "MPKitContainer.h" -#import "MPUserAttributeChange.h" -#import "MPUserIdentityChange.h" -#if TARGET_OS_IOS == 1 -#import "MPSearchAdsAttribution.h" -#endif #import "MPURLRequestBuilder.h" #import "MPListenerController.h" -#import "MParticleWebView.h" #import "MPDevice.h" #import "MPIdentityCaching.h" #import "MParticleSwift.h" +#import "MPLaunchInfo.h" +#import "MPNetworkCommunication.h" +#if TARGET_OS_IOS == 1 + #import "MPNotificationController.h" +#endif const NSInteger kNilAttributeValue = 101; const NSInteger kExceededAttributeValueMaximumLength = 104; @@ -52,11 +50,10 @@ - (instancetype)initWithUUID:(NSString *)uuid; @interface MParticle () -@property (nonatomic, strong, nullable) NSArray *deferredKitConfiguration; @property (nonatomic, strong) MPPersistenceController *persistenceController; -@property (nonatomic, strong) MPStateMachine *stateMachine; -@property (nonatomic, strong) MPKitContainer *kitContainer; -@property (nonatomic, strong) MParticleWebView *webView; +@property (nonatomic, strong) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong) MPKitContainer_PRIVATE *kitContainer_PRIVATE; +@property (nonatomic, strong) MParticleWebView_PRIVATE *webView; @property (nonatomic, strong, nullable) NSString *dataPlanId; @property (nonatomic, strong, nullable) NSNumber *dataPlanVersion; + (dispatch_queue_t)messageQueue; @@ -65,7 +62,7 @@ + (void)executeOnMain:(void(^)(void))block; @end -@interface MPBackendController() { +@interface MPBackendController_PRIVATE() { MPAppDelegateProxy *appDelegateProxy; NSTimeInterval nextCleanUpTime; dispatch_semaphore_t backendSemaphore; @@ -86,7 +83,7 @@ @interface MPBackendController() { @end -@implementation MPBackendController +@implementation MPBackendController_PRIVATE @synthesize session = _session; @synthesize uploadInterval = _uploadInterval; @@ -97,9 +94,9 @@ @implementation MPBackendController - (instancetype)initWithDelegate:(id)delegate { self = [super init]; if (self) { - _networkCommunication = [[MPNetworkCommunication alloc] init]; + _networkCommunication = [[MPNetworkCommunication_PRIVATE alloc] init]; #if TARGET_OS_IOS == 1 - _notificationController = [[MPNotificationController alloc] init]; + _notificationController = [[MPNotificationController_PRIVATE alloc] init]; #endif _sessionTimeout = DEFAULT_SESSION_TIMEOUT; nextCleanUpTime = [[NSDate date] timeIntervalSince1970]; @@ -311,7 +308,7 @@ - (void)logUserAttributeChange:(MPUserAttributeChange *)userAttributeChange { [self saveMessage:message updateSession:YES]; } -- (void)logUserIdentityChange:(MPUserIdentityChange *)userIdentityChange { +- (void)logUserIdentityChange:(MPUserIdentityChange_PRIVATE *)userIdentityChange { if (!userIdentityChange) { return; } @@ -363,7 +360,7 @@ - (void)setPreviousSessionSuccessfullyClosed:(NSNumber *)previousSessionSuccessf - (void)processDidFinishLaunching:(NSNotification *)notification { NSString *astType = kMPASTInitKey; NSMutableDictionary *messageInfo = [[NSMutableDictionary alloc] initWithCapacity:3]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; BOOL isInstallOrUpgrade = NO; if (stateMachine.installationType == MPInstallationTypeKnownInstall) { @@ -406,7 +403,7 @@ - (void)processDidFinishLaunching:(NSNotification *)notification { [self saveMessage:message updateSession:YES]; }); - [MPApplication updateStoredVersionAndBuildNumbers]; + [MPApplication_PRIVATE updateStoredVersionAndBuildNumbers]; self.didFinishLaunchingNotification = nil; @@ -444,7 +441,7 @@ - (void)proxyOriginalAppDelegate { } // Add our proxy object to hook calls to the app delegate - UIApplication *application = [MPApplication sharedUIApplication]; + UIApplication *application = [MPApplication_PRIVATE sharedUIApplication]; appDelegateProxy = [[MPAppDelegateProxy alloc] initWithOriginalAppDelegate:application.delegate]; application.delegate = appDelegateProxy; @@ -464,7 +461,7 @@ - (void)unproxyOriginalAppDelegate { return; } - UIApplication *application = [MPApplication sharedUIApplication]; + UIApplication *application = [MPApplication_PRIVATE sharedUIApplication]; if (application.delegate != appDelegateProxy) { MPILogWarning(@"Tried to unproxy the app delegate, but our proxy is no longer in place, application.delegate: %@", application.delegate); return; @@ -504,7 +501,7 @@ - (void)setUserAttributeChange:(MPUserAttributeChange *)userAttributeChange comp NSString *localKey = [userAttributes caseInsensitiveKey:userAttributeChange.key]; NSError *error = nil; - BOOL success = [MPBackendController checkAttribute:userAttributeChange.userAttributes + BOOL success = [MPBackendController_PRIVATE checkAttribute:userAttributeChange.userAttributes key:localKey value:userAttributeChange.value error:&error]; @@ -797,11 +794,11 @@ - (void)setSessionTimeout:(NSTimeInterval)sessionTimeout { - (NSTimeInterval)uploadInterval { if (_uploadInterval == 0.0) { - _uploadInterval = [MPStateMachine environment] == MPEnvironmentDevelopment ? DEFAULT_DEBUG_UPLOAD_INTERVAL : DEFAULT_UPLOAD_INTERVAL; + _uploadInterval = [MPStateMachine_PRIVATE environment] == MPEnvironmentDevelopment ? DEFAULT_DEBUG_UPLOAD_INTERVAL : DEFAULT_UPLOAD_INTERVAL; } // If running in an extension our processor time is extremely limited - if ([MPStateMachine isAppExtension]) { + if ([MPStateMachine_PRIVATE isAppExtension]) { _uploadInterval = 1.0; } return _uploadInterval; @@ -865,7 +862,7 @@ - (void)beginSessionWithIsManual:(BOOL)isManual date:(NSDate *)date { return; } - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; MPPersistenceController *persistence = [MParticle sharedInstance].persistenceController; NSNumber *mpId = [MPPersistenceController mpId]; @@ -878,7 +875,7 @@ - (void)beginSessionWithIsManual:(BOOL)isManual date:(NSDate *)date { // Set the app and device info dicts if they weren't already created if (!_session.appInfo) { - _session.appInfo = [[[MPApplication alloc] init] dictionaryRepresentation]; + _session.appInfo = [[[MPApplication_PRIVATE alloc] init] dictionaryRepresentation]; } if (!_session.deviceInfo) { _session.deviceInfo = [[[MPDevice alloc] init] dictionaryRepresentationWithMpid:mpId]; @@ -1197,7 +1194,7 @@ - (void)logError:(NSString *)message exception:(NSException *)exception topmostC messageInfo[kMPAttributesKey] = eventInfo; } - NSDictionary *appImageInfo = [MPApplication appImageInfo]; + NSDictionary *appImageInfo = [MPApplication_PRIVATE appImageInfo]; if (appImageInfo) { [messageInfo addEntriesFromDictionary:appImageInfo]; } @@ -1443,7 +1440,7 @@ - (MPExecStatus)setSessionAttribute:(MPSession *)session key:(NSString *)key val NSString *localKey = [session.attributesDictionary caseInsensitiveKey:key]; NSError *error = nil; - BOOL success = [MPBackendController checkAttribute:session.attributesDictionary + BOOL success = [MPBackendController_PRIVATE checkAttribute:session.attributesDictionary key:localKey value:value error:&error]; @@ -1461,7 +1458,7 @@ - (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 isAppExtension]) { + if (![MPStateMachine_PRIVATE isAppExtension]) { if (proxyAppDelegate) { [self proxyOriginalAppDelegate]; } @@ -1474,15 +1471,15 @@ - (void)startWithKey:(NSString *)apiKey secret:(NSString *)secret networkOptions if (![MParticle sharedInstance].stateMachine.optOut) { dispatch_async([MParticle messageQueue], ^{ - [[MParticle sharedInstance].kitContainer initializeKits]; + [[MParticle sharedInstance].kitContainer_PRIVATE initializeKits]; }); } - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; stateMachine.apiKey = apiKey; stateMachine.secret = secret; stateMachine.installationType = installationType; - [MPStateMachine setRunningInBackground:NO]; + [MPStateMachine_PRIVATE setRunningInBackground:NO]; BOOL shouldBeginSession = !stateMachine.optOut && MParticle.sharedInstance.shouldBeginSession; NSDate *date = nil; @@ -1501,7 +1498,7 @@ - (void)startWithKey:(NSString *)apiKey secret:(NSString *)secret networkOptions [self prepareBatchesForUpload:lastUploadSettings]; // Delete the cached config - [MPResponseConfig deleteConfig]; + [MPIUserDefaults deleteConfig]; } // Cache the upload settings in case we switch workspaces on startup @@ -1509,7 +1506,7 @@ - (void)startWithKey:(NSString *)apiKey secret:(NSString *)secret networkOptions [[MPIUserDefaults standardUserDefaults] setLastUploadSettings:uploadSettings]; // Restore cached config if exists - [MPResponseConfig restore]; + [MPIUserDefaults restore]; if (shouldBeginSession) { [self beginSessionWithIsManual:!MParticle.sharedInstance.automaticSessionTracking date:date]; @@ -1538,7 +1535,7 @@ - (void)startWithKey:(NSString *)apiKey secret:(NSString *)secret networkOptions #if TARGET_OS_IOS == 1 if (MParticle.sharedInstance.collectSearchAdsAttribution) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(SEARCH_ADS_ATTRIBUTION_GLOBAL_TIMEOUT_SECONDS * NSEC_PER_SEC)), [MParticle messageQueue], searchAdsCompletion); - [stateMachine.searchAttribution requestAttributionDetailsWithBlock:searchAdsCompletion requestsCompleted:0]; + [stateMachine requestAttributionDetailsWithBlock:searchAdsCompletion requestsCompleted:0]; } else { searchAdsCompletion(); } @@ -1554,7 +1551,7 @@ - (void)startWithKey:(NSString *)apiKey secret:(NSString *)secret networkOptions - (void)saveMessage:(MPMessage *)message updateSession:(BOOL)updateSession { NSTimeInterval lastEventTimestamp = message.timestamp ?: [[NSDate date] timeIntervalSince1970]; - if (MPStateMachine.runningInBackground) { + if (MPStateMachine_PRIVATE.runningInBackground) { self.timeOfLastEventInBackground = lastEventTimestamp; } @@ -1586,7 +1583,7 @@ - (void)saveMessage:(MPMessage *)message updateSession:(BOOL)updateSession { } } - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; BOOL shouldUpload = [stateMachine.triggerMessageTypes containsObject:message.messageType]; if (!shouldUpload && stateMachine.triggerEventTypes) { @@ -1632,7 +1629,7 @@ - (MPExecStatus)checkForKitsAndUploadWithCompletionHandler:(void (^ _Nullable)(B return; } - MPKitContainer *kitContainer = [MParticle sharedInstance].kitContainer; + MPKitContainer_PRIVATE *kitContainer = [MParticle sharedInstance].kitContainer_PRIVATE; BOOL shouldDelayUploadForKits = kitContainer && [kitContainer shouldDelayUpload:kMPMaximumKitWaitTimeSeconds]; BOOL shouldDelayUpload = shouldDelayUploadForKits || [MParticle.sharedInstance.webView shouldDelayUpload:kMPMaximumAgentWaitTimeSeconds]; if (shouldDelayUpload) { @@ -1749,25 +1746,25 @@ - (void)setUserIdentity:(NSString *)identityString identityType:(MPUserIdentity) NSAssert(completionHandler != nil, @"completionHandler cannot be nil."); - MPUserIdentityInstance *userIdentityNew = [[MPUserIdentityInstance alloc] initWithType:identityType - value:identityString]; + MPUserIdentityInstance_PRIVATE *newUserIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithType:identityType + value:identityString]; - MPUserIdentityChange *userIdentityChange = [[MPUserIdentityChange alloc] initWithNewUserIdentity:userIdentityNew - userIdentities:[self identitiesForUserId:[MPPersistenceController mpId]]]; + MPUserIdentityChange_PRIVATE *userIdentityChange = [[MPUserIdentityChange_PRIVATE alloc] initWithNewUserIdentity:newUserIdentity + userIdentities:[self identitiesForUserId:[MPPersistenceController mpId]]]; userIdentityChange.timestamp = timestamp; - NSNumber *identityTypeNumber = @(userIdentityChange.userIdentityNew.type); + NSNumber *identityTypeNumber = @(userIdentityChange.newUserIdentity.type); NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF[%@] == %@", kMPUserIdentityTypeKey, identityTypeNumber]; NSDictionary *currentIdentities = [[[self userIdentitiesForUserId:[MPPersistenceController mpId]] filteredArrayUsingPredicate:predicate] lastObject]; BOOL oldIdentityIsValid = currentIdentities && !MPIsNull(currentIdentities[kMPUserIdentityIdKey]); - BOOL newIdentityIsValid = !MPIsNull(userIdentityChange.userIdentityNew.value); + BOOL newIdentityIsValid = !MPIsNull(userIdentityChange.newUserIdentity.value); if (oldIdentityIsValid && newIdentityIsValid - && [currentIdentities[kMPUserIdentityIdKey] isEqualToString:userIdentityChange.userIdentityNew.value]) { + && [currentIdentities[kMPUserIdentityIdKey] isEqualToString:userIdentityChange.newUserIdentity.value]) { completionHandler(identityString, identityType, MPExecStatusFail); return; } @@ -1789,13 +1786,13 @@ - (void)setUserIdentity:(NSString *)identityString identityType:(MPUserIdentity) NSMutableArray *userIdentities = [self userIdentitiesForUserId:[MPPersistenceController mpId]]; - if (userIdentityChange.userIdentityNew.value == nil || (NSNull *)userIdentityChange.userIdentityNew.value == [NSNull null] || [userIdentityChange.userIdentityNew.value isEqualToString:@""]) { + if (userIdentityChange.newUserIdentity.value == nil || (NSNull *)userIdentityChange.newUserIdentity.value == [NSNull null] || [userIdentityChange.newUserIdentity.value isEqualToString:@""]) { existingEntryIndex = [userIdentities indexOfObjectPassingTest:objectTester]; if (existingEntryIndex != NSNotFound) { identityDictionary = [userIdentities[existingEntryIndex] mutableCopy]; - userIdentityChange.userIdentityOld = [[MPUserIdentityInstance alloc] initWithUserIdentityDictionary:identityDictionary]; - userIdentityChange.userIdentityNew = nil; + userIdentityChange.oldUserIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithUserIdentityDictionary:identityDictionary]; + userIdentityChange.newUserIdentity = nil; [userIdentities removeObjectAtIndex:existingEntryIndex]; persistUserIdentities = YES; @@ -1804,21 +1801,21 @@ - (void)setUserIdentity:(NSString *)identityString identityType:(MPUserIdentity) existingEntryIndex = [userIdentities indexOfObjectPassingTest:objectTester]; if (existingEntryIndex == NSNotFound) { - userIdentityChange.userIdentityNew.dateFirstSet = [NSDate date]; - userIdentityChange.userIdentityNew.isFirstTimeSet = YES; + userIdentityChange.newUserIdentity.dateFirstSet = [NSDate date]; + userIdentityChange.newUserIdentity.isFirstTimeSet = YES; - identityDictionary = [userIdentityChange.userIdentityNew dictionaryRepresentation]; + identityDictionary = [userIdentityChange.newUserIdentity dictionaryRepresentation]; [userIdentities addObject:identityDictionary]; } else { currentIdentities = userIdentities[existingEntryIndex]; - userIdentityChange.userIdentityOld = [[MPUserIdentityInstance alloc] initWithUserIdentityDictionary:currentIdentities]; + userIdentityChange.oldUserIdentity = [[MPUserIdentityInstance_PRIVATE alloc] initWithUserIdentityDictionary:currentIdentities]; NSNumber *timeIntervalMilliseconds = currentIdentities[kMPDateUserIdentityWasFirstSet]; - userIdentityChange.userIdentityNew.dateFirstSet = timeIntervalMilliseconds != nil ? [NSDate dateWithTimeIntervalSince1970:([timeIntervalMilliseconds doubleValue] / 1000.0)] : [NSDate date]; - userIdentityChange.userIdentityNew.isFirstTimeSet = NO; + userIdentityChange.newUserIdentity.dateFirstSet = timeIntervalMilliseconds != nil ? [NSDate dateWithTimeIntervalSince1970:([timeIntervalMilliseconds doubleValue] / 1000.0)] : [NSDate date]; + userIdentityChange.newUserIdentity.isFirstTimeSet = NO; - identityDictionary = [userIdentityChange.userIdentityNew dictionaryRepresentation]; + identityDictionary = [userIdentityChange.newUserIdentity dictionaryRepresentation]; [userIdentities replaceObjectAtIndex:existingEntryIndex withObject:identityDictionary]; } @@ -1836,7 +1833,7 @@ - (void)setUserIdentity:(NSString *)identityString identityType:(MPUserIdentity) } } - completionHandler(userIdentityChange.userIdentityNew.value, userIdentityChange.userIdentityNew.type, MPExecStatusSuccess); + completionHandler(userIdentityChange.newUserIdentity.value, userIdentityChange.newUserIdentity.type, MPExecStatusSuccess); } - (void)clearUserAttributes { @@ -1864,7 +1861,7 @@ - (MPExecStatus)beginLocationTrackingWithAccuracy:(CLLocationAccuracy)accuracy d - (MPExecStatus)endLocationTracking { [MPListenerController.sharedInstance onAPICalled:_cmd]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if ([stateMachine.locationTrackingMode isEqualToString:kMPRemoteConfigForceTrue]) { return MPExecStatusEnabledRemotely; } @@ -1876,11 +1873,11 @@ - (MPExecStatus)endLocationTracking { } #endif -- (MPNotificationController *)notificationController { +- (MPNotificationController_PRIVATE *)notificationController { return _notificationController; } -- (void)setNotificationController:(MPNotificationController *)notificationController { +- (void)setNotificationController:(MPNotificationController_PRIVATE *)notificationController { _notificationController = notificationController; } @@ -1936,7 +1933,7 @@ - (void)logUserNotification:(MParticleUserNotification *)userNotification { kMPPushMessageTypeKey:userNotification.type} mutableCopy]; - NSString *tokenString = [MPIUserDefaults stringFromDeviceToken:[MPNotificationController deviceToken]]; + NSString *tokenString = [MPIUserDefaults stringFromDeviceToken:[MPNotificationController_PRIVATE deviceToken]]; if (tokenString) { messageInfo[kMPDeviceTokenKey] = tokenString; } @@ -1974,13 +1971,13 @@ - (void)logUserNotification:(MParticleUserNotification *)userNotification { #pragma mark Background Task - (void)beginBackgroundTask { - if ([MPStateMachine isAppExtension]) { + if ([MPStateMachine_PRIVATE isAppExtension]) { return; } [MParticle executeOnMain:^{ if (self.backendBackgroundTaskIdentifier == UIBackgroundTaskInvalid) { - self.backendBackgroundTaskIdentifier = [[MPApplication sharedUIApplication] beginBackgroundTaskWithExpirationHandler:^{ + self.backendBackgroundTaskIdentifier = [[MPApplication_PRIVATE sharedUIApplication] beginBackgroundTaskWithExpirationHandler:^{ MPILogDebug(@"SDK has ended background activity together with the app."); [self endBackgroundTask]; }]; @@ -1989,13 +1986,13 @@ - (void)beginBackgroundTask { } - (void)endBackgroundTask { - if ([MPStateMachine isAppExtension]) { + if ([MPStateMachine_PRIVATE isAppExtension]) { return; } [MParticle executeOnMain:^{ if (self.backendBackgroundTaskIdentifier != UIBackgroundTaskInvalid) { - [[MPApplication sharedUIApplication] endBackgroundTask:self.backendBackgroundTaskIdentifier]; + [[MPApplication_PRIVATE sharedUIApplication] endBackgroundTask:self.backendBackgroundTaskIdentifier]; self.backendBackgroundTaskIdentifier = UIBackgroundTaskInvalid; } }]; @@ -2078,7 +2075,7 @@ - (void)handleApplicationDidEnterBackground:(NSNotification *)notification { MPILogVerbose(@"Application Did Enter Background"); NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970]; - [MPStateMachine setRunningInBackground:YES]; + [MPStateMachine_PRIVATE setRunningInBackground:YES]; [self beginBackgroundTask]; [MParticle executeOnMessage:^{ @@ -2114,7 +2111,7 @@ - (void)cancelBackgroundTimeCheckLoop { } - (void)beginBackgroundTimeCheckLoop { - if ([MPStateMachine isAppExtension]) { + if ([MPStateMachine_PRIVATE isAppExtension]) { return; } @@ -2128,12 +2125,12 @@ - (void)beginBackgroundTimeCheckLoop { UIApplicationState (^getApplicationState)(void) = ^UIApplicationState(void) { __block UIApplicationState appState; dispatch_sync(dispatch_get_main_queue(), ^{ - appState = [MPApplication sharedUIApplication].applicationState; + appState = [MPApplication_PRIVATE sharedUIApplication].applicationState; }); return appState; }; - UIApplication *sharedApplication = [MPApplication sharedUIApplication]; + UIApplication *sharedApplication = [MPApplication_PRIVATE sharedUIApplication]; UIApplicationState applicationState = getApplicationState(); // Loop to check the background state and time remaining to decide when to upload @@ -2171,7 +2168,7 @@ - (void)beginBackgroundTimeCheckLoop { } - (void)handleApplicationWillEnterForeground:(NSNotification *)notification { - [MPStateMachine setRunningInBackground:NO]; + [MPStateMachine_PRIVATE setRunningInBackground:NO]; [self cancelBackgroundTimeCheckLoop]; diff --git a/mParticle-Apple-SDK/MPConstants.swift b/mParticle-Apple-SDK/MPConstants.swift new file mode 100644 index 000000000..ba3fc0f3f --- /dev/null +++ b/mParticle-Apple-SDK/MPConstants.swift @@ -0,0 +1,167 @@ +// +// MPConstants.swift +// mParticle-Apple-SDK +// +// Created by Ben Baron on 12/3/24. +// +// NOTE: This will temporarily duplicate values from MPIConstants.h to prevent +// the need to make all our internal constants public during porting +// + +func MPMilliseconds(timestamp: Double) -> Double { + return trunc(timestamp * 1000.0) +} + +// NOTE: I kept the same naming here for clarity, but we should rename these +// after we remove them from the MPIConstants.h file + +let kMParticleSDKVersion = "8.27.4" + +struct MessageKeys { + static let kMPMessagesKey = "msgs" + static let kMPMessageIdKey = "id" + static let kMPMessageUserIdKey = "mpid" + static let kMPTimestampKey = "ct" + static let kMPSessionIdKey = "sid" + static let kMPSessionStartTimestamp = "sct" + static let kMPEventStartTimestamp = "est" + static let kMPEventLength = "el" + static let kMPEventNameKey = "n" + static let kMPEventTypeKey = "et" + static let kMPEventLengthKey = "el" + static let kMPAttributesKey = "attrs" + static let kMPLocationKey = "lc" + static let kMPUserAttributeKey = "ua" + static let kMPUserAttributeDeletedKey = "uad" + static let kMPEventTypePageView = "pageview" + static let kMPUserIdentityArrayKey = "ui" + static let kMPUserIdentityIdKey = "i" + static let kMPUserIdentityTypeKey = "n" + static let kMPUserIdentitySharedGroupIdentifier = "sgi" + static let kMPAppStateTransitionType = "t" + static let kMPEventTagsKey = "tags" + static let kMPLeaveBreadcrumbsKey = "l" + static let kMPOptOutKey = "oo" + static let kMPDateUserIdentityWasFirstSet = "dfs" + static let kMPIsFirstTimeUserIdentityHasBeenSet = "f" + static let kMPRemoteNotificationContentIdHistoryKey = "cntid" + static let kMPRemoteNotificationTimestampHistoryKey = "ts" + static let kMPForwardStatsRecord = "fsr" + static let kMPEventCustomFlags = "flags" + static let kMPContextKey = "ctx" + static let kMPDataPlanKey = "dpln" + static let kMPDataPlanIdKey = "id" + static let kMPDataPlanVersionKey = "v" +} + +struct RemoteConfig { + static let kMPRemoteConfigExceptionHandlingModeKey = "cue" + static let kMPRemoteConfigExceptionHandlingModeAppDefined = "appdefined" + static let kMPRemoteConfigExceptionHandlingModeForce = "forcecatch" + static let kMPRemoteConfigExceptionHandlingModeIgnore = "forceignore" + static let kMPRemoteConfigCrashMaxPLReportLength = "crml" + static let kMPRemoteConfigAppDefined = "appdefined" + static let kMPRemoteConfigForceTrue = "forcetrue" + static let kMPRemoteConfigForceFalse = "forcefalse" + static let kMPRemoteConfigKitsKey = "eks" + static let kMPRemoteConfigKitHashesKey = "hs" + static let kMPRemoteConfigConsumerInfoKey = "ci" + static let kMPRemoteConfigCookiesKey = "ck" + static let kMPRemoteConfigMPIDKey = "mpid" + static let kMPRemoteConfigCustomModuleSettingsKey = "cms" + static let kMPRemoteConfigCustomModuleIdKey = "id" + static let kMPRemoteConfigCustomModulePreferencesKey = "pr" + static let kMPRemoteConfigCustomModuleLocationKey = "f" + static let kMPRemoteConfigCustomModulePreferenceSettingsKey = "ps" + static let kMPRemoteConfigCustomModuleReadKey = "k" + static let kMPRemoteConfigCustomModuleDataTypeKey = "t" + static let kMPRemoteConfigCustomModuleWriteKey = "n" + static let kMPRemoteConfigCustomModuleDefaultKey = "d" + static let kMPRemoteConfigCustomSettingsKey = "cs" + static let kMPRemoteConfigSandboxModeKey = "dbg" + static let kMPRemoteConfigSessionTimeoutKey = "stl" + static let kMPRemoteConfigPushNotificationDictionaryKey = "pn" + static let kMPRemoteConfigPushNotificationModeKey = "pnm" + static let kMPRemoteConfigPushNotificationTypeKey = "rnt" + static let kMPRemoteConfigLocationKey = "lct" + static let kMPRemoteConfigLocationModeKey = "ltm" + static let kMPRemoteConfigLocationAccuracyKey = "acc" + static let kMPRemoteConfigLocationMinimumDistanceKey = "mdf" + static let kMPRemoteConfigRampKey = "rp" + static let kMPRemoteConfigTriggerKey = "tri" + static let kMPRemoteConfigTriggerEventsKey = "evts" + static let kMPRemoteConfigTriggerMessageTypesKey = "dts" + static let kMPRemoteConfigUniqueIdentifierKey = "das" + static let kMPRemoteConfigBracketKey = "bk" + static let kMPRemoteConfigRestrictIDFA = "rdlat" + static let kMPRemoteConfigAliasMaxWindow = "alias_max_window" + static let kMPRemoteConfigAllowASR = "iasr" + static let kMPRemoteConfigExcludeAnonymousUsersKey = "eau" + static let kMPRemoteConfigDirectURLRouting = "dur" + static let kMPRemoteConfigDataPlanningResults = "dpr" + static let kMPRemoteConfigDataPlanning = "dtpn" + static let kMPRemoteConfigDataPlanningBlock = "blok" + static let kMPRemoteConfigDataPlanningBlockUnplannedEvents = "ev" + static let kMPRemoteConfigDataPlanningBlockUnplannedEventAttributes = "ea" + static let kMPRemoteConfigDataPlanningBlockUnplannedUserAttributes = "ua" + static let kMPRemoteConfigDataPlanningBlockUnplannedIdentities = "id" + static let kMPRemoteConfigDataPlanningDataPlanId = "dpid" + static let kMPRemoteConfigDataPlanningDataPlanVersion = "dpvn" + static let kMPRemoteConfigDataPlanningDataPlanError = "error" + static let kMPRemoteConfigDataPlanningDataPlanVersionValue = "vers" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueDoc = "version_document" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueDataPoints = "data_points" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueMatch = "match" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueType = "type" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueValidator = "validator" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueDefinition = "definition" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueAdditionalProperties = "additionalProperties" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueUserAttributes = "user_attributes" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueCustomEvent = "custom_event" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueCustomEventType = "custom_event_type" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueEventName = "event_name" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueScreenView = "screen_view" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueScreenName = "screen_name" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueProductAction = "product_action" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueUnknown = "unknown" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueAddToCart = "add_to_cart" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueRemoveFromCart = "remove_from_cart" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueCheckout = "checkout" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueCheckoutOption = "checkout_option" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueClick = "click" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueViewDetail = "view_detail" + static let kMPRemoteConfigDataPlanningDataPlanVersionValuePurchase = "purchase" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueRefund = "refund" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueAddToWishlist = "add_to_wishlist" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueRemoveFromWishlist = "remove_from_wish_list" + static let kMPRemoteConfigDataPlanningDataPlanVersionValuePromotionAction = "promotion_action" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueProductImpressions = "product_impressions" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueCriteria = "criteria" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueAction = "action" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueImpressionUnknown = "unknown" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueImpressionView = "view" + static let kMPRemoteConfigDataPlanningDataPlanVersionValueImpressionClick = "click" +} + +struct ConsentFiltering { + static let kMPConsentKitFilter = "crvf" + static let kMPConsentKitFilterIncludeOnMatch = "i" + static let kMPConsentKitFilterItems = "v" + static let kMPConsentKitFilterItemConsented = "c" + static let kMPConsentKitFilterItemHash = "h" + static let kMPConsentRegulationFilters = "reg" + static let kMPConsentPurposeFilters = "pur" + static let kMPConsentGDPRRegulationType = "1" + static let kMPConsentCCPARegulationType = "2" + static let kMPConsentCCPAPurposeName = "data_sale_opt_out" +} + +struct Notifications { + static let kMPCrashReportOccurredNotification = Notification.Name("MPCrashReportOccurredNotification") + static let kMPConfigureExceptionHandlingNotification = Notification.Name("MPConfigureExceptionHandlingNotification") + static let kMPUserNotificationDictionaryKey = Notification.Name("MPUserNotificationDictionaryKey") + static let kMPUserNotificationActionKey = Notification.Name("MPUserNotificationActionKey") + static let kMPRemoteNotificationDeviceTokenNotification = Notification.Name("MPRemoteNotificationDeviceTokenNotification") + static let kMPRemoteNotificationDeviceTokenKey = Notification.Name("MPRemoteNotificationDeviceTokenKey") + static let kMPRemoteNotificationOldDeviceTokenKey = Notification.Name("MPRemoteNotificationOldDeviceTokenKey") +} diff --git a/mParticle-Apple-SDK/Utils/MPStateMachine.m b/mParticle-Apple-SDK/MPStateMachine.m similarity index 83% rename from mParticle-Apple-SDK/Utils/MPStateMachine.m rename to mParticle-Apple-SDK/MPStateMachine.m index adb58fa40..ee20dceb9 100644 --- a/mParticle-Apple-SDK/Utils/MPStateMachine.m +++ b/mParticle-Apple-SDK/MPStateMachine.m @@ -10,18 +10,19 @@ #import "MPConsumerInfo.h" #import "MPPersistenceController.h" #import "MPKitContainer.h" -#if TARGET_OS_IOS == 1 -#import "MPSearchAdsAttribution.h" -#endif #import #import "MPForwardQueueParameters.h" #import "MPDataPlanFilter.h" #import "MParticleSwift.h" +#import "MPLaunchInfo.h" +#import "MParticleReachability.h" +#import "MPIConstants.h" #if TARGET_OS_IOS == 1 #ifndef MPARTICLE_LOCATION_DISABLE #import #endif +#import #endif static NSString *const kCookieDateKey = @"e"; @@ -35,8 +36,7 @@ @interface MParticle () + (dispatch_queue_t)messageQueue; @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, readwrite) MPDataPlanOptions *dataPlanOptions; @property (nonatomic, readwrite) MPDataPlanFilter *dataPlanFilter; @@ -47,7 +47,7 @@ - (void)setIdentity:(NSString *)identityString identityType:(MPIdentity)identity @end -@interface MPStateMachine() { +@interface MPStateMachine_PRIVATE() { BOOL optOutSet; dispatch_queue_t messageQueue; } @@ -55,11 +55,12 @@ @interface MPStateMachine() { @property (nonatomic) MParticleNetworkStatus networkStatus; @property (nonatomic, strong) NSString *storedSDKVersion; @property (nonatomic, strong) MParticleReachability *reachability; +@property (nonatomic) MPUploadStatus uploadStatus; @end -@implementation MPStateMachine +@implementation MPStateMachine_PRIVATE @synthesize consumerInfo = _consumerInfo; @synthesize deviceTokenType = _deviceTokenType; @@ -100,9 +101,6 @@ - (instancetype)init { _launchDate = [NSDate date]; _launchOptions = nil; _logLevel = MPILogLevelNone; -#if TARGET_OS_IOS == 1 - _searchAttribution = [[MPSearchAdsAttribution alloc] init]; -#endif NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; @@ -133,8 +131,8 @@ - (instancetype)init { name:MParticleReachabilityChangedNotification object:nil]; - [MPApplication markInitialLaunchTime]; - [MPApplication updateLaunchCountsAndDates]; + [MPApplication_PRIVATE markInitialLaunchTime]; + [MPApplication_PRIVATE updateLaunchCountsAndDates]; }); } @@ -223,7 +221,7 @@ + (MPEnvironment)getEnvironment { if (isDebuggerRunning) { environment = MPEnvironmentDevelopment; } else { - NSString *provisioningProfileString = [MPStateMachine provisioningProfileString]; + NSString *provisioningProfileString = [MPStateMachine_PRIVATE provisioningProfileString]; environment = provisioningProfileString ? MPEnvironmentDevelopment : MPEnvironmentProduction; } #endif @@ -255,7 +253,7 @@ - (void)resetTriggers { #pragma mark Notification handlers - (void)handleApplicationDidEnterBackground:(NSNotification *)notification { - [MPApplication updateLastUseDate:_launchDate]; + [MPApplication_PRIVATE updateLastUseDate:_launchDate]; _backgrounded = YES; self.launchInfo = nil; } @@ -265,7 +263,7 @@ - (void)handleApplicationWillEnterForeground:(NSNotification *)notification { } - (void)handleApplicationWillTerminate:(NSNotification *)notification { - [MPApplication updateLastUseDate:_launchDate]; + [MPApplication_PRIVATE updateLastUseDate:_launchDate]; } - (void)handleReachabilityChanged:(NSNotification *)notification { @@ -279,7 +277,7 @@ + (MPEnvironment)environment { return runningEnvironment; } - runningEnvironment = [MPStateMachine getEnvironment]; + runningEnvironment = [MPStateMachine_PRIVATE getEnvironment]; return runningEnvironment; } @@ -364,7 +362,7 @@ - (NSString *)deviceTokenType { [self willChangeValueForKey:@"deviceTokenType"]; _deviceTokenType = @""; - NSString *provisioningProfileString = [MPStateMachine provisioningProfileString]; + NSString *provisioningProfileString = [MPStateMachine_PRIVATE provisioningProfileString]; if (provisioningProfileString) { NSRange range = [provisioningProfileString rangeOfString:@"aps-environmentproduction"]; @@ -395,7 +393,7 @@ - (MPInstallationType)installationType { [self willChangeValueForKey:@"installationType"]; - MPApplication *application = [[MPApplication alloc] init]; + MPApplication_PRIVATE *application = [[MPApplication_PRIVATE alloc] init]; if (application.storedVersion || application.storedBuild) { if (![application.version isEqualToString:application.storedVersion] || ![application.build isEqualToString:application.storedBuild]) { _installationType = MPInstallationTypeKnownUpgrade; @@ -579,7 +577,7 @@ - (void)setAttAuthorizationStatus:(NSNumber *)authorizationState { if (authorizationState.integerValue != MPATTAuthorizationStatusAuthorized) { NSArray *users = [MParticle sharedInstance].identity.getAllUsers; for (MParticleUser *user in users) { - [user setIdentity:NULL identityType:MPIdentityIOSAdvertiserId]; + [user setIdentity:nil identityType:MPIdentityIOSAdvertiserId]; } } } @@ -765,4 +763,66 @@ - (void)configureDataBlocking:(nullable NSDictionary *)blockSettings { } } +- (void)requestAttributionDetailsWithBlock:(void (^ _Nonnull)(void))completionHandler requestsCompleted:(int)requestsCompleted { +#if TARGET_OS_IOS == 1 + NSError *error; + if (@available(iOS 14.3, *)) { + NSString *attributionToken = [AAAttribution attributionTokenWithError:&error]; + if (!attributionToken) { + completionHandler(); + return; + } + + if (attributionToken) { + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api-adservices.apple.com/api/v1/"]]; + [request setHTTPMethod:@"POST"]; + [request setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"]; + [request setHTTPBody:[attributionToken dataUsingEncoding:NSUTF8StringEncoding]]; + + NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; + sessionConfiguration.timeoutIntervalForRequest = 30; + sessionConfiguration.timeoutIntervalForResource = 30; + NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:sessionConfiguration + delegate:nil + delegateQueue:nil]; + dispatch_async([MParticle messageQueue], ^{ + [urlSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *urlResponse, NSError *error) { + if (error) { + MPILogError(@"Failed requesting Ads Attribution with error: %@.", [error localizedDescription]); + if (error.code == 1 /* ADClientErrorLimitAdTracking */) { + completionHandler(); + } else if ((requestsCompleted + 1) > SEARCH_ADS_ATTRIBUTION_MAX_RETRIES) { + completionHandler(); + } else { + // Per Apple docs, "Handle any errors you receive and re-poll for data, if required" + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(SEARCH_ADS_ATTRIBUTION_DELAY_BEFORE_RETRY * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self requestAttributionDetailsWithBlock:completionHandler requestsCompleted:(requestsCompleted + 1)]; + }); + } + } else { + NSDictionary *adAttributionDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + // Convert the dictionary to the prior format expected by our backend + NSDictionary *finalAttributionDictionary = @{ + @"Version4.0": @{ + @"iad-attribution": adAttributionDictionary[@"attribution"], + @"iad-org-id": [adAttributionDictionary[@"orgId"] stringValue], + @"iad-campaign-id": [adAttributionDictionary[@"campaignId"] stringValue], + @"iad-conversion-type": adAttributionDictionary[@"conversionType"], + @"iad-click-date": adAttributionDictionary[@"clickDate"], + @"iad-adgroup-id": [adAttributionDictionary[@"adGroupId"] stringValue], + @"iad-country-or-region": adAttributionDictionary[@"countryOrRegion"], + @"iad-keyword-id": [adAttributionDictionary[@"keywordId"] stringValue], + @"iad-ad-id": [adAttributionDictionary[@"adId"] stringValue], + } + }; + self.searchAdsInfo = [[finalAttributionDictionary mutableCopy] copy]; + completionHandler(); + } + }]; + }); + } + } +#endif +} + @end diff --git a/mParticle-Apple-SDK/Network/MPNetworkCommunication.m b/mParticle-Apple-SDK/Network/MPNetworkCommunication.m index a00b76743..de97c85b5 100644 --- a/mParticle-Apple-SDK/Network/MPNetworkCommunication.m +++ b/mParticle-Apple-SDK/Network/MPNetworkCommunication.m @@ -3,7 +3,6 @@ #import "MPSession.h" #import #import "MPConnector.h" -#import "MPStateMachine.h" #import "MPUpload.h" #import "MPDevice.h" #import "MPApplication.h" @@ -21,11 +20,11 @@ #import "MPIdentityDTO.h" #import "MPIConstants.h" #import "MPAliasResponse.h" -#import "MPResponseConfig.h" #import "MPURL.h" #import "MPConnectorFactoryProtocol.h" #import "MPIdentityCaching.h" #import "MParticleSwift.h" +#import "MPNetworkCommunication.h" NSString *const urlFormat = @"%@://%@/%@/%@%@"; // Scheme, URL Host, API Version, API key, path NSString *const urlFormatOverride = @"%@://%@/%@%@"; // Scheme, URL Host, API key, path @@ -61,7 +60,9 @@ @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong, readonly) MPBackendController_PRIVATE *backendController; + - (void)logKitBatch:(NSString *)batch; @end @@ -80,14 +81,14 @@ - (instancetype)initWithCode:(MPIdentityErrorResponseCode) code message: (NSStri @end -@interface MPNetworkCommunication() +@interface MPNetworkCommunication_PRIVATE() @property (nonatomic, strong) NSString *context; @property (nonatomic) BOOL identifying; @end -@implementation MPNetworkCommunication +@implementation MPNetworkCommunication_PRIVATE @synthesize configURL = _configURL; @synthesize identifyURL = _identifyURL; @@ -123,7 +124,7 @@ - (NSString *)defaultHostWithSubdomain:(NSString *)subdomain apiKey:(NSString *) } - (NSString *)defaultEventHost { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.attAuthorizationStatus.integerValue == MPATTAuthorizationStatusAuthorized) { return [self defaultHostWithSubdomain:kMPURLHostEventTrackingSubdomain apiKey:stateMachine.apiKey enableDirectRouting:stateMachine.enableDirectRouting]; } else { @@ -132,7 +133,7 @@ - (NSString *)defaultEventHost { } - (NSString *)defaultIdentityHost { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.attAuthorizationStatus.integerValue == MPATTAuthorizationStatusAuthorized) { return [self defaultHostWithSubdomain:kMPURLHostIdentityTrackingSubdomain apiKey:stateMachine.apiKey enableDirectRouting:stateMachine.enableDirectRouting]; } else { @@ -145,8 +146,8 @@ - (MPURL *)configURL { return _configURL; } - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; - MPApplication *application = [[MPApplication alloc] init]; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; + MPApplication_PRIVATE *application = [[MPApplication_PRIVATE alloc] init]; NSString *configHost = [MParticle sharedInstance].networkOptions.configHost ?: kMPURLHostConfig; NSString *dataPlanConfigString; @@ -240,7 +241,7 @@ - (MPURL *)logoutURL { } - (MPURL *)identityURL:(NSString *)pathComponent { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSString *identityHost; if ([MParticle sharedInstance].networkOptions.identityTrackingHost && stateMachine.attAuthorizationStatus.integerValue == MPATTAuthorizationStatusAuthorized) { identityHost = [MParticle sharedInstance].networkOptions.identityTrackingHost; @@ -270,7 +271,7 @@ - (MPURL *)identityURL:(NSString *)pathComponent { - (MPURL *)modifyURL { NSString *pathComponent = @"modify"; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; NSString *identityHost; if ([MParticle sharedInstance].networkOptions.identityTrackingHost && stateMachine.attAuthorizationStatus.integerValue == MPATTAuthorizationStatusAuthorized) { identityHost = [MParticle sharedInstance].networkOptions.identityTrackingHost; @@ -407,8 +408,8 @@ - (NSNumber *)maxAgeForCache:(nonnull NSString *)cache { #pragma mark Public methods - (NSObject *_Nonnull)makeConnector { - if (MPNetworkCommunication.connectorFactory) { - return [MPNetworkCommunication.connectorFactory createConnector]; + if (MPNetworkCommunication_PRIVATE.connectorFactory) { + return [MPNetworkCommunication_PRIVATE.connectorFactory createConnector]; } return [[MPConnector alloc] init]; } @@ -427,10 +428,10 @@ - (void)requestConfig:(nullable NSObject *)connector withCo __block UIBackgroundTaskIdentifier backgroundTaskIdentifier = UIBackgroundTaskInvalid; - if (![MPStateMachine isAppExtension]) { - backgroundTaskIdentifier = [[MPApplication sharedUIApplication] beginBackgroundTaskWithExpirationHandler:^{ + if (![MPStateMachine_PRIVATE isAppExtension]) { + backgroundTaskIdentifier = [[MPApplication_PRIVATE sharedUIApplication] beginBackgroundTaskWithExpirationHandler:^{ if (backgroundTaskIdentifier != UIBackgroundTaskInvalid) { - [[MPApplication sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; + [[MPApplication_PRIVATE sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; backgroundTaskIdentifier = UIBackgroundTaskInvalid; } }]; @@ -447,9 +448,9 @@ - (void)requestConfig:(nullable NSObject *)connector withCo NSString *ageString = httpResponse.allHeaderFields[kMPHTTPAgeHeaderKey]; NSNumber *maxAge = [self maxAgeForCache:cacheControl]; - if (![MPStateMachine isAppExtension]) { + if (![MPStateMachine_PRIVATE isAppExtension]) { if (backgroundTaskIdentifier != UIBackgroundTaskInvalid) { - [[MPApplication sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; + [[MPApplication_PRIVATE sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; backgroundTaskIdentifier = UIBackgroundTaskInvalid; } } @@ -494,7 +495,7 @@ - (void)requestConfig:(nullable NSObject *)connector withCo NSDictionary *headersDictionary = [httpResponse allHeaderFields]; NSString *eTag = headersDictionary[kMPHTTPETagHeaderKey]; if (!MPIsNull(eTag)) { - MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configurationDictionary dataReceivedFromServer:YES]; + MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configurationDictionary dataReceivedFromServer:YES stateMachine:[MParticle sharedInstance].stateMachine backendController:[MParticle sharedInstance].backendController]; MPILogDebug(@"MPResponseConfig init: %@", responseConfig.description); MPIUserDefaults *userDefaults = [MPIUserDefaults standardUserDefaults]; @@ -597,7 +598,7 @@ - (BOOL)performMessageUpload:(MPUpload *)upload { if (responseDictionary && serializationError == nil && [responseDictionary[kMPMessageTypeKey] isEqualToString:kMPMessageTypeResponseHeader]) { - [MPNetworkCommunication parseConfiguration:responseDictionary]; + [MPNetworkCommunication_PRIVATE parseConfiguration:responseDictionary]; } MPILogVerbose(@"Upload complete: %@\n", uploadString); @@ -719,10 +720,10 @@ - (BOOL)performAliasUpload:(MPUpload *)upload { - (void)upload:(NSArray *)uploads completionHandler:(MPUploadsCompletionHandler)completionHandler { __block UIBackgroundTaskIdentifier backgroundTaskIdentifier = UIBackgroundTaskInvalid; - if (![MPStateMachine isAppExtension]) { - backgroundTaskIdentifier = [[MPApplication sharedUIApplication] beginBackgroundTaskWithExpirationHandler:^{ + if (![MPStateMachine_PRIVATE isAppExtension]) { + backgroundTaskIdentifier = [[MPApplication_PRIVATE sharedUIApplication] beginBackgroundTaskWithExpirationHandler:^{ if (backgroundTaskIdentifier != UIBackgroundTaskInvalid) { - [[MPApplication sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; + [[MPApplication_PRIVATE sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; backgroundTaskIdentifier = UIBackgroundTaskInvalid; } }]; @@ -743,9 +744,9 @@ - (void)upload:(NSArray *)uploads completionHandler:(MPUploadsComple } } - if (![MPStateMachine isAppExtension]) { + if (![MPStateMachine_PRIVATE isAppExtension]) { if (backgroundTaskIdentifier != UIBackgroundTaskInvalid) { - [[MPApplication sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; + [[MPApplication_PRIVATE sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; backgroundTaskIdentifier = UIBackgroundTaskInvalid; } } @@ -840,12 +841,12 @@ - (void)identityApiRequestWithURL:(NSURL*)url identityRequest:(MPIdentityHTTPBas if (!usedCachedResponse) { __block UIBackgroundTaskIdentifier backgroundTaskIdentifier = UIBackgroundTaskInvalid; - if (![MPStateMachine isAppExtension]) { - backgroundTaskIdentifier = [[MPApplication sharedUIApplication] beginBackgroundTaskWithExpirationHandler:^{ + if (![MPStateMachine_PRIVATE isAppExtension]) { + backgroundTaskIdentifier = [[MPApplication_PRIVATE sharedUIApplication] beginBackgroundTaskWithExpirationHandler:^{ if (backgroundTaskIdentifier != UIBackgroundTaskInvalid) { self.identifying = NO; - [[MPApplication sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; + [[MPApplication_PRIVATE sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; backgroundTaskIdentifier = UIBackgroundTaskInvalid; } }]; @@ -861,9 +862,9 @@ - (void)identityApiRequestWithURL:(NSURL*)url identityRequest:(MPIdentityHTTPBas error = response.error; NSHTTPURLResponse *httpResponse = response.httpResponse; - if (![MPStateMachine isAppExtension]) { + if (![MPStateMachine_PRIVATE isAppExtension]) { if (backgroundTaskIdentifier != UIBackgroundTaskInvalid) { - [[MPApplication sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; + [[MPApplication_PRIVATE sharedUIApplication] endBackgroundTask:backgroundTaskIdentifier]; backgroundTaskIdentifier = UIBackgroundTaskInvalid; } } diff --git a/mParticle-Apple-SDK/Network/MPURLRequestBuilder.m b/mParticle-Apple-SDK/Network/MPURLRequestBuilder.m index b3c469c6f..cca4ffa24 100644 --- a/mParticle-Apple-SDK/Network/MPURLRequestBuilder.m +++ b/mParticle-Apple-SDK/Network/MPURLRequestBuilder.m @@ -1,6 +1,5 @@ #import "MPURLRequestBuilder.h" #import -#import "MPStateMachine.h" #import "MPIConstants.h" #import #import "MPIUserDefaults.h" @@ -8,16 +7,16 @@ #import "MPExtensionProtocol.h" #import "MPILogger.h" #import "MPApplication.h" -#import "MParticleWebView.h" #import "MPURL.h" +#import "mParticle.h" +#import "MParticleSwift.h" static NSDateFormatter *RFC1123DateFormatter; @interface MParticle () -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; -@property (nonatomic, strong, readonly) MParticleWebView *webView; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong, readonly) MParticleWebView_PRIVATE *webView; @end @@ -82,7 +81,7 @@ - (NSString *)hmacSha256Encode:(NSString *const)message key:(NSString *const)key - (NSString *)userAgent { BOOL isConfig = [[_url.defaultURL relativePath] rangeOfString:@"/config"].location != NSNotFound; if (isConfig) { - return MParticle.sharedInstance.webView.originalDefaultAgent; + return MParticle.sharedInstance.webView.originalDefaultUserAgent; } return MParticle.sharedInstance.webView.userAgent; } @@ -153,7 +152,7 @@ - (NSMutableURLRequest *)build { if (_SDKURLRequest || isIdentityRequest) { NSString *deviceLocale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier]; - MPKitContainer *kitContainer = !isIdentityRequest ? [MParticle sharedInstance].kitContainer : nil; + MPKitContainer_PRIVATE *kitContainer = !isIdentityRequest ? [MParticle sharedInstance].kitContainer_PRIVATE : nil; NSArray *supportedKits = [kitContainer supportedKits]; NSString *contentType = nil; NSString *kits = nil; @@ -179,7 +178,7 @@ - (NSMutableURLRequest *)build { kits = nil; } - kits = [MParticle.sharedInstance.kitContainer.configuredKitsRegistry componentsJoinedByString:@","]; + kits = [MParticle.sharedInstance.kitContainer_PRIVATE.configuredKitsRegistry componentsJoinedByString:@","]; range = [_message rangeOfString:kMPMessageTypeNetworkPerformance]; if (range.location != NSNotFound) { @@ -196,7 +195,7 @@ - (NSMutableURLRequest *)build { kits = [supportedKits componentsJoinedByString:@","]; } - NSString *environment = [NSString stringWithFormat:@"%d", (int)[MPStateMachine environment]]; + NSString *environment = [NSString stringWithFormat:@"%d", (int)[MPStateMachine_PRIVATE environment]]; [urlRequest setValue:environment forHTTPHeaderField:@"x-mp-env"]; MPIUserDefaults *userDefaults = [MPIUserDefaults standardUserDefaults]; diff --git a/mParticle-Apple-SDK/Notifications/MPNotificationController.m b/mParticle-Apple-SDK/Notifications/MPNotificationController.m index 14b7e71f2..7f92e3834 100644 --- a/mParticle-Apple-SDK/Notifications/MPNotificationController.m +++ b/mParticle-Apple-SDK/Notifications/MPNotificationController.m @@ -3,11 +3,9 @@ #import "MPPersistenceController.h" #import "MPIUserDefaults.h" #import "mParticle.h" -#import "MPBackendController.h" -#import "MPApplication.h" -#import "MPStateMachine.h" +#import "MPNetworkCommunication.h" -@interface MPNotificationController() { +@interface MPNotificationController_PRIVATE() { } @end @@ -15,7 +13,7 @@ @interface MPNotificationController() { @interface MParticle () + (dispatch_queue_t)messageQueue; -@property (nonatomic, strong, nonnull) MPBackendController *backendController; +@property (nonatomic, strong, nonnull) MPBackendController_PRIVATE *backendController; @end @@ -23,7 +21,7 @@ + (dispatch_queue_t)messageQueue; static NSData *deviceToken = nil; #endif -@implementation MPNotificationController +@implementation MPNotificationController_PRIVATE #if TARGET_OS_IOS == 1 @@ -49,7 +47,7 @@ + (NSData *)deviceToken { } + (void)setDeviceToken:(NSData *)devToken { - if ([MPNotificationController deviceToken] && [[MPNotificationController deviceToken] isEqualToData:devToken]) { + if ([MPNotificationController_PRIVATE deviceToken] && [[MPNotificationController_PRIVATE deviceToken] isEqualToData:devToken]) { return; } diff --git a/mParticle-Apple-SDK/Persistence/MPDatabaseMigrationController.m b/mParticle-Apple-SDK/Persistence/MPDatabaseMigrationController.m index e0d624a5d..653a15e07 100644 --- a/mParticle-Apple-SDK/Persistence/MPDatabaseMigrationController.m +++ b/mParticle-Apple-SDK/Persistence/MPDatabaseMigrationController.m @@ -13,8 +13,8 @@ @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, nonnull) MPBackendController *backendController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, nonnull) MPBackendController_PRIVATE *backendController; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @end diff --git a/mParticle-Apple-SDK/Persistence/MPPersistenceController.mm b/mParticle-Apple-SDK/Persistence/MPPersistenceController.mm index 28124970c..d0ad55a57 100644 --- a/mParticle-Apple-SDK/Persistence/MPPersistenceController.mm +++ b/mParticle-Apple-SDK/Persistence/MPPersistenceController.mm @@ -58,7 +58,7 @@ typedef NS_ENUM(NSInteger, MPDatabaseState) { @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @end diff --git a/mParticle-Apple-SDK/Utils/MPApplication.m b/mParticle-Apple-SDK/Utils/MPApplication.m index 5d42c4d74..f73c14840 100644 --- a/mParticle-Apple-SDK/Utils/MPApplication.m +++ b/mParticle-Apple-SDK/Utils/MPApplication.m @@ -8,6 +8,7 @@ #import "MPStateMachine.h" #import #import "mParticle.h" +#import "MPIConstants.h" NSString *const kMPApplicationInformationKey = @"ai"; NSString *const kMPApplicationNameKey = @"an"; @@ -65,11 +66,11 @@ @interface MParticle () -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @end -@interface MPApplication() { +@interface MPApplication_PRIVATE() { NSDictionary *appInfo; MPIUserDefaults *userDefaults; } @@ -77,7 +78,7 @@ @interface MPApplication() { @end -@implementation MPApplication +@implementation MPApplication_PRIVATE @synthesize architecture = _architecture; @synthesize buildUUID = _buildUUID; @@ -86,7 +87,7 @@ @implementation MPApplication @synthesize pirated = _pirated; + (void)initialize { - if (self == [MPApplication class]) { + if (self == [MPApplication_PRIVATE class]) { _dyld_register_func_for_add_image(addImageListCallback); } } @@ -172,7 +173,7 @@ - (NSString *)bundleIdentifier { } - (MPEnvironment)environment { - return [MPStateMachine environment]; + return [MPStateMachine_PRIVATE environment]; } - (NSNumber *)firstSeenInstallation { @@ -298,7 +299,7 @@ - (NSDictionary *)searchAdsAttribution { #pragma mark NSCopying - (instancetype)copyWithZone:(NSZone *)zone { - MPApplication *copyObject = [[[self class] alloc] init]; + MPApplication_PRIVATE *copyObject = [[[self class] alloc] init]; if (copyObject) { copyObject->_architecture = [_architecture copy]; @@ -339,12 +340,12 @@ + (void)markInitialLaunchTime { } + (void)updateLastUseDate:(NSDate *)date { - MPApplication *application = [[MPApplication alloc] init]; + MPApplication_PRIVATE *application = [[MPApplication_PRIVATE alloc] init]; application.lastUseDate = MPMilliseconds([date timeIntervalSince1970]); } + (void)updateLaunchCountsAndDates { - MPApplication *application = [[MPApplication alloc] init]; + MPApplication_PRIVATE *application = [[MPApplication_PRIVATE alloc] init]; application.launchCount = @([application.launchCount integerValue] + 1); @@ -357,7 +358,7 @@ + (void)updateLaunchCountsAndDates { } + (void)updateStoredVersionAndBuildNumbers { - MPApplication *application = [[MPApplication alloc] init]; + MPApplication_PRIVATE *application = [[MPApplication_PRIVATE alloc] init]; application.storedVersion = application.version; application.storedBuild = application.build; } @@ -468,8 +469,8 @@ + (NSDictionary *)appImageInfo { applicationInfo[kMPAppBuildNumberKey] = auxString; } - if ([MParticle sharedInstance].stateMachine.allowASR && [MPApplication appStoreReceipt]) { - applicationInfo[kMPAppStoreReceiptKey] = [MPApplication appStoreReceipt]; + if ([MParticle sharedInstance].stateMachine.allowASR && [MPApplication_PRIVATE appStoreReceipt]) { + applicationInfo[kMPAppStoreReceiptKey] = [MPApplication_PRIVATE appStoreReceipt]; } appInfo = (NSDictionary *)applicationInfo; diff --git a/mParticle-Apple-SDK/Utils/MPConvertJS.swift b/mParticle-Apple-SDK/Utils/MPConvertJS.swift index 9053b10c9..5a8d5e156 100644 --- a/mParticle-Apple-SDK/Utils/MPConvertJS.swift +++ b/mParticle-Apple-SDK/Utils/MPConvertJS.swift @@ -46,14 +46,14 @@ import Foundation case MPJSCommerceEventAction.removeFromWishlist.rawValue: return .removeFromWishlist default: - MPLogger.MPLogError(format: "Invalid commerce event action received from webview: %@", arguments: json) + MPLog.error("Invalid commerce event action received from webview: %@", json) return .addToCart } } @objc public static func commerceEvent(_ json: [AnyHashable : Any]) -> MPCommerceEvent? { guard json["ProductAction"] == nil || json["ProductAction"] is [String: Any] else { - MPLogger.MPLogError(format: "Unexpected commerce event data received from webview") + MPLog.error("Unexpected commerce event data received from webview") return nil } @@ -64,14 +64,14 @@ import Foundation let isValid = isProductAction || isPromotion || isImpression if !isValid { - MPLogger.MPLogError(format: "Invalid commerce event dictionary received from webview: %@", arguments: json) + MPLog.error("Invalid commerce event dictionary received from webview: %@", json) return nil } let commerceEvent: MPCommerceEvent if isProductAction { guard let productActionType = productAction?["ProductActionType"] as? NSNumber else { - MPLogger.MPLogError(format: "Unexpected product action type received from webview") + MPLog.error("Unexpected product action type received from webview") return nil } let action = Self.commerceEventAction(productActionType) @@ -136,12 +136,12 @@ import Foundation @objc public static func promotionContainer(_ json: [AnyHashable : Any]) -> MPPromotionContainer? { guard let promotionDictionary = (json["PromotionAction"] as? [String: Any]) else { - MPLogger.MPLogError(format: "Unexpected promotion container action data received from webview") + MPLog.error("Unexpected promotion container action data received from webview") return nil } guard let promotionActionTypeNumber = (promotionDictionary["PromotionActionType"] as? NSNumber) else { - MPLogger.MPLogError(format: "Unexpected promotion container action type data received from webview") + MPLog.error("Unexpected promotion container action type data received from webview") return nil } @@ -152,7 +152,7 @@ import Foundation promotionContainer.addPromotion(MPConvertJS_PRIVATE.promotion(jsonObject)) } } else { - MPLogger.MPLogError(format: "Unexpected promotion container list data received from webview") + MPLog.error("Unexpected promotion container list data received from webview") return nil } @@ -252,7 +252,7 @@ import Foundation let request = MPIdentityApiRequest.withEmptyUser() guard let userIdentities = json?["UserIdentities"] as? [[AnyHashable : Any]] else { - MPLogger.MPLogError(format: "Unexpected user identity data received from webview") + MPLog.error("Unexpected user identity data received from webview") return nil } diff --git a/mParticle-Apple-SDK/Utils/MPDevice.m b/mParticle-Apple-SDK/Utils/MPDevice.m index 10dee262b..63fb79bfe 100644 --- a/mParticle-Apple-SDK/Utils/MPDevice.m +++ b/mParticle-Apple-SDK/Utils/MPDevice.m @@ -57,7 +57,7 @@ @interface MParticle () -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @end @@ -74,7 +74,7 @@ @interface MPDevice() { @interface MParticle () -@property (nonatomic, strong, nonnull) MPBackendController *backendController; +@property (nonatomic, strong, nonnull) MPBackendController_PRIVATE *backendController; @end @@ -522,8 +522,8 @@ - (NSDictionary *)dictionaryRepresentation { } NSData *pushNotificationToken; - if (![MPStateMachine isAppExtension]) { - pushNotificationToken = [MPNotificationController deviceToken]; + if (![MPStateMachine_PRIVATE isAppExtension]) { + pushNotificationToken = [MPNotificationController_PRIVATE deviceToken]; if (pushNotificationToken) { NSString *tokenString = [MPIUserDefaults stringFromDeviceToken:pushNotificationToken]; if (tokenString) { diff --git a/mParticle-Apple-SDK/Utils/MPIHasher.swift b/mParticle-Apple-SDK/Utils/MPIHasher.swift index 8fc350cfb..6e887931c 100644 --- a/mParticle-Apple-SDK/Utils/MPIHasher.swift +++ b/mParticle-Apple-SDK/Utils/MPIHasher.swift @@ -25,7 +25,7 @@ import Foundation let lowercaseStringToHash = stringToHash.lowercased() guard let dataToHash = lowercaseStringToHash.data(using: .utf8) else { - MPLogger.MPLogWarning(format: "Hash String Failed. Could not encode string as data") + MPLog.warning("Hash String Failed. Could not encode string as data") return "" } @@ -39,7 +39,7 @@ import Foundation @objc public class func hashStringUTF16(_ stringToHash: String) -> String { guard let data = stringToHash.data(using: .utf16LittleEndian) else { - MPLogger.MPLogWarning(format: "Hash String UTF16 Failed. Could not encode string as data") + MPLog.warning("Hash String UTF16 Failed. Could not encode string as data") return "" } let hash = hashFNV1a(data) diff --git a/mParticle-Apple-SDK/Utils/MPIUserDefaults.h b/mParticle-Apple-SDK/Utils/MPIUserDefaults.h index 87e74e161..e52822732 100644 --- a/mParticle-Apple-SDK/Utils/MPIUserDefaults.h +++ b/mParticle-Apple-SDK/Utils/MPIUserDefaults.h @@ -2,6 +2,7 @@ @class MPKitConfiguration; @class MPUploadSettings; +@class MPResponseConfig; @interface MPIUserDefaults : NSObject @@ -34,5 +35,8 @@ - (nullable MPUploadSettings *)lastUploadSettings; + (NSString *_Nullable)stringFromDeviceToken:(NSData *_Nonnull)deviceToken; ++ (nullable MPResponseConfig *)restore; ++ (void)deleteConfig; ++ (BOOL)isOlderThanConfigMaxAgeSeconds; @end diff --git a/mParticle-Apple-SDK/Utils/MPIUserDefaults.m b/mParticle-Apple-SDK/Utils/MPIUserDefaults.m index 3d23f4beb..ba66b876e 100644 --- a/mParticle-Apple-SDK/Utils/MPIUserDefaults.m +++ b/mParticle-Apple-SDK/Utils/MPIUserDefaults.m @@ -4,7 +4,6 @@ #import "MPILogger.h" #import "mParticle.h" #import "MPKitConfiguration.h" -#import "MPStateMachine.h" #import "MPKitContainer.h" #import "MParticleSwift.h" #import "MPUpload.h" @@ -12,8 +11,8 @@ @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; +@property (nonatomic, strong, nonnull) MPBackendController_PRIVATE *backendController; @end @@ -403,7 +402,7 @@ - (NSString *)currentConfigurationParameters { [configString appendFormat:@"SDK Version: %@\n", MParticle.sharedInstance.version]; } - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.apiKey != nil) { [configString appendFormat:@"API Key: %@\n", stateMachine.apiKey]; @@ -412,7 +411,7 @@ - (NSString *)currentConfigurationParameters { NSMutableString *supportedKitsString = [NSMutableString string]; NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" ascending: YES]; - NSArray *supportedKits = [[[MParticle sharedInstance].kitContainer supportedKits] sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]]; + NSArray *supportedKits = [[[MParticle sharedInstance].kitContainer_PRIVATE supportedKits] sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]]; if (supportedKits != nil) { for (NSNumber *kitID in supportedKits) { [supportedKitsString appendFormat:@"%@\n", kitID]; @@ -420,7 +419,7 @@ - (NSString *)currentConfigurationParameters { } [configString appendFormat:@"Supported Kits: \n%@\n", supportedKitsString]; - NSNumber *environment = [NSNumber numberWithInt:(int)[MPStateMachine environment]]; + NSNumber *environment = [NSNumber numberWithInt:(int)[MPStateMachine_PRIVATE environment]]; [configString appendFormat:@"Environment: %@\n", environment]; return [MPIHasher hashString:configString]; @@ -496,5 +495,37 @@ + (NSString *)stringFromDeviceToken:(NSData *)deviceToken { return [hexString copy]; } ++ (nullable MPResponseConfig *)restore { + NSDictionary *configuration = [[MPIUserDefaults standardUserDefaults] getConfiguration]; + MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration dataReceivedFromServer:NO stateMachine:MParticle.sharedInstance.stateMachine backendController:MParticle.sharedInstance.backendController]; + + return responseConfig; +} + ++ (void)deleteConfig { + [[MPIUserDefaults standardUserDefaults] deleteConfiguration]; +} + ++ (BOOL)isOlderThanConfigMaxAgeSeconds { + BOOL shouldConfigurationBeDeleted = NO; + + MPIUserDefaults *userDefaults = [MPIUserDefaults standardUserDefaults]; + NSNumber *configProvisioned = userDefaults[kMPConfigProvisionedTimestampKey]; + NSNumber *maxAgeSeconds = [[MParticle sharedInstance] configMaxAgeSeconds]; + + if (configProvisioned != nil && maxAgeSeconds != nil && [maxAgeSeconds doubleValue] > 0) { + NSTimeInterval intervalConfigProvisioned = [configProvisioned doubleValue]; + NSTimeInterval intervalNow = [[NSDate date] timeIntervalSince1970]; + NSTimeInterval delta = intervalNow - intervalConfigProvisioned; + shouldConfigurationBeDeleted = delta > [maxAgeSeconds doubleValue]; + } + + if (shouldConfigurationBeDeleted) { + [[MPIUserDefaults standardUserDefaults] deleteConfiguration]; + } + + return shouldConfigurationBeDeleted; +} + @end diff --git a/mParticle-Apple-SDK/Utils/MPMessageBuilder.h b/mParticle-Apple-SDK/Utils/MPMessageBuilder.h index 440fbf549..91b0bbb46 100644 --- a/mParticle-Apple-SDK/Utils/MPMessageBuilder.h +++ b/mParticle-Apple-SDK/Utils/MPMessageBuilder.h @@ -10,7 +10,7 @@ @class MPSession; @class MPCommerceEvent; @class MPUserAttributeChange; -@class MPUserIdentityChange; +@class MPUserIdentityChange_PRIVATE; @class MPMessage; @interface MPMessageBuilder : NSObject @@ -31,7 +31,7 @@ messageInfo:(nullable NSDictionary *)messageInfo; - (nullable instancetype)initWithMessageType:(MPMessageType)messageType session:(nullable MPSession *)session - userIdentityChange:(nonnull MPUserIdentityChange *)userIdentityChange; + userIdentityChange:(nonnull MPUserIdentityChange_PRIVATE *)userIdentityChange; - (nullable instancetype)initWithMessageType:(MPMessageType)messageType session:(nonnull MPSession *)session userAttributeChange:(nonnull MPUserAttributeChange *)userAttributeChange; diff --git a/mParticle-Apple-SDK/Utils/MPMessageBuilder.m b/mParticle-Apple-SDK/Utils/MPMessageBuilder.m index dd3501035..eec2c2625 100644 --- a/mParticle-Apple-SDK/Utils/MPMessageBuilder.m +++ b/mParticle-Apple-SDK/Utils/MPMessageBuilder.m @@ -8,12 +8,11 @@ #import "MPCommerceEvent+Dictionary.h" #import "MPILogger.h" #import "NSDictionary+MPCaseInsensitive.h" -#import "MPUserAttributeChange.h" -#import "MPUserIdentityChange.h" #import "MPPersistenceController.h" #import "MPApplication.h" #import "mParticle.h" #import "MParticleSwift.h" +#import "MPLaunchInfo.h" NSString *const launchInfoStringFormat = @"%@%@%@=%@"; NSString *const kMPHorizontalAccuracyKey = @"acc"; @@ -31,7 +30,7 @@ NSString *const kMPUserIdentityOldValueKey = @"oi"; @interface MParticle () -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, strong, nullable) NSString *dataPlanId; @property (nonatomic, strong, nullable) NSNumber *dataPlanVersion; @end @@ -173,8 +172,8 @@ - (instancetype)initWithMessageType:(MPMessageType)messageType session:(MPSessio NSString *presentedViewControllerDescription = nil; NSNumber *mainThreadFlag; if ([NSThread isMainThread]) { - if (![MPStateMachine isAppExtension]) { - UIViewController *presentedViewController = [MPApplication sharedUIApplication].keyWindow.rootViewController.presentedViewController; + if (![MPStateMachine_PRIVATE isAppExtension]) { + UIViewController *presentedViewController = [MPApplication_PRIVATE sharedUIApplication].keyWindow.rootViewController.presentedViewController; presentedViewControllerDescription = presentedViewController ? [[presentedViewController class] description] : nil; } else { presentedViewControllerDescription = @"extension_message"; @@ -207,7 +206,7 @@ - (instancetype)initWithMessageType:(MPMessageType)messageType session:(MPSessio return self; } -- (instancetype)initWithMessageType:(MPMessageType)messageType session:(MPSession *)session userIdentityChange:(MPUserIdentityChange *)userIdentityChange { +- (instancetype)initWithMessageType:(MPMessageType)messageType session:(MPSession *)session userIdentityChange:(MPUserIdentityChange_PRIVATE *)userIdentityChange { self = [self initWithMessageType:messageType session:session]; if (self && userIdentityChange) { [self userIdentityChange:userIdentityChange]; @@ -234,13 +233,13 @@ - (void)userAttributeChange:(nonnull MPUserAttributeChange *)userAttributeChange _messageDictionary[kMPUserAttributeNewlyAddedKey] = oldValue ? @NO : @YES; } -- (void)userIdentityChange:(MPUserIdentityChange *)userIdentityChange { - NSDictionary *dictionary = [userIdentityChange.userIdentityNew dictionaryRepresentation]; +- (void)userIdentityChange:(MPUserIdentityChange_PRIVATE *)userIdentityChange { + NSDictionary *dictionary = [userIdentityChange.newUserIdentity dictionaryRepresentation]; if (dictionary) { _messageDictionary[kMPUserIdentityNewValueKey] = dictionary; } - dictionary = [userIdentityChange.userIdentityOld dictionaryRepresentation]; + dictionary = [userIdentityChange.oldUserIdentity dictionaryRepresentation]; if (dictionary) { _messageDictionary[kMPUserIdentityOldValueKey] = dictionary; } @@ -271,7 +270,7 @@ - (void)timestamp:(NSTimeInterval)timestamp { // NOTE: Here "sessionFinalized" is really referring to if we are starting a new session on launch, see Facebook event forwarder backend code - (void)stateTransition:(BOOL)sessionFinalized previousSession:(MPSession *)previousSession { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.launchInfo.sourceApplication) { _messageDictionary[kMPLaunchSourceKey] = stateMachine.launchInfo.sourceApplication; @@ -310,8 +309,8 @@ - (MPMessage *)build { #if TARGET_OS_IOS == 1 #ifndef MPARTICLE_LOCATION_DISABLE - (void)location:(CLLocation *)location { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; - if ([MPStateMachine runningInBackground] && !stateMachine.locationManager.backgroundLocationTracking) { + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; + if ([MPStateMachine_PRIVATE runningInBackground] && !stateMachine.locationManager.backgroundLocationTracking) { return; } diff --git a/mParticle-Apple-SDK/Utils/MPResponseConfig.h b/mParticle-Apple-SDK/Utils/MPResponseConfig.h deleted file mode 100644 index b6f24062f..000000000 --- a/mParticle-Apple-SDK/Utils/MPResponseConfig.h +++ /dev/null @@ -1,20 +0,0 @@ -#import -#import - -@interface MPResponseConfig : NSObject - -@property (nonatomic, copy, nonnull, readonly) NSDictionary *configuration; - -- (nonnull instancetype)initWithConfiguration:(nonnull NSDictionary *)configuration; -- (nonnull instancetype)initWithConfiguration:(nonnull NSDictionary *)configuration dataReceivedFromServer:(BOOL)dataReceivedFromServer; - -+ (nullable MPResponseConfig *)restore; -+ (void)deleteConfig; -+ (BOOL)isOlderThanConfigMaxAgeSeconds; - -#if TARGET_OS_IOS == 1 -- (void)configureLocationTracking:(nonnull NSDictionary *)locationDictionary; -- (void)configurePushNotifications:(nonnull NSDictionary *)pushNotificationDictionary; -#endif - -@end diff --git a/mParticle-Apple-SDK/Utils/MPResponseConfig.m b/mParticle-Apple-SDK/Utils/MPResponseConfig.m deleted file mode 100644 index fa50df48a..000000000 --- a/mParticle-Apple-SDK/Utils/MPResponseConfig.m +++ /dev/null @@ -1,228 +0,0 @@ -#import "MPResponseConfig.h" -#import "mParticle.h" -#import "MPIConstants.h" -#import "MPILogger.h" -#import "MPKitContainer.h" -#import "MPStateMachine.h" -#import "MPIUserDefaults.h" -#import "MPPersistenceController.h" -#import "MPApplication.h" -#import "MPBackendController.h" - -#if TARGET_OS_IOS == 1 -#ifndef MPARTICLE_LOCATION_DISABLE - #import -#endif -#endif - -@interface MParticle () - -@property (nonatomic, strong, nullable) NSArray *deferredKitConfiguration; -@property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; -@property (nonatomic, strong, readonly) MPKitContainer *kitContainer; -@property (nonatomic, strong, nonnull) MPBackendController *backendController; - -@end - -@implementation MPResponseConfig - -- (instancetype)initWithConfiguration:(NSDictionary *)configuration { - return [self initWithConfiguration:configuration dataReceivedFromServer:YES]; -} - -- (nonnull instancetype)initWithConfiguration:(nonnull NSDictionary *)configuration dataReceivedFromServer:(BOOL)dataReceivedFromServer { - self = [super init]; - if (!self || MPIsNull(configuration)) { - return nil; - } - - _configuration = [configuration copy]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; - - if (dataReceivedFromServer) { - BOOL hasConsentFilters = NO; - - if (!MPIsNull(self->_configuration[kMPRemoteConfigKitsKey])) { - for (NSDictionary *kitDictionary in self->_configuration[kMPRemoteConfigKitsKey]) { - - NSDictionary *consentKitFilter = kitDictionary[kMPConsentKitFilter]; - BOOL hasConsentKitFilter = MPIsNonEmptyDictionary(consentKitFilter); - - BOOL hasRegulationOrPurposeFilters = NO; - - NSDictionary *hashes = kitDictionary[kMPRemoteConfigKitHashesKey]; - - if (MPIsNonEmptyDictionary(hashes)) { - - NSDictionary *regulationFilters = hashes[kMPConsentRegulationFilters]; - NSDictionary *purposeFilters = hashes[kMPConsentPurposeFilters]; - - BOOL hasRegulationFilters = MPIsNonEmptyDictionary(regulationFilters); - BOOL hasPurposeFilters = MPIsNonEmptyDictionary(purposeFilters); - - if (hasRegulationFilters || hasPurposeFilters) { - hasRegulationOrPurposeFilters = YES; - } - - } - - if (hasConsentKitFilter || hasRegulationOrPurposeFilters) { - - hasConsentFilters = YES; - break; - - } - } - } - - - NSNumber *mpid = [MPPersistenceController mpId]; - BOOL hasInitialIdentity = mpid != nil && ![mpid isEqual:@0]; - - BOOL shouldDefer = hasConsentFilters && !hasInitialIdentity; - - if (!shouldDefer) { - dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer configureKits:self->_configuration[kMPRemoteConfigKitsKey]]; - }); - } else { - [MParticle sharedInstance].deferredKitConfiguration = [self->_configuration[kMPRemoteConfigKitsKey] copy]; - } - - } - - [stateMachine configureCustomModules:_configuration[kMPRemoteConfigCustomModuleSettingsKey]]; - [stateMachine configureRampPercentage:_configuration[kMPRemoteConfigRampKey]]; - [stateMachine configureTriggers:_configuration[kMPRemoteConfigTriggerKey]]; - [stateMachine configureAliasMaxWindow:_configuration[kMPRemoteConfigAliasMaxWindow]]; - [stateMachine configureDataBlocking:_configuration[kMPRemoteConfigDataPlanningResults]]; - - stateMachine.allowASR = [_configuration[kMPRemoteConfigAllowASR] boolValue]; - stateMachine.enableDirectRouting = [_configuration[kMPRemoteConfigDirectURLRouting] boolValue]; - - // Exception handling - NSString *auxString = !MPIsNull(_configuration[kMPRemoteConfigExceptionHandlingModeKey]) ? _configuration[kMPRemoteConfigExceptionHandlingModeKey] : nil; - if (auxString) { - stateMachine.exceptionHandlingMode = [auxString copy]; - - [[NSNotificationCenter defaultCenter] postNotificationName:kMPConfigureExceptionHandlingNotification - object:nil - userInfo:nil]; - } - - // Crash size limiting - NSNumber *auxNumber = !MPIsNull(_configuration[kMPRemoteConfigCrashMaxPLReportLength]) ? _configuration[kMPRemoteConfigCrashMaxPLReportLength] : nil; - if (auxNumber != nil) { - stateMachine.crashMaxPLReportLength = auxNumber; - } - - - // Session timeout - auxNumber = _configuration[kMPRemoteConfigSessionTimeoutKey]; - if (auxNumber != nil) { - [MParticle sharedInstance].backendController.sessionTimeout = [auxNumber doubleValue]; - } - -#if TARGET_OS_IOS == 1 - // Push notifications - NSDictionary *auxDictionary = !MPIsNull(_configuration[kMPRemoteConfigPushNotificationDictionaryKey]) ? _configuration[kMPRemoteConfigPushNotificationDictionaryKey] : nil; - if (auxDictionary) { - [self configurePushNotifications:auxDictionary]; - } - - // Location tracking - auxDictionary = !MPIsNull(_configuration[kMPRemoteConfigLocationKey]) ? _configuration[kMPRemoteConfigLocationKey] : nil; - if (auxDictionary) { - [self configureLocationTracking:auxDictionary]; - } -#endif - - return self; -} - -#pragma mark NSSecureCoding -- (void)encodeWithCoder:(NSCoder *)coder { - [coder encodeObject:_configuration forKey:@"configuration"]; -} - -- (id)initWithCoder:(NSCoder *)coder { - NSDictionary *configuration = [coder decodeObjectOfClass:[NSDictionary class] forKey:@"configuration"]; - self = [[MPResponseConfig alloc] initWithConfiguration:configuration dataReceivedFromServer:NO]; - - return self; -} - -+ (BOOL)supportsSecureCoding { - return YES; -} - -#pragma mark Private methods - -#pragma mark Public class methods -+ (nullable MPResponseConfig *)restore { - NSDictionary *configuration = [[MPIUserDefaults standardUserDefaults] getConfiguration]; - MPResponseConfig *responseConfig = [[MPResponseConfig alloc] initWithConfiguration:configuration dataReceivedFromServer:NO]; - - return responseConfig; -} - -+ (void)deleteConfig { - [[MPIUserDefaults standardUserDefaults] deleteConfiguration]; -} - -+ (BOOL)isOlderThanConfigMaxAgeSeconds { - BOOL shouldConfigurationBeDeleted = NO; - - MPIUserDefaults *userDefaults = [MPIUserDefaults standardUserDefaults]; - NSNumber *configProvisioned = userDefaults[kMPConfigProvisionedTimestampKey]; - NSNumber *maxAgeSeconds = [[MParticle sharedInstance] configMaxAgeSeconds]; - - if (configProvisioned != nil && maxAgeSeconds != nil && [maxAgeSeconds doubleValue] > 0) { - NSTimeInterval intervalConfigProvisioned = [configProvisioned doubleValue]; - NSTimeInterval intervalNow = [[NSDate date] timeIntervalSince1970]; - NSTimeInterval delta = intervalNow - intervalConfigProvisioned; - shouldConfigurationBeDeleted = delta > [maxAgeSeconds doubleValue]; - } - - if (shouldConfigurationBeDeleted) { - [[MPIUserDefaults standardUserDefaults] deleteConfiguration]; - } - - return shouldConfigurationBeDeleted; -} - -#pragma mark Public instance methods -#if TARGET_OS_IOS == 1 -- (void)configureLocationTracking:(NSDictionary *)locationDictionary { - NSString *locationMode = locationDictionary[kMPRemoteConfigLocationModeKey]; - [MParticle sharedInstance].stateMachine.locationTrackingMode = locationMode; - -#ifndef MPARTICLE_LOCATION_DISABLE - if ([locationMode isEqualToString:kMPRemoteConfigForceTrue]) { - NSNumber *accurary = locationDictionary[kMPRemoteConfigLocationAccuracyKey]; - NSNumber *minimumDistance = locationDictionary[kMPRemoteConfigLocationMinimumDistanceKey]; - - [[MParticle sharedInstance] beginLocationTracking:[accurary doubleValue] minDistance:[minimumDistance doubleValue] authorizationRequest:MPLocationAuthorizationRequestAlways]; - } else if ([locationMode isEqualToString:kMPRemoteConfigForceFalse]) { - [[MParticle sharedInstance] endLocationTracking]; - } -#endif -} - -- (void)configurePushNotifications:(NSDictionary *)pushNotificationDictionary { - NSString *pushNotificationMode = pushNotificationDictionary[kMPRemoteConfigPushNotificationModeKey]; - [MParticle sharedInstance].stateMachine.pushNotificationMode = pushNotificationMode; - if (![MPStateMachine isAppExtension]) { - UIApplication *app = [MPApplication sharedUIApplication]; - - if ([pushNotificationMode isEqualToString:kMPRemoteConfigForceTrue]) { - [app registerForRemoteNotifications]; - } else if ([pushNotificationMode isEqualToString:kMPRemoteConfigForceFalse]) { - [app unregisterForRemoteNotifications]; - } - } -} -#endif - -@end diff --git a/mParticle-Apple-SDK/Utils/MPResponseConfig.swift b/mParticle-Apple-SDK/Utils/MPResponseConfig.swift new file mode 100644 index 000000000..789fd2654 --- /dev/null +++ b/mParticle-Apple-SDK/Utils/MPResponseConfig.swift @@ -0,0 +1,144 @@ +// +// MPResponseConfig.swift +// mParticle-Apple-SDK +// +// Created by Brandon Stalnaker on 12/2/24. +// + +import Foundation + +@objc public class MPResponseConfig : NSObject { + @objc public private(set) var configuration: [AnyHashable : Any]? + private var stateMachine: MPStateMachine_PRIVATE + private var backendController: MPBackendController_PRIVATE + + @objc public convenience init?(configuration: [AnyHashable : Any], stateMachine: MPStateMachine_PRIVATE, backendController: MPBackendController_PRIVATE) { + self.init(configuration: configuration, dataReceivedFromServer: true, stateMachine: stateMachine, backendController: backendController) + } + + @objc public init?(configuration: [AnyHashable : Any], dataReceivedFromServer: Bool, stateMachine: MPStateMachine_PRIVATE, backendController: MPBackendController_PRIVATE) { + self.configuration = configuration + self.stateMachine = stateMachine + self.backendController = backendController + super.init() + + if self.configuration == nil || self.configuration?.count == 0 { + return nil + } + self.setUp(dataReceivedFromServer: dataReceivedFromServer) + } + + @objc private func setUp(dataReceivedFromServer: Bool) { + if let config = self.configuration { + if dataReceivedFromServer { + var hasConsentFilters = false + + if let configKitDictionary = config[RemoteConfig.kMPRemoteConfigKitsKey] as? [[String : Any]] { + for kitDictionary in configKitDictionary { + let consentKitFilter = kitDictionary[ConsentFiltering.kMPConsentKitFilter] as? [String : Any] + hasConsentFilters = consentKitFilter != nil && consentKitFilter!.count > 0 + var hasRegulationOrPurposeFilters = false + + if let hashes = kitDictionary[RemoteConfig.kMPRemoteConfigKitHashesKey] as? [String : Any], hashes.count > 0 { + if let regulationFilters = hashes[ConsentFiltering.kMPConsentRegulationFilters] as? [String : Any], regulationFilters.count > 0 { + hasRegulationOrPurposeFilters = true + } + if let purposeFilters = hashes[ConsentFiltering.kMPConsentPurposeFilters] as? [String : Any], purposeFilters.count > 0 { + hasRegulationOrPurposeFilters = true + } + } + + if hasConsentFilters || hasRegulationOrPurposeFilters { + hasConsentFilters = true + } + } + } + + var hasInitialIdentity = false + if let mpid = MParticle.sharedInstance().identity.currentUser?.userId, mpid != 0 { + hasInitialIdentity = true + } + + let shouldDefer = hasConsentFilters && !hasInitialIdentity + if !shouldDefer { + DispatchQueue.main.async { + MParticle.sharedInstance().kitContainer_PRIVATE.configureKits(config[RemoteConfig.kMPRemoteConfigKitsKey] as? [[AnyHashable : Any]]) + } + } else { + MParticle.sharedInstance().deferredKitConfiguration_PRIVATE = config[RemoteConfig.kMPRemoteConfigKitsKey] as? [[AnyHashable : Any]] + } + } + + stateMachine.configureCustomModules(config[RemoteConfig.kMPRemoteConfigCustomModuleSettingsKey] as? [[AnyHashable : Any]]) + stateMachine.configureRampPercentage(config[RemoteConfig.kMPRemoteConfigRampKey] as? NSNumber) + stateMachine.configureTriggers(config[RemoteConfig.kMPRemoteConfigTriggerKey] as? [AnyHashable : Any]) + stateMachine.configureAliasMaxWindow(config[RemoteConfig.kMPRemoteConfigAliasMaxWindow] as? NSNumber) + stateMachine.configureDataBlocking(config[RemoteConfig.kMPRemoteConfigDataPlanningResults] as? [AnyHashable : Any]) + + stateMachine.allowASR = config[RemoteConfig.kMPRemoteConfigAllowASR] as? Bool ?? false + stateMachine.enableDirectRouting = config[RemoteConfig.kMPRemoteConfigDirectURLRouting] as? Bool ?? false + + // Exception handling + if let auxString = config[RemoteConfig.kMPRemoteConfigExceptionHandlingModeKey] as? String { + stateMachine.exceptionHandlingMode = auxString + NotificationCenter.default.post(Notification(name: Notifications.kMPConfigureExceptionHandlingNotification)) + } + + // Crash size limiting + if let crashMaxReportLength = config[RemoteConfig.kMPRemoteConfigCrashMaxPLReportLength] as? NSNumber { + stateMachine.crashMaxPLReportLength = crashMaxReportLength + } + + // Session timeout + if let sessionTimeout = config[RemoteConfig.kMPRemoteConfigSessionTimeoutKey] as? NSNumber { + self.backendController.sessionTimeout = sessionTimeout.doubleValue + } + +#if os(iOS) + // Push notifications + if let pushNotificationDictionary = config["pn"] as? [AnyHashable : Any] { + self.configurePushNotifications(pushNotificationDictionary) + } + + // Location tracking + if let locationTrackingDictionary = config["lct"] as? [AnyHashable : Any] { + self.configureLocationTracking(locationTrackingDictionary) + } +#endif + } + } + +#if os(iOS) + @objc public func configureLocationTracking(_ locationDictionary: [AnyHashable : Any]) { + if let locationMode = locationDictionary[RemoteConfig.kMPRemoteConfigLocationModeKey] as? String { + stateMachine.locationTrackingMode = locationMode + +#if !MPARTICLE_LOCATION_DISABLE + if locationMode == RemoteConfig.kMPRemoteConfigForceTrue { + if let accuracy = locationDictionary[RemoteConfig.kMPRemoteConfigLocationAccuracyKey] as? NSNumber, let minimumDistance = locationDictionary[RemoteConfig.kMPRemoteConfigLocationMinimumDistanceKey] as? NSNumber { + MParticle.sharedInstance().beginLocationTracking(accuracy.doubleValue, minDistance: minimumDistance.doubleValue, authorizationRequest: MPLocationAuthorizationRequest.always) + } + } else if locationMode == RemoteConfig.kMPRemoteConfigForceFalse { + MParticle.sharedInstance().endLocationTracking() + } +#endif + } + } + + @objc public func configurePushNotifications(_ pushNotificationDictionary: [AnyHashable : Any]) { + if let pushNotificationMode = pushNotificationDictionary[RemoteConfig.kMPRemoteConfigPushNotificationModeKey] as? String { + stateMachine.pushNotificationMode = pushNotificationMode + if !MPStateMachine_PRIVATE.isAppExtension() { + let app = MPApplication_PRIVATE.sharedUIApplication() + + if pushNotificationMode == RemoteConfig.kMPRemoteConfigForceTrue { + app?.registerForRemoteNotifications() + } else if pushNotificationMode == RemoteConfig.kMPRemoteConfigForceFalse { + app?.unregisterForRemoteNotifications() + } + } + } + } +#endif +} + diff --git a/mParticle-Apple-SDK/Utils/MPSearchAdsAttribution.h b/mParticle-Apple-SDK/Utils/MPSearchAdsAttribution.h deleted file mode 100644 index 16529b7c9..000000000 --- a/mParticle-Apple-SDK/Utils/MPSearchAdsAttribution.h +++ /dev/null @@ -1,9 +0,0 @@ -#import - -#if TARGET_OS_IOS == 1 -@interface MPSearchAdsAttribution : NSObject - -- (void)requestAttributionDetailsWithBlock:(void (^ _Nonnull)(void))completionHandler requestsCompleted:(int)requestsCompleted; - -@end -#endif diff --git a/mParticle-Apple-SDK/Utils/MPSearchAdsAttribution.m b/mParticle-Apple-SDK/Utils/MPSearchAdsAttribution.m deleted file mode 100644 index b984628dc..000000000 --- a/mParticle-Apple-SDK/Utils/MPSearchAdsAttribution.m +++ /dev/null @@ -1,81 +0,0 @@ -#import - -#if TARGET_OS_IOS == 1 -#import "MPSearchAdsAttribution.h" -#import "mParticle.h" -#import "MPStateMachine.h" -#import "MPIConstants.h" -#import "MPILogger.h" -#import - -@interface MParticle () - -+ (dispatch_queue_t)messageQueue; -@property (nonatomic, strong) MPStateMachine *stateMachine; - -@end - -@implementation MPSearchAdsAttribution - -- (void)requestAttributionDetailsWithBlock:(void (^ _Nonnull)(void))completionHandler requestsCompleted:(int)requestsCompleted { - NSError *error; - if (@available(iOS 14.3, *)) { - NSString *attributionToken = [AAAttribution attributionTokenWithError:&error]; - if (!attributionToken) { - completionHandler(); - return; - } - - if (attributionToken) { - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api-adservices.apple.com/api/v1/"]]; - [request setHTTPMethod:@"POST"]; - [request setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"]; - [request setHTTPBody:[attributionToken dataUsingEncoding:NSUTF8StringEncoding]]; - - NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; - sessionConfiguration.timeoutIntervalForRequest = 30; - sessionConfiguration.timeoutIntervalForResource = 30; - NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:sessionConfiguration - delegate:nil - delegateQueue:nil]; - dispatch_async([MParticle messageQueue], ^{ - [urlSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *urlResponse, NSError *error) { - if (error) { - MPILogError(@"Failed requesting Ads Attribution with error: %@.", [error localizedDescription]); - if (error.code == 1 /* ADClientErrorLimitAdTracking */) { - completionHandler(); - } else if ((requestsCompleted + 1) > SEARCH_ADS_ATTRIBUTION_MAX_RETRIES) { - completionHandler(); - } else { - // Per Apple docs, "Handle any errors you receive and re-poll for data, if required" - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(SEARCH_ADS_ATTRIBUTION_DELAY_BEFORE_RETRY * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self requestAttributionDetailsWithBlock:completionHandler requestsCompleted:(requestsCompleted + 1)]; - }); - } - } else { - NSDictionary *adAttributionDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; - // Convert the dictionary to the prior format expected by our backend - NSDictionary *finalAttributionDictionary = @{ - @"Version4.0": @{ - @"iad-attribution": adAttributionDictionary[@"attribution"], - @"iad-org-id": [adAttributionDictionary[@"orgId"] stringValue], - @"iad-campaign-id": [adAttributionDictionary[@"campaignId"] stringValue], - @"iad-conversion-type": adAttributionDictionary[@"conversionType"], - @"iad-click-date": adAttributionDictionary[@"clickDate"], - @"iad-adgroup-id": [adAttributionDictionary[@"adGroupId"] stringValue], - @"iad-country-or-region": adAttributionDictionary[@"countryOrRegion"], - @"iad-keyword-id": [adAttributionDictionary[@"keywordId"] stringValue], - @"iad-ad-id": [adAttributionDictionary[@"adId"] stringValue], - } - }; - [MParticle sharedInstance].stateMachine.searchAdsInfo = [[finalAttributionDictionary mutableCopy] copy]; - completionHandler(); - } - }]; - }); - } - } -} - -@end -#endif diff --git a/mParticle-Apple-SDK/Utils/MPUploadBuilder.m b/mParticle-Apple-SDK/Utils/MPUploadBuilder.m index 6a08d3c5d..9bcb1939c 100644 --- a/mParticle-Apple-SDK/Utils/MPUploadBuilder.m +++ b/mParticle-Apple-SDK/Utils/MPUploadBuilder.m @@ -20,7 +20,7 @@ @interface MParticle () @property (nonatomic, strong, readonly) MPPersistenceController *persistenceController; -@property (nonatomic, strong, readonly) MPStateMachine *stateMachine; +@property (nonatomic, strong, readonly) MPStateMachine_PRIVATE *stateMachine; @property (nonatomic, strong, nonnull) MParticleOptions *options; @end @@ -73,7 +73,7 @@ - (nonnull instancetype)initWithMpid:(nonnull NSNumber *)mpid sessionId:(nullabl ltv = @0; } - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; _uploadDictionary = [@{ kMPOptOutKey:@(stateMachine.optOut), @@ -133,7 +133,7 @@ - (NSString *)description { #pragma mark Public instance methods - (void)build:(void (^)(MPUpload *upload))completionHandler { - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; _uploadDictionary[kMPMessageTypeKey] = kMPMessageTypeRequestHeader; _uploadDictionary[kMPmParticleSDKVersionKey] = kMParticleSDKVersion; @@ -149,7 +149,7 @@ - (void)build:(void (^)(MPUpload *upload))completionHandler { } else { // If the info wasn't saved in the session, use the old behavior and grab it now // NOTE: This should only ever happen the first time after upgrading to the new schema if there are old sessions left - MPApplication *application = [[MPApplication alloc] init]; + MPApplication_PRIVATE *application = [[MPApplication_PRIVATE alloc] init]; _uploadDictionary[kMPApplicationInformationKey] = [application dictionaryRepresentation]; } diff --git a/mParticle-Apple-SDK/Utils/MPUserAttributeChange.h b/mParticle-Apple-SDK/Utils/MPUserAttributeChange.h deleted file mode 100644 index 340088e6d..000000000 --- a/mParticle-Apple-SDK/Utils/MPUserAttributeChange.h +++ /dev/null @@ -1,16 +0,0 @@ -#import - -@interface MPUserAttributeChange : NSObject - -@property (nonatomic, strong, nonnull) NSString *key; -@property (nonatomic, strong, nullable) NSDate *timestamp; -@property (nonatomic, strong, nullable) NSDictionary *userAttributes; -@property (nonatomic, strong, nullable) id value; -@property (nonatomic, strong, nullable) id valueToLog; -@property (nonatomic, readonly) BOOL changed; -@property (nonatomic) BOOL deleted; -@property (nonatomic) BOOL isArray; - -- (nullable instancetype)initWithUserAttributes:(nullable NSDictionary *)userAttributes key:(nonnull NSString *)key value:(nullable id)value; - -@end diff --git a/mParticle-Apple-SDK/Utils/MPUserAttributeChange.m b/mParticle-Apple-SDK/Utils/MPUserAttributeChange.m deleted file mode 100644 index 06907b0ee..000000000 --- a/mParticle-Apple-SDK/Utils/MPUserAttributeChange.m +++ /dev/null @@ -1,62 +0,0 @@ -#import "MPUserAttributeChange.h" -#import "MPIConstants.h" - -@implementation MPUserAttributeChange - -@synthesize valueToLog = _valueToLog; - -- (nullable instancetype)initWithUserAttributes:(nullable NSDictionary *)userAttributes key:(nonnull NSString *)key value:(nullable id)value { - Class NSStringClass = [NSString class]; - Class NSArrayClass = [NSArray class]; - BOOL validKey = !MPIsNull(key) && [key isKindOfClass:NSStringClass]; - BOOL isValueAnArray = [value isKindOfClass:NSArrayClass]; - - NSAssert(validKey, @"'key' must be a string."); - NSAssert(value == nil || (value != nil && ([value isKindOfClass:NSStringClass] || [value isKindOfClass:[NSNumber class]] || isValueAnArray) || (NSNull *)value == [NSNull null]), @"'value' must be either nil, string, number, or array of strings."); - - if (!validKey || (!userAttributes && !value)) { - return nil; - } - - self = [super init]; - if (self) { - _userAttributes = userAttributes; - _key = key; - _value = value; - _changed = YES; - _deleted = NO; - - id existingValue = userAttributes[key]; - if (existingValue) { - _isArray = [existingValue isKindOfClass:NSArrayClass] || isValueAnArray; - - BOOL isExistingValueNull = (NSNull *)existingValue == [NSNull null]; - BOOL isNewValueNull = (NSNull *)value == [NSNull null]; - if (isNewValueNull) { - _changed = !isExistingValueNull; - } else if (value) { - _changed = isExistingValueNull || ![existingValue isEqual:value]; - } else { - _changed = YES; - } - } else { - _isArray = isValueAnArray; - } - } - - return self; -} - -- (id)valueToLog { - if (!_valueToLog) { - _valueToLog = _value && !_deleted ? _value : [NSNull null]; - } - - return _valueToLog; -} - -- (void)setValueToLog:(id)valueToLog { - _valueToLog = valueToLog ? valueToLog : [NSNull null]; -} - -@end diff --git a/mParticle-Apple-SDK/Utils/MPUserAttributeChange.swift b/mParticle-Apple-SDK/Utils/MPUserAttributeChange.swift new file mode 100644 index 000000000..601b1e5cb --- /dev/null +++ b/mParticle-Apple-SDK/Utils/MPUserAttributeChange.swift @@ -0,0 +1,48 @@ +// +// MPUserAttributeChange.swift +// mParticle-Apple-SDK +// +// Created by Brandon Stalnaker on 12/9/24. +// + +import Foundation + +@objc public class MPUserAttributeChange : NSObject { + + @objc public var key: String + @objc public var timestamp: Date? + @objc public var userAttributes: [String : Any]? + @objc public var value: Any? + @objc public var valueToLog: Any? + @objc public private(set) var changed: Bool + @objc public var deleted: Bool + @objc public var isArray: Bool + + @objc public init?(userAttributes: [String : Any]? = nil, key: String, value: Any?) { + guard value == nil || value is [Any] || value is NSNull || value is String || value is NSNumber else { + return nil + } + + if userAttributes == nil && value == nil { + return nil + } + + self.key = key + self.value = value + self.deleted = false + self.valueToLog = value + self.userAttributes = userAttributes + + let existingValue = userAttributes?[key] + self.isArray = (value is [Any] || existingValue is [Any]) + self.changed = !equals(existingValue, value) + super.init() + } +} + +fileprivate func equals(_ x : Any?, _ y : Any?) -> Bool { + guard let x = x as? AnyHashable, let y = y as? AnyHashable else { + return false + } + return x == y +} diff --git a/mParticle-Apple-SDK/Utils/MPUserIdentityChange.h b/mParticle-Apple-SDK/Utils/MPUserIdentityChange.h deleted file mode 100644 index 99a5ff491..000000000 --- a/mParticle-Apple-SDK/Utils/MPUserIdentityChange.h +++ /dev/null @@ -1,30 +0,0 @@ -#import -#import "MPEnums.h" - -#pragma mark - MPUserIdentityInstance -@interface MPUserIdentityInstance : NSObject - -@property (nonatomic, strong, nullable) NSString *value; -@property (nonatomic, strong, nonnull) NSDate *dateFirstSet; -@property (nonatomic) MPUserIdentity type; -@property (nonatomic) BOOL isFirstTimeSet; - -- (nonnull instancetype)initWithType:(MPUserIdentity)type value:(nullable NSString *)value; -- (nonnull instancetype)initWithType:(MPUserIdentity)type value:(nullable NSString *)value dateFirstSet:(nonnull NSDate *)dateFirstSet isFirstTimeSet:(BOOL)isFirstTimeSet; -- (nonnull instancetype)initWithUserIdentityDictionary:(nonnull NSDictionary *)userIdentityDictionary; -- (nonnull NSMutableDictionary *)dictionaryRepresentation; - -@end - -#pragma mark - MPUserIdentityChange -@interface MPUserIdentityChange : NSObject - -@property (nonatomic, strong, nullable) MPUserIdentityInstance *userIdentityNew; -@property (nonatomic, strong, nullable) MPUserIdentityInstance *userIdentityOld; -@property (nonatomic, strong, nullable) NSDate *timestamp; -@property (nonatomic, readonly) BOOL changed; - -- (nonnull instancetype)initWithNewUserIdentity:(nullable MPUserIdentityInstance *)userIdentityNew userIdentities:(nullable NSArray *> *)userIdentities; -- (nonnull instancetype)initWithNewUserIdentity:(nullable MPUserIdentityInstance *)userIdentityNew oldUserIdentity:(nullable MPUserIdentityInstance *)userIdentityOld timestamp:(nullable NSDate *)timestamp userIdentities:(nullable NSArray *> *)userIdentities; - -@end diff --git a/mParticle-Apple-SDK/Utils/MPUserIdentityChange.m b/mParticle-Apple-SDK/Utils/MPUserIdentityChange.m deleted file mode 100644 index 5e4be4861..000000000 --- a/mParticle-Apple-SDK/Utils/MPUserIdentityChange.m +++ /dev/null @@ -1,104 +0,0 @@ -#import "MPUserIdentityChange.h" -#import "MPIConstants.h" - -#pragma mark - MPUserIdentityInstance -@implementation MPUserIdentityInstance - -- (nonnull instancetype)initWithType:(MPUserIdentity)type value:(nullable NSString *)value { - self = [super init]; - if (self) { - _type = type; - _value = value; - } - - return self; -} - -- (nonnull instancetype)initWithType:(MPUserIdentity)type value:(nullable NSString *)value dateFirstSet:(nonnull NSDate *)dateFirstSet isFirstTimeSet:(BOOL)isFirstTimeSet { - self = [self initWithType:type value:value]; - if (self) { - _dateFirstSet = dateFirstSet; - _isFirstTimeSet = isFirstTimeSet; - } - - return self; -} - -- (nonnull instancetype)initWithUserIdentityDictionary:(nonnull NSDictionary *)userIdentityDictionary { - MPUserIdentity type = [userIdentityDictionary[kMPUserIdentityTypeKey] integerValue]; - NSString *value = userIdentityDictionary[kMPUserIdentityIdKey]; - NSDate *date = [NSDate dateWithTimeIntervalSince1970:([userIdentityDictionary[kMPDateUserIdentityWasFirstSet] doubleValue] / 1000.0)]; - BOOL isFirstSet = [userIdentityDictionary[kMPIsFirstTimeUserIdentityHasBeenSet] boolValue]; - - self = [self initWithType:type - value:value - dateFirstSet:date - isFirstTimeSet:isFirstSet]; - - return self; -} - -- (nonnull NSMutableDictionary *)dictionaryRepresentation { - NSMutableDictionary *identityDictionary = [[NSMutableDictionary alloc] initWithCapacity:4]; - - identityDictionary[kMPUserIdentityTypeKey] = @(_type); - identityDictionary[kMPIsFirstTimeUserIdentityHasBeenSet] = @(_isFirstTimeSet); - - if (_dateFirstSet) { - identityDictionary[kMPDateUserIdentityWasFirstSet] = MPMilliseconds([_dateFirstSet timeIntervalSince1970]); - } - - if (_value) { - identityDictionary[kMPUserIdentityIdKey] = _value; - } - - return identityDictionary; -} - -@end - -#pragma mark - MPUserIdentityChange -@implementation MPUserIdentityChange - -- (nonnull instancetype)initWithNewUserIdentity:(nullable MPUserIdentityInstance *)userIdentityNew userIdentities:(nullable NSArray *> *)userIdentities { - self = [super init]; - if (self) { - _userIdentityNew = userIdentityNew; - _changed = YES; - - [userIdentities enumerateObjectsUsingBlock:^(NSDictionary * _Nonnull ui, NSUInteger idx, BOOL * _Nonnull stop) { - MPUserIdentity idType = [ui[kMPUserIdentityTypeKey] unsignedIntegerValue]; - id idValue = ui[kMPUserIdentityIdKey]; - - if (idType == self->_userIdentityNew.type && [idValue isEqual:self->_userIdentityNew.value]) { - self->_changed = NO; - } - - if (!self->_changed) { - *stop = YES; - } - }]; - } - - return self; -} - -- (nonnull instancetype)initWithNewUserIdentity:(nullable MPUserIdentityInstance *)userIdentityNew oldUserIdentity:(nullable MPUserIdentityInstance *)userIdentityOld timestamp:(nullable NSDate *)timestamp userIdentities:(nullable NSArray *> *)userIdentities { - self = [self initWithNewUserIdentity:userIdentityNew userIdentities:userIdentities]; - if (self) { - _userIdentityOld = userIdentityOld; - _timestamp = timestamp; - } - - return self; -} - -- (NSDate *)timestamp { - if (!_timestamp) { - _timestamp = [NSDate date]; - } - - return _timestamp; -} - -@end diff --git a/mParticle-Apple-SDK/Utils/MParticleWebView.h b/mParticle-Apple-SDK/Utils/MParticleWebView.h deleted file mode 100644 index 03db283fe..000000000 --- a/mParticle-Apple-SDK/Utils/MParticleWebView.h +++ /dev/null @@ -1,15 +0,0 @@ -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface MParticleWebView : NSObject - -- (void)startWithCustomUserAgent:(nullable NSString *)customUserAgent shouldCollect:(BOOL)shouldCollect defaultAgentOverride:(nullable NSString *)defaultAgent; -- (BOOL)shouldDelayUpload:(NSTimeInterval)maxWaitTime; -- (nullable NSString *)userAgent; -- (nullable NSString *)originalDefaultAgent; - -@end - -NS_ASSUME_NONNULL_END diff --git a/mParticle-Apple-SDK/Utils/MParticleWebView.m b/mParticle-Apple-SDK/Utils/MParticleWebView.m deleted file mode 100644 index eac17a8b3..000000000 --- a/mParticle-Apple-SDK/Utils/MParticleWebView.m +++ /dev/null @@ -1,130 +0,0 @@ -#import "MParticleWebView.h" -#import "MPILogger.h" -#import "mParticle.h" -#import "MPStateMachine.h" -#import "MPApplication.h" - -@interface MParticle () -+ (dispatch_queue_t)messageQueue; -@end - -@interface MParticleWebView () - -// options -@property (nonatomic) NSString *customAgent; -@property (nonatomic) BOOL shouldCollect; -@property (nonatomic) NSString *defaultAgent; - -@property (nonatomic) NSDate *initializedDate; -@property (nonatomic) NSString *resolvedAgent; // final result -@property (nonatomic) BOOL isCollecting; -@property (nonatomic) int retryCount; - -#if TARGET_OS_IOS == 1 -@property (nonatomic) WKWebView *webView; -#endif - -@end - -@implementation MParticleWebView - -- (void)startWithCustomUserAgent:(nullable NSString *)customUserAgent shouldCollect:(BOOL)shouldCollect defaultAgentOverride:(nullable NSString *)defaultAgent { - self.initializedDate = [NSDate date]; - self.customAgent = customUserAgent; - self.shouldCollect = shouldCollect; - self.defaultAgent = defaultAgent ?: [self originalDefaultAgent]; - self.retryCount = 0; - [self startCollectionIfNecessary]; -} - -- (void)startCollectionIfNecessary { - if (self.customAgent != nil) { - self.resolvedAgent = self.customAgent; - } else if (![self canAndShouldCollect]) { - self.resolvedAgent = self.defaultAgent; - } - if (self.resolvedAgent != nil) { - return; - } - [self evaluateAgent]; -} - -- (BOOL)canAndShouldCollect { -#if TARGET_OS_IOS != 1 - return NO; -#else - return self.shouldCollect; -#endif -} - -- (void)evaluateAgent { -#if TARGET_OS_IOS == 1 - dispatch_async([MParticle messageQueue], ^{ - self.isCollecting = YES; - dispatch_async(dispatch_get_main_queue(), ^{ - if (!self.webView) { - self.webView = [[WKWebView alloc] initWithFrame:CGRectZero]; - } - MPILogVerbose(@"Getting user agent"); - [self.webView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id _Nullable result, NSError * _Nullable error) { - if (result == nil || error != nil) { - MPILogVerbose(@"Error collecting user agent: %@", error); - } - if (result == nil) { - if (self.retryCount < 10) { - self.retryCount += 1; - MPILogVerbose(@"User agent collection failed (count=%@), retrying", @(self.retryCount)); - self.webView = nil; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self evaluateAgent]; - }); - return; - } else { - MPILogVerbose(@"Falling back on default user agent"); - self.resolvedAgent = self.defaultAgent; - } - } else { - MPILogVerbose(@"Finished getting user agent"); - self.resolvedAgent = result; - } - self.webView = nil; - dispatch_async([MParticle messageQueue], ^{ - self.isCollecting = NO; - }); - }]; - }); - }); -#endif -} - -- (BOOL)shouldDelayUpload:(NSTimeInterval)maxWaitTime { - if (self.resolvedAgent || !self.isCollecting || !self.initializedDate) { - return NO; - } - - NSTimeInterval timeInterval = -1 * [self.initializedDate timeIntervalSinceNow]; - if (timeInterval > maxWaitTime) { - static BOOL printedMessage = NO; - if (!printedMessage) { - printedMessage = YES; - MPILogDebug(@"Max wait time exceeded for user agent"); - } - return NO; - } - static BOOL printedMessageDelay = NO; - if (!printedMessageDelay) { - printedMessageDelay = YES; - MPILogVerbose(@"Delaying initial upload for user agent"); - } - return YES; -} - -- (nullable NSString *)userAgent { - return self.resolvedAgent ?: self.defaultAgent; -} - -- (nullable NSString *)originalDefaultAgent { - return [NSString stringWithFormat:@"mParticle Apple SDK/%@", MParticle.sharedInstance.version]; -} - -@end diff --git a/mParticle-Apple-SDK/Utils/MParticleWebView.swift b/mParticle-Apple-SDK/Utils/MParticleWebView.swift new file mode 100644 index 000000000..7c6e0fe59 --- /dev/null +++ b/mParticle-Apple-SDK/Utils/MParticleWebView.swift @@ -0,0 +1,122 @@ +// +// MParticleWebView.swift +// mParticle-Apple-SDK +// +// Created by Ben Baron on 12/10/24. +// + +// NOTE: @objc specifier added to private properties to support existing Obj-C unit tests + +@objc public class MParticleWebView_PRIVATE : NSObject { + + @objc public var userAgent: String? { resolvedUserAgent ?? defaultUserAgent } + @objc public var originalDefaultUserAgent: String? { "mParticle Apple SDK/\(kMParticleSDKVersion)" } + + private var messageQueue: DispatchQueue + + private var customUserAgent: String? = nil + private var shouldCollect = false + private var defaultUserAgent: String? = nil + + @objc private var initializedDate: Date? = nil + @objc private var resolvedUserAgent: String? = nil // final result + @objc private var isCollecting: Bool = false + @objc private var retryCount: Int = 0 + +#if os(iOS) + @objc private var webView: WKWebView? = nil +#endif + + @objc public init(messageQueue: DispatchQueue) { + self.messageQueue = messageQueue + super.init() + } + + @objc public func start(customUserAgent: String?, shouldCollect: Bool, defaultUserAgentOverride: String?) { + self.initializedDate = Date() + self.customUserAgent = customUserAgent +#if os(iOS) + self.shouldCollect = shouldCollect +#endif + self.defaultUserAgent = defaultUserAgentOverride ?? originalDefaultUserAgent + self.retryCount = 0 + startCollectionIfNecessary() + } + + private func startCollectionIfNecessary() { + if let customUserAgent = customUserAgent { + resolvedUserAgent = customUserAgent; + } else if !shouldCollect { + resolvedUserAgent = defaultUserAgent; + } + + if let _ = resolvedUserAgent { + return + } + +#if os(iOS) + evaluateAgent() +#endif + } + +#if os(iOS) + private func evaluateAgent() { + messageQueue.async { + self.isCollecting = true + DispatchQueue.main.async { + if self.webView == nil { + self.webView = WKWebView(frame: .zero) + } + MPLog.verbose("Getting user agent") + self.webView?.evaluateJavaScript("navigator.userAgent") { result, error in + if result == nil, let error = error as? NSError { + MPLog.verbose("Error collecting user agent: %@", error) + } + if let result = result as? String { + MPLog.verbose("Finished getting user agent") + self.resolvedUserAgent = result + } else { + if self.retryCount < 10 { + self.retryCount += 1 + MPLog.verbose("User agent collection failed (count=%@), retrying", self.retryCount) + self.webView = nil + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { + self.evaluateAgent() + } + return + } else { + MPLog.verbose("Falling back on default user agent") + self.resolvedUserAgent = self.defaultUserAgent + } + } + self.webView = nil + self.messageQueue.async { + self.isCollecting = false + } + } + } + } + } +#endif + + private var printedMessage = false + private var printedMessageDelay = false + @objc public func shouldDelayUpload(_ maxWaitTime: TimeInterval) -> Bool { + guard let initializedDate = initializedDate, resolvedUserAgent == nil, isCollecting else { + return false + } + + if -initializedDate.timeIntervalSinceNow > maxWaitTime { + if !printedMessage { + printedMessage = true + MPLog.debug("Max wait time exceeded for user agent") + } + return false + } + if !printedMessageDelay { + printedMessageDelay = true + MPLog.verbose("Delaying initial upload for user agent") + } + return true + } +} diff --git a/mParticle-Apple-SDK/mParticle.m b/mParticle-Apple-SDK/mParticle.m index b9d8672d3..5b3c37879 100644 --- a/mParticle-Apple-SDK/mParticle.m +++ b/mParticle-Apple-SDK/mParticle.m @@ -1,6 +1,5 @@ #import "mParticle.h" #import "MPAppNotificationHandler.h" -#import "MPBackendController.h" #import "MPConsumerInfo.h" #import "MPDevice.h" #import "MPForwardQueueParameters.h" @@ -9,21 +8,16 @@ #import "MPILogger.h" #import "MPIntegrationAttributes.h" #import "MPKitActivity.h" -#import "MPKitContainer.h" #import "MPKitFilter.h" #import "MPNetworkPerformance.h" -#import "MPNotificationController.h" #import "MPPersistenceController.h" #import "MPSession.h" -#import "MPStateMachine.h" #import "MPIUserDefaults.h" #import "MPIdentityApi.h" -#import "MPApplication.h" -#import "MParticleWebView.h" #import "MPDataPlanFilter.h" -#import "MPResponseConfig.h" -#import "MParticleSwift.h" #import "MPUpload.h" +#import "MPKitContainer.h" +#import "MParticleSwift.h" static dispatch_queue_t messageQueue = nil; static void *messageQueueKey = "mparticle message queue key"; @@ -45,7 +39,7 @@ @interface MPIdentityApi () - (void)identifyNoDispatch:(MPIdentityApiRequest *)identifyRequest completion:(nullable MPIdentityApiResultCallback)completion; @end -@interface MPKitContainer () +@interface MPKitContainer_PRIVATE () - (BOOL)kitsInitialized; @end @@ -59,18 +53,17 @@ @interface MParticle() *deferredKitConfiguration; -@property (nonatomic, strong) MParticleWebView *webView; +@property (nonatomic, strong) MParticleWebView_PRIVATE *webView; @property (nonatomic, strong, nullable) NSString *dataPlanId; @property (nonatomic, strong, nullable) NSNumber *dataPlanVersion; @property (nonatomic, readwrite) MPDataPlanOptions *dataPlanOptions; @@ -267,7 +260,7 @@ - (void)setPersistenceMaxAgeSeconds:(NSNumber *)persistenceMaxAgeSeconds { @end -@interface MPBackendController () +@interface MPBackendController_PRIVATE () - (NSMutableArray *> *)userIdentitiesForUserId:(NSNumber *)userId; @@ -280,7 +273,7 @@ @implementation MParticle @synthesize optOut = _optOut; @synthesize persistenceController = _persistenceController; @synthesize stateMachine = _stateMachine; -@synthesize kitContainer = _kitContainer; +@synthesize kitContainer_PRIVATE = _kitContainer_PRIVATE; @synthesize appNotificationHandler = _appNotificationHandler; + (void)initialize { @@ -348,8 +341,8 @@ - (instancetype)init { _trackNotifications = YES; _automaticSessionTracking = YES; _appNotificationHandler = [[MPAppNotificationHandler alloc] init]; - _stateMachine = [[MPStateMachine alloc] init]; - _webView = [[MParticleWebView alloc] init]; + _stateMachine = [[MPStateMachine_PRIVATE alloc] init]; + _webView = [[MParticleWebView_PRIVATE alloc] initWithMessageQueue:messageQueue]; return self; } @@ -371,7 +364,7 @@ - (NSMutableDictionary *)configSettings { #pragma mark MPBackendControllerDelegate methods - (void)sessionDidBegin:(MPSession *)session { dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(beginSession) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(beginSession) event:nil parameters:nil messageType:MPMessageTypeSessionStart @@ -382,7 +375,7 @@ - (void)sessionDidBegin:(MPSession *)session { - (void)sessionDidEnd:(MPSession *)session { dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(endSession) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(endSession) event:nil parameters:nil messageType:MPMessageTypeSessionEnd @@ -394,7 +387,7 @@ - (void)sessionDidEnd:(MPSession *)session { #pragma mark MPBackendControllerDelegate methods - (void)forwardLogInstall { dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:_cmd + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:_cmd event:nil parameters:nil messageType:MPMessageTypeUnknown @@ -405,7 +398,7 @@ - (void)forwardLogInstall { - (void)forwardLogUpdate { dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:_cmd + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:_cmd event:nil parameters:nil messageType:MPMessageTypeUnknown @@ -425,7 +418,7 @@ - (MPIdentityApi *)identity { } - (MPEnvironment)environment { - return [MPStateMachine environment]; + return [MPStateMachine_PRIVATE environment]; } - (MPILogLevel)logLevel { @@ -452,7 +445,7 @@ - (void)setOptOut:(BOOL)optOut { MPForwardQueueParameters *optOutParameters = [[MPForwardQueueParameters alloc] init]; [optOutParameters addParameter:@(optOut)]; - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(setOptOut:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(setOptOut:) event:nil parameters:optOutParameters messageType:MPMessageTypeOptOut @@ -529,9 +522,9 @@ - (void)startWithOptions:(MParticleOptions *)options { [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:options]; - [self.webView startWithCustomUserAgent:options.customUserAgent shouldCollect:options.collectUserAgent defaultAgentOverride:options.defaultAgent]; + [self.webView startWithCustomUserAgent:options.customUserAgent shouldCollect:options.collectUserAgent defaultUserAgentOverride:options.defaultAgent]; - _backendController = [[MPBackendController alloc] initWithDelegate:self]; + _backendController = [[MPBackendController_PRIVATE alloc] initWithDelegate:self]; if (options.networkOptions) { self.networkOptions = options.networkOptions; @@ -593,19 +586,19 @@ - (void)startWithOptions:(MParticleOptions *)options { MPILogWarning(@"SDK has been initialized in Production Mode."); } - [MPStateMachine setEnvironment:environment]; + [MPStateMachine_PRIVATE setEnvironment:environment]; [MParticle sharedInstance].stateMachine.automaticSessionTracking = options.automaticSessionTracking; if (options.attStatus != nil) { [self setATTStatus:(MPATTAuthorizationStatus)options.attStatus.integerValue withATTStatusTimestampMillis:options.attStatusTimestampMillis]; } - if ([MPResponseConfig isOlderThanConfigMaxAgeSeconds]) { - [MPResponseConfig deleteConfig]; + if ([MPIUserDefaults isOlderThanConfigMaxAgeSeconds]) { + [MPIUserDefaults deleteConfig]; } - _kitContainer = [[MPKitContainer alloc] init]; - _kitContainer.sideloadedKits = options.sideloadedKits ?: [NSArray array]; - NSUInteger sideLoadedKitsCount = _kitContainer.sideloadedKits.count; + _kitContainer_PRIVATE = [[MPKitContainer_PRIVATE alloc] init]; + _kitContainer_PRIVATE.sideloadedKits = options.sideloadedKits ?: [NSArray array]; + NSUInteger sideLoadedKitsCount = _kitContainer_PRIVATE.sideloadedKits.count; [userDefaults setSideloadedKitsCount:sideLoadedKitsCount]; [self.backendController startWithKey:apiKey @@ -637,13 +630,13 @@ - (void)startWithOptions:(MParticleOptions *)options { MPILogError(@"Identify request failed with error: %@", error); } - NSArray *deferredKitConfiguration = self.deferredKitConfiguration; + NSArray *deferredKitConfiguration = self.deferredKitConfiguration_PRIVATE; if (deferredKitConfiguration != nil && [deferredKitConfiguration isKindOfClass:[NSArray class]]) { dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer configureKits:deferredKitConfiguration]; - weakSelf.deferredKitConfiguration = nil; + [[MParticle sharedInstance].kitContainer_PRIVATE configureKits:deferredKitConfiguration]; + weakSelf.deferredKitConfiguration_PRIVATE = nil; }); } @@ -723,11 +716,11 @@ - (MParticleSession *)currentSession { - (void)resetForSwitchingWorkspaces:(void (^)(void))completion { [MParticle executeOnMessage:^{ // Remove any kits that can't be reconfigured - [self.kitContainer removeKitsFromRegistryInvalidForWorkspaceSwitch]; + [self.kitContainer_PRIVATE removeKitsFromRegistryInvalidForWorkspaceSwitch]; // Clean up kits - [self.kitContainer flushSerializedKits]; - [self.kitContainer removeAllSideloadedKits]; + [self.kitContainer_PRIVATE flushSerializedKits]; + [self.kitContainer_PRIVATE removeAllSideloadedKits]; // Clean up persistence [[MPIUserDefaults standardUserDefaults] resetDefaults]; @@ -774,16 +767,16 @@ - (void)switchWorkspaceWithOptions:(MParticleOptions *)options { #pragma mark Application notifications #if TARGET_OS_IOS == 1 - (NSData *)pushNotificationToken { - if (![MPStateMachine isAppExtension]) { - return [MPNotificationController deviceToken]; + if (![MPStateMachine_PRIVATE isAppExtension]) { + return [MPNotificationController_PRIVATE deviceToken]; } else { return nil; } } - (void)setPushNotificationToken:(NSData *)pushNotificationToken { - if (![MPStateMachine isAppExtension]) { - [MPNotificationController setDeviceToken:pushNotificationToken]; + if (![MPStateMachine_PRIVATE isAppExtension]) { + [MPNotificationController_PRIVATE setDeviceToken:pushNotificationToken]; } } @@ -792,7 +785,7 @@ - (void)didReceiveRemoteNotification:(NSDictionary *)userInfo { return; } - if (![MPStateMachine isAppExtension]) { + if (![MPStateMachine_PRIVATE isAppExtension]) { [[MParticle sharedInstance].appNotificationHandler didReceiveRemoteNotification:userInfo]; } } @@ -802,7 +795,7 @@ - (void)didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { return; } - if (![MPStateMachine isAppExtension]) { + if (![MPStateMachine_PRIVATE isAppExtension]) { [[MParticle sharedInstance].appNotificationHandler didFailToRegisterForRemoteNotificationsWithError:error]; } } @@ -812,7 +805,7 @@ - (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { return; } - if (![MPStateMachine isAppExtension]) { + if (![MPStateMachine_PRIVATE isAppExtension]) { [[MParticle sharedInstance].appNotificationHandler didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; } } @@ -822,7 +815,7 @@ - (void)handleActionWithIdentifier:(NSString *)identifier forRemoteNotification: return; } - if (![MPStateMachine isAppExtension]) { + if (![MPStateMachine_PRIVATE isAppExtension]) { [[MParticle sharedInstance].appNotificationHandler handleActionWithIdentifier:identifier forRemoteNotification:userInfo]; } } @@ -832,7 +825,7 @@ - (void)handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNoti return; } - if (![MPStateMachine isAppExtension]) { + if (![MPStateMachine_PRIVATE isAppExtension]) { [[MParticle sharedInstance].appNotificationHandler handleActionWithIdentifier:identifier forRemoteNotification:userInfo withResponseInfo:responseInfo]; } } @@ -864,8 +857,8 @@ - (BOOL)continueUserActivity:(nonnull NSUserActivity *)userActivity restorationH - (void)reset:(void (^)(void))completion { [MParticle executeOnMessage:^{ - [self.kitContainer flushSerializedKits]; - [self.kitContainer removeAllSideloadedKits]; + [self.kitContainer_PRIVATE flushSerializedKits]; + [self.kitContainer_PRIVATE removeAllSideloadedKits]; [[MPIUserDefaults standardUserDefaults] resetDefaults]; [self.persistenceController resetDatabase]; [MParticle executeOnMain:^{ @@ -905,7 +898,7 @@ - (void)beginTimedEvent:(MPEvent *)event { if (kitEvent) { // Forwarding calls to kits dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(beginTimedEvent:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(beginTimedEvent:) event:kitEvent parameters:nil messageType:MPMessageTypeEvent @@ -931,14 +924,14 @@ - (void)endTimedEvent:(MPEvent *)event { if (kitEvent) { dispatch_async(dispatch_get_main_queue(), ^{ // Forwarding calls to kits - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(endTimedEvent:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(endTimedEvent:) event:kitEvent parameters:nil messageType:MPMessageTypeEvent userInfo:nil ]; - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(logEvent:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(logEvent:) event:kitEvent parameters:nil messageType:MPMessageTypeEvent @@ -978,7 +971,7 @@ - (void)logEvent:(MPBaseEvent *)event { if (kitEvent) { // Forwarding calls to kits dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(logBaseEvent:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(logBaseEvent:) event:kitEvent parameters:nil messageType:kitEvent.messageType @@ -1010,7 +1003,7 @@ - (void)logCustomEvent:(MPEvent *)event { if (kitEvent) { // Forwarding calls to kits dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(logEvent:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(logEvent:) event:kitEvent parameters:nil messageType:MPMessageTypeEvent @@ -1033,13 +1026,13 @@ - (void)logKitBatch:(NSString *)batch { dispatch_async(messageQueue, ^{ dispatch_block_t block = ^{ if (batch) { - if ([MParticle.sharedInstance.kitContainer hasKitBatchingKits]) { + if ([MParticle.sharedInstance.kitContainer_PRIVATE hasKitBatchingKits]) { NSData *finalData = [[NSData alloc] initWithBytes:batch.UTF8String length:batch.length]; NSDictionary *kitBatch = [NSJSONSerialization JSONObjectWithData:finalData options:0 error:nil]; // Forwarding calls to kits dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(logBatch:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(logBatch:) batch:kitBatch kitHandler:^(id _Nonnull kit, NSDictionary * _Nonnull kitBatch, MPKitConfiguration * _Nonnull kitConfiguration) { NSArray *forwardRecords = [kit logBatch:kitBatch]; @@ -1056,7 +1049,7 @@ - (void)logKitBatch:(NSString *)batch { } }; - BOOL kitsInitialized = [MParticle sharedInstance].kitContainer.kitsInitialized; + BOOL kitsInitialized = [MParticle sharedInstance].kitContainer_PRIVATE.kitsInitialized; if (kitsInitialized) { block(); } else { @@ -1100,7 +1093,7 @@ - (void)logScreenEvent:(MPEvent *)event { if (kitEvent) { dispatch_async(dispatch_get_main_queue(), ^{ // Forwarding calls to kits - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(logScreen:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(logScreen:) event:kitEvent parameters:nil messageType:MPMessageTypeScreenView @@ -1150,7 +1143,7 @@ - (void)setATTStatus:(MPATTAuthorizationStatus)status withATTStatusTimestampMill NSNumber *parameter0 = @(status); NSObject *parameter1 = attStatusTimestampMillis ?: [NSNull null]; MPForwardQueueParameters *parameters = [[MPForwardQueueParameters alloc] initWithParameters:@[parameter0, parameter1]]; - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(setATTStatus:withATTStatusTimestampMillis:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(setATTStatus:withATTStatusTimestampMillis:) event:nil parameters:parameters messageType:MPMessageTypeUnknown @@ -1161,7 +1154,7 @@ - (void)setATTStatus:(MPATTAuthorizationStatus)status withATTStatusTimestampMill #pragma mark Attribution - (nullable NSDictionary *)attributionInfo { - return [[MParticle sharedInstance].kitContainer.attributionInfo copy]; + return [[MParticle sharedInstance].kitContainer_PRIVATE.attributionInfo copy]; } #pragma mark Error, Exception, and Crash Handling @@ -1197,7 +1190,7 @@ - (void)leaveBreadcrumb:(NSString *)breadcrumbName eventInfo:(NSDictionary *)e [queueParameters addParameter:message]; [queueParameters addParameter:eventInfo]; - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(logError:eventInfo:) event:nil parameters:queueParameters messageType:MPMessageTypeUnknown userInfo:nil]; + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(logError:eventInfo:) event:nil parameters:queueParameters messageType:MPMessageTypeUnknown userInfo:nil]; } }]; }); @@ -1264,7 +1257,7 @@ - (void)logException:(NSException *)exception topmostContext:(id)topmostContext MPForwardQueueParameters *queueParameters = [[MPForwardQueueParameters alloc] init]; [queueParameters addParameter:exception]; - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(logException:) event:nil parameters:queueParameters messageType:MPMessageTypeUnknown userInfo:nil]; + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(logException:) event:nil parameters:queueParameters messageType:MPMessageTypeUnknown userInfo:nil]; } }]; }); @@ -1316,7 +1309,7 @@ - (void)logCommerceEvent:(MPCommerceEvent *)commerceEvent { MPCommerceEvent *kitEvent = self.dataPlanFilter != nil ? [self.dataPlanFilter transformEventForCommerceEvent:commerceEvent] : commerceEvent; if (kitEvent) { // Forwarding calls to kits - [[MParticle sharedInstance].kitContainer forwardCommerceEventCall:kitEvent]; + [[MParticle sharedInstance].kitContainer_PRIVATE forwardCommerceEventCall:kitEvent]; } else { MPILogDebug(@"Blocked commerce event from kits: %@", commerceEvent); } @@ -1352,7 +1345,7 @@ - (void)logLTVIncrease:(double)increaseAmount eventName:(NSString *)eventName ev if (kitEvent) { dispatch_async(dispatch_get_main_queue(), ^{ // Forwarding calls to kits - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(logLTVIncrease:event:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(logLTVIncrease:event:) event:nil parameters:nil messageType:MPMessageTypeUnknown @@ -1374,7 +1367,7 @@ + (BOOL)registerExtension:(nonnull id)extension { BOOL registrationSuccessful = NO; if ([extension conformsToProtocol:@protocol(MPExtensionKitProtocol)]) { - registrationSuccessful = [MPKitContainer registerKit:(id)extension]; + registrationSuccessful = [MPKitContainer_PRIVATE registerKit:(id)extension]; } return registrationSuccessful; @@ -1419,7 +1412,7 @@ - (nullable NSDictionary *)integrationAttributesForKit:(nonnull NSNumber *)integ - (void)onKitsInitialized:(void(^)(void))block { [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:block]; - BOOL kitsInitialized = [MParticle sharedInstance].kitContainer.kitsInitialized; + BOOL kitsInitialized = [MParticle sharedInstance].kitContainer_PRIVATE.kitsInitialized; if (kitsInitialized) { block(); } else { @@ -1504,7 +1497,7 @@ - (void)setLocation:(CLLocation *)location { MPForwardQueueParameters *queueParameters = [[MPForwardQueueParameters alloc] init]; [queueParameters addParameter:location]; - [[MParticle sharedInstance].kitContainer forwardSDKCall:_cmd + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:_cmd event:nil parameters:queueParameters messageType:MPMessageTypeEvent @@ -1521,7 +1514,7 @@ - (void)beginLocationTracking:(CLLocationAccuracy)accuracy minDistance:(CLLocati - (void)beginLocationTracking:(CLLocationAccuracy)accuracy minDistance:(CLLocationDistance)distanceFilter authorizationRequest:(MPLocationAuthorizationRequest)authorizationRequest { [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:@(accuracy) parameter2:@(distanceFilter)]; - MPStateMachine *stateMachine = [MParticle sharedInstance].stateMachine; + MPStateMachine_PRIVATE *stateMachine = [MParticle sharedInstance].stateMachine; if (stateMachine.optOut) { return; } @@ -1530,7 +1523,7 @@ - (void)beginLocationTracking:(CLLocationAccuracy)accuracy minDistance:(CLLocati if (execStatus == MPExecStatusSuccess) { MPILogDebug(@"Began location tracking with accuracy: %0.0f and distance filter %0.0f", accuracy, distanceFilter); } else { - MPILogError(@"Could not begin location tracking: %@", [MPBackendController execStatusDescription:execStatus]); + MPILogError(@"Could not begin location tracking: %@", [MPBackendController_PRIVATE execStatusDescription:execStatus]); } } @@ -1541,7 +1534,7 @@ - (void)endLocationTracking { if (execStatus == MPExecStatusSuccess) { MPILogDebug(@"Ended location tracking"); } else { - MPILogError(@"Could not end location tracking: %@", [MPBackendController execStatusDescription:execStatus]); + MPILogError(@"Could not end location tracking: %@", [MPBackendController_PRIVATE execStatusDescription:execStatus]); } } #endif // MPARTICLE_LOCATION_DISABLE @@ -1594,7 +1587,7 @@ - (void)setSessionAttribute:(NSString *)key value:(id)value { if (execStatus == MPExecStatusSuccess) { MPILogDebug(@"Set session attribute - %@:%@", key, value); } else { - MPILogError(@"Could not set session attribute - %@:%@\n Reason: %@", key, value, [MPBackendController execStatusDescription:execStatus]); + MPILogError(@"Could not set session attribute - %@:%@\n Reason: %@", key, value, [MPBackendController_PRIVATE execStatusDescription:execStatus]); } }); } @@ -1632,7 +1625,7 @@ - (void)upload { if (execStatus == MPExecStatusSuccess) { MPILogDebug(@"Forcing Upload"); } else { - MPILogError(@"Could not upload data: %@", [MPBackendController execStatusDescription:execStatus]); + MPILogError(@"Could not upload data: %@", [MPBackendController_PRIVATE execStatusDescription:execStatus]); } }); } @@ -1664,7 +1657,7 @@ - (NSString *)surveyURL:(MPSurveyProvider)surveyProvider { __block NSString *surveyURL = nil; dispatch_async(dispatch_get_main_queue(), ^{ - [[MParticle sharedInstance].kitContainer forwardSDKCall:@selector(surveyURLWithUserAttributes:) + [[MParticle sharedInstance].kitContainer_PRIVATE forwardSDKCall:@selector(surveyURLWithUserAttributes:) userAttributes:userAttributes kitHandler:^(id kit, NSDictionary *forwardAttributes, MPKitConfiguration *kitConfig) { FilteredMParticleUser *filteredUser = [[FilteredMParticleUser alloc] initWithMParticleUser:[[[MParticle sharedInstance] identity] currentUser] kitConfiguration:kitConfig]; @@ -1982,7 +1975,7 @@ - (void)logNotificationOpenedWithUserInfo:(nonnull NSDictionary *)userInfo andAc - (void)logNotificationWithUserInfo:(nonnull NSDictionary *)userInfo behavior:(MPUserNotificationBehavior)behavior andActionIdentifier:(nullable NSString *)actionIdentifier { [MPListenerController.sharedInstance onAPICalled:_cmd parameter1:userInfo parameter2:@(behavior)]; - UIApplicationState state = [MPApplication sharedUIApplication].applicationState; + UIApplicationState state = [MPApplication_PRIVATE sharedUIApplication].applicationState; NSString *stateString = state == UIApplicationStateActive ? kMPPushNotificationStateForeground : kMPPushNotificationStateBackground;