Commit 25d7f43d by Shailesh Aher

[IOS-127]: Integrated tercept enabler to check multiple conditions of…

[IOS-127]: Integrated tercept enabler to check multiple conditions of initializing/deinitializing tercept
parent 4be57610
......@@ -215,6 +215,8 @@
CEEF4100265E47FF00425D8F /* BlendFIPSSource.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEEF40FF265E47FF00425D8F /* BlendFIPSSource.framework */; };
CEEF4101265E47FF00425D8F /* BlendFIPSSource.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CEEF40FF265E47FF00425D8F /* BlendFIPSSource.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
F227B22E26B2A45700DD7EBB /* AppInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = F227B22D26B2A45700DD7EBB /* AppInfo.swift */; };
F227B23026B7B97200DD7EBB /* TerceptSDKEnablerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F227B22F26B7B97200DD7EBB /* TerceptSDKEnablerTests.swift */; };
F227B23226B7CC0000DD7EBB /* TerceptSDKEnabler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F227B23126B7CC0000DD7EBB /* TerceptSDKEnabler.swift */; };
F2D8A6E2269D88D10060F36A /* libTerceptSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F2D8A6B9269D88D10060F36A /* libTerceptSDK.a */; };
F2D8A6E3269D88D10060F36A /* x86_64-apple-ios-simulator.swiftinterface in Resources */ = {isa = PBXBuildFile; fileRef = F2D8A6BB269D88D10060F36A /* x86_64-apple-ios-simulator.swiftinterface */; };
F2D8A6E4269D88D10060F36A /* arm64-apple-ios.swiftinterface in Resources */ = {isa = PBXBuildFile; fileRef = F2D8A6BC269D88D10060F36A /* arm64-apple-ios.swiftinterface */; };
......@@ -511,6 +513,8 @@
CEEF40FF265E47FF00425D8F /* BlendFIPSSource.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = BlendFIPSSource.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DF826CF4702D9DCCB9A9DD71 /* Pods-1Weather.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-1Weather.release.xcconfig"; path = "Target Support Files/Pods-1Weather/Pods-1Weather.release.xcconfig"; sourceTree = "<group>"; };
F227B22D26B2A45700DD7EBB /* AppInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInfo.swift; sourceTree = "<group>"; };
F227B22F26B7B97200DD7EBB /* TerceptSDKEnablerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerceptSDKEnablerTests.swift; sourceTree = "<group>"; };
F227B23126B7CC0000DD7EBB /* TerceptSDKEnabler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerceptSDKEnabler.swift; sourceTree = "<group>"; };
F2D8A6B7269D88D10060F36A /* PublicHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PublicHeader.h; sourceTree = "<group>"; };
F2D8A6B8269D88D10060F36A /* TerceptSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TerceptSDK.h; sourceTree = "<group>"; };
F2D8A6B9269D88D10060F36A /* libTerceptSDK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libTerceptSDK.a; sourceTree = "<group>"; };
......@@ -1384,6 +1388,7 @@
children = (
F2D8A6B6269D88D10060F36A /* lib */,
F2D8A70C269D93210060F36A /* TerceptSDKManager.swift */,
F227B23126B7CC0000DD7EBB /* TerceptSDKEnabler.swift */,
);
path = TerceptSDK;
sourceTree = "<group>";
......@@ -1464,6 +1469,7 @@
children = (
F2D8A7C8269FFFD50060F36A /* StubTerceptOptimizer.swift */,
F2D8A74D269FFDF10060F36A /* TerceptSDKManagerTests.swift */,
F227B22F26B7B97200DD7EBB /* TerceptSDKEnablerTests.swift */,
);
path = TerceptSDK;
sourceTree = "<group>";
......@@ -1853,6 +1859,7 @@
CE6BE4942634170800626822 /* USStateCode.swift in Sources */,
CD37D3F3260DF4FB002669D6 /* SettingsCoordinator.swift in Sources */,
CD1237C3255D5C5900C98139 /* AppDelegate.swift in Sources */,
F227B23226B7CC0000DD7EBB /* TerceptSDKEnabler.swift in Sources */,
F2D8A70D269D93210060F36A /* TerceptSDKManager.swift in Sources */,
CD39F2F225DE94C4009FE398 /* SunPhaseCell.swift in Sources */,
CD6B304325726AD1004B34B3 /* DefaultTheme.swift in Sources */,
......@@ -1990,6 +1997,7 @@
buildActionMask = 2147483647;
files = (
F2D8A74E269FFDF10060F36A /* TerceptSDKManagerTests.swift in Sources */,
F227B23026B7B97200DD7EBB /* TerceptSDKEnablerTests.swift in Sources */,
F2D8A7C9269FFFD50060F36A /* StubTerceptOptimizer.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
......
......@@ -133,6 +133,8 @@ class CCPAHelper {
FBAdSettings.setAdvertiserTrackingEnabled(canCollectData)
let terceptSDKManager: TerceptSDKManager? = Dependency.shared.getDependency()
terceptSDKManager?.canCollectData = canCollectData
// https://ams.amazon.com/webpublisher/uam/docs/web-integration-documentation/integration-guide/uam-ccpa.html?source=menu
if self.canCollectData == nil {
A9Cache.shared.ccpaPrivacyString = "1\(self.shownPrivacyNoticeBefore ? "Y" : "N")-"
......
//
// TerceptSDKEnablerTests.swift
// 1WeatherTests
//
// Created by Shailesh on 02/08/21.
//
import XCTest
@testable import _Weather
class TerceptSDKEnablerTests: XCTestCase {
private var isInitCalled = false
private var isDeinitCalled = false
private var enabler = TerceptSDKEnabler()
override func setUp() {
super.setUp()
enabler = TerceptSDKEnabler()
self.enabler.attachObserver(observer: TerceptConditionsObserver(initSDK: {
self.isInitCalled = true
}, deinitSDK: {
self.isDeinitCalled = true
}))
}
override func tearDown() {
super.tearDown()
isInitCalled = false
isDeinitCalled = false
}
func testEnablingCondition() {
enabler.enableDataCollection(true)
XCTAssertFalse(isInitCalled)
XCTAssertFalse(isDeinitCalled)
enabler.setConfigToggle(true)
XCTAssertTrue(isInitCalled)
XCTAssertFalse(isDeinitCalled)
}
func testDelayedEnabledCondition() {
enabler.enableDataCollection(false)
XCTAssertFalse(isInitCalled)
XCTAssertFalse(isDeinitCalled)
enabler.setConfigToggle(false)
XCTAssertFalse(isInitCalled)
XCTAssertFalse(isDeinitCalled)
enabler.enableDataCollection(true)
XCTAssertFalse(isInitCalled)
XCTAssertFalse(isDeinitCalled)
enabler.setConfigToggle(true)
XCTAssertTrue(isInitCalled)
XCTAssertFalse(isDeinitCalled)
}
func testDataCollectionDeniedCondition() {
enabler.enableDataCollection(true)
XCTAssertFalse(isInitCalled)
XCTAssertFalse(isDeinitCalled)
enabler.setConfigToggle(true)
XCTAssertTrue(isInitCalled)
XCTAssertFalse(isDeinitCalled)
// Resetting init
isInitCalled = false
enabler.enableDataCollection(false)
XCTAssertFalse(isInitCalled)
XCTAssertTrue(isDeinitCalled)
}
func testMultipleDeinitCallingIssue() {
testDataCollectionDeniedCondition()
isDeinitCalled = false
enabler.enableDataCollection(false)
XCTAssertFalse(isInitCalled)
XCTAssertFalse(isDeinitCalled)
}
}
......@@ -72,4 +72,74 @@ class TerceptSDKManagerTests: XCTestCase {
NotificationCenter.default.post(name: UIApplication.didEnterBackgroundNotification, object: nil)
XCTAssertTrue(stub.sentEventDataCalled)
}
func testTerceptInit() {
let sdkManager = TerceptSDKManager()
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
let configManager = ConfigManager()
configManager.config = AppConfig(popularCities: nil,
adConfig: AdConfig(),
ccpaUpdateInterval: nil,
nwsAlertsViaMoEngageEnabled: false,
showAttPrompt: false,
shortsLeftBelowCountKey: 0,
shortsLastNudgeEnabledKey: false,
shortsSwipeUpNudgeCountKey: 0,
terceptSDKTrackingEnabled: true)
sdkManager.dataUpdated(by: configManager)
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
sdkManager.canCollectData = true
XCTAssertTrue(sdkManager.logEvent("", "", [:]))
}
func testTerceptFirebaseToggleOff() {
let sdkManager = TerceptSDKManager()
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
let configManager = ConfigManager()
configManager.config = AppConfig(popularCities: nil,
adConfig: AdConfig(),
ccpaUpdateInterval: nil,
nwsAlertsViaMoEngageEnabled: false,
showAttPrompt: false,
shortsLeftBelowCountKey: 0,
shortsLastNudgeEnabledKey: false,
shortsSwipeUpNudgeCountKey: 0,
terceptSDKTrackingEnabled: false)
sdkManager.dataUpdated(by: configManager)
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
sdkManager.canCollectData = true
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
sdkManager.canCollectData = false
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
}
func testDataCollectionPermission() {
let sdkManager = TerceptSDKManager()
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
let configManager = ConfigManager()
configManager.config = AppConfig(popularCities: nil,
adConfig: AdConfig(),
ccpaUpdateInterval: nil,
nwsAlertsViaMoEngageEnabled: false,
showAttPrompt: false,
shortsLeftBelowCountKey: 0,
shortsLastNudgeEnabledKey: false,
shortsSwipeUpNudgeCountKey: 0,
terceptSDKTrackingEnabled: true)
sdkManager.dataUpdated(by: configManager)
sdkManager.canCollectData = true
XCTAssertTrue(sdkManager.logEvent("", "", [:]))
sdkManager.canCollectData = false
XCTAssertFalse(sdkManager.logEvent("", "", [:]))
}
}
//
// TerceptSDKEnabler.swift
// 1Weather
//
// Created by Shailesh on 02/08/21.
//
struct TerceptConditionsObserver {
let initSDK: (() -> Void)
let deinitSDK: (() -> Void)
}
final class TerceptSDKEnabler {
private var observer: TerceptConditionsObserver?
private var configToggle: Bool?
private var canCollectData: Bool?
private var hasInitializedSDK: Bool = false
private func invokeObserver() {
guard let firebaseConfig = configToggle,
let canCollectData = canCollectData else { return }
if firebaseConfig, canCollectData, !hasInitializedSDK {
hasInitializedSDK = true
observer?.initSDK()
} else if hasInitializedSDK {
hasInitializedSDK = false
observer?.deinitSDK()
}
}
func attachObserver(observer: TerceptConditionsObserver) {
self.observer = observer
}
func setConfigToggle(_ configToggle: Bool) {
self.configToggle = configToggle
invokeObserver()
}
func enableDataCollection(_ canCollectData: Bool) {
self.canCollectData = canCollectData
invokeObserver()
}
}
......@@ -24,7 +24,7 @@ extension TerceptOptimization: TerceptOpimizable { }
final class TerceptSDKManager: AdEventLoggable, DependencyRepresentable {
private var optimizer: TerceptOpimizable?
private let enabler: TerceptSDKEnabler
private struct Constants {
static let DFPCode: String = "120348554"
static var IDFA: String { AppInfo.idfa ?? "UNKNOWN" }
......@@ -32,24 +32,43 @@ final class TerceptSDKManager: AdEventLoggable, DependencyRepresentable {
static var version: String { AppInfo.appVersion }
}
var canCollectData: Bool = false {
didSet {
enabler.enableDataCollection(canCollectData)
}
}
required init() {
self.enabler = TerceptSDKEnabler()
attachObserver()
registerNotifications()
}
init(optimizable: TerceptOpimizable, adUnitIDs: [String]) {
self.optimizer = optimizable
self.enabler = TerceptSDKEnabler()
attachObserver()
updateKeys()
optimizable.fetch(adUnitIDs)
registerNotifications()
fetchIfAvailable()
}
//MARK:- Private
private func attachObserver() {
self.enabler.attachObserver(observer: TerceptConditionsObserver(initSDK: initializeSDK, deinitSDK: deinitSDK))
}
private func initializeSDK() {
optimizer = TerceptOptimization(Constants.DFPCode)
updateKeys()
fetchIfAvailable()
}
private func deinitSDK() {
optimizer = nil
}
private func updateKeys() {
optimizer?.initParams(Constants.IDFA, Constants.IDFV, ["appVersion": Constants.version])
}
......@@ -77,6 +96,11 @@ final class TerceptSDKManager: AdEventLoggable, DependencyRepresentable {
optimizer?.fetch(adUnitIDs)
}
@objc private func handleSwitchToBackground() {
optimizer?.sendEventsData()
}
//MARK:- Public
func getTracker(with adUnitId: String) -> TerceptAdTracker {
return TerceptAdTracker(adUnitId: adUnitId,
logger: self,
......@@ -90,17 +114,11 @@ final class TerceptSDKManager: AdEventLoggable, DependencyRepresentable {
@discardableResult func logEvent(_ adunit: String?, _ event: String?, _ customParams: [String : Any]) -> Bool {
return optimizer?.logEvent(adunit, event, customParams) ?? false
}
@objc private func handleSwitchToBackground() {
optimizer?.sendEventsData()
}
}
extension TerceptSDKManager: ConfigManagerDelegate {
func dataUpdated(by configManager: ConfigManager) {
if configManager.config.terceptSDKTrackingEnabled {
initializeSDK()
}
enabler.setConfigToggle(configManager.config.terceptSDKTrackingEnabled)
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment