diff --git a/Kickstarter-iOS/ViewModels/AppDelegateViewModel.swift b/Kickstarter-iOS/ViewModels/AppDelegateViewModel.swift index dd980de0e3..a2222ef2c8 100644 --- a/Kickstarter-iOS/ViewModels/AppDelegateViewModel.swift +++ b/Kickstarter-iOS/ViewModels/AppDelegateViewModel.swift @@ -637,6 +637,25 @@ public final class AppDelegateViewModel: AppDelegateViewModelType, AppDelegateVi deepLinkFromNotification .observeValues { _ in AppEnvironment.current.koala.trackNotificationOpened() } + // Optimizely tracking + + self.applicationDidEnterBackgroundProperty.signal + .observeValues { + let (properties, eventTags) = optimizelyTrackingAttributesAndEventTags( + with: AppEnvironment.current.currentUser, + project: nil, + refTag: nil + ) + + try? AppEnvironment.current.optimizelyClient? + .track( + eventKey: "App Closed", + userId: deviceIdentifier(uuid: UUID()), + attributes: properties, + eventTags: eventTags + ) + } + self.applicationIconBadgeNumber = Signal.merge( self.applicationWillEnterForegroundProperty.signal, self.applicationLaunchOptionsProperty.signal.ignoreValues() diff --git a/Kickstarter-iOS/ViewModels/AppDelegateViewModelTests.swift b/Kickstarter-iOS/ViewModels/AppDelegateViewModelTests.swift index 7429d674df..9ed7a792f1 100644 --- a/Kickstarter-iOS/ViewModels/AppDelegateViewModelTests.swift +++ b/Kickstarter-iOS/ViewModels/AppDelegateViewModelTests.swift @@ -253,6 +253,14 @@ final class AppDelegateViewModelTests: TestCase { } } + func testOptimizelyTracking() { + XCTAssertEqual(self.optimizelyClient.trackedEventKey, nil) + + self.vm.inputs.applicationDidEnterBackground() + + XCTAssertEqual(self.optimizelyClient.trackedEventKey, "App Closed") + } + // MARK: - AppCenter func testConfigureAppCenter_AlphaApp_LoggedOut() { diff --git a/Library/OptimizelyClientType.swift b/Library/OptimizelyClientType.swift index ac1b72909b..d1a4c96248 100644 --- a/Library/OptimizelyClientType.swift +++ b/Library/OptimizelyClientType.swift @@ -40,16 +40,16 @@ extension OptimizelyClientType { public func optimizelyTrackingAttributesAndEventTags( with user: User?, - project: Project, + project: Project?, refTag: RefTag? ) -> ([String: Any], [String: Any]) { let properties = optimizelyUserAttributes(with: user, project: project, refTag: refTag) let eventTags: [String: Any] = ([ - "project_subcategory": project.category.name, - "project_category": project.category.parentName, - "project_country": project.location.country.lowercased(), - "project_user_has_watched": project.personalization.isStarred + "project_subcategory": project?.category.name, + "project_category": project?.category.parentName, + "project_country": project?.location.country.lowercased(), + "project_user_has_watched": project?.personalization.isStarred ] as [String: Any?]).compact() return (properties, eventTags) diff --git a/Library/ViewModels/LandingPageViewModel.swift b/Library/ViewModels/LandingPageViewModel.swift index 611bcee91e..b4ca9de1e4 100644 --- a/Library/ViewModels/LandingPageViewModel.swift +++ b/Library/ViewModels/LandingPageViewModel.swift @@ -33,6 +33,25 @@ public final class LandingPageViewModel: LandingPageViewModelType, LandingPageVi .observeValues { _ in AppEnvironment.current.userDefaults.hasSeenLandingPage = true } + + // Tracking + + self.ctaButtonTappedSignal + .observeValues { + let (properties, eventTags) = optimizelyTrackingAttributesAndEventTags( + with: AppEnvironment.current.currentUser, + project: nil, + refTag: nil + ) + + try? AppEnvironment.current.optimizelyClient? + .track( + eventKey: "Get Started Button Clicked", + userId: deviceIdentifier(uuid: UUID()), + attributes: properties, + eventTags: eventTags + ) + } } private let (ctaButtonTappedSignal, ctaButtonTappedObserver) = Signal<(), Never>.pipe() diff --git a/Library/ViewModels/LandingPageViewModelTests.swift b/Library/ViewModels/LandingPageViewModelTests.swift index ce10a14a28..910ec5550c 100644 --- a/Library/ViewModels/LandingPageViewModelTests.swift +++ b/Library/ViewModels/LandingPageViewModelTests.swift @@ -27,6 +27,14 @@ internal final class LandingPageViewModelTests: TestCase { self.dismissViewController.assertValueCount(1) } + func testoptimizelyTracking_OnButtonTap() { + XCTAssertEqual(self.optimizelyClient.trackedEventKey, nil) + + self.viewModel.inputs.ctaButtonTapped() + + XCTAssertEqual(self.optimizelyClient.trackedEventKey, "Get Started Button Clicked") + } + func testUserDefaultsUpdates_OnViewDidLoad() { let userDefaults = MockKeyValueStore()