diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4ca17f9a..9cafd4aa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,7 @@ jobs: - uses: actions/checkout@v2 - uses: ruby/setup-ruby@v1 with: - ruby-version: '2.7' + ruby-version: '3.0' - name: Install Fastlane run: | gem install fastlane @@ -24,7 +24,7 @@ jobs: working-directory: ./builder strategy: matrix: - destination: ["platform=iOS Simulator,OS=14.5,name=iPhone 14"] + destination: ["platform=iOS Simulator,OS=17.5,name=iPhone 15 Pro"] scheme: - TealiumAppDelegateProxyTests-iOS - TealiumAttributionTests-iOS @@ -40,6 +40,7 @@ jobs: - TealiumTagManagementIntegrationTests-iOS - TealiumTagManagementTests-iOS - TealiumVisitorServiceTests-iOS + - TealiumMomentsAPITests-iOS steps: - name: Setup Xcode version uses: maxim-lobanov/setup-xcode@v1.4.1 @@ -47,7 +48,7 @@ jobs: xcode-version: latest-stable - uses: actions/checkout@v2 - name: Test - "${{ matrix.scheme }}" - run: fastlane scan --scheme "${{ matrix.scheme }}" --output_files "${{ matrix.scheme }}".html + run: fastlane scan --scheme "${{ matrix.scheme }}" --output_files "${{ matrix.scheme }}" --derived-data-path "./build" --skip_build true --result_bundle true --output_types junit --xcodebuild_formatter "xcbeautify -q --is-ci" --destination "${{ matrix.destination }}" working-directory: ${{env.working-directory}} - name: Archive Code Coverage Report uses: actions/upload-artifact@v2 @@ -86,7 +87,7 @@ jobs: working-directory: ./builder strategy: matrix: - destination: ["platform=macOS,arch=x86_64"] + destination: ["platform=macOS"] scheme: - TealiumAutotrackingTests-macOS - TealiumCoreTests-macOS @@ -94,6 +95,7 @@ jobs: - TealiumLifecycleTests-macOS - TealiumMediaTests-macOS - TealiumVisitorServiceTests-macOS + - TealiumMomentsAPITests-macOS steps: - name: Setup Xcode version uses: maxim-lobanov/setup-xcode@v1.4.1 @@ -101,7 +103,7 @@ jobs: xcode-version: latest-stable - uses: actions/checkout@v2 - name: Test - "${{ matrix.scheme }}" - run: rm -rf output && fastlane scan --scheme "${{ matrix.scheme }}" --derived_data_path ./output --code_coverage true --skip_build true + run: rm -rf output && fastlane scan --scheme "${{ matrix.scheme }}" --derived_data_path ./output --code_coverage true --skip_build true --destination "${{ matrix.destination }}" working-directory: ${{env.working-directory}} - name: Archive Code Coverage Report uses: actions/upload-artifact@v2 @@ -147,6 +149,7 @@ jobs: - TealiumLifecycleTests-tvOS - TealiumMediaTests-tvOS - TealiumVisitorServiceTests-tvOS + - TealiumMomentsAPITests-tvOS steps: - name: Setup Xcode version uses: maxim-lobanov/setup-xcode@v1.4.1 @@ -154,7 +157,7 @@ jobs: xcode-version: latest-stable - uses: actions/checkout@v2 - name: Test - "${{ matrix.scheme }}" - run: rm -rf output && fastlane scan --scheme "${{ matrix.scheme }}" --derived_data_path ./output --code_coverage true --skip_build true + run: rm -rf output && fastlane scan --scheme "${{ matrix.scheme }}" --derived_data_path ./output --code_coverage true --skip_build true --destination "${{ matrix.destination }}" working-directory: ${{env.working-directory}} - name: Archive Code Coverage Report uses: actions/upload-artifact@v2 @@ -206,7 +209,7 @@ jobs: working-directory: ./builder strategy: matrix: - destination: ["platform=iOS Simulator,OS=14.5,name=iPhone 14"] + destination: ["platform=iOS Simulator,OS=17.5,name=iPhone 15 Pro"] steps: - name: Setup Xcode version uses: maxim-lobanov/setup-xcode@v1.4.1 @@ -214,7 +217,7 @@ jobs: xcode-version: latest-stable - uses: actions/checkout@v2 - name: Test TealiumAutotracking iOS UI Tests - run: rm -rf output && fastlane scan --scheme "TealiumAutotrackingUITests-iOS" --derived_data_path ./output --code_coverage false --skip_build true + run: rm -rf output && fastlane scan --scheme "TealiumAutotrackingUITests-iOS" --derived_data_path ./output --code_coverage false --skip_build true --destination "${{ matrix.destination }}" working-directory: ${{ env.working-directory }} test_Autotracking_macOS_uiTests: needs: install @@ -226,7 +229,7 @@ jobs: working-directory: ./builder strategy: matrix: - destination: ["platform=macOS,arch=x86_64"] + destination: ["platform=macOS"] steps: - name: Setup Xcode version uses: maxim-lobanov/setup-xcode@v1.3.0 @@ -234,7 +237,7 @@ jobs: xcode-version: latest-stable - uses: actions/checkout@v2 - name: Test TealiumAutotracking macOS UI Tests - run: rm -rf output && fastlane scan --scheme "TealiumAutotrackingUITests-macOS" --derived_data_path ./output --code_coverage false --skip_build true + run: rm -rf output && fastlane scan --scheme "TealiumAutotrackingUITests-macOS" --derived_data_path ./output --code_coverage false --skip_build true --destination "${{ matrix.destination }}" working-directory: ${{ env.working-directory }} test_Autotracking_tvOS_uiTests: needs: install @@ -254,5 +257,5 @@ jobs: xcode-version: latest-stable - uses: actions/checkout@v2 - name: Test TealiumAutotracking tvOS UI Tests - run: rm -rf output && fastlane scan --scheme "TealiumAutotrackingUITests-tvOS" --derived_data_path ./output --code_coverage false --skip_build true + run: rm -rf output && fastlane scan --scheme "TealiumAutotrackingUITests-tvOS" --derived_data_path ./output --code_coverage false --skip_build true --destination "${{ matrix.destination }}" working-directory: ${{ env.working-directory }} diff --git a/.swiftlint.yml b/.swiftlint.yml index 0ef869da..0d4c0c9f 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -43,7 +43,6 @@ file_length: identifier_name: excluded: - id - severity: warning line_length: warning: 200 error: 500 diff --git a/Package.swift b/Package.swift index be49f410..a6e591d0 100644 --- a/Package.swift +++ b/Package.swift @@ -38,7 +38,10 @@ let package = Package( targets: ["TealiumTagManagement"]), .library( name: "TealiumVisitorService", - targets: ["TealiumVisitorService"]) + targets: ["TealiumVisitorService"]), + .library( + name: "TealiumMomentsAPI", + targets: ["TealiumMomentsAPI"]) ], dependencies: [ @@ -124,5 +127,11 @@ let package = Package( path: "tealium/collectors/visitorservice/", swiftSettings: [.define("visitorservice")] ), + .target( + name: "TealiumMomentsAPI", + dependencies: ["TealiumCore"], + path: "tealium/collectors/momentsapi/", + swiftSettings: [.define("momentsapi")] + ), ] ) diff --git a/builder/SM/Surfile b/builder/SM/Surfile index ac96167e..095dfd8b 100644 --- a/builder/SM/Surfile +++ b/builder/SM/Surfile @@ -627,10 +627,81 @@ + + name + TealiumMomentsAPI + targets + + + sdk + iOS + workspace + tealium-swift.xcworkspace + scheme + TealiumMomentsAPI + + + sdk + iOSSimulator + workspace + tealium-swift.xcworkspace + scheme + TealiumMomentsAPI + + + sdk + watchSimulator + workspace + tealium-swift.xcworkspace + scheme + TealiumMomentsAPI + + + sdk + watchOS + workspace + tealium-swift.xcworkspace + scheme + TealiumMomentsAPI + + + sdk + macOS + workspace + tealium-swift.xcworkspace + scheme + TealiumMomentsAPI + + + sdk + macOSCatalyst + workspace + tealium-swift.xcworkspace + scheme + TealiumMomentsAPI + + + sdk + tvOS + workspace + tealium-swift.xcworkspace + scheme + TealiumMomentsAPI + + + sdk + tvOSSimulator + workspace + tealium-swift.xcworkspace + scheme + TealiumMomentsAPI + + + finalActions openDirectory - \ No newline at end of file + diff --git a/builder/TealiumMoments-Info.plist b/builder/TealiumMoments-Info.plist new file mode 100644 index 00000000..323e5ecf --- /dev/null +++ b/builder/TealiumMoments-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/builder/iOSTealiumTest/ContentView.swift b/builder/iOSTealiumTest/ContentView.swift index 9640815e..95e94f7e 100644 --- a/builder/iOSTealiumTest/ContentView.swift +++ b/builder/iOSTealiumTest/ContentView.swift @@ -69,6 +69,8 @@ struct ContentView: View { @ObservedObject var iapHelper = IAPHelper.shared @State private var traceId: String = "" @State private var showAlert = false + @State private var navigateToMoments = false + @State private var navigateToVisitorService = false @State private var email: String = TealiumHelper.shared.tealium?.dataLayer.all[TealiumDataKey.email] as? String ?? "" let name = "Main Screen" // Timed event start @@ -152,6 +154,18 @@ struct ContentView: View { TealiumTextButton(title: "VisitorProfileRequest") { TealiumHelper.shared.tealium?.visitorService?.requestVisitorProfile() } + TealiumTextButton(title: "Moments API") { + navigateToMoments = true + } + TealiumTextButton(title: "Visitor Service") { + navigateToVisitorService = true + } + NavigationLink(destination: MomentsView(), isActive: $navigateToMoments) { + EmptyView() + } + NavigationLink(destination: VisitorServiceView(), isActive: $navigateToVisitorService) { + EmptyView() + } } Spacer() } diff --git a/builder/iOSTealiumTest/Info.plist b/builder/iOSTealiumTest/Info.plist index ff684aea..2fd0fab4 100644 --- a/builder/iOSTealiumTest/Info.plist +++ b/builder/iOSTealiumTest/Info.plist @@ -35,8 +35,15 @@ Intent + LSApplicationCategoryType + LSRequiresIPhoneOS + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSLocationAlwaysAndWhenInUseUsageDescription We'd like to access your location NSLocationAlwaysUsageDescription diff --git a/builder/iOSTealiumTest/MomentsView.swift b/builder/iOSTealiumTest/MomentsView.swift new file mode 100644 index 00000000..94a91080 --- /dev/null +++ b/builder/iOSTealiumTest/MomentsView.swift @@ -0,0 +1,139 @@ +// +// MomentsView.swift +// iOSTealiumTest +// +// Copyright © 2024 Tealium, Inc. All rights reserved. +// + +import Foundation +import SwiftUI + +struct MomentsView: View { + @State private var audiencesContent = "Awaiting API request" + @State private var badgesContent = "Awaiting API request" + @State private var numbersContent = "Awaiting API request" + @State private var datesContent = "Awaiting API request" + @State private var stringsContent = "Awaiting API request" + @AppStorage("engineId") private var engineId = "" + @State private var isEngineIdEditable = true + @State private var isLoading = false + @State private var showAlert = false + @State private var alertMessage = "" + + var body: some View { + NavigationView { + VStack { + HStack { + TextField("Enter Engine ID", text: $engineId) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .disabled(!isEngineIdEditable) + if isEngineIdEditable { + Button("Confirm") { + isEngineIdEditable = false + loadData() + } + .padding() + .background(Color.blue) + .foregroundColor(.white) + .cornerRadius(8) + } else { + Button("Edit") { + isEngineIdEditable = true + } + .padding() + .background(Color.gray) + .foregroundColor(.white) + .cornerRadius(8) + } + } + .padding() + + Button(action: { + loadData() + }) { + Text("Moments API Request") + .padding() + .foregroundColor(.white) + .background(isLoading ? Color.gray : Color.blue) + .cornerRadius(8) + } + .disabled(engineId.isEmpty || isEngineIdEditable || isLoading) + + List { + RowView(label: "Audiences", content: $audiencesContent) + RowView(label: "Badges", content: $badgesContent) + RowView(label: "Numbers", content: $numbersContent) + RowView(label: "Dates", content: $datesContent) + RowView(label: "Strings", content: $stringsContent) + } + } + .navigationBarTitle("Moments API") + .alert(isPresented: $showAlert) { + Alert( + title: Text("Error"), + message: Text(alertMessage), + dismissButton: .default(Text("OK")) + ) + } + } + .onAppear { + TealiumHelper.shared.trackView(title: "Moments API View", data: nil) + if !engineId.isEmpty { + isEngineIdEditable = false + } + } + } + + func loadData() { + isLoading = true + TealiumHelper.shared.fetchMoments(engineId: engineId) { engineResponse in + isLoading = false + switch engineResponse { + case .success(let engineResponse): + stringsContent = (engineResponse.strings ?? [:]) + .sorted(by: { $0.key < $1.key }) + .compactMap { + "\($0.key) : \($0.value)" + } + .joined(separator: "\n") + audiencesContent = (engineResponse.audiences ?? []) + .joined(separator: "\n") + badgesContent = (engineResponse.badges ?? []) + .joined(separator: "\n") + datesContent = (engineResponse.dates ?? [String: Int64]()) + .sorted(by: { $0.key < $1.key }) + .compactMap { + "\($0.key) : \($0.value)" + } + .joined(separator: "\n") + numbersContent = (engineResponse.numbers ?? [String: Double]()) + .sorted(by: { $0.key < $1.key }) + .compactMap { + "\($0.key) : \(String(format: "%.2f", $0.value))" + } + .joined(separator: "\n") + case .failure(let error): + print("Error fetching moments:", error.localizedDescription) + alertMessage = error.localizedDescription + if let suggestion = (error as? LocalizedError)?.recoverySuggestion { + alertMessage += "\n\(suggestion)" + } + showAlert = true + } + } + } +} + +struct RowView: View { + var label: String + @Binding var content: String + + var body: some View { + HStack { + Text(label + ":") + .bold() + Spacer() + Text(content) + } + } +} diff --git a/builder/iOSTealiumTest/TealiumHelper.swift b/builder/iOSTealiumTest/TealiumHelper.swift index dc978c3b..25146e74 100644 --- a/builder/iOSTealiumTest/TealiumHelper.swift +++ b/builder/iOSTealiumTest/TealiumHelper.swift @@ -6,49 +6,51 @@ // import Foundation - +import TealiumAutotracking import TealiumCollect import TealiumCore +import TealiumInAppPurchase import TealiumLifecycle +import TealiumMomentsAPI import TealiumVisitorService -import TealiumAutotracking -import TealiumInAppPurchase + #if os(iOS) -import WebKit -import TealiumAttribution -import TealiumLocation -import TealiumRemoteCommands -import TealiumTagManagement + import WebKit + import TealiumAttribution + import TealiumLocation + import TealiumRemoteCommands + import TealiumTagManagement #endif extension TealiumDataKey { static let email = "email" } -class TealiumHelper { +class TealiumHelper: ObservableObject { @ToAnyObservable(TealiumBufferedSubject(bufferSize: 10)) - var onWillTrack: TealiumObservable<[String:Any]> - + var onWillTrack: TealiumObservable<[String: Any]> + @Published var visitorProfile: TealiumVisitorProfile? static let shared = TealiumHelper() var tealium: Tealium? var enableHelperLogs = true - private init() { } + private init() {} func start() { - let config = TealiumConfig(account: "tealiummobile", - profile: "demo", - environment: "prod", - dataSource: "test12", - options: nil) + let config = TealiumConfig( + account: "tealiummobile", + profile: "demo", + environment: "prod", + dataSource: "test12", + options: nil) config.connectivityRefreshInterval = 5 config.loggerType = .os - config.logLevel = .info + config.logLevel = .debug config.consentPolicy = .gdpr config.consentLoggingEnabled = true -// config.remoteHTTPCommandDisabled = false + // config.remoteHTTPCommandDisabled = false config.dispatchListeners = [self] config.dispatchValidators = [self] config.shouldUseRemotePublishSettings = false @@ -62,10 +64,12 @@ class TealiumHelper { config.autoTrackingCollectorDelegate = self config.batterySaverEnabled = true config.hostedDataLayerKeys = ["hdl-test": "product_id"] - config.timedEventTriggers = [TimedEventTrigger(start: "product_view", end: "order_complete"), - TimedEventTrigger(start: "start_game", end: "buy_coins")] + config.timedEventTriggers = [ + TimedEventTrigger(start: "product_view", end: "order_complete"), + TimedEventTrigger(start: "start_game", end: "buy_coins"), + ] - config.consentExpiry = (time: 2, unit: .minutes) + config.consentExpiry = (time: 2, unit: .years) config.onConsentExpiration = { print("Consent expired") } @@ -79,17 +83,18 @@ class TealiumHelper { Collectors.Connectivity, Collectors.Device, Collectors.Location, + Collectors.MomentsAPI, Collectors.VisitorService, Collectors.InAppPurchase, - Collectors.AutoTracking + Collectors.AutoTracking, ] - + config.dispatchers = [ Dispatchers.Collect, -// Dispatchers.TagManagement, - Dispatchers.RemoteCommands + // Dispatchers.TagManagement, + Dispatchers.RemoteCommands, ] - + // config.appDelegateProxyEnabled = false config.remoteAPIEnabled = true config.remoteCommandConfigRefresh = .every(24, .hours) @@ -99,6 +104,7 @@ class TealiumHelper { config.geofenceUrl = "https://tags.tiqcdn.com/dle/tealiummobile/location/geofences.json" config.desiredAccuracy = .best config.updateDistance = 100.0 + config.momentsAPIRegion = .us_east #else config.collectors = [ Collectors.Lifecycle, @@ -107,49 +113,52 @@ class TealiumHelper { Collectors.Device, Collectors.VisitorService, Collectors.AutoTracking, - Collectors.InAppPurchase + Collectors.InAppPurchase, ] config.dispatchers = [ - Dispatchers.Collect, + Dispatchers.Collect ] #endif tealium = Tealium(config: config) { [weak self] response in guard let self = self, - let teal = self.tealium else { + let teal = self.tealium + else { return - } let dataLayer = teal.dataLayer teal.consentManager?.userConsentStatus = .consented dataLayer.add(key: "myvarforever", value: 123_456, expiry: .forever) dataLayer.add(data: ["some_key1": "some_val1"], expiry: .session) - dataLayer.add(data: ["some_key_forever": "some_val_forever"], expiry: .forever) // forever + dataLayer.add(data: ["some_key_forever": "some_val_forever"], expiry: .forever) // forever dataLayer.add(data: ["until": "restart"], expiry: .untilRestart) dataLayer.add(data: ["custom": "expire in 3 min"], expiry: .afterCustom((.minutes, 3))) #if os(iOS) - teal.location?.requestAuthorization() + teal.location?.requestAuthorization() - guard let remoteCommands = self.tealium?.remoteCommands else { - return - } + guard let remoteCommands = self.tealium?.remoteCommands else { + return + } - teal.getTagManagementWebView { webView in - if #available(iOS 16.4, *) { -// webView.isInspectable = true // Uncomment to inspect tagManagement webviews on XCode 14.3+ and iOS 16.4+ + teal.getTagManagementWebView { webView in + if #available(iOS 16.4, *) { + // webView.isInspectable = true // Uncomment to inspect tagManagement webviews on XCode 14.3+ and iOS 16.4+ + } } - } - let display = RemoteCommand(commandId: "display", description: "Test") { response in - guard let payload = response.payload, - let hello = payload["hello"] as? String, - let key = payload["key"] as? String, - let tealium = payload["tealium"] as? String else { - return + let display = RemoteCommand(commandId: "display", description: "Test") { response in + guard let payload = response.payload, + let hello = payload["hello"] as? String, + let key = payload["key"] as? String, + let tealium = payload["tealium"] as? String + else { + return + } + print( + "Remote Command data: hello = \(hello), key = \(key), tealium = \(tealium) 🎉🎊" + ) } - print("Remote Command data: hello = \(hello), key = \(key), tealium = \(tealium) 🎉🎊") - } - remoteCommands.add(display) + remoteCommands.add(display) #endif } } @@ -162,7 +171,9 @@ class TealiumHelper { if let consentStatus = tealium?.consentManager?.userConsentStatus { switch consentStatus { case .notConsented: - TealiumHelper.shared.tealium?.consentManager?.userConsentCategories = [.affiliates, .analytics, .bigData] + TealiumHelper.shared.tealium?.consentManager?.userConsentCategories = [ + .affiliates, .analytics, .bigData, + ] case .unknown: TealiumHelper.shared.tealium?.consentManager?.userConsentStatus = .consented default: @@ -176,6 +187,32 @@ class TealiumHelper { tealium?.track(dispatch) } + func fetchMoments(engineId: String, completion: @escaping (Result) -> Void) { + // example showing all the different types of attributes + tealium?.momentsAPI?.fetchEngineResponse( + engineID: engineId, + completion: { engineResponse in + switch engineResponse { + case .success(let engineResponse): + print( + "Moments fetched successfully - String attributes:", engineResponse.strings ?? []) + print( + "Moments fetched successfully - Boolean attributes:", + engineResponse.booleans ?? []) + print("Moments fetched successfully - Audiences:", engineResponse.audiences ?? []) + print("Moments fetched successfully - Date attributes:", engineResponse.dates ?? [String: Int64]()) + print("Moments fetched successfully - Badges:", engineResponse.badges ?? []) + print("Moments fetched successfully - Numbers:", engineResponse.numbers ?? [String: Double]()) + case .failure(let error): + print("Error fetching moments:", error.localizedDescription) + if let suggestion = (error as? LocalizedError)?.recoverySuggestion { + print("Recovery suggestion:", suggestion) + } + } + completion(engineResponse) + }) + } + func trackView(title: String, data: [String: Any]?) { let dispatch = TealiumView(title, dataLayer: data) tealium?.track(dispatch) @@ -190,21 +227,26 @@ class TealiumHelper { } func crash() { - NSException.raise(NSExceptionName(rawValue: "Exception"), format: "This is a test exception", arguments: getVaList(["nil"])) + NSException.raise( + NSExceptionName(rawValue: "Exception"), format: "This is a test exception", + arguments: getVaList(["nil"])) } } extension TealiumHelper: VisitorServiceDelegate { func didUpdate(visitorProfile: TealiumVisitorProfile) { + DispatchQueue.main.async { + self.visitorProfile = visitorProfile + } if let json = try? JSONEncoder().encode(visitorProfile), - let string = String(data: json, encoding: .utf8) { + let string = String(data: json, encoding: .utf8) + { if self.enableHelperLogs { print("Visitor Profile: \(string)") } } } - } extension TealiumHelper: DispatchListener { @@ -219,7 +261,7 @@ extension TealiumHelper: DispatchListener { } extension TealiumHelper: DispatchValidator { - + var id: String { return "Helper" } @@ -238,7 +280,7 @@ extension TealiumHelper: DispatchValidator { } extension TealiumHelper: AutoTrackingDelegate { - func onCollectScreenView(screenName: String) -> [String : Any] { + func onCollectScreenView(screenName: String) -> [String: Any] { return ["from_delegate": "true"] } } @@ -253,10 +295,12 @@ class MyDateCollector: Collector { var config: TealiumConfig - required init(context: TealiumContext, - delegate: ModuleDelegate?, - diskStorage: TealiumDiskStorageProtocol?, - completion: ((Result, [String: Any]?)) -> Void) { + required init( + context: TealiumContext, + delegate: ModuleDelegate?, + diskStorage: TealiumDiskStorageProtocol?, + completion: ((Result, [String: Any]?)) -> Void + ) { self.config = context.config } @@ -271,7 +315,8 @@ class MyCustomDispatcher: Dispatcher { var config: TealiumConfig - required init(context: TealiumContext, delegate: ModuleDelegate, completion: ModuleCompletion?) { + required init(context: TealiumContext, delegate: ModuleDelegate, completion: ModuleCompletion?) + { self.config = context.config } @@ -281,12 +326,12 @@ class MyCustomDispatcher: Dispatcher { if TealiumHelper.shared.enableHelperLogs { print("Track received: \(request.event ?? "no event name")") } - // perform track action, e.g. send to custom endpoint + // perform track action, e.g. send to custom endpoint case _ as TealiumBatchTrackRequest: if TealiumHelper.shared.enableHelperLogs { print("Batch track received") } - // perform batch track action, e.g. send to custom endpoint + // perform batch track action, e.g. send to custom endpoint default: return } diff --git a/builder/iOSTealiumTest/VisitorServiceView.swift b/builder/iOSTealiumTest/VisitorServiceView.swift new file mode 100644 index 00000000..de9fe940 --- /dev/null +++ b/builder/iOSTealiumTest/VisitorServiceView.swift @@ -0,0 +1,77 @@ +// +// VisitorServiceView.swift +// iOSTealiumTest +// +// Copyright © 2024 Tealium, Inc. All rights reserved. +// + +import Foundation +import TealiumVisitorService +import SwiftUI + +struct VisitorServiceView: View { + @State private var audiencesContent = "Awaiting API request" + @State private var badgesContent = "Awaiting API request" + @State private var numbersContent = "Awaiting API request" + @State private var datesContent = "Awaiting API request" + @State private var stringsContent = "Awaiting API request" + @State private var visitorProfile: TealiumVisitorProfile? = nil + @ObservedObject var tealiumHelper = TealiumHelper.shared + + var body: some View { + NavigationView { + VStack { + Button("Visitor Service Request") { + TealiumHelper.shared.track(title: "Some Event", data: [:]) + } + .padding() + .foregroundColor(.white) + .background(Color.blue) + .cornerRadius(8) + + List { + RowView(label: "Audiences", content: $audiencesContent) + RowView(label: "Badges", content: $badgesContent) + RowView(label: "Numbers", content: $numbersContent) + RowView(label: "Dates", content: $datesContent) + RowView(label: "Strings", content: $stringsContent) + } + } + .onReceive(tealiumHelper.$visitorProfile) { visitorProfile in + if let strings = visitorProfile?.strings { + self.stringsContent = strings + .compactMap({ string in + string.value + }).joined(separator: "\n") + } + + if let audiences = visitorProfile?.audiences { + self.audiencesContent = audiences.compactMap({ string in + string.value + }).joined(separator: "\n") + } + if let badges = visitorProfile?.badges { + self.badgesContent = badges.compactMap({ badge in + badge.key + }).joined(separator: "\n") + } + if let dates = visitorProfile?.dates { + datesContent = dates + .sorted(by: { $0.key < $1.key }) + .compactMap { + "\($0.key) : \($0.value)" + }.joined(separator: "\n") + } + if let numbers = visitorProfile?.numbers { + numbersContent = numbers + .sorted(by: { $0.key < $1.key }) + .compactMap { + "\($0.key) : \(String(format: "%.2f", $0.value))" + }.joined(separator: "\n") + } + } + .navigationBarTitle("Visitor Service Demo") + } + } +} + diff --git a/builder/tealium-swift.xcodeproj/project.pbxproj b/builder/tealium-swift.xcodeproj/project.pbxproj index 53357975..310a780d 100644 --- a/builder/tealium-swift.xcodeproj/project.pbxproj +++ b/builder/tealium-swift.xcodeproj/project.pbxproj @@ -3,10 +3,56 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 55; objects = { /* Begin PBXBuildFile section */ + 08191EC72BCEC1AB003EEE36 /* TealiumCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D755DD0D21945E41003C6BA1 /* TealiumCore.framework */; }; + 08191EC92BCEC1AB003EEE36 /* VisitorServiceModule.swift in Headers */ = {isa = PBXBuildFile; fileRef = D7805876233A691800DAD90E /* VisitorServiceModule.swift */; settings = {ATTRIBUTES = (Public, ); }; }; + 08191ECF2BCEC1C9003EEE36 /* MomentsAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191EB92BCE88B2003EEE36 /* MomentsAPI.swift */; }; + 08191ED02BCEC1C9003EEE36 /* MomentsAPIExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191EBA2BCE890C003EEE36 /* MomentsAPIExtensions.swift */; }; + 08191ED32BD00F55003EEE36 /* MomentsAPIModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191ED22BD00F55003EEE36 /* MomentsAPIModule.swift */; }; + 08191ED42BD031E7003EEE36 /* TealiumMomentsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; }; + 08191ED52BD031E7003EEE36 /* TealiumMomentsAPI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 08191EDB2BD16EF5003EEE36 /* MomentsAPIEngineResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191EDA2BD16EF5003EEE36 /* MomentsAPIEngineResponse.swift */; }; + 08191EFE2BD2C555003EEE36 /* MomentsAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191EDC2BD2C21F003EEE36 /* MomentsAPITests.swift */; }; + 08191F292BDFAB08003EEE36 /* MomentsAPIHTTPError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191F282BDFAB08003EEE36 /* MomentsAPIHTTPError.swift */; }; + 08191F2B2BDFEA24003EEE36 /* MomentsAPIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191F2A2BDFEA24003EEE36 /* MomentsAPIError.swift */; }; + 08191F2E2BE10451003EEE36 /* MomentsAPIModuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191F2C2BE10451003EEE36 /* MomentsAPIModuleTests.swift */; }; + 087AA34D2C46C62B00ADC001 /* MockURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15A0E69D2BC406B80077FFEB /* MockURLSession.swift */; }; + 087AA34E2C46C62C00ADC001 /* MockURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15A0E69D2BC406B80077FFEB /* MockURLSession.swift */; }; + 087AA34F2C46C62C00ADC001 /* MockURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15A0E69D2BC406B80077FFEB /* MockURLSession.swift */; }; + 08CA23D52BE2437D002AC47A /* TestTealiumHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 716C7D1B1DDBC3A500512C99 /* TestTealiumHelper.swift */; }; + 08CA23D62BE245CF002AC47A /* CoreMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFA558BF24E4E6B200BFBED8 /* CoreMocks.swift */; }; + 08CA23D72BE245E1002AC47A /* MockSessionStarter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7187F1A24768F5000CF0AB0 /* MockSessionStarter.swift */; }; + 08CA23D82BE24DA3002AC47A /* MockDiskStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D780585B233A68DD00DAD90E /* MockDiskStorage.swift */; }; + 08CA23DA2BE39905002AC47A /* MomentsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CA23D92BE39905002AC47A /* MomentsView.swift */; }; + 08CA23DC2BE3ABCA002AC47A /* VisitorServiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CA23DB2BE3ABCA002AC47A /* VisitorServiceView.swift */; }; + 08CA23E32BE50019002AC47A /* MomentsAPIModuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191F2C2BE10451003EEE36 /* MomentsAPIModuleTests.swift */; }; + 08CA23E42BE50019002AC47A /* MockDiskStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D780585B233A68DD00DAD90E /* MockDiskStorage.swift */; }; + 08CA23E52BE50019002AC47A /* CoreMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFA558BF24E4E6B200BFBED8 /* CoreMocks.swift */; }; + 08CA23E72BE50019002AC47A /* MomentsAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191EDC2BD2C21F003EEE36 /* MomentsAPITests.swift */; }; + 08CA23E82BE50019002AC47A /* MockSessionStarter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7187F1A24768F5000CF0AB0 /* MockSessionStarter.swift */; }; + 08CA23E92BE50019002AC47A /* TestTealiumHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 716C7D1B1DDBC3A500512C99 /* TestTealiumHelper.swift */; }; + 08CA23F72BE50022002AC47A /* MomentsAPIModuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191F2C2BE10451003EEE36 /* MomentsAPIModuleTests.swift */; }; + 08CA23F82BE50022002AC47A /* MockDiskStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D780585B233A68DD00DAD90E /* MockDiskStorage.swift */; }; + 08CA23F92BE50022002AC47A /* CoreMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFA558BF24E4E6B200BFBED8 /* CoreMocks.swift */; }; + 08CA23FB2BE50022002AC47A /* MomentsAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08191EDC2BD2C21F003EEE36 /* MomentsAPITests.swift */; }; + 08CA23FC2BE50022002AC47A /* MockSessionStarter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7187F1A24768F5000CF0AB0 /* MockSessionStarter.swift */; }; + 08CA23FD2BE50022002AC47A /* TestTealiumHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 716C7D1B1DDBC3A500512C99 /* TestTealiumHelper.swift */; }; + 08DAC3CC2C2093B800089032 /* TealiumMomentsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; }; + 08DAC3CD2C2093B800089032 /* TealiumMomentsAPI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 08DAC3D02C2093BF00089032 /* TealiumMomentsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; }; + 08DAC3D12C2093BF00089032 /* TealiumMomentsAPI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 08DAC3D52C2093C400089032 /* TealiumMomentsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; }; + 08DAC3D62C2093C400089032 /* TealiumMomentsAPI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 08DAC3DF2C20997300089032 /* TealiumMomentsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; }; + 08DAC3E02C20997300089032 /* TealiumMomentsAPI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 08DAC3E32C21E49000089032 /* TealiumMomentsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; }; + 08DAC3E42C21E49000089032 /* TealiumMomentsAPI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 08EFB6D82C418341006459F6 /* MockAppDataDiskStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE69B0E20126B91000759D8 /* MockAppDataDiskStorage.swift */; }; + 08EFB6D92C418341006459F6 /* MockAppDataDiskStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE69B0E20126B91000759D8 /* MockAppDataDiskStorage.swift */; }; + 08EFB6DA2C418342006459F6 /* MockAppDataDiskStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE69B0E20126B91000759D8 /* MockAppDataDiskStorage.swift */; }; 15046A0F28C8CBF000B0535E /* allEventsCommands.json in Resources */ = {isa = PBXBuildFile; fileRef = 15046A0E28C8CBF000B0535E /* allEventsCommands.json */; }; 15062EEB270758EC00734060 /* large-event-data.json in Resources */ = {isa = PBXBuildFile; fileRef = D7187F1524768F5000CF0AB0 /* large-event-data.json */; }; 15062EEC270758EC00734060 /* big-visitor.json in Resources */ = {isa = PBXBuildFile; fileRef = CF8FF2C524466FD90081C1A9 /* big-visitor.json */; }; @@ -861,6 +907,97 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 08191EBD2BCEC1AB003EEE36 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = D755DC9821945E41003C6BA1; + remoteInfo = TealiumCore; + }; + 08191ED62BD031E7003EEE36 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08191EBB2BCEC1AB003EEE36; + remoteInfo = TealiumMoments; + }; + 08191EE02BD2C4F4003EEE36 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = D755DC9821945E41003C6BA1; + remoteInfo = TealiumCore; + }; + 08191EFB2BD2C547003EEE36 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08191EBB2BCEC1AB003EEE36; + remoteInfo = TealiumMoments; + }; + 08CA23DF2BE50019002AC47A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08191EBB2BCEC1AB003EEE36; + remoteInfo = TealiumMoments; + }; + 08CA23E12BE50019002AC47A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = D755DC9821945E41003C6BA1; + remoteInfo = TealiumCore; + }; + 08CA23F32BE50022002AC47A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08191EBB2BCEC1AB003EEE36; + remoteInfo = TealiumMoments; + }; + 08CA23F52BE50022002AC47A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = D755DC9821945E41003C6BA1; + remoteInfo = TealiumCore; + }; + 08DAC3CE2C2093B800089032 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08191EBB2BCEC1AB003EEE36; + remoteInfo = TealiumMoments; + }; + 08DAC3D22C2093BF00089032 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08191EBB2BCEC1AB003EEE36; + remoteInfo = TealiumMoments; + }; + 08DAC3D72C2093C400089032 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08191EBB2BCEC1AB003EEE36; + remoteInfo = TealiumMoments; + }; + 08DAC3E12C20997300089032 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08191EBB2BCEC1AB003EEE36; + remoteInfo = TealiumMomentsAPI; + }; + 08DAC3E52C21E49000089032 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 7182DD011D77492D0001A95B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 08191EBB2BCEC1AB003EEE36; + remoteInfo = TealiumMomentsAPI; + }; 150334B227907D600014CD63 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 7182DD011D77492D0001A95B /* Project object */; @@ -2033,6 +2170,17 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 08DAC3D42C2093BF00089032 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 08DAC3D12C2093BF00089032 /* TealiumMomentsAPI.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 1510990A273D5B150022AD66 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -2047,6 +2195,7 @@ 15109903273D5B150022AD66 /* TealiumTagManagement.framework in Embed Frameworks */, 151098F3273D5B150022AD66 /* TealiumLifecycle.framework in Embed Frameworks */, 151098F7273D5B150022AD66 /* TealiumLocation.framework in Embed Frameworks */, + 08DAC3CD2C2093B800089032 /* TealiumMomentsAPI.framework in Embed Frameworks */, 151098EB273D5B150022AD66 /* TealiumCollect.framework in Embed Frameworks */, 151098EF273D5B150022AD66 /* TealiumCore.framework in Embed Frameworks */, 151098FB273D5B150022AD66 /* TealiumMedia.framework in Embed Frameworks */, @@ -2060,6 +2209,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 08DAC3D62C2093C400089032 /* TealiumMomentsAPI.framework in Embed Frameworks */, 1561915927904E5E00A73543 /* TealiumInAppPurchase.framework in Embed Frameworks */, 15D43D4126F20869004E52FE /* TealiumCore.framework in Embed Frameworks */, 15D43D5126F20869004E52FE /* TealiumVisitorService.framework in Embed Frameworks */, @@ -2104,6 +2254,7 @@ CF8807B62554BB3B0020E1B2 /* TealiumLocation.framework in Embed Frameworks */, 48B28449273D67D700FE908D /* TealiumInAppPurchase.framework in Embed Frameworks */, CF8807BE2554BB3B0020E1B2 /* TealiumTagManagement.framework in Embed Frameworks */, + 08191ED52BD031E7003EEE36 /* TealiumMomentsAPI.framework in Embed Frameworks */, CF8807AA2554BB3B0020E1B2 /* TealiumCollect.framework in Embed Frameworks */, CF8807BA2554BB3B0020E1B2 /* TealiumRemoteCommands.framework in Embed Frameworks */, CF8807AE2554BB3B0020E1B2 /* TealiumCore.framework in Embed Frameworks */, @@ -2117,6 +2268,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 08DAC3E42C21E49000089032 /* TealiumMomentsAPI.framework in Embed Frameworks */, 1561915227904E1000A73543 /* TealiumInAppPurchase.framework in Embed Frameworks */, CF8807CF2554BB480020E1B2 /* TealiumLifecycle.framework in Embed Frameworks */, CF8807D32554BB480020E1B2 /* TealiumVisitorService.framework in Embed Frameworks */, @@ -2133,6 +2285,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 08DAC3E02C20997300089032 /* TealiumMomentsAPI.framework in Embed Frameworks */, 15755DDB27904DA200F894CA /* TealiumInAppPurchase.framework in Embed Frameworks */, CF8807E02554BB600020E1B2 /* TealiumLifecycle.framework in Embed Frameworks */, CF8807E42554BB600020E1B2 /* TealiumVisitorService.framework in Embed Frameworks */, @@ -2156,6 +2309,21 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 08191EB92BCE88B2003EEE36 /* MomentsAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MomentsAPI.swift; sourceTree = ""; }; + 08191EBA2BCE890C003EEE36 /* MomentsAPIExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MomentsAPIExtensions.swift; sourceTree = ""; }; + 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TealiumMomentsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 08191ECE2BCEC1AC003EEE36 /* TealiumMoments-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "TealiumMoments-Info.plist"; path = "/Users/craig.rouse/mobiledev/swift-library/tealium-swift/builder/TealiumMoments-Info.plist"; sourceTree = ""; }; + 08191ED22BD00F55003EEE36 /* MomentsAPIModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MomentsAPIModule.swift; sourceTree = ""; }; + 08191EDA2BD16EF5003EEE36 /* MomentsAPIEngineResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MomentsAPIEngineResponse.swift; sourceTree = ""; }; + 08191EDC2BD2C21F003EEE36 /* MomentsAPITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MomentsAPITests.swift; sourceTree = ""; }; + 08191EF92BD2C4F4003EEE36 /* TealiumMomentsAPITests-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "TealiumMomentsAPITests-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 08191F282BDFAB08003EEE36 /* MomentsAPIHTTPError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MomentsAPIHTTPError.swift; sourceTree = ""; }; + 08191F2A2BDFEA24003EEE36 /* MomentsAPIError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MomentsAPIError.swift; sourceTree = ""; }; + 08191F2C2BE10451003EEE36 /* MomentsAPIModuleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MomentsAPIModuleTests.swift; sourceTree = ""; }; + 08CA23D92BE39905002AC47A /* MomentsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MomentsView.swift; sourceTree = ""; }; + 08CA23DB2BE3ABCA002AC47A /* VisitorServiceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisitorServiceView.swift; sourceTree = ""; }; + 08CA23EF2BE50019002AC47A /* TealiumMomentsAPITests-tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "TealiumMomentsAPITests-tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 08CA24032BE50022002AC47A /* TealiumMomentsAPITests-macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "TealiumMomentsAPITests-macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 15046A0E28C8CBF000B0535E /* allEventsCommands.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = allEventsCommands.json; sourceTree = ""; }; 150F9FB328BFB3DB00E75B31 /* VisitorIdentityListenerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisitorIdentityListenerTests.swift; sourceTree = ""; }; 150F9FB728BFB86500E75B31 /* VisitorIdProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisitorIdProviderTests.swift; sourceTree = ""; }; @@ -2615,6 +2783,35 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 08191EC62BCEC1AB003EEE36 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 08191EC72BCEC1AB003EEE36 /* TealiumCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 08191EEF2BD2C4F4003EEE36 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 08CA23EA2BE50019002AC47A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 08CA23FE2BE50022002AC47A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1516A2DB26EF7F26003DF8F2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -2655,6 +2852,7 @@ 15109902273D5B150022AD66 /* TealiumTagManagement.framework in Frameworks */, 151098F2273D5B150022AD66 /* TealiumLifecycle.framework in Frameworks */, 151098F6273D5B150022AD66 /* TealiumLocation.framework in Frameworks */, + 08DAC3CC2C2093B800089032 /* TealiumMomentsAPI.framework in Frameworks */, 151098EA273D5B150022AD66 /* TealiumCollect.framework in Frameworks */, 151098EE273D5B150022AD66 /* TealiumCore.framework in Frameworks */, 151098FA273D5B150022AD66 /* TealiumMedia.framework in Frameworks */, @@ -2665,6 +2863,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 08DAC3D52C2093C400089032 /* TealiumMomentsAPI.framework in Frameworks */, 1561915827904E5600A73543 /* TealiumInAppPurchase.framework in Frameworks */, 15D43D4026F20869004E52FE /* TealiumCore.framework in Frameworks */, 15D43D5026F20869004E52FE /* TealiumVisitorService.framework in Frameworks */, @@ -2701,6 +2900,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 08DAC3D02C2093BF00089032 /* TealiumMomentsAPI.framework in Frameworks */, 1561915527904E4100A73543 /* TealiumInAppPurchase.framework in Frameworks */, 15D43D3126F207FA004E52FE /* TealiumCollect.framework in Frameworks */, 15D43D3226F207FA004E52FE /* TealiumLifecycle.framework in Frameworks */, @@ -2776,6 +2976,7 @@ CF8807B52554BB3B0020E1B2 /* TealiumLocation.framework in Frameworks */, 48B28448273D67D600FE908D /* TealiumInAppPurchase.framework in Frameworks */, CF8807BD2554BB3B0020E1B2 /* TealiumTagManagement.framework in Frameworks */, + 08191ED42BD031E7003EEE36 /* TealiumMomentsAPI.framework in Frameworks */, CF8807A92554BB3B0020E1B2 /* TealiumCollect.framework in Frameworks */, CF8807B92554BB3B0020E1B2 /* TealiumRemoteCommands.framework in Frameworks */, CF8807AD2554BB3B0020E1B2 /* TealiumCore.framework in Frameworks */, @@ -2786,6 +2987,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 08DAC3E32C21E49000089032 /* TealiumMomentsAPI.framework in Frameworks */, 1561915127904E0800A73543 /* TealiumInAppPurchase.framework in Frameworks */, CF8807CE2554BB480020E1B2 /* TealiumLifecycle.framework in Frameworks */, CF8807D22554BB480020E1B2 /* TealiumVisitorService.framework in Frameworks */, @@ -2799,6 +3001,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 08DAC3DF2C20997300089032 /* TealiumMomentsAPI.framework in Frameworks */, 15755DDA27904D9200F894CA /* TealiumInAppPurchase.framework in Frameworks */, CF8807DF2554BB600020E1B2 /* TealiumLifecycle.framework in Frameworks */, CF8807E32554BB600020E1B2 /* TealiumVisitorService.framework in Frameworks */, @@ -3037,6 +3240,28 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 08191EB82BCE8894003EEE36 /* momentsapi */ = { + isa = PBXGroup; + children = ( + 08191EB92BCE88B2003EEE36 /* MomentsAPI.swift */, + 08191ED22BD00F55003EEE36 /* MomentsAPIModule.swift */, + 08191EBA2BCE890C003EEE36 /* MomentsAPIExtensions.swift */, + 08191EDA2BD16EF5003EEE36 /* MomentsAPIEngineResponse.swift */, + 08191F282BDFAB08003EEE36 /* MomentsAPIHTTPError.swift */, + 08191F2A2BDFEA24003EEE36 /* MomentsAPIError.swift */, + ); + path = momentsapi; + sourceTree = ""; + }; + 08191ED82BD15F22003EEE36 /* test_tealium_moments_api */ = { + isa = PBXGroup; + children = ( + 08191EDC2BD2C21F003EEE36 /* MomentsAPITests.swift */, + 08191F2C2BE10451003EEE36 /* MomentsAPIModuleTests.swift */, + ); + path = test_tealium_moments_api; + sourceTree = ""; + }; 1516A2E826EF7F6A003DF8F2 /* ui_tests */ = { isa = PBXGroup; children = ( @@ -3300,6 +3525,7 @@ 716C7D0B1DDBC3A500512C99 /* tests */ = { isa = PBXGroup; children = ( + 08191ED82BD15F22003EEE36 /* test_tealium_moments_api */, 48A13B01273C22800031E2B5 /* test_tealium_inapppurchase */, 71EBA7541DDCD63D00813470 /* test_tealium_attribution */, 7102BF6E1E0CF03300ED5783 /* test_tealium_autotracking */, @@ -3390,6 +3616,7 @@ 15B84D7626F206950094DC05 /* AutoTrackingTvOSTest */, 7182DD0A1D77492D0001A95B /* Products */, D79876C11FACE5B100FFA96B /* Frameworks */, + 08191ECE2BCEC1AC003EEE36 /* TealiumMoments-Info.plist */, ); sourceTree = ""; }; @@ -3446,6 +3673,10 @@ 48AB110E275E42C30011D4D6 /* TealiumInAppPurchaseTests-iOS.xctest */, 15C6015127902A2900497901 /* TealiumMediaIntegrationTests-iOS.xctest */, 15274F97279191E0009F645A /* TealiumInAppPurchaseTests-tvOS.xctest */, + 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */, + 08191EF92BD2C4F4003EEE36 /* TealiumMomentsAPITests-iOS.xctest */, + 08CA23EF2BE50019002AC47A /* TealiumMomentsAPITests-tvOS.xctest */, + 08CA24032BE50022002AC47A /* TealiumMomentsAPITests-macOS.xctest */, ); name = Products; sourceTree = ""; @@ -3743,6 +3974,8 @@ CF8809272554BD490020E1B2 /* iOSTealiumTestApp.swift */, CF8809282554BD490020E1B2 /* Assets.xcassets */, CF88092B2554BD490020E1B2 /* ContentView.swift */, + 08CA23D92BE39905002AC47A /* MomentsView.swift */, + 08CA23DB2BE3ABCA002AC47A /* VisitorServiceView.swift */, CF88092C2554BD490020E1B2 /* Info.plist */, CF88092D2554BD490020E1B2 /* iOSTealiumTest.entitlements */, CF88092E2554BD490020E1B2 /* Supporting Views */, @@ -3886,9 +4119,10 @@ D70FC7AD24508146004AD838 /* collectors */ = { isa = PBXGroup; children = ( + D780586F233A68E900DAD90E /* visitorservice */, + 08191EB82BCE8894003EEE36 /* momentsapi */, 48405B362739B9690094EA18 /* inapppurchase */, CFAD9D5B25A66C040079B19A /* media */, - D780586F233A68E900DAD90E /* visitorservice */, CFF242BF23CE77F10091B7BF /* location */, 71F085BD1DDE154C008850C8 /* attribution */, 71D2B34C1E2FE3670049BCF3 /* autotracking */, @@ -4120,6 +4354,14 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 08191EC82BCEC1AB003EEE36 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 08191EC92BCEC1AB003EEE36 /* VisitorServiceModule.swift in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 48B2843A273D674700FE908D /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -4259,6 +4501,88 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 08191ECA2BCEC1AB003EEE36 /* Build configuration list for PBXNativeTarget "TealiumMomentsAPI" */; + buildPhases = ( + 08191EBE2BCEC1AB003EEE36 /* SwiftLint */, + 08191EBF2BCEC1AB003EEE36 /* Sources */, + 08191EC62BCEC1AB003EEE36 /* Frameworks */, + 08191EC82BCEC1AB003EEE36 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 08191EBC2BCEC1AB003EEE36 /* PBXTargetDependency */, + ); + name = TealiumMomentsAPI; + productName = ios; + productReference = 08191ECD2BCEC1AB003EEE36 /* TealiumMomentsAPI.framework */; + productType = "com.apple.product-type.framework"; + }; + 08191EDE2BD2C4F4003EEE36 /* TealiumMomentsAPITests-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 08191EF62BD2C4F4003EEE36 /* Build configuration list for PBXNativeTarget "TealiumMomentsAPITests-iOS" */; + buildPhases = ( + 08191EE32BD2C4F4003EEE36 /* Sources */, + 08191EEF2BD2C4F4003EEE36 /* Frameworks */, + 08191EF02BD2C4F4003EEE36 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 08191EFC2BD2C547003EEE36 /* PBXTargetDependency */, + 08191EDF2BD2C4F4003EEE36 /* PBXTargetDependency */, + ); + name = "TealiumMomentsAPITests-iOS"; + packageProductDependencies = ( + ); + productName = "tealium-swift-tests"; + productReference = 08191EF92BD2C4F4003EEE36 /* TealiumMomentsAPITests-iOS.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 08CA23DD2BE50019002AC47A /* TealiumMomentsAPITests-tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 08CA23EC2BE50019002AC47A /* Build configuration list for PBXNativeTarget "TealiumMomentsAPITests-tvOS" */; + buildPhases = ( + 08CA23E22BE50019002AC47A /* Sources */, + 08CA23EA2BE50019002AC47A /* Frameworks */, + 08CA23EB2BE50019002AC47A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 08CA23DE2BE50019002AC47A /* PBXTargetDependency */, + 08CA23E02BE50019002AC47A /* PBXTargetDependency */, + ); + name = "TealiumMomentsAPITests-tvOS"; + packageProductDependencies = ( + ); + productName = "tealium-swift-tests"; + productReference = 08CA23EF2BE50019002AC47A /* TealiumMomentsAPITests-tvOS.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 08CA23F12BE50022002AC47A /* TealiumMomentsAPITests-macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 08CA24002BE50022002AC47A /* Build configuration list for PBXNativeTarget "TealiumMomentsAPITests-macOS" */; + buildPhases = ( + 08CA23F62BE50022002AC47A /* Sources */, + 08CA23FE2BE50022002AC47A /* Frameworks */, + 08CA23FF2BE50022002AC47A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 08CA23F22BE50022002AC47A /* PBXTargetDependency */, + 08CA23F42BE50022002AC47A /* PBXTargetDependency */, + ); + name = "TealiumMomentsAPITests-macOS"; + packageProductDependencies = ( + ); + productName = "tealium-swift-tests"; + productReference = 08CA24032BE50022002AC47A /* TealiumMomentsAPITests-macOS.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 1516A2DD26EF7F26003DF8F2 /* TealiumAutotrackingUITests-iOS */ = { isa = PBXNativeTarget; buildConfigurationList = 1516A2E526EF7F26003DF8F2 /* Build configuration list for PBXNativeTarget "TealiumAutotrackingUITests-iOS" */; @@ -4359,6 +4683,7 @@ 15109901273D5B150022AD66 /* PBXTargetDependency */, 15109905273D5B150022AD66 /* PBXTargetDependency */, 15109909273D5B150022AD66 /* PBXTargetDependency */, + 08DAC3CF2C2093B800089032 /* PBXTargetDependency */, ); name = AutoTrackingIOSTest; productName = AutoTrackingIOSTest; @@ -4384,6 +4709,7 @@ 15D43D4726F20869004E52FE /* PBXTargetDependency */, 15D43D4F26F20869004E52FE /* PBXTargetDependency */, 15D43D5326F20869004E52FE /* PBXTargetDependency */, + 08DAC3D82C2093C400089032 /* PBXTargetDependency */, ); name = AutoTrackingTvOSTest; productName = AutoTrackingTvOSTest; @@ -4455,6 +4781,7 @@ 15F8E22026F0AF5900C4F6A1 /* Sources */, 15F8E22126F0AF5900C4F6A1 /* Frameworks */, 15F8E22226F0AF5900C4F6A1 /* Resources */, + 08DAC3D42C2093BF00089032 /* Embed Frameworks */, ); buildRules = ( ); @@ -4466,6 +4793,7 @@ 15D43D2F26F207EE004E52FE /* PBXTargetDependency */, 15D43D1F26F207CF004E52FE /* PBXTargetDependency */, 15D43D1D26F207C5004E52FE /* PBXTargetDependency */, + 08DAC3D32C2093BF00089032 /* PBXTargetDependency */, ); name = AutoTrackingMacOSTest; productName = AutoTrackingMacOSTest; @@ -4635,6 +4963,7 @@ CF8807C42554BB3B0020E1B2 /* PBXTargetDependency */, CFAD9D3025A66BE90079B19A /* PBXTargetDependency */, 48B2844B273D67D700FE908D /* PBXTargetDependency */, + 08191ED72BD031E7003EEE36 /* PBXTargetDependency */, ); name = iOSTealiumTest; packageProductDependencies = ( @@ -4661,6 +4990,7 @@ CF8807D12554BB480020E1B2 /* PBXTargetDependency */, CF8807D52554BB480020E1B2 /* PBXTargetDependency */, 1555F59926E64C7900AFDC3D /* PBXTargetDependency */, + 08DAC3E62C21E49000089032 /* PBXTargetDependency */, ); name = tvOSTealiumTest; productName = tvOSTealiumTest; @@ -4685,6 +5015,7 @@ CF8807E22554BB600020E1B2 /* PBXTargetDependency */, CF8807E62554BB600020E1B2 /* PBXTargetDependency */, 1555F59526E64C7000AFDC3D /* PBXTargetDependency */, + 08DAC3E22C20997300089032 /* PBXTargetDependency */, ); name = macOSTealiumTest; productName = macOSTealiumTest; @@ -5313,8 +5644,9 @@ 7182DD011D77492D0001A95B /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1320; - LastUpgradeCheck = 1100; + LastUpgradeCheck = 1540; ORGANIZATIONNAME = "Tealium, Inc"; TargetAttributes = { 1516A2DD26EF7F26003DF8F2 = { @@ -5495,6 +5827,7 @@ D7881EF121998DAD002CDCC1 /* TealiumLifecycle */, CFF242A023CE774C0091B7BF /* TealiumLocation */, CFAD9D1B25A66BE80079B19A /* TealiumMedia */, + 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */, D7B04D08219994D400C87E22 /* TealiumRemoteCommands */, D755DD1121945F99003C6BA1 /* TealiumTagManagement */, D7805825233A65FB00DAD90E /* TealiumVisitorService */, @@ -5538,11 +5871,35 @@ 15A0077B27284EF9005E1927 /* AutoTrackingIOSTest */, 15F8E22326F0AF5900C4F6A1 /* AutoTrackingMacOSTest */, 15B84D7426F206950094DC05 /* AutoTrackingTvOSTest */, + 08191EDE2BD2C4F4003EEE36 /* TealiumMomentsAPITests-iOS */, + 08CA23DD2BE50019002AC47A /* TealiumMomentsAPITests-tvOS */, + 08CA23F12BE50022002AC47A /* TealiumMomentsAPITests-macOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 08191EF02BD2C4F4003EEE36 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 08CA23EB2BE50019002AC47A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 08CA23FF2BE50022002AC47A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1516A2DC26EF7F26003DF8F2 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -5895,6 +6252,25 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 08191EBE2BCEC1AB003EEE36 /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n# Type a script or drag a script file from your workspace to insert its path.\nif which swiftlint >/dev/null; then\nswiftlint --config \"$PROJECT_DIR\"/../.swiftlint.yml\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + }; 15037B9F2982904400EB8175 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -6107,6 +6483,64 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 08191EBF2BCEC1AB003EEE36 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 08191F292BDFAB08003EEE36 /* MomentsAPIHTTPError.swift in Sources */, + 08191ED32BD00F55003EEE36 /* MomentsAPIModule.swift in Sources */, + 08191EDB2BD16EF5003EEE36 /* MomentsAPIEngineResponse.swift in Sources */, + 08191F2B2BDFEA24003EEE36 /* MomentsAPIError.swift in Sources */, + 08191ECF2BCEC1C9003EEE36 /* MomentsAPI.swift in Sources */, + 08191ED02BCEC1C9003EEE36 /* MomentsAPIExtensions.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 08191EE32BD2C4F4003EEE36 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 087AA34D2C46C62B00ADC001 /* MockURLSession.swift in Sources */, + 08191F2E2BE10451003EEE36 /* MomentsAPIModuleTests.swift in Sources */, + 08CA23D82BE24DA3002AC47A /* MockDiskStorage.swift in Sources */, + 08CA23D62BE245CF002AC47A /* CoreMocks.swift in Sources */, + 08EFB6D82C418341006459F6 /* MockAppDataDiskStorage.swift in Sources */, + 08191EFE2BD2C555003EEE36 /* MomentsAPITests.swift in Sources */, + 08CA23D72BE245E1002AC47A /* MockSessionStarter.swift in Sources */, + 08CA23D52BE2437D002AC47A /* TestTealiumHelper.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 08CA23E22BE50019002AC47A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 087AA34E2C46C62C00ADC001 /* MockURLSession.swift in Sources */, + 08CA23E32BE50019002AC47A /* MomentsAPIModuleTests.swift in Sources */, + 08CA23E42BE50019002AC47A /* MockDiskStorage.swift in Sources */, + 08CA23E52BE50019002AC47A /* CoreMocks.swift in Sources */, + 08EFB6D92C418341006459F6 /* MockAppDataDiskStorage.swift in Sources */, + 08CA23E72BE50019002AC47A /* MomentsAPITests.swift in Sources */, + 08CA23E82BE50019002AC47A /* MockSessionStarter.swift in Sources */, + 08CA23E92BE50019002AC47A /* TestTealiumHelper.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 08CA23F62BE50022002AC47A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 087AA34F2C46C62C00ADC001 /* MockURLSession.swift in Sources */, + 08CA23F72BE50022002AC47A /* MomentsAPIModuleTests.swift in Sources */, + 08CA23F82BE50022002AC47A /* MockDiskStorage.swift in Sources */, + 08CA23F92BE50022002AC47A /* CoreMocks.swift in Sources */, + 08EFB6DA2C418342006459F6 /* MockAppDataDiskStorage.swift in Sources */, + 08CA23FB2BE50022002AC47A /* MomentsAPITests.swift in Sources */, + 08CA23FC2BE50022002AC47A /* MockSessionStarter.swift in Sources */, + 08CA23FD2BE50022002AC47A /* TestTealiumHelper.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1516A2DA26EF7F26003DF8F2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -6312,6 +6746,8 @@ files = ( CF8809312554BD510020E1B2 /* TealiumHelper.swift in Sources */, CFB6B53B2679119B00D62D87 /* Colors.swift in Sources */, + 08CA23DC2BE3ABCA002AC47A /* VisitorServiceView.swift in Sources */, + 08CA23DA2BE39905002AC47A /* MomentsView.swift in Sources */, CFB6B53A2679119B00D62D87 /* UIColor+Hex.swift in Sources */, CF88094A2554BD560020E1B2 /* iOSTealiumTestApp.swift in Sources */, CFB6B5372679119B00D62D87 /* ButtonViews.swift in Sources */, @@ -7064,6 +7500,91 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 08191EBC2BCEC1AB003EEE36 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D755DC9821945E41003C6BA1 /* TealiumCore */; + targetProxy = 08191EBD2BCEC1AB003EEE36 /* PBXContainerItemProxy */; + }; + 08191ED72BD031E7003EEE36 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */; + targetProxy = 08191ED62BD031E7003EEE36 /* PBXContainerItemProxy */; + }; + 08191EDF2BD2C4F4003EEE36 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D755DC9821945E41003C6BA1 /* TealiumCore */; + targetProxy = 08191EE02BD2C4F4003EEE36 /* PBXContainerItemProxy */; + }; + 08191EFC2BD2C547003EEE36 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */; + targetProxy = 08191EFB2BD2C547003EEE36 /* PBXContainerItemProxy */; + }; + 08CA23DE2BE50019002AC47A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + platformFilters = ( + ios, + maccatalyst, + tvos, + ); + target = 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */; + targetProxy = 08CA23DF2BE50019002AC47A /* PBXContainerItemProxy */; + }; + 08CA23E02BE50019002AC47A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + platformFilters = ( + ios, + maccatalyst, + tvos, + ); + target = D755DC9821945E41003C6BA1 /* TealiumCore */; + targetProxy = 08CA23E12BE50019002AC47A /* PBXContainerItemProxy */; + }; + 08CA23F22BE50022002AC47A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + platformFilters = ( + ios, + maccatalyst, + macos, + ); + target = 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */; + targetProxy = 08CA23F32BE50022002AC47A /* PBXContainerItemProxy */; + }; + 08CA23F42BE50022002AC47A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + platformFilters = ( + ios, + maccatalyst, + macos, + ); + target = D755DC9821945E41003C6BA1 /* TealiumCore */; + targetProxy = 08CA23F52BE50022002AC47A /* PBXContainerItemProxy */; + }; + 08DAC3CF2C2093B800089032 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */; + targetProxy = 08DAC3CE2C2093B800089032 /* PBXContainerItemProxy */; + }; + 08DAC3D32C2093BF00089032 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */; + targetProxy = 08DAC3D22C2093BF00089032 /* PBXContainerItemProxy */; + }; + 08DAC3D82C2093C400089032 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */; + targetProxy = 08DAC3D72C2093C400089032 /* PBXContainerItemProxy */; + }; + 08DAC3E22C20997300089032 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */; + targetProxy = 08DAC3E12C20997300089032 /* PBXContainerItemProxy */; + }; + 08DAC3E62C21E49000089032 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 08191EBB2BCEC1AB003EEE36 /* TealiumMomentsAPI */; + targetProxy = 08DAC3E52C21E49000089032 /* PBXContainerItemProxy */; + }; 150334B327907D600014CD63 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = CF8806D92554B8620020E1B2 /* macOSTealiumTest */; @@ -7772,11 +8293,19 @@ }; D788A4F2231988B000BC6D60 /* PBXTargetDependency */ = { isa = PBXTargetDependency; + platformFilters = ( + ios, + maccatalyst, + ); target = D755DC9821945E41003C6BA1 /* TealiumCore */; targetProxy = D788A4F3231988B000BC6D60 /* PBXContainerItemProxy */; }; D788A507231988F000BC6D60 /* PBXTargetDependency */ = { isa = PBXTargetDependency; + platformFilters = ( + ios, + maccatalyst, + ); target = D7881EF121998DAD002CDCC1 /* TealiumLifecycle */; targetProxy = D788A506231988F000BC6D60 /* PBXContainerItemProxy */; }; @@ -7914,12 +8443,362 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 1516A2E626EF7F26003DF8F2 /* Debug */ = { + 08191ECB2BCEC1AB003EEE36 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + BUILD_SCRIPT = NO; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + EXCLUDED_ARCHS = ""; + FRAMEWORK_SEARCH_PATHS = ""; + INFOPLIST_FILE = "TealiumMoments-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.moments; + PRODUCT_MODULE_NAME = "$(PRODUCT_NAME)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = NO; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator appletvsimulator watchos appletvos macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "momentsapi DEBUG"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4,6"; + TVOS_DEPLOYMENT_TARGET = 12.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = Debug; + }; + 08191ECC2BCEC1AB003EEE36 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + BUILD_SCRIPT = NO; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + EXCLUDED_ARCHS = ""; + FRAMEWORK_SEARCH_PATHS = ""; + INFOPLIST_FILE = "TealiumMoments-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.moments; + PRODUCT_MODULE_NAME = "$(PRODUCT_NAME)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = NO; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator appletvsimulator watchos appletvos macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = momentsapi; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4,6"; + TVOS_DEPLOYMENT_TARGET = 12.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = Release; + }; + 08191EF72BD2C4F4003EEE36 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = XC939GDC9P; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "TEST=1", + ); + INFOPLIST_FILE = "TealiumTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@loader_path/Frameworks", + "@loader_path/../Frameworks", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ""; + OTHER_SWIFT_FLAGS = "-DTEST"; + PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 08191EF82BD2C4F4003EEE36 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = XC939GDC9P; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = ""; + INFOPLIST_FILE = "TealiumTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@loader_path/Frameworks", + "@loader_path/../Frameworks", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ""; + OTHER_SWIFT_FLAGS = "-DTEST"; + PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 08CA23ED2BE50019002AC47A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = XC939GDC9P; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "TEST=1", + ); + INFOPLIST_FILE = "TealiumTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@loader_path/Frameworks", + "@loader_path/../Frameworks", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ""; + OTHER_SWIFT_FLAGS = "-DTEST"; + PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + }; + name = Debug; + }; + 08CA23EE2BE50019002AC47A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = XC939GDC9P; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = ""; + INFOPLIST_FILE = "TealiumTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@loader_path/Frameworks", + "@loader_path/../Frameworks", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ""; + OTHER_SWIFT_FLAGS = "-DTEST"; + PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 3; + }; + name = Release; + }; + 08CA24012BE50022002AC47A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = XC939GDC9P; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "TEST=1", + ); + INFOPLIST_FILE = "TealiumTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@loader_path/Frameworks", + "@loader_path/../Frameworks", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ""; + OTHER_SWIFT_FLAGS = "-DTEST"; + PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = macosx; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 08CA24022BE50022002AC47A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = XC939GDC9P; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = ""; + INFOPLIST_FILE = "TealiumTests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@loader_path/Frameworks", + "@loader_path/../Frameworks", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ""; + OTHER_SWIFT_FLAGS = "-DTEST"; + PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = macosx; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 1516A2E626EF7F26003DF8F2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; @@ -7932,6 +8811,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -7962,6 +8842,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -7988,6 +8869,7 @@ DEVELOPMENT_TEAM = XC939GDC9P; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -8018,6 +8900,7 @@ DEVELOPMENT_TEAM = XC939GDC9P; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.tealium.TealiumInAppPurchaseTests-tvOS"; @@ -8056,7 +8939,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -8090,7 +8973,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -8127,6 +9010,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -8161,6 +9045,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -8206,6 +9091,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -8251,6 +9137,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.AutoTrackingIOSTest; @@ -8285,6 +9172,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.AutoTrackingTvOSTest; @@ -8319,6 +9207,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.AutoTrackingTvOSTest; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -8350,6 +9239,7 @@ ); INFOPLIST_FILE = "TealiumTests-info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -8378,6 +9268,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "TealiumTests-info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -8407,6 +9298,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -8437,6 +9329,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -8466,6 +9359,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -8495,6 +9389,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -8520,6 +9415,7 @@ CODE_SIGN_ENTITLEMENTS = AutoTrackingMacOSTest/AutoTrackingMacOSTest.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"AutoTrackingMacOSTest/Preview Content\""; ENABLE_PREVIEWS = YES; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -8553,6 +9449,7 @@ CODE_SIGN_ENTITLEMENTS = AutoTrackingMacOSTest/AutoTrackingMacOSTest.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"AutoTrackingMacOSTest/Preview Content\""; ENABLE_PREVIEWS = YES; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -8581,6 +9478,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "TealiumTests-info.plist"; LD_RUNPATH_SEARCH_PATHS = ( @@ -8611,6 +9509,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "TealiumTests-info.plist"; LD_RUNPATH_SEARCH_PATHS = ( @@ -8654,6 +9553,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -8690,6 +9590,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -8713,8 +9614,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -8723,6 +9623,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; @@ -8735,7 +9636,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.inapppurchase; PRODUCT_MODULE_NAME = TealiumInAppPurchase; @@ -8766,8 +9668,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -8775,6 +9676,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; @@ -8787,7 +9689,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.inapppurchase; PRODUCT_MODULE_NAME = TealiumInAppPurchase; @@ -8833,6 +9736,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -8840,6 +9744,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -8859,7 +9764,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LIBRARY_SEARCH_PATHS = ""; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = YES; @@ -8896,6 +9801,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -8903,6 +9809,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; ENABLE_NS_ASSERTIONS = NO; @@ -8916,7 +9823,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LIBRARY_SEARCH_PATHS = ""; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; @@ -8952,6 +9859,7 @@ "@loader_path/../Frameworks", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -8983,6 +9891,7 @@ "@loader_path/../Frameworks", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9023,6 +9932,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -9061,6 +9971,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -9098,6 +10009,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.iOSTealiumMediaTest; @@ -9132,6 +10044,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.iOSTealiumMediaTest; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9169,6 +10082,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -9210,6 +10124,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.iOSTealiumTestApp; @@ -9244,6 +10159,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.tvOSTealiumTest; @@ -9278,6 +10194,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.tvOSTealiumTest; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9304,6 +10221,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = XC939GDC9P; ENABLE_HARDENED_RUNTIME = YES; @@ -9340,6 +10258,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = XC939GDC9P; ENABLE_HARDENED_RUNTIME = YES; @@ -9384,6 +10303,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9417,6 +10337,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9440,8 +10361,7 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -9450,6 +10370,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "TealiumMedia-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -9459,7 +10380,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.media; @@ -9492,8 +10414,7 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = iOSTealiumTest/iOSTealiumTest.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -9501,6 +10422,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "TealiumMedia-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -9510,7 +10432,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.media; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; @@ -9557,6 +10480,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = "com.tealium.tealium-swift-tests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9592,6 +10516,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = "com.tealium.tealium-swift-tests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9627,6 +10552,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9667,6 +10593,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9705,7 +10632,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = "com.tealium.tealium-swift-tests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9746,7 +10673,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = "com.tealium.tealium-swift-tests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -9785,6 +10712,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -9821,6 +10749,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -9846,8 +10775,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -9856,6 +10784,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "TealiumLocation-Info.plist"; @@ -9866,7 +10795,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.location; @@ -9898,8 +10828,7 @@ CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -9907,6 +10836,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "TealiumLocation-Info.plist"; @@ -9917,7 +10847,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.location; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; @@ -9946,9 +10877,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -9957,6 +10886,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; @@ -9969,7 +10899,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.collect; PRODUCT_MODULE_NAME = TealiumCollect; @@ -9998,9 +10929,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -10008,6 +10937,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; @@ -10020,7 +10950,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.collect; PRODUCT_MODULE_NAME = TealiumCollect; @@ -10051,8 +10982,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -10061,6 +10991,8 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ""; INFOPLIST_FILE = "TealiumCore-Info.plist"; @@ -10071,7 +11003,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.core; PRODUCT_MODULE_NAME = "$(PRODUCT_NAME)"; @@ -10102,8 +11035,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -10111,6 +11043,8 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ""; INFOPLIST_FILE = "TealiumCore-Info.plist"; @@ -10121,7 +11055,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.core; @@ -10152,9 +11087,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -10163,6 +11096,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ""; INFOPLIST_FILE = "TealiumTagManagement-Info.plist"; @@ -10173,7 +11107,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.tagmanagement; PRODUCT_MODULE_NAME = "${PRODUCT_NAME}"; @@ -10186,7 +11121,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "tagmanagement DEBUG"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 11.0; + TVOS_DEPLOYMENT_TARGET = 12.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; WATCHOS_DEPLOYMENT_TARGET = 4.0; @@ -10202,9 +11137,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -10212,6 +11145,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ""; INFOPLIST_FILE = "TealiumTagManagement-Info.plist"; @@ -10222,7 +11156,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.tagmanagement; PRODUCT_MODULE_NAME = "${PRODUCT_NAME}"; @@ -10235,7 +11170,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = tagmanagement; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 11.0; + TVOS_DEPLOYMENT_TARGET = 12.0; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -10268,6 +11203,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10303,6 +11239,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10325,8 +11262,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -10335,6 +11271,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; @@ -10347,7 +11284,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.attribution; PRODUCT_MODULE_NAME = TealiumAttribution; @@ -10376,8 +11314,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -10385,6 +11322,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; @@ -10397,7 +11335,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.attribution; PRODUCT_MODULE_NAME = TealiumAttribution; @@ -10428,9 +11367,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -10439,6 +11376,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ""; INFOPLIST_FILE = "TealiumVisitorService-Info.plist"; @@ -10449,7 +11387,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ""; @@ -10482,9 +11421,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -10492,6 +11429,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = ""; INFOPLIST_FILE = "TealiumVisitorService-Info.plist"; @@ -10502,7 +11440,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.visitorservice; PRODUCT_MODULE_NAME = "$(PRODUCT_NAME)"; @@ -10549,6 +11488,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10584,6 +11524,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10605,9 +11546,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -10616,6 +11555,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; @@ -10628,7 +11568,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.lifecycle; PRODUCT_MODULE_NAME = TealiumLifecycle; @@ -10658,9 +11599,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -10668,6 +11607,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = ""; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; GCC_INCREASE_PRECOMPILED_HEADER_SHARING = NO; @@ -10680,7 +11620,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.lifecycle; PRODUCT_MODULE_NAME = TealiumLifecycle; @@ -10728,6 +11669,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10737,7 +11679,7 @@ SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; WATCHOS_DEPLOYMENT_TARGET = 3.0; }; name = Debug; @@ -10764,6 +11706,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10772,7 +11715,7 @@ SDKROOT = iphoneos; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 12.0; WATCHOS_DEPLOYMENT_TARGET = 3.0; }; name = Release; @@ -10802,6 +11745,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10835,6 +11779,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10871,6 +11816,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10905,6 +11851,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -10942,12 +11889,16 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -10976,12 +11927,16 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -11013,6 +11968,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11047,6 +12003,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11084,6 +12041,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11119,6 +12077,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11156,6 +12115,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11190,6 +12150,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11227,7 +12188,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = "-fprofile-instr-generate"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11262,7 +12223,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = "-fprofile-instr-generate"; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11299,6 +12260,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11333,6 +12295,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11370,7 +12333,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11405,7 +12368,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11443,6 +12406,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11477,6 +12441,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11515,7 +12480,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11551,7 +12516,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11575,9 +12540,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -11586,6 +12549,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = "$(inherited) $(EXCLUDED_ARCHS__IS_MACCATALYST_$(IS_MACCATALYST)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))"; EXCLUDED_ARCHS__IS_MACCATALYST_YES__NATIVE_ARCH_64_BIT_x86_64 = "arm64 arm64e armv7 armv7s armv6 armv8"; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; @@ -11599,7 +12563,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.remotecommands; PRODUCT_MODULE_NAME = TealiumRemoteCommands; @@ -11614,7 +12579,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.3.3; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 11.0; + TVOS_DEPLOYMENT_TARGET = 12.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; WATCHOS_DEPLOYMENT_TARGET = 4.0; @@ -11631,9 +12596,7 @@ CLANG_ENABLE_MODULES = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -11641,6 +12604,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = "$(inherited) $(EXCLUDED_ARCHS__IS_MACCATALYST_$(IS_MACCATALYST)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))"; EXCLUDED_ARCHS__IS_MACCATALYST_YES__NATIVE_ARCH_64_BIT_x86_64 = "arm64 arm64e armv7 armv7s armv6 armv8"; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; @@ -11654,7 +12618,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.remotecommands; @@ -11669,7 +12634,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = remotecommands; SWIFT_VERSION = 5.3.3; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 11.0; + TVOS_DEPLOYMENT_TARGET = 12.0; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -11686,9 +12651,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -11697,6 +12660,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = "$(inherited) $(EXCLUDED_ARCHS__IS_MACCATALYST_$(IS_MACCATALYST)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))"; EXCLUDED_ARCHS__IS_MACCATALYST_YES__NATIVE_ARCH_64_BIT_x86_64 = "arm64 arm64e armv7 armv7s armv6 armv8"; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; @@ -11710,7 +12674,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.autotracking; @@ -11741,9 +12706,7 @@ BUILD_SCRIPT = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -11751,6 +12714,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; EXCLUDED_ARCHS = "$(inherited) $(EXCLUDED_ARCHS__IS_MACCATALYST_$(IS_MACCATALYST)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT))"; EXCLUDED_ARCHS__IS_MACCATALYST_YES__NATIVE_ARCH_64_BIT_x86_64 = "arm64 arm64e armv7 armv7s armv6 armv8"; FRAMEWORK_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; @@ -11764,7 +12728,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = tealium.ios.autotracking; @@ -11889,6 +12854,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11926,6 +12892,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; OTHER_LDFLAGS = ""; OTHER_SWIFT_FLAGS = "-DTEST"; PRODUCT_BUNDLE_IDENTIFIER = com.tealium.TealiumTests; @@ -11944,6 +12911,42 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 08191ECA2BCEC1AB003EEE36 /* Build configuration list for PBXNativeTarget "TealiumMomentsAPI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08191ECB2BCEC1AB003EEE36 /* Debug */, + 08191ECC2BCEC1AB003EEE36 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 08191EF62BD2C4F4003EEE36 /* Build configuration list for PBXNativeTarget "TealiumMomentsAPITests-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08191EF72BD2C4F4003EEE36 /* Debug */, + 08191EF82BD2C4F4003EEE36 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 08CA23EC2BE50019002AC47A /* Build configuration list for PBXNativeTarget "TealiumMomentsAPITests-tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08CA23ED2BE50019002AC47A /* Debug */, + 08CA23EE2BE50019002AC47A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 08CA24002BE50022002AC47A /* Build configuration list for PBXNativeTarget "TealiumMomentsAPITests-macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 08CA24012BE50022002AC47A /* Debug */, + 08CA24022BE50022002AC47A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; 1516A2E526EF7F26003DF8F2 /* Build configuration list for PBXNativeTarget "TealiumAutotrackingUITests-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/AutoTrackingIOSTest.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/AutoTrackingIOSTest.xcscheme index 4b44f875..23bcfaeb 100644 --- a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/AutoTrackingIOSTest.xcscheme +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/AutoTrackingIOSTest.xcscheme @@ -1,6 +1,6 @@ + + + + diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumAttribution.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumAttribution.xcscheme index 17e35e22..01ba11b5 100644 --- a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumAttribution.xcscheme +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumAttribution.xcscheme @@ -1,6 +1,6 @@ - - - - diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumInAppPurchaseTests-tvOS.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumInAppPurchaseTests-tvOS.xcscheme index b60f72f6..8fe094c7 100644 --- a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumInAppPurchaseTests-tvOS.xcscheme +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumInAppPurchaseTests-tvOS.xcscheme @@ -1,6 +1,6 @@ + + + + diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumLifecycle.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumLifecycle.xcscheme index 8d2757d2..6c94dd1e 100644 --- a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumLifecycle.xcscheme +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumLifecycle.xcscheme @@ -1,6 +1,6 @@ - - - - diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMedia.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMedia.xcscheme index ead2cae5..129104b7 100644 --- a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMedia.xcscheme +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMedia.xcscheme @@ -1,6 +1,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMomentsAPITests-iOS.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMomentsAPITests-iOS.xcscheme new file mode 100644 index 00000000..0f61cf9a --- /dev/null +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMomentsAPITests-iOS.xcscheme @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMomentsAPITests-macOS.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMomentsAPITests-macOS.xcscheme new file mode 100644 index 00000000..cc1c1875 --- /dev/null +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMomentsAPITests-macOS.xcscheme @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMomentsAPITests-tvOS.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMomentsAPITests-tvOS.xcscheme new file mode 100644 index 00000000..ec075eff --- /dev/null +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumMomentsAPITests-tvOS.xcscheme @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumRemoteCommands.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumRemoteCommands.xcscheme index f814d0bd..d68dfa53 100644 --- a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumRemoteCommands.xcscheme +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumRemoteCommands.xcscheme @@ -1,6 +1,6 @@ - - - - diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumTagManagementTests-iOS.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumTagManagementTests-iOS.xcscheme index 24016638..3f06ebd6 100644 --- a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumTagManagementTests-iOS.xcscheme +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumTagManagementTests-iOS.xcscheme @@ -1,6 +1,6 @@ + + + + diff --git a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumTraceTests-iOS.xcscheme b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumTraceTests-iOS.xcscheme index bcefd6fe..002f46ed 100644 --- a/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumTraceTests-iOS.xcscheme +++ b/builder/tealium-swift.xcodeproj/xcshareddata/xcschemes/TealiumTraceTests-iOS.xcscheme @@ -1,6 +1,6 @@ (_ block: () -> T) -> T { + return TealiumQueues.backgroundSerialQueue.sync { + return block() + } + } + + override func setUpWithError() throws { + super.setUp() + } + + override func tearDownWithError() throws { + super.tearDown() + } + + func testModuleInitializationWithMissingRegion() { + let contextWithoutRegion = TealiumContext(config: testTealiumConfig, dataLayer: mockDataLayer) + let _ = TealiumMomentsAPIModule(context: contextWithoutRegion, delegate: nil, diskStorage: nil) { result in + switch result.0 { + case .failure(let error): + XCTAssertEqual(error as! MomentsError, MomentsError.missingRegion, "Expected MomentsError for missing region") + case .success: + XCTFail("Initialization should fail without region") + } + } + } + + func testSuccessfulModuleInitialization() { + testTealiumConfig.momentsAPIRegion = .germany + let context = TealiumContext(config: testTealiumConfig, dataLayer: mockDataLayer) + let _ = TealiumMomentsAPIModule(context: context, delegate: nil, diskStorage: nil) { result in + switch result.0 { + case .failure: + XCTFail("Exepected success") + case .success: + XCTAssertTrue(true, "Initialization succeeded") + } + } + } + + func testVisitorIDIsUpdated() { + let tealiumInitialized = expectation(description: "Tealium is initialized") + testTealiumConfig.momentsAPIRegion = .germany + testTealiumConfig.collectors = [Collectors.AppData] + tealium = Tealium(config: testTealiumConfig) { _ in + tealiumInitialized.fulfill() + } + waitOnTealiumSerialQueue { + wait(for: [tealiumInitialized], timeout: 1.0) + } + + let idProvider = tealium!.appDataModule?.visitorIdProvider + let initialVisitorId = "123456" + idProvider!.publishVisitorId(initialVisitorId, andUpdateStorage: false) + let context = tealium.context! + let moduleInitializedExpectation = expectation(description: "module initialized") + let module = TealiumMomentsAPIModule(context: context, delegate: nil, diskStorage: nil) { _ in + moduleInitializedExpectation.fulfill() + } + + waitOnTealiumSerialQueue { + wait(for: [moduleInitializedExpectation], timeout: 1.0) + } + XCTAssertEqual(module.momentsAPI?.visitorId!, initialVisitorId) + let newVisitorId = "newvisitor" + idProvider!.publishVisitorId(newVisitorId, andUpdateStorage: false) + let visitorIdExpectation = expectation(description: "visitorid") + + TealiumQueues.backgroundSerialQueue.async { + XCTAssertEqual(newVisitorId, module.momentsAPI!.visitorId!) + visitorIdExpectation.fulfill() + } + waitOnTealiumSerialQueue { + wait(for: [visitorIdExpectation], timeout: 1.0) + } + } + + +} diff --git a/support/tests/test_tealium_moments_api/MomentsAPITests.swift b/support/tests/test_tealium_moments_api/MomentsAPITests.swift new file mode 100644 index 00000000..6906b797 --- /dev/null +++ b/support/tests/test_tealium_moments_api/MomentsAPITests.swift @@ -0,0 +1,215 @@ +// +// MomentsAPITests.swift +// tealium-swift +// +// Copyright © 2024 Tealium, Inc. All rights reserved. +// + +import Foundation +@testable import TealiumCore +@testable import TealiumMomentsAPI +import XCTest + +class MomentsAPITests: XCTestCase { + + static let customReferrer = "https://tealium.com/" + static let account = "testAccount" + static let profile = "testProfile" + static let environment = "dev" + static let standardReferrer = "https://tags.tiqcdn.com/utag/\(account)/\(profile)/\(environment)/mobile.html" + let mockURLSession = MockURLSession() + + func testFetchEngineResponseSuccess() { + let api = TealiumMomentsAPI(region: .us_east, account: MomentsAPITests.account, profile: MomentsAPITests.profile, environment: MomentsAPITests.environment, session: mockURLSession) + + let jsonData = """ + {"audiences":["VIP", "Women's Apparel", "Lifetime visit count"], + "badges":["13", "26", "52"], + "properties":{"54":"other","58":"other","60":"mobile application","5123":"set","5240":"Visitor: String Attribute","5688":"1970-01-01"}, + "metrics":{"15":5,"21":5,"22":43,"25":2.7933666666666666}, + "flags":{"27":true,"5152":true,"5242":false}, + "dates":{"23":1718202502203,"24":1718357687966,"5244":1718360309656,"5690":0}} + """.data(using: .utf8)! + + mockURLSession.result = .success(withData: jsonData, statusCode: 200) + + let expectation = XCTestExpectation(description: "Fetch engine response succeeds") + + api.visitorId = "12345" + api.fetchEngineResponse(engineID: "engine123") { result in + switch result { + case .success(let response): + XCTAssertEqual(response.audiences!.count, 3) + XCTAssertEqual(response.dates!.count, 4) + XCTAssertEqual(response.badges!.count, 3) + XCTAssertEqual(response.strings!.count, 6) + XCTAssertEqual(response.booleans!.count, 3) + XCTAssertEqual(response.numbers!.count, 4) + XCTAssertEqual(response.numbers!["25"]!, 2.7933666666666666) + XCTAssertEqual(response.booleans!["5242"]!, false) + + expectation.fulfill() + case .failure: + XCTFail("Expected successful engine response, got failure") + } + } + + wait(for: [expectation], timeout: 1.0) + } + + func testFetchEngineResponsePartialData() { + let api = TealiumMomentsAPI(region: .us_east, account: MomentsAPITests.account, profile: MomentsAPITests.profile, environment: MomentsAPITests.environment, session: mockURLSession) + + let jsonData = """ + {"audiences":["VIP", "Women's Apparel", "Lifetime visit count"], + "badges":["13", "26", "52"], + "flags":{"27":true,"5152":true,"5242":false}, + "properties": {"1234":null}} + """.data(using: .utf8)! + + mockURLSession.result = .success(withData: jsonData, statusCode: 200) + + let expectation = XCTestExpectation(description: "Fetch engine response succeeds") + + api.visitorId = "12345" + api.fetchEngineResponse(engineID: "engine123") { result in + switch result { + case .success(let response): + XCTAssertEqual(response.audiences!.count, 3) + XCTAssertNil(response.dates) + XCTAssertEqual(response.badges!.count, 3) + XCTAssertNil(response.strings) + XCTAssertEqual(response.booleans!.count, 3) + XCTAssertNil(response.numbers) + XCTAssertEqual(response.booleans!["5242"]!, false) + + expectation.fulfill() + case .failure: + XCTFail("Expected successful engine response, got failure") + } + } + + wait(for: [expectation], timeout: 1.0) + } + + + func testFetchEngineResponseForbidden() { + let api = TealiumMomentsAPI(region: .us_east, account: MomentsAPITests.account, profile: MomentsAPITests.profile, environment: MomentsAPITests.environment, session: mockURLSession) + + mockURLSession.result = .success(withData: nil, statusCode: 403) + + let expectation = XCTestExpectation(description: "Fetch engine response fails") + + api.visitorId = "12345" + api.fetchEngineResponse(engineID: "engine123") { result in + switch result { + case .success: + XCTFail("Expected error, got success.") + case .failure(let error): + XCTAssertEqual((error as! MomentsAPIHTTPError), MomentsAPIHTTPError.forbidden, "Unexpected error type returned.") + expectation.fulfill() + } + } + + wait(for: [expectation], timeout: 1.0) + } + + func testFetchEngineResponseBadRequest() { + let api = TealiumMomentsAPI(region: .us_east, account: MomentsAPITests.account, profile: MomentsAPITests.profile, environment: MomentsAPITests.environment, session: mockURLSession) + + mockURLSession.result = .success(withData: nil, statusCode: 400) + + let expectation = XCTestExpectation(description: "Fetch engine response fails") + + api.visitorId = "12345" + api.fetchEngineResponse(engineID: "engine123") { result in + switch result { + case .success: + XCTFail("Expected error, got success.") + case .failure(let error): + XCTAssertEqual((error as! MomentsAPIHTTPError), MomentsAPIHTTPError.badRequest, "Unexpected error type returned.") + expectation.fulfill() + } + } + + wait(for: [expectation], timeout: 1.0) + } + + func testFetchEngineResponseCustomReferrer() { + let api = TealiumMomentsAPI(region: .us_east, account: MomentsAPITests.account, profile: MomentsAPITests.profile, environment: MomentsAPITests.environment, referrer: MomentsAPITests.customReferrer, session: mockURLSession) + + mockURLSession.result = .success(withData: nil, statusCode: 200) + + let requestSent = expectation(description: "Request sent and custom referrer is correctly set") + mockURLSession.onRequestSent.subscribeOnce { request in + XCTAssertEqual(request.value(forHTTPHeaderField: "Referer"), MomentsAPITests.customReferrer) + requestSent.fulfill() + } + + let expectation = XCTestExpectation(description: "Fetch engine response completes") + + api.visitorId = "12345" + api.fetchEngineResponse(engineID: "engine123") { result in + expectation.fulfill() + } + + wait(for: [expectation, requestSent], timeout: 1.0) + } + + func testFetchEngineResponseNotFound() { + let api = TealiumMomentsAPI(region: .us_east, account: MomentsAPITests.account, profile: MomentsAPITests.profile, environment: MomentsAPITests.environment, session: mockURLSession) + + mockURLSession.result = .success(withData: nil, statusCode: 404) + + let expectation = XCTestExpectation(description: "Fetch engine response fails") + + api.visitorId = "12345" + api.fetchEngineResponse(engineID: "engine123") { result in + switch result { + case .success: + XCTFail("Expected error, got success.") + case .failure(let error): + XCTAssertEqual((error as! MomentsAPIHTTPError), MomentsAPIHTTPError.notFound, "Unexpected error type returned.") + expectation.fulfill() + } + } + + wait(for: [expectation], timeout: 1.0) + } + + func testFetchEngineResponseFailureMissingVisitorID() { + let api = TealiumMomentsAPI(region: .us_east, account: MomentsAPITests.account, profile: MomentsAPITests.profile, environment: MomentsAPITests.environment, session: mockURLSession) + + let expectation = XCTestExpectation(description: "Fetch engine response fails due to missing visitor ID") + + api.fetchEngineResponse(engineID: "engine123") { result in + if case .failure(let error as MomentsError) = result, case .missingVisitorID = error { + expectation.fulfill() + } else { + XCTFail("Expected failure with missing visitor ID, got other error") + } + } + + wait(for: [expectation], timeout: 1.0) + } + + func testFetchEngineResponseNetworkError() { + let api = TealiumMomentsAPI(region: .us_east, account: MomentsAPITests.account, profile: MomentsAPITests.profile, environment: MomentsAPITests.environment, session: mockURLSession) + + mockURLSession.result = .failure(URLError(URLError.Code.notConnectedToInternet)) + + let expectation = XCTestExpectation(description: "Fetch engine response fails due to network error") + + api.visitorId = "12345" + api.fetchEngineResponse(engineID: "engine123") { result in + if case .failure(let error as URLError) = result, error.code == .notConnectedToInternet { + expectation.fulfill() + } else { + XCTFail("Expected network error, got other error") + } + } + + wait(for: [expectation], timeout: 1.0) + } +} + diff --git a/tealium-swift.podspec b/tealium-swift.podspec index 8f73716f..08ca9938 100644 --- a/tealium-swift.podspec +++ b/tealium-swift.podspec @@ -150,6 +150,11 @@ Pod::Spec.new do |s| media.dependency "tealium-swift/Core" end + s.subspec "MomentsAPI" do |momentsapi| + momentsapi.source_files = "tealium/collectors/momentsapi/*" + momentsapi.dependency "tealium-swift/Core" + end + s.subspec "RemoteCommands" do |remotecommands| remotecommands.source_files = "tealium/dispatchers/remotecommands/*" remotecommands.dependency "tealium-swift/Core" diff --git a/tealium/collectors/momentsapi/MomentsAPI.swift b/tealium/collectors/momentsapi/MomentsAPI.swift new file mode 100644 index 00000000..93dd1731 --- /dev/null +++ b/tealium/collectors/momentsapi/MomentsAPI.swift @@ -0,0 +1,97 @@ +// +// MomentsAPI.swift +// tealium-swift +// +// Copyright © 2024 Tealium, Inc. All rights reserved. +// + +import Foundation +#if momentsapi +import TealiumCore +#endif + +protocol MomentsAPI: AnyObject { + func fetchEngineResponse(engineID: String, completion: @escaping (Result) -> Void) + var visitorId: String? { get set } +} + +class TealiumMomentsAPI: MomentsAPI { + private let session: URLSessionProtocol + private let region: MomentsAPIRegion + private let account: String + private let profile: String + private let referrer: String + var visitorId: String? + + init(region: MomentsAPIRegion, + account: String, + profile: String, + environment: String, + referrer: String? = nil, + session: URLSessionProtocol = URLSession(configuration: .ephemeral)) { + self.region = region + self.account = account + self.profile = profile + self.referrer = referrer ?? "https://tags.tiqcdn.com/utag/\(account)/\(profile)/\(environment)/mobile.html" + self.session = session + } + + func fetchEngineResponse(engineID: String, completion: @escaping (Result) -> Void) { + guard let visitorId = self.visitorId else { + completion(.failure(MomentsError.missingVisitorID)) + return + } + performRequestForEngineResponse(engineID: engineID, visitorId: visitorId, completion: completion) + } +} + +// MARK: - Private Methods +private extension TealiumMomentsAPI { + func performRequestForEngineResponse(engineID: String, visitorId: String, completion: @escaping (Result) -> Void) { + guard let url = constructURL(forEngineID: engineID, visitorID: visitorId) else { + completion(.failure(URLError(.badURL))) + return + } + + var request = URLRequest(url: url) + request.httpMethod = "GET" + request.setValue(referrer, forHTTPHeaderField: "Referer") + + session.tealiumDataTask(with: request) { data, response, error in + self.handleResponse(data: data, response: response, error: error, completion: completion) + }.resume() + } + + func constructURL(forEngineID engineID: String, visitorID: String) -> URL? { + var engineUrl: String { + """ + https://personalization-api.\(region.rawValue).prod.tealiumapis.com/personalization/accounts/\(account)/profiles/\(profile)/engines/\(engineID)/visitors/\(visitorID)?ignoreTapid=true + """ + } + return URL(string: engineUrl) + } + + func handleResponse(data: Data?, response: URLResponse?, error: Error?, completion: @escaping (Result) -> Void) { + if let error = error { + completion(.failure(error)) + return + } + + if let httpResponse = response as? HTTPURLResponse, let customError = MomentsAPIHTTPError(rawValue: httpResponse.statusCode) { + completion(.failure(customError)) + return + } + + guard let data = data else { + completion(.failure(URLError(.cannotDecodeRawData))) + return + } + + do { + let moments = try JSONDecoder().decode(EngineResponse.self, from: data) + completion(.success(moments)) + } catch { + completion(.failure(error)) + } + } +} diff --git a/tealium/collectors/momentsapi/MomentsAPIEngineResponse.swift b/tealium/collectors/momentsapi/MomentsAPIEngineResponse.swift new file mode 100644 index 00000000..3e9b3d60 --- /dev/null +++ b/tealium/collectors/momentsapi/MomentsAPIEngineResponse.swift @@ -0,0 +1,82 @@ +// +// MomentsAPIEngineResponse.swift +// tealium-swift +// +// Copyright © 2024 Tealium, Inc. All rights reserved. +// + +import Foundation + +public struct EngineResponse: Codable { + /// The complete list of audiences the visitor is currently assigned to. Could be the audience name, or just the ID, depending on the options specified in the UI. + public var audiences: [String]? + /// The complete list of badges assigned to the visitor. Could be the badge name, or just the ID, depending on the options specified in the UI. + public var badges: [String]? + /// All audiencestream `Boolean` attributes currently assigned to the visitor + public var booleans: [String: Bool]? + /// All audiencestream `Date` attributes currently assigned to the visitor, which are millisecond-precise Unix timestamps + public var dates: [String: Int64]? + /// All audiencestream `Number` attributes currently assigned to the visitor + public var numbers: [String: Double]? + /// All audiencestream `String` attributes currently assigned to the visitor + public var strings: [String: String]? + + enum CodingKeys: String, CodingKey { + case audiences, + badges, + booleans = "flags", + dates, + numbers = "metrics", + strings = "properties" + } + + public init(audiences: [String]? = nil, + badges: [String]? = nil, + booleans: [String: Bool]? = nil, + dates: [String: Int64]? = nil, + numbers: [String: Double]? = nil, + strings: [String: String]? = nil) { + self.audiences = audiences + self.badges = badges + self.booleans = booleans + self.dates = dates + self.numbers = numbers + self.strings = strings + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.audiences = try container.decodeIfPresent([String].self, forKey: .audiences) + self.badges = try container.decodeIfPresent([String].self, forKey: .badges) + self.booleans = try decodeDictionarySkippingNullValues(container: container, key: .booleans) + self.dates = try decodeDictionarySkippingNullValues(container: container, key: .dates) + self.numbers = try decodeDictionarySkippingNullValues(container: container, key: .numbers) + self.strings = try decodeDictionarySkippingNullValues(container: container, key: .strings) + } + + private func decodeDictionarySkippingNullValues(container: KeyedDecodingContainer, key: CodingKeys) throws -> [String: T]? { + guard let nestedContainer = try? container.nestedContainer(keyedBy: JSONCodingKeys.self, forKey: key) else { + return nil + } + var result = [String: T]() + for codingKey in nestedContainer.allKeys { + if let value = try nestedContainer.decodeIfPresent(T.self, forKey: codingKey) { + result[codingKey.stringValue] = value + } + } + return result.isEmpty ? nil : result + } +} + +private struct JSONCodingKeys: CodingKey { + var stringValue: String + init?(stringValue: String) { + self.stringValue = stringValue + } + + var intValue: Int? + + init?(intValue: Int) { + return nil + } +} diff --git a/tealium/collectors/momentsapi/MomentsAPIError.swift b/tealium/collectors/momentsapi/MomentsAPIError.swift new file mode 100644 index 00000000..cc3166a1 --- /dev/null +++ b/tealium/collectors/momentsapi/MomentsAPIError.swift @@ -0,0 +1,34 @@ +// +// MomentsAPIError.swift +// tealium-swift +// +// Copyright © 2024 Tealium, Inc. All rights reserved. +// + +import Foundation + +enum MomentsError: Error, LocalizedError { + case missingRegion + case missingVisitorID + case moduleNotFound + public var errorDescription: String? { + switch self { + case .missingRegion: + return "Missing Region." + case .missingVisitorID: + return "Missing Visitor ID." + case .moduleNotFound: + return "The Moments API module wasn't found." + } + } + var recoverySuggestion: String? { + switch self { + case .missingRegion: + return "Set momentsAPIRegion property on TealiumConfig." + case .missingVisitorID: + return "Tealium Anonymous Visitor ID could not be determined. This is likely to be a temporary error, and should resolve itself." + case .moduleNotFound: + return "Pass Collectors.MomentsAPI in the TealiumConfig collectors object at initialization." + } + } +} diff --git a/tealium/collectors/momentsapi/MomentsAPIExtensions.swift b/tealium/collectors/momentsapi/MomentsAPIExtensions.swift new file mode 100644 index 00000000..bd018b5b --- /dev/null +++ b/tealium/collectors/momentsapi/MomentsAPIExtensions.swift @@ -0,0 +1,109 @@ +// +// MomentsAPIExtensions.swift +// tealium-swift +// +// Copyright © 2024 Tealium, Inc. All rights reserved. +// + +import Foundation +#if momentsapi +import TealiumCore +#endif + +extension TealiumConfigKey { + static let momentsAPIRegion = "moments_api_region" + static let momentsAPIReferrer = "moments_api_referrer" +} + +public enum MomentsAPIRegion { + // swiftlint:disable identifier_name + case germany + case us_east + case sydney + case oregon + case tokyo + case hong_kong + case custom(String) + + var rawValue: String { + switch self { + case .germany: + return "eu-central-1" + case .us_east: + return "us-east-1" + case .sydney: + return "ap-southeast-2" + case .oregon: + return "us-west-2" + case .tokyo: + return "ap-northeast-1" + case .hong_kong: + return "ap-east-1" + case .custom(let regionString): + return regionString + } + } + // swiftlint:enable identifier_name +} + +public extension TealiumConfig { + + /// Sets the region for calls to the Moments API endpoint + var momentsAPIRegion: MomentsAPIRegion? { + get { + options[TealiumConfigKey.momentsAPIRegion] as? MomentsAPIRegion + } + + set { + options[TealiumConfigKey.momentsAPIRegion] = newValue + } + } + + /// Sets the region for calls to the Moments API endpoint + var momentsAPIReferrer: String? { + get { + options[TealiumConfigKey.momentsAPIReferrer] as? String + } + + set { + options[TealiumConfigKey.momentsAPIReferrer] = newValue + } + } +} + +public extension Tealium { + + class MomentsAPIWrapper { + private weak var tealium: Tealium? + + private var module: TealiumMomentsAPIModule? { + (tealium?.zz_internal_modulesManager?.modules.first { + $0 is TealiumMomentsAPIModule + }) as? TealiumMomentsAPIModule + } + + /// Fetches a response from a configured Moments API Engine + /// - Parameters: + /// - completion: `Result` Optional completion block to be called when a response has been received from the Moments API + /// - result: `Result` Result type to receive a valid Moments API Engine Response or an error + public func fetchEngineResponse(engineID: String, completion: @escaping (Result) -> Void) { + TealiumQueues.backgroundSerialQueue.async(qos: .userInitiated) { + guard let module = self.module else { + completion(.failure(MomentsError.moduleNotFound)) + return + } + module.momentsAPI?.fetchEngineResponse(engineID: engineID, completion: completion) + } + } + + init(tealium: Tealium) { + self.tealium = tealium + } + } + + /// Provides API methods to interact with the Moments module + var momentsAPI: MomentsAPIWrapper? { + return MomentsAPIWrapper(tealium: self) + } + +} diff --git a/tealium/collectors/momentsapi/MomentsAPIHTTPError.swift b/tealium/collectors/momentsapi/MomentsAPIHTTPError.swift new file mode 100644 index 00000000..bec28646 --- /dev/null +++ b/tealium/collectors/momentsapi/MomentsAPIHTTPError.swift @@ -0,0 +1,77 @@ +import Foundation + +enum MomentsAPIHTTPError: RawRepresentable, Error, LocalizedError, Equatable { + typealias RawValue = Int + + case badRequest + case forbidden + case notFound + case unsuccessful(_ statusCode: Int) + + init?(rawValue: Int) { + switch rawValue { + case 200..<300: + return nil + case 400: + self = .badRequest + case 403: + self = .forbidden + case 404: + self = .notFound + default: + self = .unsuccessful(rawValue) + } + } + + var rawValue: Int { + switch self { + case .badRequest: + return 400 + case .forbidden: + return 403 + case .notFound: + return 404 + case .unsuccessful(let code): + return code + } + } + + var errorDescription: String? { + switch self { + case .badRequest: + return "Bad request. Please check the request parameters." + case .forbidden: + return "The Moments API engine is not enabled. Please check your configuration." + case .notFound: + return "Not Found. The Tealium visitor ID does not have moments stored in the database." + case .unsuccessful(let statusCode): + return "An error occurred with status code \(statusCode)." + } + } + + var recoverySuggestion: String? { + switch self { + case .badRequest: + return "Verify the request parameters and try again." + case .forbidden: + return "Ensure that the Moments API engine is properly configured and enabled." + case .notFound: + return "Check the Tealium visitor ID." + case .unsuccessful: + return "Please consult the documentation or contact support for further assistance." + } + } + + static func == (lhs: MomentsAPIHTTPError, rhs: MomentsAPIHTTPError) -> Bool { + switch (lhs, rhs) { + case (.badRequest, .badRequest), + (.forbidden, .forbidden), + (.notFound, .notFound): + return true + case let (.unsuccessful(lhsCode), .unsuccessful(rhsCode)): + return lhsCode == rhsCode + default: + return false + } + } +} diff --git a/tealium/collectors/momentsapi/MomentsAPIModule.swift b/tealium/collectors/momentsapi/MomentsAPIModule.swift new file mode 100644 index 00000000..e459a6c5 --- /dev/null +++ b/tealium/collectors/momentsapi/MomentsAPIModule.swift @@ -0,0 +1,55 @@ +// +// MomentsAPIModule.swift +// tealium-swift +// +// Copyright © 2024 Tealium, Inc. All rights reserved. +// + +import Foundation +#if momentsapi +import TealiumCore +#endif + +public class TealiumMomentsAPIModule: Collector { + public let id: String = ModuleNames.momentsapi + public var config: TealiumConfig + public var data: [String: Any]? + let momentsAPI: MomentsAPI? + private var bag = TealiumDisposeBag() + + /// Initializes the module + /// + /// - Parameter context: `TealiumContext` instance + /// - Parameter delegate: `ModuleDelegate?` instance + /// - Parameter diskStorage: `TealiumDiskStorageProtocol?` instance + /// - Parameter completion: `ModuleCompletion` block to be called when init is finished + required public init(context: TealiumContext, + delegate: ModuleDelegate?, + diskStorage: TealiumDiskStorageProtocol?, + completion: ModuleCompletion) { + self.config = context.config + guard let momentsAPIRegion = config.momentsAPIRegion else { + self.momentsAPI = nil + completion((.failure(MomentsError.missingRegion), nil)) + return + } + self.momentsAPI = TealiumMomentsAPI(region: momentsAPIRegion, + account: config.account, + profile: config.profile, + environment: config.environment, + referrer: config.momentsAPIReferrer) + TealiumQueues.backgroundSerialQueue.async { + context.onVisitorId?.subscribe { [weak self] visitorId in + guard let self = self else { + return + } + self.momentsAPI?.visitorId = visitorId + }.toDisposeBag(self.bag) + } + completion((.success(true), nil)) + } +} + +public extension Collectors { + static let MomentsAPI = TealiumMomentsAPIModule.self +} diff --git a/tealium/core/ModulesManager.swift b/tealium/core/ModulesManager.swift index 4b23917d..f83a5c71 100644 --- a/tealium/core/ModulesManager.swift +++ b/tealium/core/ModulesManager.swift @@ -18,6 +18,8 @@ enum ModulesManagerLogMessages { static let noDispatchersEnabled = "No dispatchers are enabled. Please check remote publish settings." static let noConnectionDispatchersDisabled = "Internet connection not available. Dispatchers could not be enabled. Will retry when connection available." static let connectionLost = "Internet connection lost. Events will be queued until connection restored." + static let collectorInitializedSuccessfully = "Collector initialized successfully." + static let collectorFailedToInitialize = "Collector failed to initialize." } public class ModulesManager { @@ -271,7 +273,33 @@ extension ModulesManager { return } - let collector = collector.init(context: context, delegate: self, diskStorage: nil) { _, _ in } + let collector = collector.init(context: context, delegate: self, diskStorage: nil) { result, _ in + switch result { + case .success: + let logRequest = TealiumLogRequest(title: ModulesManagerLogMessages.system, + message: "\(ModulesManagerLogMessages.collectorInitializedSuccessfully)", + info: nil, + logLevel: .info, + category: .`init`) + self.logger?.log(logRequest) + case .failure(let error): + if let error = error as? LocalizedError { + var message = "\(ModulesManagerLogMessages.collectorFailedToInitialize) with error: \((error).localizedDescription)" + + if let recoverySuggestion = error.recoverySuggestion { + message += "\nRecovery suggestion: \(recoverySuggestion)" + } + + let logRequest = TealiumLogRequest(title: ModulesManagerLogMessages.system, + message: message, + info: nil, + logLevel: .info, + category: .`init`) + self.logger?.log(logRequest) + } + } + + } addCollector(collector) } diff --git a/tealium/core/TealiumConstants.swift b/tealium/core/TealiumConstants.swift index b259f155..78a60056 100644 --- a/tealium/core/TealiumConstants.swift +++ b/tealium/core/TealiumConstants.swift @@ -14,7 +14,7 @@ public enum Dispatchers {} public enum TealiumValue { public static let libraryName = "swift" - public static let libraryVersion = "2.13.0" + public static let libraryVersion = "2.14.0" // This is the current limit for performance reasons. May be increased in future public static let maxEventBatchSize = 10 public static let defaultMinimumDiskSpace: Int32 = 20_000_000 @@ -45,6 +45,7 @@ public enum ModuleNames { public static let lifecycle = "Lifecycle" public static let inapppurchase = "InAppPurchase" public static let location = "Location" + public static let momentsapi = "MomentsAPI" public static let remotecommands = "RemoteCommands" public static let tagmanagement = "TagManagement" public static let visitorservice = "VisitorService" diff --git a/tealium/core/dispatchmanager/DispatchManager.swift b/tealium/core/dispatchmanager/DispatchManager.swift index 1f305835..2fb3f39a 100644 --- a/tealium/core/dispatchmanager/DispatchManager.swift +++ b/tealium/core/dispatchmanager/DispatchManager.swift @@ -231,7 +231,6 @@ class DispatchManager: DispatchManagerProtocol { case .success: self.logModuleResponse(for: moduleId, request: request, info: data, success: true, error: nil) } - } } } diff --git a/tealium/core/publishsettings/TealiumPublishSettingsRetriever.swift b/tealium/core/publishsettings/TealiumPublishSettingsRetriever.swift index 13e696d5..a4be6c50 100644 --- a/tealium/core/publishsettings/TealiumPublishSettingsRetriever.swift +++ b/tealium/core/publishsettings/TealiumPublishSettingsRetriever.swift @@ -59,8 +59,8 @@ class TealiumPublishSettingsRetriever: TealiumPublishSettingsRetrieverProtocol, } static func getPublishSettings(from data: Data, etag: String?) -> RemotePublishSettings? { - guard let dataString = String(data: data, encoding: .utf8), - let startScript = dataString.range(of: "var mps = ") else { + let dataString = String(decoding: data, as: UTF8.self) + guard let startScript = dataString.range(of: "var mps = ") else { return nil } diff --git a/tealium/core/utils/network/TealiumNetworkUtils.swift b/tealium/core/utils/network/TealiumNetworkUtils.swift index 9979c955..801641f0 100644 --- a/tealium/core/utils/network/TealiumNetworkUtils.swift +++ b/tealium/core/utils/network/TealiumNetworkUtils.swift @@ -15,7 +15,7 @@ public extension Dictionary where Key == String, Value == Any { encoder.outputFormatting = writingOptions let encodable = self.encodable let jsonData = try encoder.encode(encodable) - return String(data: jsonData, encoding: .utf8) + return String(decoding: jsonData, as: UTF8.self) } } diff --git a/tealium/dispatchers/remotecommands/RemoteCommand.swift b/tealium/dispatchers/remotecommands/RemoteCommand.swift index 42a8f51e..a3b48f0c 100644 --- a/tealium/dispatchers/remotecommands/RemoteCommand.swift +++ b/tealium/dispatchers/remotecommands/RemoteCommand.swift @@ -84,11 +84,7 @@ open class RemoteCommand: RemoteCommandProtocol { } var responseStr: String if let responseData = response.data { - if let encodedResponse = String(data: responseData, encoding: .utf8) { - responseStr = encodedResponse - } else { - responseStr = "(null)" - } + responseStr = String(decoding: responseData, as: UTF8.self) } else { // keep previous behavior from obj-c library responseStr = "(null)"