diff --git a/Agent.xcodeproj/project.pbxproj b/Agent.xcodeproj/project.pbxproj index 652fe4b2..154439ea 100644 --- a/Agent.xcodeproj/project.pbxproj +++ b/Agent.xcodeproj/project.pbxproj @@ -6504,7 +6504,7 @@ "$(SRCROOT)/modular-crash-reporter-ios/Source/Tests/**", ); INFOPLIST_FILE = "Tests/Unit-Tests/Shared/tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -6553,7 +6553,7 @@ "$(SRCROOT)/modular-crash-reporter-ios/Source/Tests/**", ); INFOPLIST_FILE = "Tests/Unit-Tests/Shared/tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -6639,7 +6639,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MACH_O_TYPE = mh_dylib; MODULEMAP_FILE = module.modulemap; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; @@ -6712,7 +6712,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MACH_O_TYPE = mh_dylib; MODULEMAP_FILE = module.modulemap; MTL_ENABLE_DEBUG_INFO = NO; @@ -6767,7 +6767,7 @@ ); INFOPLIST_FILE = Agent/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -6824,7 +6824,7 @@ ); INFOPLIST_FILE = Agent/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -6876,7 +6876,7 @@ "$(SRCROOT)/modular-crash-reporter-ios/Source/Tests/**", ); INFOPLIST_FILE = "Tests/Unit-Tests/Shared/tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -6929,7 +6929,7 @@ "$(SRCROOT)/modular-crash-reporter-ios/Source/Tests/**", ); INFOPLIST_FILE = "Tests/Unit-Tests/Shared/tests-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -6975,7 +6975,7 @@ "${SRCROOT}/**", ); INFOPLIST_FILE = "Tests/Stress-Tests/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -7017,7 +7017,7 @@ "${SRCROOT}/**", ); INFOPLIST_FILE = "Tests/Stress-Tests/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Agent.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Agent.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..61b8c21f --- /dev/null +++ b/Agent.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,150 @@ +{ + "originHash" : "3f9307b0200d00557b078bb8bcbc32df1db2b415f8448a4231539c315bd6cfc6", + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "194a6706acbd25e4ef639bcaddea16e8758a3e27", + "version" : "1.2024011602.0" + } + }, + { + "identity" : "app-check", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/app-check.git", + "state" : { + "revision" : "3b62f154d00019ae29a71e9738800bb6f18b236d", + "version" : "10.19.2" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk.git", + "state" : { + "revision" : "eca84fd638116dd6adb633b5a3f31cc7befcbb7d", + "version" : "10.29.0" + } + }, + { + "identity" : "gcdwebserver", + "kind" : "remoteSourceControl", + "location" : "https://github.com/yene/GCDWebServer", + "state" : { + "revision" : "c2f837b30038ef716b77225f40cc8d104b6ff645", + "version" : "3.5.7" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "fe727587518729046fc1465625b9afd80b5ab361", + "version" : "10.28.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "a637d318ae7ae246b02d7305121275bc75ed5565", + "version" : "9.4.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "57a1d307f42df690fdef2637f3e5b776da02aad6", + "version" : "7.13.3" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "e9fad491d0673bdda7063a0341fb6b47a30c5359", + "version" : "1.62.2" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b", + "version" : "3.5.0" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1", + "version" : "1.22.5" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1", + "version" : "2.30910.0" + } + }, + { + "identity" : "newrelic-ios-agent", + "kind" : "remoteSourceControl", + "location" : "https://github.com/newrelic/newrelic-ios-agent.git", + "state" : { + "branch" : "main", + "revision" : "e07a355a3ad373652a05ed3bc056ef41381c773d" + } + }, + { + "identity" : "perfsuite-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/bookingcom/perfsuite-ios", + "state" : { + "revision" : "618ab87492cf2b69654056ed64d3f97bfcbe45ef", + "version" : "1.5.2" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac", + "version" : "2.4.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "c6fe6442e6a64250495669325044052e113e990c", + "version" : "1.32.0" + } + } + ], + "version" : 3 +} diff --git a/Agent/SessionReplay/SwiftUI/NRConditionalMaskView.swift b/Agent/SessionReplay/SwiftUI/NRConditionalMaskView.swift index 45847104..23e75b78 100644 --- a/Agent/SessionReplay/SwiftUI/NRConditionalMaskView.swift +++ b/Agent/SessionReplay/SwiftUI/NRConditionalMaskView.swift @@ -10,23 +10,22 @@ import SwiftUI @available(iOS 16, *) public struct NRConditionalMaskView: View { - private let maskApplicationText: Bool? - private let maskUserInputText: Bool? - private let maskAllImages: Bool? - private let maskAllUserTouches: Bool? + let maskApplicationText: Bool? + let maskUserInputText: Bool? + let maskAllImages: Bool? + let maskAllUserTouches: Bool? - private let sessionReplayIdentifier: String? + let sessionReplayIdentifier: String? - private let activated: Bool + let activated: Bool - private let content: () -> Content + let content: () -> Content public init(maskApplicationText: Bool? = nil, maskUserInputText: Bool? = nil, maskAllImages: Bool? = nil, maskAllUserTouches: Bool? = nil, sessionReplayIdentifier: String? = nil, - activated: Bool = true, @ViewBuilder content: @escaping () -> Content) { self.maskApplicationText = maskApplicationText diff --git a/Agent/SessionReplay/SwiftUI/SwiftUIViewAttributes.swift b/Agent/SessionReplay/SwiftUI/SwiftUIViewAttributes.swift index d53b9b69..2f1ac934 100644 --- a/Agent/SessionReplay/SwiftUI/SwiftUIViewAttributes.swift +++ b/Agent/SessionReplay/SwiftUI/SwiftUIViewAttributes.swift @@ -11,18 +11,18 @@ import CoreGraphics import UIKit // Swift -public struct SwiftUIViewAttributes: Equatable { +struct SwiftUIViewAttributes: Equatable { // Core geometry - public internal(set) var frame: CGRect - public internal(set) var clip: CGRect + internal(set) var frame: CGRect + internal(set) var clip: CGRect // Visual appearance - public internal(set) var backgroundColor: CGColor? - public internal(set) var layerBorderColor: CGColor? - public internal(set) var layerBorderWidth: CGFloat - public internal(set) var layerCornerRadius: CGFloat - public internal(set) var alpha: CGFloat + internal(set) var backgroundColor: CGColor? + internal(set) var layerBorderColor: CGColor? + internal(set) var layerBorderWidth: CGFloat + internal(set) var layerCornerRadius: CGFloat + internal(set) var alpha: CGFloat // Visibility & layout var isHidden: Bool diff --git a/LambdaTest/test-ios.js b/LambdaTest/test-ios.js new file mode 100644 index 00000000..afd0360e --- /dev/null +++ b/LambdaTest/test-ios.js @@ -0,0 +1,269 @@ +describe("main agent test app - ios", () => { + it("Opens app", async () => { + // wait for the app to load + await driver.setTimeouts(5000); + + const home = await $("id:Home"); + await home.waitForExist({ timeout: 30000 }); + await home.click(); + await driver.setTimeouts(5000); + }); + + // it("Opens the ToDo tab and adds todo", async () => { + // const todo = await $("accessibility id:TodoList"); + // await todo.waitForExist({ timeout: 3000 }); + // await todo.click(); + // await driver.setTimeouts(3000); + + // const openKeyboard = await $("accessibility id:text-input-flat"); + // await openKeyboard.waitForExist({ timeout: 3000 }); + // await openKeyboard.click(); + // await driver.setTimeouts(3000); + // const typeS = await $("accessibility id:S"); + // await typeS.click(); + // await driver.setTimeouts(3000); + // const typeD = await $("accessibility id:d"); + // await typeD.click(); + // await driver.setTimeouts(3000); + // const typeF = await $("accessibility id:f"); + // await typeF.click(); + // await driver.setTimeouts(3000); + // const typeG = await $("accessibility id:g"); + // await typeG.click(); + // await driver.setTimeouts(3000); + // const add = await $("accessibility id:Add"); + // await add.click(); + // await driver.setTimeouts(3000); + // const closeKeyboard2 = await $("accessibility id:Return"); + // await closeKeyboard2.click(); + // await driver.setTimeouts(3000); + // }); + + // it("Clicks around the Explore tab", async () => { + // const exploreTab = await $("accessibility id:Explore"); + // await exploreTab.waitForExist({ timeout: 30000 }); + // await exploreTab.click(); + // await driver.setTimeouts(5000); + + // const googlelink = await $( + // '-ios class chain:**/XCUIElementTypeStaticText[`name == "Google"`][2]' + // ); + // await googlelink.waitForExist({ timeout: 30000 }); + // await googlelink.click(); + // await driver.setTimeouts(5000); + + // const googleTopBar = await driver.$("accessibility id:TopBrowserBar"); + // await googleTopBar.waitForExist({ timeout: 30000 }); + // await googleTopBar.click(); + // await driver.setTimeouts(5000); + + // const closeGoogle = await driver.$( + // '-ios class chain:**/XCUIElementTypeButton[`name == "Done"`]' + // ); + // await closeGoogle.waitForExist({ timeout: 30000 }); + // await closeGoogle.click(); + // await driver.setTimeouts(5000); + + // const newrelicLink = await $( + // '-ios class chain:**/XCUIElementTypeStaticText[`name == "New Relic"`][2]' + // ); + // await newrelicLink.waitForExist({ timeout: 30000 }); + // await newrelicLink.click(); + // await driver.setTimeouts(5000); + + // const NRtopBar = await driver.$("accessibility id:TopBrowserBar"); + // await NRtopBar.waitForExist({ timeout: 30000 }); + // await NRtopBar.click(); + // await driver.setTimeouts(5000); + + // const closeNR = await $( + // '-ios class chain:**/XCUIElementTypeButton[`name == "Done"`]' + // ); + // await closeNR.waitForExist({ timeout: 30000 }); + // await closeNR.click(); + // await driver.setTimeouts(5000); + + // const expoLink = await $( + // '-ios class chain:**/XCUIElementTypeStaticText[`name == "Expo"`][2]' + // ); + // await expoLink.waitForExist({ timeout: 30000 }); + // await expoLink.click(); + // await driver.setTimeouts(5000); + + // const expoTopBar = await driver.$("accessibility id:TopBrowserBar"); + // await expoTopBar.waitForExist({ timeout: 30000 }); + // await expoTopBar.click(); + // await driver.setTimeouts(5000); + + // const closeExpo = await $( + // '-ios class chain:**/XCUIElementTypeButton[`name == "Done"`]' + // ); + // await closeExpo.waitForExist({ timeout: 30000 }); + // await closeExpo.click(); + // await driver.setTimeouts(5000); + + // const hexClick = await $("accessibility id:HandledException"); + // await hexClick.waitForExist({ timeout: 30000 }); + // await hexClick.click(); + // await driver.setTimeouts(5000); + + // const goodRequest = await $("accessibility id:Good Http Request"); + // await goodRequest.waitForExist({ timeout: 30000 }); + // await goodRequest.click(); + // await driver.setTimeouts(5000); + + // const dtRequest = await driver.$( + // "accessibility id:Distributed Tracing Request" + // ); + // await dtRequest.waitForExist({ timeout: 30000 }); + // await dtRequest.click(); + // await driver.setTimeouts(5000); + + // const reset = await driver.$("accessibility id:Reset"); + // await reset.waitForExist({ timeout: 30000 }); + // await reset.click(); + // await driver.setTimeouts(5000); + + // const badRequest = await $("accessibility id:Bad Http Request"); + // await badRequest.waitForExist({ timeout: 30000 }); + // await badRequest.click(); + // await driver.setTimeouts(5000); + + // const delayedRequest = await driver.$( + // "accessibility id:Delayed Http Request" + // ); + // await delayedRequest.waitForExist({ timeout: 30000 }); + // await delayedRequest.click(); + // await driver.setTimeouts(5000); + + // await badRequest.click(); + // await driver.setTimeouts(3000); + // await badRequest.click(); + // await driver.setTimeouts(3000); + // await badRequest.click(); + // await driver.setTimeouts(3000); + // await badRequest.click(); + // await driver.setTimeouts(3000); + // await badRequest.click(); + // await driver.setTimeouts(3000); + // await badRequest.click(); + // await driver.setTimeouts(3000); + // await badRequest.click(); + // await driver.setTimeouts(3000); + + // await delayedRequest.click(); + // await driver.setTimeouts(5000); + // await delayedRequest.click(); + // await driver.setTimeouts(5000); + // await hexClick.click(); + // await driver.setTimeouts(5000); + + // await driver.executeScript("mobile:pressButton", [{ name: "home" }]); + // await driver.setTimeouts(5000); + // await driver.execute("mobile: launchApp", { + // bundleId: "com.newrelic.mainagenttestapp", + // }); + // await driver.setTimeouts(5000); + + // await goodRequest.click(); + // await driver.setTimeouts(3000); + // await goodRequest.click(); + // await driver.setTimeouts(3000); + // await goodRequest.click(); + // await driver.setTimeouts(3000); + // await goodRequest.click(); + // await driver.setTimeouts(3000); + // await goodRequest.click(); + // await driver.setTimeouts(3000); + // await goodRequest.click(); + // await driver.setTimeouts(3000); + // await hexClick.click(); + // await driver.setTimeouts(5000); + + // await delayedRequest.click(); + // await driver.setTimeouts(5000); + // await delayedRequest.click(); + // await driver.setTimeouts(5000); + + // await driver.executeScript("mobile:pressButton", [{ name: "home" }]); + // await driver.setTimeouts(5000); + // await driver.execute("mobile: launchApp", { + // bundleId: "com.newrelic.mainagenttestapp", + // }); + // await driver.setTimeouts(5000); + + // await dtRequest.click(); + // await driver.setTimeouts(3000); + // await dtRequest.click(); + // await driver.setTimeouts(3000); + // await dtRequest.click(); + // await driver.setTimeouts(3000); + // await dtRequest.click(); + // await driver.setTimeouts(3000); + // await dtRequest.click(); + // await driver.setTimeouts(3000); + // await dtRequest.click(); + + // await driver.executeScript("mobile:pressButton", [{ name: "home" }]); + // await driver.setTimeouts(5000); + // await driver.execute("mobile: launchApp", { + // bundleId: "com.newrelic.mainagenttestapp", + // }); + // await driver.setTimeouts(5000); + // }); + + // it("Clicks around the Crash tab", async () => { + // const crashTab = await $("accessibility id:Crash"); + // await crashTab.waitForExist({ timeout: 30000 }); + // await crashTab.click(); + // await driver.setTimeouts(5000); + + // const uriError = await $("accessibility id:URI Error"); + // await uriError.waitForExist({ timeout: 30000 }); + // await uriError.click(); + // await driver.setTimeouts(5000); + + // await driver.execute("mobile: launchApp", { + // bundleId: "com.newrelic.mainagenttestapp", + // }); + // await driver.setTimeouts(5000); + + // await crashTab.waitForExist({ timeout: 30000 }); + // await crashTab.click(); + // await driver.setTimeouts(3000); + + // const typeError = await $("accessibility id:Type Error"); + // await typeError.waitForExist({ timeout: 30000 }); + // await typeError.click(); + // await driver.setTimeouts(5000); + + // await driver.execute("mobile: launchApp", { + // bundleId: "com.newrelic.mainagenttestapp", + // }); + // await driver.setTimeouts(5000); + + // await crashTab.waitForExist({ timeout: 30000 }); + // await crashTab.click(); + // await driver.setTimeouts(3000); + + // const evalError = await $("accessibility id:Eval Error"); + // await evalError.waitForExist({ timeout: 30000 }); + // await evalError.click(); + // await driver.setTimeouts(5000); + + // await driver.execute("mobile: launchApp", { + // bundleId: "com.newrelic.mainagenttestapp", + // }); + // await driver.setTimeouts(5000); + // }); + + it("Opens app", async () => { + // wait for the app to load + await driver.setTimeouts(5000); + + const home = await $("id:Home"); + await home.waitForExist({ timeout: 30000 }); + await home.click(); + await driver.setTimeouts(3000); + }); +}); diff --git a/Test Harness/NRTestApp/NRTestApp.xcodeproj/project.pbxproj b/Test Harness/NRTestApp/NRTestApp.xcodeproj/project.pbxproj index 4baeebe3..19a83900 100644 --- a/Test Harness/NRTestApp/NRTestApp.xcodeproj/project.pbxproj +++ b/Test Harness/NRTestApp/NRTestApp.xcodeproj/project.pbxproj @@ -7,8 +7,94 @@ objects = { /* Begin PBXBuildFile section */ + 2B00011C2E34083400543C1B /* triggerException.m in Sources */ = {isa = PBXBuildFile; fileRef = F864284B2971DFA5002ABA01 /* triggerException.m */; }; + 2B00011D2E34083400543C1B /* UtilViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86428472971C661002ABA01 /* UtilViewModel.swift */; }; + 2B00011E2E34083400543C1B /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302AFC296F5EFA003EC291 /* ViewController.swift */; }; + 2B00011F2E34083400543C1B /* ApodService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B9029707BCC003EC291 /* ApodService.swift */; }; + 2B0001202E34083400543C1B /* MainCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B8A297076F9003EC291 /* MainCoordinator.swift */; }; + 2B0001212E34083400543C1B /* ViewControllerProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B8529707695003EC291 /* ViewControllerProvider.swift */; }; + 2B0001222E34083400543C1B /* ApodResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B9329708027003EC291 /* ApodResult.swift */; }; + 2B0001232E34083400543C1B /* Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B88297076E9003EC291 /* Coordinator.swift */; }; + 2B0001242E34083400543C1B /* plistHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = F864286229775023002ABA01 /* plistHelper.swift */; }; + 2B0001252E34083400543C1B /* UIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B982970ADC1003EC291 /* UIImageView.swift */; }; + 2B0001262E34083400543C1B /* Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B9A2970B29D003EC291 /* Date.swift */; }; + 2B0001272E34083400543C1B /* InfiniteScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F81062172E1724FF00B8CC81 /* InfiniteScrollViewController.swift */; }; + 2B0001282E34083400543C1B /* ApodURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B9C2970B3E0003EC291 /* ApodURL.swift */; }; + 2B0001292E34083400543C1B /* UtilitiesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86428402971BD5B002ABA01 /* UtilitiesViewController.swift */; }; + 2B00012A2E34083400543C1B /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F864284E2971E254002ABA01 /* WebViewController.swift */; }; + 2B00012B2E34083400543C1B /* SecureLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F84EEFAD2E21B18B000E2A5A /* SecureLabel.swift */; }; + 2B00012C2E34083400543C1B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302AF8296F5EFA003EC291 /* AppDelegate.swift */; }; + 2B00012D2E34083400543C1B /* AppDelegate+UITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF1FA3B2AE32C9500E9019C /* AppDelegate+UITest.swift */; }; + 2B00012E2E34083400543C1B /* ApodViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B8D297078EA003EC291 /* ApodViewModel.swift */; }; + 2B00012F2E34083400543C1B /* ScrollableCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F81061F72E16C13F00B8CC81 /* ScrollableCollectionViewController.swift */; }; + 2B0001302E34083400543C1B /* TextMaskingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6649002DEA283000923E4D /* TextMaskingViewModel.swift */; }; + 2B0001312E34083400543C1B /* ImageDetailPDFView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F824A43329AEADC2000886A6 /* ImageDetailPDFView.swift */; }; + 2B0001322E34083400543C1B /* TextMaskingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B69E45D2DE8F9EB00543A2E /* TextMaskingViewController.swift */; }; + 2B0001332E34083400543C1B /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302AFA296F5EFA003EC291 /* SceneDelegate.swift */; }; + 2B0001342E34083400543C1B /* ImageFullScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = F824A43B29AEAE2D000886A6 /* ImageFullScreen.swift */; }; + 2B0001352E34083400543C1B /* Variable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B95297093FF003EC291 /* Variable.swift */; }; + 2B00013A2E34083400543C1B /* NRAPI-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F824A54C29BBB23D000886A6 /* NRAPI-Info.plist */; }; + 2B00013B2E34083400543C1B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F8302B03296F5EFB003EC291 /* LaunchScreen.storyboard */; }; + 2B00013C2E34083400543C1B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F8302B01296F5EFB003EC291 /* Assets.xcassets */; }; + 2B00014E2E34089500543C1B /* NewRelic in Frameworks */ = {isa = PBXBuildFile; productRef = 2B00014D2E34089500543C1B /* NewRelic */; }; + 2B03F6592E452CCA00DBA375 /* PerformanceSuite in Frameworks */ = {isa = PBXBuildFile; productRef = 2B03F6582E452CCA00DBA375 /* PerformanceSuite */; }; + 2B03F65F2E45335100DBA375 /* MetricsConsumer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F65E2E45335100DBA375 /* MetricsConsumer.swift */; }; + 2B03F6602E45335100DBA375 /* MetricsConsumer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F65E2E45335100DBA375 /* MetricsConsumer.swift */; }; + 2B03F6612E45335100DBA375 /* MetricsConsumer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F65E2E45335100DBA375 /* MetricsConsumer.swift */; }; + 2B03F6632E45338300DBA375 /* UITestsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F6622E45338300DBA375 /* UITestsHelper.swift */; }; + 2B03F6642E45338300DBA375 /* UITestsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F6622E45338300DBA375 /* UITestsHelper.swift */; }; + 2B03F6652E45338300DBA375 /* UITestsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F6622E45338300DBA375 /* UITestsHelper.swift */; }; + 2B03F6692E45338B00DBA375 /* UITestsInterop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F6662E45338B00DBA375 /* UITestsInterop.swift */; }; + 2B03F66C2E45350900DBA375 /* GCDWebServer in Frameworks */ = {isa = PBXBuildFile; productRef = 2B03F66B2E45350900DBA375 /* GCDWebServer */; }; + 2B03F66E2E45352500DBA375 /* PerformanceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F66D2E45352500DBA375 /* PerformanceScreen.swift */; }; + 2B03F66F2E45352500DBA375 /* PerformanceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F66D2E45352500DBA375 /* PerformanceScreen.swift */; }; + 2B03F6702E45352500DBA375 /* PerformanceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B03F66D2E45352500DBA375 /* PerformanceScreen.swift */; }; 2B2B3FB92AEB166E00C24897 /* harvestCollector.json in Resources */ = {isa = PBXBuildFile; fileRef = 2B2B3FB32AEB166E00C24897 /* harvestCollector.json */; }; 2B3493712E8EF15C006DE9D0 /* MaskingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3493692E8EF15A006DE9D0 /* MaskingView.swift */; }; + 2B358B5B2E9DD1B200DFB02F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C7E2E860C7D001D2B88 /* ContentView.swift */; }; + 2B358B632E9DD27100DFB02F /* SlidersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C872E860C7D001D2B88 /* SlidersView.swift */; }; + 2B358B642E9DD27100DFB02F /* ScrollViewsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C842E860C7D001D2B88 /* ScrollViewsView.swift */; }; + 2B358B652E9DD27100DFB02F /* TextFieldsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C8A2E860C7D001D2B88 /* TextFieldsView.swift */; }; + 2B358B662E9DD27100DFB02F /* PickersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C822E860C7D001D2B88 /* PickersView.swift */; }; + 2B358B672E9DD27100DFB02F /* ProgressViewsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C832E860C7D001D2B88 /* ProgressViewsView.swift */; }; + 2B358B682E9DD27100DFB02F /* SegmentedControlsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C852E860C7D001D2B88 /* SegmentedControlsView.swift */; }; + 2B358B692E9DD27100DFB02F /* MaskingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3493692E8EF15A006DE9D0 /* MaskingView.swift */; }; + 2B358B6A2E9DD27100DFB02F /* StacksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C882E860C7D001D2B88 /* StacksView.swift */; }; + 2B358B6B2E9DD27100DFB02F /* GridsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C802E860C7D001D2B88 /* GridsView.swift */; }; + 2B358B6C2E9DD27100DFB02F /* ListsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C812E860C7D001D2B88 /* ListsView.swift */; }; + 2B358B6D2E9DD27100DFB02F /* SteppersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C892E860C7D001D2B88 /* SteppersView.swift */; }; + 2B358B6E2E9DD27100DFB02F /* ShapesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C862E860C7D001D2B88 /* ShapesView.swift */; }; + 2B358B6F2E9DD27100DFB02F /* TogglesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C8B2E860C7D001D2B88 /* TogglesView.swift */; }; + 2B358B702E9DD27100DFB02F /* DatePickersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C7F2E860C7D001D2B88 /* DatePickersView.swift */; }; + 2B358B712E9DD27100DFB02F /* ButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C7D2E860C7D001D2B88 /* ButtonsView.swift */; }; + 2B358B722E9DD28A00DFB02F /* InfiniteImageCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F832CB0C2E5CDBC5007569CE /* InfiniteImageCollectionViewController.swift */; }; + 2B459FDF2E9EF52500CB66F3 /* NRTestAppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8302B0F296F5EFB003EC291 /* NRTestAppTests.swift */; }; + 2B459FE02E9EF52500CB66F3 /* NRTestAppFakeNavigationAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = F825FB0329CA509100E1C1DC /* NRTestAppFakeNavigationAction.swift */; }; + 2B459FE12E9EF52500CB66F3 /* NRTestAppNavigationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8C8812829845B8C001C15B9 /* NRTestAppNavigationTests.swift */; }; + 2B459FF52E9EF52F00CB66F3 /* Socket+File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DAB2ADF2DF600C0C972 /* Socket+File.swift */; }; + 2B459FF62E9EF52F00CB66F3 /* HttpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA82ADF2DF600C0C972 /* HttpResponse.swift */; }; + 2B459FF72E9EF52F00CB66F3 /* String+Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DAD2ADF2DF600C0C972 /* String+Misc.swift */; }; + 2B459FF82E9EF52F00CB66F3 /* String+BASE64.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DAC2ADF2DF600C0C972 /* String+BASE64.swift */; }; + 2B459FF92E9EF52F00CB66F3 /* HTTPParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DAF2ADF2DF600C0C972 /* HTTPParser.swift */; }; + 2B459FFA2E9EF52F00CB66F3 /* String+SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA42ADF2DF600C0C972 /* String+SHA1.swift */; }; + 2B459FFB2E9EF52F00CB66F3 /* Errno.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DAA2ADF2DF600C0C972 /* Errno.swift */; }; + 2B459FFC2E9EF52F00CB66F3 /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA72ADF2DF600C0C972 /* HttpRequest.swift */; }; + 2B459FFD2E9EF52F00CB66F3 /* HttpRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DAE2ADF2DF600C0C972 /* HttpRouter.swift */; }; + 2B459FFE2E9EF52F00CB66F3 /* Files.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA62ADF2DF600C0C972 /* Files.swift */; }; + 2B459FFF2E9EF52F00CB66F3 /* WebSockets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA02ADF2DF600C0C972 /* WebSockets.swift */; }; + 2B45A0002E9EF52F00CB66F3 /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DB12ADF2DF600C0C972 /* Socket.swift */; }; + 2B45A0012E9EF52F00CB66F3 /* Socket+Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA32ADF2DF600C0C972 /* Socket+Server.swift */; }; + 2B45A0022E9EF52F00CB66F3 /* Scopes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05D9F2ADF2DF600C0C972 /* Scopes.swift */; }; + 2B45A0032E9EF52F00CB66F3 /* String+File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA52ADF2DF600C0C972 /* String+File.swift */; }; + 2B45A0042E9EF52F00CB66F3 /* MimeTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DB02ADF2DF600C0C972 /* MimeTypes.swift */; }; + 2B45A0052E9EF52F00CB66F3 /* HttpServerIO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA12ADF2DF600C0C972 /* HttpServerIO.swift */; }; + 2B45A0062E9EF52F00CB66F3 /* HttpServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA92ADF2DF600C0C972 /* HttpServer.swift */; }; + 2B45A0072E9EF52F00CB66F3 /* NRTestAppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DD32ADF323A00C0C972 /* NRTestAppUITests.swift */; }; + 2B45A0082E9EF52F00CB66F3 /* HTTPDynamicStubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DCB2ADF2F4000C0C972 /* HTTPDynamicStubs.swift */; }; + 2B45A0092E9EF52F00CB66F3 /* Process.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA22ADF2DF600C0C972 /* Process.swift */; }; + 2B45A00C2E9EF52F00CB66F3 /* harvestConnector.json in Resources */ = {isa = PBXBuildFile; fileRef = 2BD05DF12ADF32D300C0C972 /* harvestConnector.json */; }; + 2B45A00D2E9EF52F00CB66F3 /* harvestConnectorWithLogReporting.json in Resources */ = {isa = PBXBuildFile; fileRef = 2BEDE16A2B180A0700BEF5B6 /* harvestConnectorWithLogReporting.json */; }; + 2B45A00E2E9EF52F00CB66F3 /* harvestCollector.json in Resources */ = {isa = PBXBuildFile; fileRef = 2B2B3FB32AEB166E00C24897 /* harvestCollector.json */; }; 2B6649012DEA283000923E4D /* TextMaskingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6649002DEA283000923E4D /* TextMaskingViewModel.swift */; }; 2B6649022DEA283000923E4D /* TextMaskingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6649002DEA283000923E4D /* TextMaskingViewModel.swift */; }; 2B6649032DEA283000923E4D /* TextMaskingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6649002DEA283000923E4D /* TextMaskingViewModel.swift */; }; @@ -17,6 +103,7 @@ 2B69E4602DE8F9EB00543A2E /* TextMaskingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B69E45D2DE8F9EB00543A2E /* TextMaskingViewController.swift */; }; 2B8208C02E5D0F2A0063E9BD /* SwiftUIViewRepresentableTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8208B82E5D0F100063E9BD /* SwiftUIViewRepresentableTestView.swift */; }; 2B8208C12E5D0F2A0063E9BD /* SwiftUIViewRepresentableTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8208B82E5D0F100063E9BD /* SwiftUIViewRepresentableTestView.swift */; }; + 2B8A46A02E4A880600DEB854 /* DiffTestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8E278412E3BEACD00D6F04C /* DiffTestViewController.swift */; }; 2BAE5C8E2E860C7D001D2B88 /* StacksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C882E860C7D001D2B88 /* StacksView.swift */; }; 2BAE5C8F2E860C7D001D2B88 /* ProgressViewsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C832E860C7D001D2B88 /* ProgressViewsView.swift */; }; 2BAE5C902E860C7D001D2B88 /* ShapesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C862E860C7D001D2B88 /* ShapesView.swift */; }; @@ -32,6 +119,9 @@ 2BAE5C9A2E860C7D001D2B88 /* ScrollViewsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C842E860C7D001D2B88 /* ScrollViewsView.swift */; }; 2BAE5C9B2E860C7D001D2B88 /* SlidersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C872E860C7D001D2B88 /* SlidersView.swift */; }; 2BAE5C9C2E860C7D001D2B88 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BAE5C7E2E860C7D001D2B88 /* ContentView.swift */; }; + 2BB1E1EB2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BB1E1EA2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift */; }; + 2BB1E1EC2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BB1E1EA2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift */; }; + 2BB1E1ED2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BB1E1EA2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift */; }; 2BD05DD42ADF323A00C0C972 /* NRTestAppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DD32ADF323A00C0C972 /* NRTestAppUITests.swift */; }; 2BD05DDC2ADF324D00C0C972 /* HTTPDynamicStubs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DCB2ADF2F4000C0C972 /* HTTPDynamicStubs.swift */; }; 2BD05DDD2ADF326A00C0C972 /* String+File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA52ADF2DF600C0C972 /* String+File.swift */; }; @@ -54,10 +144,12 @@ 2BD05DEE2ADF326A00C0C972 /* MimeTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DB02ADF2DF600C0C972 /* MimeTypes.swift */; }; 2BD05DEF2ADF326A00C0C972 /* Process.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD05DA22ADF2DF600C0C972 /* Process.swift */; }; 2BD05DF22ADF32D300C0C972 /* harvestConnector.json in Resources */ = {isa = PBXBuildFile; fileRef = 2BD05DF12ADF32D300C0C972 /* harvestConnector.json */; }; + 2BE225182E60EE3300B300C8 /* SwiftUIViewRepresentableTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8208B82E5D0F100063E9BD /* SwiftUIViewRepresentableTestView.swift */; }; 2BE9D6C12A1E90E400A09A98 /* NewRelic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8302B6229705766003EC291 /* NewRelic.framework */; }; 2BE9D6C22A1E90E400A09A98 /* NewRelic.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F8302B6229705766003EC291 /* NewRelic.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 2BE9D6C42A1E913700A09A98 /* NewRelic.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8302B6229705766003EC291 /* NewRelic.framework */; }; 2BEDE1702B180A0700BEF5B6 /* harvestConnectorWithLogReporting.json in Resources */ = {isa = PBXBuildFile; fileRef = 2BEDE16A2B180A0700BEF5B6 /* harvestConnectorWithLogReporting.json */; }; + 2BEE33442EC3D364007F2B75 /* SimpleScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8672A552EAA69820055FA51 /* SimpleScrollView.swift */; }; + 2BEE33492EC3D384007F2B75 /* InfiniteImageCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8ACFA282EA019BF00E6692B /* InfiniteImageCollectionView.swift */; }; 2BF1FA3C2AE32C9500E9019C /* AppDelegate+UITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BF1FA3B2AE32C9500E9019C /* AppDelegate+UITest.swift */; }; F802EE962BE0218600AB956F /* NRTestApp__watchOS_App.swift in Sources */ = {isa = PBXBuildFile; fileRef = F802EE952BE0218600AB956F /* NRTestApp__watchOS_App.swift */; }; F802EE982BE0218600AB956F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F802EE972BE0218600AB956F /* ContentView.swift */; }; @@ -167,6 +259,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 2B459FDD2E9EF52500CB66F3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F8302AED296F5EFA003EC291 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2B00011A2E34083400543C1B; + remoteInfo = NRTestAppAsFramework; + }; + 2B459FF32E9EF52F00CB66F3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F8302AED296F5EFA003EC291 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2B00011A2E34083400543C1B; + remoteInfo = NRTestAppAsFramework; + }; 2B6588122EA9957600A5AC8C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = F8302B5229705766003EC291 /* Agent.xcodeproj */; @@ -195,6 +301,20 @@ remoteGlobalIDString = 3431DD172BED375E00FF145F; remoteInfo = "Agent-watchos-Tests"; }; + 2BB91D3C2E9EC56700E1624C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F8302AED296F5EFA003EC291 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2B00011A2E34083400543C1B; + remoteInfo = NRTestAppAsFramework; + }; + 2BB91D452E9EC6CB00E1624C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F8302AED296F5EFA003EC291 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2B00011A2E34083400543C1B; + remoteInfo = NRTestAppAsFramework; + }; 2BD05DD72ADF323A00C0C972 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = F8302AED296F5EFA003EC291 /* Project object */; @@ -304,9 +424,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 2B0001432E34083400543C1B /* NRTestAppAsFramework.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NRTestAppAsFramework.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2B03F65E2E45335100DBA375 /* MetricsConsumer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetricsConsumer.swift; sourceTree = ""; }; + 2B03F6622E45338300DBA375 /* UITestsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestsHelper.swift; sourceTree = ""; }; + 2B03F6662E45338B00DBA375 /* UITestsInterop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestsInterop.swift; sourceTree = ""; }; + 2B03F66D2E45352500DBA375 /* PerformanceScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PerformanceScreen.swift; sourceTree = ""; }; 2B2317DE2ADF442100D521E1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 2B2B3FB32AEB166E00C24897 /* harvestCollector.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = harvestCollector.json; sourceTree = ""; }; 2B3493692E8EF15A006DE9D0 /* MaskingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaskingView.swift; sourceTree = ""; }; + 2B459FE72E9EF52500CB66F3 /* NRTestAppAsFrameworkTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NRTestAppAsFrameworkTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2B45A0122E9EF52F00CB66F3 /* NRTestAppAsFrameworkUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NRTestAppAsFrameworkUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2B45A0132E9EF52F00CB66F3 /* NRTestAppAsFrameworkUITests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "NRTestAppAsFrameworkUITests-Info.plist"; path = "/Users/cdillard/Documents/Workspace/newrelic-ios-agent-copy/newrelic-ios-agent/Test Harness/NRTestApp/NRTestAppAsFrameworkUITests-Info.plist"; sourceTree = ""; }; + 2B45A0142E9EF6EA00CB66F3 /* NRTestAppAsFramework.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = NRTestAppAsFramework.xctestplan; sourceTree = SOURCE_ROOT; }; 2B6649002DEA283000923E4D /* TextMaskingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextMaskingViewModel.swift; sourceTree = ""; }; 2B69E45D2DE8F9EB00543A2E /* TextMaskingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextMaskingViewController.swift; sourceTree = ""; }; 2B708A982ADF3AD80063110E /* NewRelic+Replace.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NewRelic+Replace.h"; sourceTree = ""; }; @@ -327,6 +456,7 @@ 2BAE5C892E860C7D001D2B88 /* SteppersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SteppersView.swift; sourceTree = ""; }; 2BAE5C8A2E860C7D001D2B88 /* TextFieldsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldsView.swift; sourceTree = ""; }; 2BAE5C8B2E860C7D001D2B88 /* TogglesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TogglesView.swift; sourceTree = ""; }; + 2BB1E1EA2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedStringTextMaskingViewController.swift; sourceTree = ""; }; 2BD05D9F2ADF2DF600C0C972 /* Scopes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Scopes.swift; sourceTree = ""; }; 2BD05DA02ADF2DF600C0C972 /* WebSockets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebSockets.swift; sourceTree = ""; }; 2BD05DA12ADF2DF600C0C972 /* HttpServerIO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpServerIO.swift; sourceTree = ""; }; @@ -411,6 +541,30 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 2B0001362E34083400543C1B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B00014E2E34089500543C1B /* NewRelic in Frameworks */, + 2B03F6592E452CCA00DBA375 /* PerformanceSuite in Frameworks */, + 2B03F66C2E45350900DBA375 /* GCDWebServer in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2B459FE22E9EF52500CB66F3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2B45A00A2E9EF52F00CB66F3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 2BD05DCE2ADF323A00C0C972 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -431,7 +585,6 @@ buildActionMask = 2147483647; files = ( 2BE9D6C12A1E90E400A09A98 /* NewRelic.framework in Frameworks */, - 2BE9D6C42A1E913700A09A98 /* NewRelic.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -521,6 +674,7 @@ 2BD05DD22ADF323A00C0C972 /* NRTestAppUITests */ = { isa = PBXGroup; children = ( + 2B45A0142E9EF6EA00CB66F3 /* NRTestAppAsFramework.xctestplan */, 2B2317DE2ADF442100D521E1 /* Info.plist */, 2BD05DD32ADF323A00C0C972 /* NRTestAppUITests.swift */, 2BD05DCB2ADF2F4000C0C972 /* HTTPDynamicStubs.swift */, @@ -573,6 +727,7 @@ F8F5D8212BEBB7C800CDC139 /* NRTestApp (watchOS) AppTests */, F8302AF6296F5EFA003EC291 /* Products */, F8302B8129705B28003EC291 /* Frameworks */, + 2B45A0132E9EF52F00CB66F3 /* NRTestAppAsFrameworkUITests-Info.plist */, ); sourceTree = ""; }; @@ -586,6 +741,9 @@ 2BD05DD12ADF323A00C0C972 /* NRTestAppUITests.xctest */, F802EE902BE0218600AB956F /* NRTestApp (watchOS) Watch App.app */, F8F5D8202BEBB7C800CDC139 /* NRTestApp (watchOS) AppTests.xctest */, + 2B0001432E34083400543C1B /* NRTestAppAsFramework.app */, + 2B459FE72E9EF52500CB66F3 /* NRTestAppAsFrameworkTests.xctest */, + 2B45A0122E9EF52F00CB66F3 /* NRTestAppAsFrameworkUITests.xctest */, ); name = Products; sourceTree = ""; @@ -594,6 +752,10 @@ isa = PBXGroup; children = ( 2BAE5C8D2E860C7D001D2B88 /* SwiftUI */, + 2B03F66D2E45352500DBA375 /* PerformanceScreen.swift */, + 2B03F6662E45338B00DBA375 /* UITestsInterop.swift */, + 2B03F6622E45338300DBA375 /* UITestsHelper.swift */, + 2B03F65E2E45335100DBA375 /* MetricsConsumer.swift */, 2B808EBE29FC4EA500E04658 /* NRTestApp.entitlements */, F86428492971DF80002ABA01 /* Helpers */, F8302AF8296F5EFA003EC291 /* AppDelegate.swift */, @@ -656,6 +818,7 @@ isa = PBXGroup; children = ( 2B8208B82E5D0F100063E9BD /* SwiftUIViewRepresentableTestView.swift */, + 2BB1E1EA2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift */, 2B69E45D2DE8F9EB00543A2E /* TextMaskingViewController.swift */, F824A43B29AEAE2D000886A6 /* ImageFullScreen.swift */, F8302AFC296F5EFA003EC291 /* ViewController.swift */, @@ -754,6 +917,60 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 2B00011A2E34083400543C1B /* NRTestAppAsFramework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2B0001402E34083400543C1B /* Build configuration list for PBXNativeTarget "NRTestAppAsFramework" */; + buildPhases = ( + 2B00011B2E34083400543C1B /* Sources */, + 2B0001362E34083400543C1B /* Frameworks */, + 2B0001392E34083400543C1B /* Resources */, + 2B00013D2E34083400543C1B /* Run New Relic dSYM Upload Tool */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = NRTestAppAsFramework; + productName = NRTestApp; + productReference = 2B0001432E34083400543C1B /* NRTestAppAsFramework.app */; + productType = "com.apple.product-type.application"; + }; + 2B459FD92E9EF52500CB66F3 /* NRTestAppAsFrameworkTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2B459FE42E9EF52500CB66F3 /* Build configuration list for PBXNativeTarget "NRTestAppAsFrameworkTests" */; + buildPhases = ( + 2B459FDE2E9EF52500CB66F3 /* Sources */, + 2B459FE22E9EF52500CB66F3 /* Frameworks */, + 2B459FE32E9EF52500CB66F3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2B459FDC2E9EF52500CB66F3 /* PBXTargetDependency */, + ); + name = NRTestAppAsFrameworkTests; + productName = NRTestAppTests; + productReference = 2B459FE72E9EF52500CB66F3 /* NRTestAppAsFrameworkTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 2B459FEF2E9EF52F00CB66F3 /* NRTestAppAsFrameworkUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2B45A00F2E9EF52F00CB66F3 /* Build configuration list for PBXNativeTarget "NRTestAppAsFrameworkUITests" */; + buildPhases = ( + 2B459FF42E9EF52F00CB66F3 /* Sources */, + 2B45A00A2E9EF52F00CB66F3 /* Frameworks */, + 2B45A00B2E9EF52F00CB66F3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2B459FF22E9EF52F00CB66F3 /* PBXTargetDependency */, + ); + name = NRTestAppAsFrameworkUITests; + productName = NRTestAppUITests; + productReference = 2B45A0122E9EF52F00CB66F3 /* NRTestAppAsFrameworkUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; 2BD05DD02ADF323A00C0C972 /* NRTestAppUITests */ = { isa = PBXNativeTarget; buildConfigurationList = 2BD05DD92ADF323A00C0C972 /* Build configuration list for PBXNativeTarget "NRTestAppUITests" */; @@ -766,6 +983,7 @@ ); dependencies = ( 2BD05DD82ADF323A00C0C972 /* PBXTargetDependency */, + 2BB91D462E9EC6CB00E1624C /* PBXTargetDependency */, ); name = NRTestAppUITests; productName = NRTestAppUITests; @@ -824,6 +1042,7 @@ ); dependencies = ( F8302B0D296F5EFB003EC291 /* PBXTargetDependency */, + 2BB91D3D2E9EC56700E1624C /* PBXTargetDependency */, ); name = NRTestAppTests; productName = NRTestAppTests; @@ -896,6 +1115,12 @@ LastSwiftUpdateCheck = 1530; LastUpgradeCheck = 1420; TargetAttributes = { + 2B459FD92E9EF52500CB66F3 = { + TestTargetID = 2B00011A2E34083400543C1B; + }; + 2B459FEF2E9EF52F00CB66F3 = { + TestTargetID = 2B00011A2E34083400543C1B; + }; 2BD05DD02ADF323A00C0C972 = { CreatedOnToolsVersion = 15.0; TestTargetID = F8302AF4296F5EFA003EC291; @@ -933,6 +1158,11 @@ Base, ); mainGroup = F8302AEC296F5EFA003EC291; + packageReferences = ( + 2B03F6572E452CCA00DBA375 /* XCRemoteSwiftPackageReference "perfsuite-ios" */, + 2B03F66A2E45350900DBA375 /* XCRemoteSwiftPackageReference "GCDWebServer" */, + 2B2271692E9EEBD20091D931 /* XCRemoteSwiftPackageReference "newrelic-ios-agent" */, + ); productRefGroup = F8302AF6296F5EFA003EC291 /* Products */; projectDirPath = ""; projectReferences = ( @@ -950,6 +1180,9 @@ F848CDE02AA270E80082052F /* NRTestApp(tvOS)Tests */, 2BD05DD02ADF323A00C0C972 /* NRTestAppUITests */, F8F5D81F2BEBB7C800CDC139 /* NRTestApp (watchOS) AppTests */, + 2B00011A2E34083400543C1B /* NRTestAppAsFramework */, + 2B459FD92E9EF52500CB66F3 /* NRTestAppAsFrameworkTests */, + 2B459FEF2E9EF52F00CB66F3 /* NRTestAppAsFrameworkUITests */, ); }; /* End PBXProject section */ @@ -1007,6 +1240,33 @@ /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ + 2B0001392E34083400543C1B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B00013A2E34083400543C1B /* NRAPI-Info.plist in Resources */, + 2B00013B2E34083400543C1B /* LaunchScreen.storyboard in Resources */, + 2B00013C2E34083400543C1B /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2B459FE32E9EF52500CB66F3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2B45A00B2E9EF52F00CB66F3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B45A00C2E9EF52F00CB66F3 /* harvestConnector.json in Resources */, + 2B45A00D2E9EF52F00CB66F3 /* harvestConnectorWithLogReporting.json in Resources */, + 2B45A00E2E9EF52F00CB66F3 /* harvestCollector.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 2BD05DCF2ADF323A00C0C972 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1074,6 +1334,25 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 2B00013D2E34083400543C1B /* Run New Relic dSYM Upload Tool */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Run New Relic dSYM Upload Tool"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "SCRIPT=`/usr/bin/find \"${SRCROOT}/../..\" -name run-symbol-tool | head -n 1`\n/bin/sh \"${SCRIPT}\" \"APP_TOKEN\"\n\n"; + }; 2BC833E52C46CF3900B73F01 /* Run New Relic dSYM upload run-symbol-tool */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -1134,6 +1413,103 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 2B00011B2E34083400543C1B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B00011C2E34083400543C1B /* triggerException.m in Sources */, + 2B00011D2E34083400543C1B /* UtilViewModel.swift in Sources */, + 2B00011E2E34083400543C1B /* ViewController.swift in Sources */, + 2B03F6652E45338300DBA375 /* UITestsHelper.swift in Sources */, + 2BB1E1EB2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift in Sources */, + 2B00011F2E34083400543C1B /* ApodService.swift in Sources */, + 2B0001202E34083400543C1B /* MainCoordinator.swift in Sources */, + 2B0001212E34083400543C1B /* ViewControllerProvider.swift in Sources */, + 2B03F66F2E45352500DBA375 /* PerformanceScreen.swift in Sources */, + 2B03F6602E45335100DBA375 /* MetricsConsumer.swift in Sources */, + 2B0001222E34083400543C1B /* ApodResult.swift in Sources */, + 2B0001232E34083400543C1B /* Coordinator.swift in Sources */, + 2BE225182E60EE3300B300C8 /* SwiftUIViewRepresentableTestView.swift in Sources */, + 2B0001242E34083400543C1B /* plistHelper.swift in Sources */, + 2B0001252E34083400543C1B /* UIImageView.swift in Sources */, + 2B0001262E34083400543C1B /* Date.swift in Sources */, + 2B8A46A02E4A880600DEB854 /* DiffTestViewController.swift in Sources */, + 2B0001272E34083400543C1B /* InfiniteScrollViewController.swift in Sources */, + 2B0001282E34083400543C1B /* ApodURL.swift in Sources */, + 2B0001292E34083400543C1B /* UtilitiesViewController.swift in Sources */, + 2B00012A2E34083400543C1B /* WebViewController.swift in Sources */, + 2B00012B2E34083400543C1B /* SecureLabel.swift in Sources */, + 2B00012C2E34083400543C1B /* AppDelegate.swift in Sources */, + 2BEE33442EC3D364007F2B75 /* SimpleScrollView.swift in Sources */, + 2BEE33492EC3D384007F2B75 /* InfiniteImageCollectionView.swift in Sources */, + 2B00012D2E34083400543C1B /* AppDelegate+UITest.swift in Sources */, + 2B358B5B2E9DD1B200DFB02F /* ContentView.swift in Sources */, + 2B358B632E9DD27100DFB02F /* SlidersView.swift in Sources */, + 2B358B642E9DD27100DFB02F /* ScrollViewsView.swift in Sources */, + 2B358B652E9DD27100DFB02F /* TextFieldsView.swift in Sources */, + 2B358B722E9DD28A00DFB02F /* InfiniteImageCollectionViewController.swift in Sources */, + 2B358B662E9DD27100DFB02F /* PickersView.swift in Sources */, + 2B358B672E9DD27100DFB02F /* ProgressViewsView.swift in Sources */, + 2B358B682E9DD27100DFB02F /* SegmentedControlsView.swift in Sources */, + 2B358B692E9DD27100DFB02F /* MaskingView.swift in Sources */, + 2B358B6A2E9DD27100DFB02F /* StacksView.swift in Sources */, + 2B358B6B2E9DD27100DFB02F /* GridsView.swift in Sources */, + 2B358B6C2E9DD27100DFB02F /* ListsView.swift in Sources */, + 2B358B6D2E9DD27100DFB02F /* SteppersView.swift in Sources */, + 2B358B6E2E9DD27100DFB02F /* ShapesView.swift in Sources */, + 2B358B6F2E9DD27100DFB02F /* TogglesView.swift in Sources */, + 2B358B702E9DD27100DFB02F /* DatePickersView.swift in Sources */, + 2B358B712E9DD27100DFB02F /* ButtonsView.swift in Sources */, + 2B00012E2E34083400543C1B /* ApodViewModel.swift in Sources */, + 2B00012F2E34083400543C1B /* ScrollableCollectionViewController.swift in Sources */, + 2B0001302E34083400543C1B /* TextMaskingViewModel.swift in Sources */, + 2B0001312E34083400543C1B /* ImageDetailPDFView.swift in Sources */, + 2B0001322E34083400543C1B /* TextMaskingViewController.swift in Sources */, + 2B0001332E34083400543C1B /* SceneDelegate.swift in Sources */, + 2B03F6692E45338B00DBA375 /* UITestsInterop.swift in Sources */, + 2B0001342E34083400543C1B /* ImageFullScreen.swift in Sources */, + 2B0001352E34083400543C1B /* Variable.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2B459FDE2E9EF52500CB66F3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B459FDF2E9EF52500CB66F3 /* NRTestAppTests.swift in Sources */, + 2B459FE02E9EF52500CB66F3 /* NRTestAppFakeNavigationAction.swift in Sources */, + 2B459FE12E9EF52500CB66F3 /* NRTestAppNavigationTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2B459FF42E9EF52F00CB66F3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B459FF52E9EF52F00CB66F3 /* Socket+File.swift in Sources */, + 2B459FF62E9EF52F00CB66F3 /* HttpResponse.swift in Sources */, + 2B459FF72E9EF52F00CB66F3 /* String+Misc.swift in Sources */, + 2B459FF82E9EF52F00CB66F3 /* String+BASE64.swift in Sources */, + 2B459FF92E9EF52F00CB66F3 /* HTTPParser.swift in Sources */, + 2B459FFA2E9EF52F00CB66F3 /* String+SHA1.swift in Sources */, + 2B459FFB2E9EF52F00CB66F3 /* Errno.swift in Sources */, + 2B459FFC2E9EF52F00CB66F3 /* HttpRequest.swift in Sources */, + 2B459FFD2E9EF52F00CB66F3 /* HttpRouter.swift in Sources */, + 2B459FFE2E9EF52F00CB66F3 /* Files.swift in Sources */, + 2B459FFF2E9EF52F00CB66F3 /* WebSockets.swift in Sources */, + 2B45A0002E9EF52F00CB66F3 /* Socket.swift in Sources */, + 2B45A0012E9EF52F00CB66F3 /* Socket+Server.swift in Sources */, + 2B45A0022E9EF52F00CB66F3 /* Scopes.swift in Sources */, + 2B45A0032E9EF52F00CB66F3 /* String+File.swift in Sources */, + 2B45A0042E9EF52F00CB66F3 /* MimeTypes.swift in Sources */, + 2B45A0052E9EF52F00CB66F3 /* HttpServerIO.swift in Sources */, + 2B45A0062E9EF52F00CB66F3 /* HttpServer.swift in Sources */, + 2B45A0072E9EF52F00CB66F3 /* NRTestAppUITests.swift in Sources */, + 2B45A0082E9EF52F00CB66F3 /* HTTPDynamicStubs.swift in Sources */, + 2B45A0092E9EF52F00CB66F3 /* Process.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 2BD05DCD2ADF323A00C0C972 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1189,6 +1565,8 @@ F86428482971C661002ABA01 /* UtilViewModel.swift in Sources */, F8ACFA292EA019BF00E6692B /* InfiniteImageCollectionView.swift in Sources */, F8302AFD296F5EFA003EC291 /* ViewController.swift in Sources */, + 2B03F6632E45338300DBA375 /* UITestsHelper.swift in Sources */, + 2BB1E1EC2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift in Sources */, F8302B9129707BCC003EC291 /* ApodService.swift in Sources */, F8302B8B297076F9003EC291 /* MainCoordinator.swift in Sources */, F8672A562EAA69820055FA51 /* SimpleScrollView.swift in Sources */, @@ -1209,7 +1587,9 @@ 2BAE5C9C2E860C7D001D2B88 /* ContentView.swift in Sources */, F8E278492E3BEADA00D6F04C /* DiffTestViewController.swift in Sources */, F8302B8629707695003EC291 /* ViewControllerProvider.swift in Sources */, + 2B03F6612E45335100DBA375 /* MetricsConsumer.swift in Sources */, F8302B9429708027003EC291 /* ApodResult.swift in Sources */, + 2B03F6702E45352500DBA375 /* PerformanceScreen.swift in Sources */, F8302B89297076E9003EC291 /* Coordinator.swift in Sources */, F864286329775023002ABA01 /* plistHelper.swift in Sources */, 2B8208C02E5D0F2A0063E9BD /* SwiftUIViewRepresentableTestView.swift in Sources */, @@ -1263,6 +1643,7 @@ 2B69E4602DE8F9EB00543A2E /* TextMaskingViewController.swift in Sources */, F86429302979CDFA002ABA01 /* UIImageView.swift in Sources */, F84EEFB62E21B19C000E2A5A /* SecureLabel.swift in Sources */, + 2B03F66E2E45352500DBA375 /* PerformanceScreen.swift in Sources */, F81062182E17250B00B8CC81 /* InfiniteScrollViewController.swift in Sources */, F81061F92E16C13F00B8CC81 /* ScrollableCollectionViewController.swift in Sources */, F86429312979CDFA002ABA01 /* Date.swift in Sources */, @@ -1275,12 +1656,15 @@ F8D7C6052B45C38700170F79 /* AppDelegate+UITest.swift in Sources */, F86429392979CDFA002ABA01 /* SceneDelegate.swift in Sources */, F864293A2979CDFA002ABA01 /* ViewControllerProvider.swift in Sources */, + 2B03F65F2E45335100DBA375 /* MetricsConsumer.swift in Sources */, F864293B2979CDFA002ABA01 /* Coordinator.swift in Sources */, F864293C2979CDFA002ABA01 /* MainCoordinator.swift in Sources */, F864293D2979CDFA002ABA01 /* ViewController.swift in Sources */, F864293E2979CDFA002ABA01 /* UtilitiesViewController.swift in Sources */, F864293F2979CDFA002ABA01 /* WebViewController.swift in Sources */, F86429402979CDFA002ABA01 /* ApodViewModel.swift in Sources */, + 2BB1E1ED2E342D2000BC36A6 /* AttributedStringTextMaskingViewController.swift in Sources */, + 2B03F6642E45338300DBA375 /* UITestsHelper.swift in Sources */, F86429412979CDFA002ABA01 /* UtilViewModel.swift in Sources */, F86429422979CDFA002ABA01 /* ApodService.swift in Sources */, 2B8208C12E5D0F2A0063E9BD /* SwiftUIViewRepresentableTestView.swift in Sources */, @@ -1321,6 +1705,16 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 2B459FDC2E9EF52500CB66F3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2B00011A2E34083400543C1B /* NRTestAppAsFramework */; + targetProxy = 2B459FDD2E9EF52500CB66F3 /* PBXContainerItemProxy */; + }; + 2B459FF22E9EF52F00CB66F3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2B00011A2E34083400543C1B /* NRTestAppAsFramework */; + targetProxy = 2B459FF32E9EF52F00CB66F3 /* PBXContainerItemProxy */; + }; 2B6588132EA9957600A5AC8C /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Agent_iOS; @@ -1336,6 +1730,16 @@ name = "Agent-watchOS"; targetProxy = 2B6588212EA995BB00A5AC8C /* PBXContainerItemProxy */; }; + 2BB91D3D2E9EC56700E1624C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2B00011A2E34083400543C1B /* NRTestAppAsFramework */; + targetProxy = 2BB91D3C2E9EC56700E1624C /* PBXContainerItemProxy */; + }; + 2BB91D462E9EC6CB00E1624C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2B00011A2E34083400543C1B /* NRTestAppAsFramework */; + targetProxy = 2BB91D452E9EC6CB00E1624C /* PBXContainerItemProxy */; + }; 2BD05DD82ADF323A00C0C972 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = F8302AF4296F5EFA003EC291 /* NRTestApp */; @@ -1378,6 +1782,197 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 2B0001412E34083400543C1B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CODE_SIGN_ENTITLEMENTS = NRTestApp/NRTestApp.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 13; + DEVELOPMENT_TEAM = SU7SUNGZJP; + "ENABLE_APP_SANDBOX[sdk=*]" = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_GENERATE_TEST_COVERAGE_FILES = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NRTestApp/Info.plist; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 4.7; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.newrelic.NRApp.bitcode; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG DEBUG_IMPORT"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "NRTestApp/Helpers/NRTestApp-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 2B0001422E34083400543C1B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CODE_SIGN_ENTITLEMENTS = NRTestApp/NRTestApp.entitlements; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 13; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = SU7SUNGZJP; + "DEVELOPMENT_TEAM[sdk=macosx*]" = SU7SUNGZJP; + ENABLE_APP_SANDBOX = YES; + "ENABLE_APP_SANDBOX[sdk=*]" = NO; + "ENABLE_APP_SANDBOX[sdk=macosx*]" = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_GENERATE_TEST_COVERAGE_FILES = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NRTestApp/Info.plist; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 4.7; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.newrelic.NRApp.bitcode; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = iOSAgentiOSDist; + "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = iOSAgentDist; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "NRTestApp/Helpers/NRTestApp-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 2B459FE52E9EF52500CB66F3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = SU7SUNGZJP; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = newrelic.NRTestAppTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NRTestAppAsFramework.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/NRTestAppAsFramework"; + }; + name = Debug; + }; + 2B459FE62E9EF52500CB66F3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = SU7SUNGZJP; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = newrelic.NRTestAppTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/NRTestAppAsFramework.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/NRTestAppAsFramework"; + }; + name = Release; + }; + 2B45A0102E9EF52F00CB66F3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = SU7SUNGZJP; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "NRTestAppAsFrameworkUITests-Info.plist"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 13.6; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.newrelic.NRTestAppUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = NRTestAppAsFramework; + }; + name = Debug; + }; + 2B45A0112E9EF52F00CB66F3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = SU7SUNGZJP; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "NRTestAppAsFrameworkUITests-Info.plist"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 13.6; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.newrelic.NRTestAppUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = NRTestAppAsFramework; + }; + name = Release; + }; 2BD05DDA2ADF323A00C0C972 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1390,7 +1985,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = NRTestAppUITests/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MACOSX_DEPLOYMENT_TARGET = 13.6; MARKETING_VERSION = 1.0; @@ -1418,7 +2013,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = NRTestAppUITests/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MACOSX_DEPLOYMENT_TARGET = 13.6; MARKETING_VERSION = 1.0; @@ -1557,7 +2152,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; - IPHONEOS_DEPLOYMENT_TARGET = 16.2; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -1613,7 +2208,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.business"; - IPHONEOS_DEPLOYMENT_TARGET = 16.2; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -1725,7 +2320,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = SU7SUNGZJP; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MARKETING_VERSION = 1.0; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = newrelic.NRTestAppTests; @@ -1747,7 +2342,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = SU7SUNGZJP; GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MARKETING_VERSION = 1.0; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = newrelic.NRTestAppTests; @@ -1915,6 +2510,33 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 2B0001402E34083400543C1B /* Build configuration list for PBXNativeTarget "NRTestAppAsFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2B0001412E34083400543C1B /* Debug */, + 2B0001422E34083400543C1B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2B459FE42E9EF52500CB66F3 /* Build configuration list for PBXNativeTarget "NRTestAppAsFrameworkTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2B459FE52E9EF52500CB66F3 /* Debug */, + 2B459FE62E9EF52500CB66F3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2B45A00F2E9EF52F00CB66F3 /* Build configuration list for PBXNativeTarget "NRTestAppAsFrameworkUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2B45A0102E9EF52F00CB66F3 /* Debug */, + 2B45A0112E9EF52F00CB66F3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 2BD05DD92ADF323A00C0C972 /* Build configuration list for PBXNativeTarget "NRTestAppUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1988,6 +2610,59 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 2B00014C2E34089500543C1B /* XCRemoteSwiftPackageReference "newrelic-ios-agent" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/newrelic/newrelic-ios-agent.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 7.5.7; + }; + }; + 2B03F6572E452CCA00DBA375 /* XCRemoteSwiftPackageReference "perfsuite-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/bookingcom/perfsuite-ios"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.5.1; + }; + }; + 2B03F66A2E45350900DBA375 /* XCRemoteSwiftPackageReference "GCDWebServer" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/yene/GCDWebServer"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.5.7; + }; + }; + 2B2271692E9EEBD20091D931 /* XCRemoteSwiftPackageReference "newrelic-ios-agent" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/newrelic/newrelic-ios-agent.git"; + requirement = { + branch = main; + kind = branch; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 2B00014D2E34089500543C1B /* NewRelic */ = { + isa = XCSwiftPackageProductDependency; + package = 2B00014C2E34089500543C1B /* XCRemoteSwiftPackageReference "newrelic-ios-agent" */; + productName = NewRelic; + }; + 2B03F6582E452CCA00DBA375 /* PerformanceSuite */ = { + isa = XCSwiftPackageProductDependency; + package = 2B03F6572E452CCA00DBA375 /* XCRemoteSwiftPackageReference "perfsuite-ios" */; + productName = PerformanceSuite; + }; + 2B03F66B2E45350900DBA375 /* GCDWebServer */ = { + isa = XCSwiftPackageProductDependency; + package = 2B03F66A2E45350900DBA375 /* XCRemoteSwiftPackageReference "GCDWebServer" */; + productName = GCDWebServer; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = F8302AED296F5EFA003EC291 /* Project object */; } diff --git a/Test Harness/NRTestApp/NRTestApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Test Harness/NRTestApp/NRTestApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..a14983ff --- /dev/null +++ b/Test Harness/NRTestApp/NRTestApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "57d1ccda4ded584a1634936170ecf00e7e370643ee361bf9f001b6729408615b", + "pins" : [ + { + "identity" : "newrelic-ios-agent", + "kind" : "remoteSourceControl", + "location" : "https://github.com/newrelic/newrelic-ios-agent.git", + "state" : { + "revision" : "81d33f56334ccc64b7188e56f79fbf4cd6881483", + "version" : "7.5.7-rc.1500" + } + } + ], + "version" : 3 +} diff --git a/Test Harness/NRTestApp/NRTestApp.xcodeproj/xcshareddata/xcschemes/NRTestAppAsFramework.xcscheme b/Test Harness/NRTestApp/NRTestApp.xcodeproj/xcshareddata/xcschemes/NRTestAppAsFramework.xcscheme new file mode 100644 index 00000000..b3c12425 --- /dev/null +++ b/Test Harness/NRTestApp/NRTestApp.xcodeproj/xcshareddata/xcschemes/NRTestAppAsFramework.xcscheme @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Test Harness/NRTestApp/NRTestApp.xcodeproj/xcshareddata/xcschemes/NRTestAppAsFrameworkUITests.xcscheme b/Test Harness/NRTestApp/NRTestApp.xcodeproj/xcshareddata/xcschemes/NRTestAppAsFrameworkUITests.xcscheme new file mode 100644 index 00000000..5e6732ef --- /dev/null +++ b/Test Harness/NRTestApp/NRTestApp.xcodeproj/xcshareddata/xcschemes/NRTestAppAsFrameworkUITests.xcscheme @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Test Harness/NRTestApp/NRTestApp/AppDelegate.swift b/Test Harness/NRTestApp/NRTestApp/AppDelegate.swift index 5d377dd2..9c5956fe 100644 --- a/Test Harness/NRTestApp/NRTestApp/AppDelegate.swift +++ b/Test Harness/NRTestApp/NRTestApp/AppDelegate.swift @@ -7,7 +7,10 @@ import UIKit import NewRelic +#if DEBUG_IMPORT +import PerformanceSuite +#endif // For more info on installing the New Relic agent go to https://docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-ios/installation/spm-installation/#configure-using-swift-package-manager @main @@ -17,6 +20,19 @@ class AppDelegate: UIResponder, UIApplicationDelegate { #if DEBUG // The New Relic agent is set to log at NRLogLevelInfo by default, debug logging should only be used for debugging when all agent logs are desired. NRLogger.setLogLevels(NRLogLevelDebug.rawValue) + + +#if DEBUG_IMPORT + // if use perofrmance sutie + UITestsHelper.prepareForTestsIfNeeded() + + let metricsConsumer = MetricsConsumer() + do { + try PerformanceMonitoring.enable(config: .all(receiver: metricsConsumer), didCrashPreviously: false) + } catch { + preconditionFailure("Couldn't initialize PerformanceSuite: \(error)") + } + #endif #endif NRLogger.setLogLevels(NRLogLevelDebug.rawValue) @@ -27,6 +43,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { NRMAFeatureFlags.NRFeatureFlag_WebViewInstrumentation ]) #endif + + NRLogger.setLogLevels(NRLogLevelDebug.rawValue) + NewRelic.addHTTPHeaderTracking(for: ["Test"]) NewRelic.enableFeatures([NRMAFeatureFlags.NRFeatureFlag_SwiftAsyncURLSessionSupport, diff --git a/Test Harness/NRTestApp/NRTestApp/MetricsConsumer.swift b/Test Harness/NRTestApp/NRTestApp/MetricsConsumer.swift new file mode 100644 index 00000000..325a906e --- /dev/null +++ b/Test Harness/NRTestApp/NRTestApp/MetricsConsumer.swift @@ -0,0 +1,118 @@ +// +// MetricsConsumer.swift +// NRTestApp +// +// Created by Chris Dillard on 8/7/25. +// + +import Foundation +import OSLog + +#if DEBUG_IMPORT + +import PerformanceSuite +#endif +import SwiftUI + +#if DEBUG_IMPORT + +extension UIHostingController: PerformanceTrackable { + var performanceScreen: PerformanceScreen? { + return (introspectRootView() as? PerformanceTrackable)?.performanceScreen + } +} + +class MetricsConsumer: PerformanceSuiteMetricsReceiver { + + let interop = UITestsHelper.isInTests ? UITestsInterop.Server() : nil + + func appRenderingMetricsReceived(metrics: RenderingMetrics) { + log("App RenderingMetrics \(metrics)") + interop?.send(message: Message.appFreezeTime(duration: metrics.freezeTime.milliseconds ?? -1)) + } + + func ttiMetricsReceived(metrics: TTIMetrics, screen: PerformanceScreen) { + log("TTIMetrics \(screen) \(metrics)") + interop?.send(message: Message.tti(duration: metrics.tti.milliseconds ?? -1, screen: screen.rawValue)) + } + + func renderingMetricsReceived(metrics: RenderingMetrics, screen: PerformanceScreen) { + log("RenderingMetrics \(screen) \(metrics)") + interop?.send(message: Message.freezeTime(duration: metrics.freezeTime.milliseconds ?? -1, screen: screen.rawValue)) + } + + func screenIdentifier(for viewController: UIViewController) -> PerformanceScreen? { + return (viewController as? PerformanceTrackable)?.performanceScreen + } + + func watchdogTerminationReceived(_ data: WatchdogTerminationData) { + log("WatchdogTermination reported") + interop?.send(message: Message.watchdogTermination) + } + + func viewControllerLeakReceived(viewController: UIViewController) { + log("View controller leak \(viewController)") + interop?.send(message: Message.memoryLeak) + } + + func startupTimeReceived(_ data: StartupTimeData) { + log("Startup time received \(data.totalTime.milliseconds ?? 0) ms") + interop?.send(message: Message.startupTime(duration: data.totalTime.milliseconds ?? -1)) + } + + func fragmentTTIMetricsReceived(metrics: TTIMetrics, fragment identifier: String) { + log("fragmentTTIMetricsReceived \(identifier) \(metrics)") + interop?.send(message: Message.fragmentTTI(duration: metrics.tti.milliseconds ?? -1, fragment: identifier)) + } + + func fatalHangReceived(info: HangInfo) { + log("fatalHangReceived \(info)") + interop?.send(message: Message.fatalHang) + } + + func nonFatalHangReceived(info: HangInfo) { + log("nonFatalHangReceived \(info)") + interop?.send(message: Message.nonFatalHang) + } + + func hangStarted(info: HangInfo) { + log("hangStarted \(info)") + interop?.send(message: Message.hangStarted) + } + + var hangThreshold: TimeInterval { + return 3 + } + + private func log(_ message: String) { + logger.info("\(message, privacy: .public)") + } + private let logger = Logger(subsystem: "com.booking.PerformanceApp", category: "MetricsConsumer") + + // MARK: - ViewControllerLoggingReceiver + + func onInit(screen: PerformanceScreen) { + log("onInit \(screen)") + } + + func onViewDidLoad(screen: PerformanceScreen) { + log("onViewDidLoad \(screen)") + } + + func onViewWillAppear(screen: PerformanceScreen) { + log("onViewWillAppear \(screen)") + } + + func onViewDidAppear(screen: PerformanceScreen) { + log("onViewDidAppear \(screen)") + } + + func onViewWillDisappear(screen: PerformanceScreen) { + log("onViewWillDisappear \(screen)") + } + + func onViewDidDisappear(screen: PerformanceScreen) { + log("onViewDidDisappear \(screen)") + } +} +#endif diff --git a/Test Harness/NRTestApp/NRTestApp/Navigation/MainCoordinator.swift b/Test Harness/NRTestApp/NRTestApp/Navigation/MainCoordinator.swift index c11cfd29..496ad35a 100644 --- a/Test Harness/NRTestApp/NRTestApp/Navigation/MainCoordinator.swift +++ b/Test Harness/NRTestApp/NRTestApp/Navigation/MainCoordinator.swift @@ -47,8 +47,13 @@ class MainCoordinator: Coordinator { } func showTextMaskingController() { - let webViewController = ViewControllerProvider.textMaskingViewController - navigationController.pushViewController(webViewController, animated: true) + let textMaskingViewController = ViewControllerProvider.textMaskingViewController + navigationController.pushViewController(textMaskingViewController, animated: true) + } + + func showAttributedStringTextMaskingController() { + let attributedStringTextMaskingViewController = ViewControllerProvider.attributedStringTextMaskingViewController + navigationController.pushViewController(attributedStringTextMaskingViewController, animated: true) } func showCollectionController() { diff --git a/Test Harness/NRTestApp/NRTestApp/Navigation/ViewControllerProvider.swift b/Test Harness/NRTestApp/NRTestApp/Navigation/ViewControllerProvider.swift index df573868..8720a120 100644 --- a/Test Harness/NRTestApp/NRTestApp/Navigation/ViewControllerProvider.swift +++ b/Test Harness/NRTestApp/NRTestApp/Navigation/ViewControllerProvider.swift @@ -31,6 +31,11 @@ enum ViewControllerProvider { return viewController } + static var attributedStringTextMaskingViewController: AttributedStringTextMaskingViewController { + let viewController = AttributedStringTextMaskingViewController() + return viewController + } + static var collectionViewController: ScrollableCollectionViewController { let viewController = ScrollableCollectionViewController() return viewController diff --git a/Test Harness/NRTestApp/NRTestApp/PerformanceScreen.swift b/Test Harness/NRTestApp/NRTestApp/PerformanceScreen.swift new file mode 100644 index 00000000..430aba00 --- /dev/null +++ b/Test Harness/NRTestApp/NRTestApp/PerformanceScreen.swift @@ -0,0 +1,20 @@ +// +// PerformanceScreen.swift +// PerformanceApp +// +// Created by Gleb Tarasov on 18/12/2023. +// + +import Foundation + + +/// Every root view should implement this protocol and return an enum value, corresponding to this view +protocol PerformanceTrackable { + var performanceScreen: PerformanceScreen? { get } +} + +enum PerformanceScreen: String { + case menu + case rendering + case list +} diff --git a/Test Harness/NRTestApp/NRTestApp/SwiftUI/ContentView.swift b/Test Harness/NRTestApp/NRTestApp/SwiftUI/ContentView.swift index eab6c518..580e7c70 100644 --- a/Test Harness/NRTestApp/NRTestApp/SwiftUI/ContentView.swift +++ b/Test Harness/NRTestApp/NRTestApp/SwiftUI/ContentView.swift @@ -1,4 +1,5 @@ import SwiftUI +import NewRelic struct SwiftUIContentView: View { var body: some View { diff --git a/Test Harness/NRTestApp/NRTestApp/SwiftUI/MaskingView.swift b/Test Harness/NRTestApp/NRTestApp/SwiftUI/MaskingView.swift index d5793959..d3fddeb6 100644 --- a/Test Harness/NRTestApp/NRTestApp/SwiftUI/MaskingView.swift +++ b/Test Harness/NRTestApp/NRTestApp/SwiftUI/MaskingView.swift @@ -6,6 +6,7 @@ // import SwiftUI +import NewRelic struct MaskingView: View { @State private var maskedInput: String = "" @@ -91,7 +92,7 @@ struct MaskingView: View { } sectionTitle("Deep Nesting (Mixed Overrides)") - + NRConditionalMaskView(maskApplicationText: false, maskUserInputText: false, maskAllUserTouches: false) { VStack(alignment: .leading, spacing: 10) { @@ -101,7 +102,7 @@ struct MaskingView: View { Text("Level 2 (no id)") } VStack(alignment: .leading, spacing: 6) { - NRConditionalMaskView(sessionReplayIdentifier: "my-masked-id") { + NRConditionalMaskView(sessionReplayIdentifier: "msr-swiftui-text-1") { Text("Level 3 Explicit Masked") VStack(alignment: .leading, spacing: 4) { diff --git a/Test Harness/NRTestApp/NRTestApp/UITestsHelper.swift b/Test Harness/NRTestApp/NRTestApp/UITestsHelper.swift new file mode 100644 index 00000000..6630518c --- /dev/null +++ b/Test Harness/NRTestApp/NRTestApp/UITestsHelper.swift @@ -0,0 +1,30 @@ +// +// UITestsHelper.swift +// PerformanceSuite-PerformanceApp +// +// Created by Gleb Tarasov on 19/12/2023. +// + +#if DEBUG_IMPORT + +import Foundation + +class UITestsHelper { + static func prepareForTestsIfNeeded() { + if shouldClearStorage { + clearStorage() + } + } + + static let isInTests = ProcessInfo.processInfo.environment[inTestsKey] != nil + private static let shouldClearStorage = ProcessInfo.processInfo.environment[clearStorageKey] != nil + + private static func clearStorage() { + guard let domain = Bundle.main.bundleIdentifier else { + fatalError("no bundle identifier") + } + UserDefaults.standard.removePersistentDomain(forName: domain) + UserDefaults.resetStandardUserDefaults() + } +} +#endif diff --git a/Test Harness/NRTestApp/NRTestApp/UITestsInterop.swift b/Test Harness/NRTestApp/NRTestApp/UITestsInterop.swift new file mode 100644 index 00000000..4dbf4d5b --- /dev/null +++ b/Test Harness/NRTestApp/NRTestApp/UITestsInterop.swift @@ -0,0 +1,170 @@ +// +// Interop.swift +// PerformanceSuiteNew +// +// Created by Gleb Tarasov on 09/03/2022. +// + +import Foundation +import Network +import UIKit +import GCDWebServer + +public let inTestsKey = "UI_TESTS" +public let clearStorageKey = "CLEAR_STORAGE" + + +/// Message which is sent from the app to UI tests target +public enum Message: Codable, Equatable { + case startupTime(duration: Int) + case appFreezeTime(duration: Int) + case freezeTime(duration: Int, screen: String) + case tti(duration: Int, screen: String) + case fragmentTTI(duration: Int, fragment: String) + case hangStarted + case fatalHang + case nonFatalHang + case watchdogTermination + case memoryLeak + case crash + + public static func == (lhs: Message, rhs: Message) -> Bool { + switch (lhs, rhs) { + case (.startupTime, .startupTime), + (.appFreezeTime, .appFreezeTime), + (.hangStarted, .hangStarted), + (.fatalHang, .fatalHang), + (.nonFatalHang, .nonFatalHang), + (.watchdogTermination, .watchdogTermination), + (.memoryLeak, .memoryLeak), + (.crash, .crash): + return true + + case let (.freezeTime(_, screenA), .freezeTime(_, screenB)), + let (.tti(_, screenA), .tti(_, screenB)): + return screenA == screenB + + case let (.fragmentTTI(_, fragmentA), .fragmentTTI(_, fragmentB)): + return fragmentA == fragmentB + + default: + return false + } + } +} + +/// This is a namespace to access Client and Server classes +public enum UITestsInterop { + + /// Class is used to communicate between App target and UI Tests target. + /// This part is a client part, which works in UI tests target. + /// We start connection as a client and poll data from the server + /// + public class Client { + + public init() { + print("Client.init") + timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] _ in + self?.makeRequest() + } + } + + static let host: String = "localhost" + static let port: UInt16 = 50001 + private let url = URL(string: "http://\(host):\(port)")! + + private let decoder = JSONDecoder() + private let session = URLSession(configuration: .default) + private var timer: Timer? + private var task: URLSessionDataTask? + + public var messages: [Message] { + return messagesLock.withLock { + messagesStorage + } + } + + private var messagesStorage: [Message] = [] + private let messagesLock = NSLock() + + private func makeRequest() { + self.task?.cancel() + + print("Client.makeRequest") + self.task = session.dataTask(with: url) { data, _, _ in + guard let data = data else { + print("No data found") + return + } + do { + let messages = try self.decoder.decode([Message].self, from: data) + self.messagesLock.withLock { + self.messagesStorage.append(contentsOf: messages) + } + if messages.isEmpty { + print("No new messages") + } else { + print("Messages received:\n--------------\n\(messages)\n--------------\n") + } + } catch { + let str = String(data: data, encoding: .utf8) + fatalError("Couldn't decode messages from \(str ?? "empty")") + } + + self.task = nil + } + self.task?.resume() + } + + public func reset() { + messagesLock.withLock { + messagesStorage.removeAll() + } + timer?.invalidate() + } + } + + + /// Class is used to communicate between App target and UI Tests target. + /// This part is a server part, which works in App target. + /// We start server when app is started and send data to the open connection when needed. + /// + /// We start server in the app, not in the UI tests target, because this way it will work on the device. + /// The opposite way won't work on the real device. I will re-think if this is needed or not. + /// If not, I will switch server and client back. + public final class Server { + public init() { + server = GCDWebServer() + server.addDefaultHandler(forMethod: "GET", request: GCDWebServerRequest.self) { _ in + let messagesToSend = self.messagesLock.withLock { + let result = self.messages + self.messages.removeAll() + return result + } + do { + let data = try self.encoder.encode(messagesToSend) + return GCDWebServerDataResponse(data: data, contentType: "application/json") + } catch { + fatalError("Couldn't encode messages \(messagesToSend)") + } + } + do { + try server.start(options: [GCDWebServerOption_BindToLocalhost: true, GCDWebServerOption_Port: Client.port]) + } catch { + fatalError("Couldn't start GCDWebServer: \(error)") + } + } + private let server: GCDWebServer + private let encoder = JSONEncoder() + + private var messages: [Message] = [] + private let messagesLock = NSLock() + + public func send(message: Message) { + messagesLock.withLock { + self.messages.append(message) + } + } + } + +} diff --git a/Test Harness/NRTestApp/NRTestApp/ViewControllers/AttributedStringTextMaskingViewController.swift b/Test Harness/NRTestApp/NRTestApp/ViewControllers/AttributedStringTextMaskingViewController.swift new file mode 100644 index 00000000..501c5f10 --- /dev/null +++ b/Test Harness/NRTestApp/NRTestApp/ViewControllers/AttributedStringTextMaskingViewController.swift @@ -0,0 +1,351 @@ +// +// AttributedStringTextMaskingViewController.swift +// NRTestApp +// +// Created by Chris Dillard on 5/30/25 +// + +import UIKit + +class AttributedStringTextMaskingViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { + var viewModel = TextMaskingViewModel() + + let data = [("Title 1", "Subtitle 1"), ("Title 2", "Subtitle 2"), ("Title 3", "Subtitle 3")] + + // Reusable attributed string generator + func featureRichAttributedString(_ string: String) -> NSAttributedString { + let attributes: [NSAttributedString.Key: Any] = [ + .font: UIFont.systemFont(ofSize: 16, weight: .medium), + .foregroundColor: UIColor.systemIndigo, + .backgroundColor: UIColor.systemGray6, + .underlineStyle: NSUnderlineStyle.single.rawValue, + .strokeColor: UIColor.systemPink, + .strokeWidth: -2.0, + .kern: 1.2 + ] + return NSAttributedString(string: string, attributes: attributes) + } + + override func viewDidLoad() { + super.viewDidLoad() + + self.title = "Attributed String Text Masking" + self.view.backgroundColor = .systemBackground + + let searchAndCredentialsStack = createSearchAndCredentialsSection() + let maskedStack = createSectionStack(title: "Masked Fields", isMasked: true, isCustom: false) + let unmaskedStack = createSectionStack(title: "Unmasked Fields", isMasked: false, isCustom: false) + let customMaskedStack = createSectionStack(title: "Custom Masked Fields", isMasked: true, isCustom: true) + let customUnmaskedStack = createSectionStack(title: "Custom Unmasked Fields", isMasked: false, isCustom: true) + let parentChildStack = createParentChildSection() + let tableViewStack = createTableViewSection() + + let scrollView = UIScrollView() + let mainStack = UIStackView(arrangedSubviews: [searchAndCredentialsStack, maskedStack, unmaskedStack, customMaskedStack, customUnmaskedStack, parentChildStack, tableViewStack]) +// let mainStack = UIStackView(arrangedSubviews: [maskedStack, parentChildStack]) +// let mainStack = UIStackView(arrangedSubviews: [maskedStack])//, parentChildStack]) + + mainStack.axis = .vertical + mainStack.spacing = 32 + mainStack.translatesAutoresizingMaskIntoConstraints = false + + scrollView.translatesAutoresizingMaskIntoConstraints = false + scrollView.showsHorizontalScrollIndicator = false + scrollView.showsVerticalScrollIndicator = true + + scrollView.addSubview(mainStack) + + view.addSubview(scrollView) + + NSLayoutConstraint.activate([ + scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor), + + mainStack.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor), + mainStack.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor), + mainStack.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor), + mainStack.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor), + + mainStack.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor) + ]) + } + + private func createSectionStack(title: String, isMasked: Bool, isCustom: Bool) -> UIStackView { + let sectionLabel = UILabel() + sectionLabel.attributedText = featureRichAttributedString(title) + sectionLabel.font = .boldSystemFont(ofSize: 18) + + let fieldsStack = UIStackView() + fieldsStack.axis = .vertical + fieldsStack.spacing = 12 + + // UILabels + for i in 1...4 { + let label = UILabel() + label.attributedText = featureRichAttributedString("\(title) UILabel \(i)") + if isCustom { + label.accessibilityIdentifier = isMasked ? "private" : "public" + } else { + label.accessibilityIdentifier = isMasked ? "nr-mask" : "nr-unmask" + } + fieldsStack.addArrangedSubview(label) + } + // UITextFields + for i in 1...4 { + let textField = UITextField() + textField.borderStyle = .roundedRect + textField.attributedPlaceholder = featureRichAttributedString("\(title) UITextField \(i)") + if isCustom { + textField.accessibilityIdentifier = isMasked ? "private" : "public" + } else { + textField.accessibilityIdentifier = isMasked ? "nr-mask" : "nr-unmask" + } + fieldsStack.addArrangedSubview(textField) + } + // UITextViews + for i in 1...4 { + let textView = UITextView() + textView.attributedText = featureRichAttributedString("\(title) UITextView \(i)") + textView.layer.borderWidth = 1 + textView.layer.borderColor = UIColor.systemGray4.cgColor + textView.layer.cornerRadius = 6 + if isCustom { + textView.accessibilityIdentifier = isMasked ? "private" : "public" + } else { + textView.accessibilityIdentifier = isMasked ? "nr-mask" : "nr-unmask" + } + textView.heightAnchor.constraint(equalToConstant: 60).isActive = true + fieldsStack.addArrangedSubview(textView) + } + + let sectionStack = UIStackView(arrangedSubviews: [sectionLabel, fieldsStack]) + sectionStack.axis = .vertical + sectionStack.spacing = 8 + return sectionStack + } + + private func createParentChildSection() -> UIStackView { + let sectionLabel = UILabel() + sectionLabel.attributedText = featureRichAttributedString("Parent-Child Relationship") + sectionLabel.font = .boldSystemFont(ofSize: 18) + + // Create parent container views + let maskedParentView = createParentView(isMasked: true) + let unmaskedParentView = createParentView(isMasked: false) + + let descriptionLabel = UILabel() + descriptionLabel.attributedText = featureRichAttributedString("Testing masked accessibility identifier propagation to child views") + descriptionLabel.numberOfLines = 0 + descriptionLabel.font = .systemFont(ofSize: 14) + descriptionLabel.textColor = .secondaryLabel + + let containerStack = UIStackView(arrangedSubviews: [descriptionLabel, maskedParentView, unmaskedParentView]) + containerStack.axis = .vertical + containerStack.spacing = 16 + + let sectionStack = UIStackView(arrangedSubviews: [sectionLabel, containerStack]) + sectionStack.axis = .vertical + sectionStack.spacing = 8 + return sectionStack + } + + private func createParentView(isMasked: Bool) -> UIView { + let containerView = UIView() + containerView.backgroundColor = isMasked ? .systemBlue.withAlphaComponent(0.1) : .systemGreen.withAlphaComponent(0.1) + containerView.layer.cornerRadius = 8 + containerView.layer.borderWidth = 1 + containerView.layer.borderColor = isMasked ? UIColor.systemBlue.cgColor : UIColor.systemGreen.cgColor + containerView.translatesAutoresizingMaskIntoConstraints = false + + // Set accessibility identifier on parent + containerView.accessibilityIdentifier = isMasked ? "nr-mask" : "nr-unmask" +// containerView.accessibilityIdentifier = isMasked ? "nr-masked-parent-container" : "nr-unmasked-parent-container" + + // Header label for the parent view + let headerLabel = UILabel() + headerLabel.attributedText = featureRichAttributedString(isMasked ? "Masked Parent View" : "Unmasked Parent View") + headerLabel.font = .boldSystemFont(ofSize: 16) + headerLabel.translatesAutoresizingMaskIntoConstraints = false + + // Child views that should inherit masking + let childStack = UIStackView() + childStack.axis = .vertical + childStack.spacing = 8 + childStack.translatesAutoresizingMaskIntoConstraints = false + + // Add various child elements + for i in 1...3 { + let label = UILabel() + label.attributedText = featureRichAttributedString("Child Label \(i)") + label.accessibilityIdentifier = "child-label-\(i)" + childStack.addArrangedSubview(label) + + let button = UIButton(type: .system) + button.setAttributedTitle(featureRichAttributedString("Child Button \(i)"), for: .normal) + button.accessibilityIdentifier = "child-button-\(i)" + childStack.addArrangedSubview(button) + + if i == 2 { + let nestedContainer = UIView() + nestedContainer.backgroundColor = .systemGray6 + nestedContainer.layer.cornerRadius = 4 + nestedContainer.accessibilityIdentifier = "nested-container-\(i)" + + let nestedLabel = UILabel() + nestedLabel.attributedText = featureRichAttributedString("Nested Child Label") + nestedLabel.accessibilityIdentifier = "nested-child-label" + nestedLabel.translatesAutoresizingMaskIntoConstraints = false + nestedContainer.addSubview(nestedLabel) + NSLayoutConstraint.activate([ + nestedLabel.topAnchor.constraint(equalTo: nestedContainer.topAnchor, constant: 8), + nestedLabel.leadingAnchor.constraint(equalTo: nestedContainer.leadingAnchor, constant: 8), + nestedLabel.trailingAnchor.constraint(equalTo: nestedContainer.trailingAnchor, constant: -8), + nestedLabel.bottomAnchor.constraint(equalTo: nestedContainer.bottomAnchor, constant: -8) + ]) + childStack.addArrangedSubview(nestedContainer) + nestedContainer.heightAnchor.constraint(equalToConstant: 40).isActive = true + } + } + + containerView.addSubview(headerLabel) + containerView.addSubview(childStack) + + NSLayoutConstraint.activate([ + containerView.heightAnchor.constraint(greaterThanOrEqualToConstant: 200), + + headerLabel.topAnchor.constraint(equalTo: containerView.topAnchor, constant: 12), + headerLabel.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 12), + headerLabel.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -12), + + childStack.topAnchor.constraint(equalTo: headerLabel.bottomAnchor, constant: 12), + childStack.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 12), + childStack.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -12), + childStack.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: -12) + ]) + + return containerView + } + + private func createTableViewSection() -> UIStackView { + let sectionLabel = UILabel() + sectionLabel.attributedText = featureRichAttributedString("TableView Masking Test") + sectionLabel.font = .boldSystemFont(ofSize: 18) + + // Create a container for the tableview with proper label + let tableViewContainer = UIView() + tableViewContainer.translatesAutoresizingMaskIntoConstraints = false + + let descriptionLabel = UILabel() + descriptionLabel.attributedText = featureRichAttributedString("Testing masking propagation in TableView hierarchy") + descriptionLabel.numberOfLines = 0 + descriptionLabel.font = .systemFont(ofSize: 14) + descriptionLabel.textColor = .secondaryLabel + descriptionLabel.translatesAutoresizingMaskIntoConstraints = false + + // Create the tableview with masking identifier + let tableView = UITableView() + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.register(MaskTestTableViewCell.self, forCellReuseIdentifier: "MaskTestCell") + tableView.dataSource = self + tableView.delegate = self + tableView.rowHeight = 80 + tableView.accessibilityIdentifier = "nr-mask" + tableView.layer.borderWidth = 1 + tableView.layer.borderColor = UIColor.systemBlue.cgColor + tableView.layer.cornerRadius = 8 + + // Add views to container + tableViewContainer.addSubview(descriptionLabel) + tableViewContainer.addSubview(tableView) + + NSLayoutConstraint.activate([ + tableViewContainer.heightAnchor.constraint(equalToConstant: 300), + + descriptionLabel.topAnchor.constraint(equalTo: tableViewContainer.topAnchor), + descriptionLabel.leadingAnchor.constraint(equalTo: tableViewContainer.leadingAnchor), + descriptionLabel.trailingAnchor.constraint(equalTo: tableViewContainer.trailingAnchor), + + tableView.topAnchor.constraint(equalTo: descriptionLabel.bottomAnchor, constant: 8), + tableView.leadingAnchor.constraint(equalTo: tableViewContainer.leadingAnchor), + tableView.trailingAnchor.constraint(equalTo: tableViewContainer.trailingAnchor), + tableView.bottomAnchor.constraint(equalTo: tableViewContainer.bottomAnchor) + ]) + + let sectionStack = UIStackView(arrangedSubviews: [sectionLabel, tableViewContainer]) + sectionStack.axis = .vertical + sectionStack.spacing = 8 + return sectionStack + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return data.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: "MaskTestCell", for: indexPath) as? MaskTestTableViewCell else { + return UITableViewCell() + } + let (title, subtitle) = data[indexPath.row] + cell.titleLabel.attributedText = featureRichAttributedString(title) + cell.subtitleLabel.attributedText = featureRichAttributedString(subtitle) + return cell + } + + // UITableViewDelegate Methods + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + print("Selected row at \(indexPath.row)") + } + + private func createSearchAndCredentialsSection() -> UIStackView { + let sectionLabel = UILabel() + sectionLabel.attributedText = featureRichAttributedString("Search & Credentials Fields") + sectionLabel.font = .boldSystemFont(ofSize: 18) + + let fieldsStack = UIStackView() + fieldsStack.axis = .vertical + fieldsStack.spacing = 12 + + // Search Bar + let searchBar = UISearchBar() + searchBar.searchTextField.attributedPlaceholder = featureRichAttributedString("Search query (masked)") + searchBar.accessibilityIdentifier = "nr-mask" + fieldsStack.addArrangedSubview(searchBar) + + // Username TextField + let usernameField = UITextField() + usernameField.borderStyle = .roundedRect + usernameField.attributedPlaceholder = featureRichAttributedString("Username (unmasked)") + usernameField.accessibilityIdentifier = "nr-unmask" + fieldsStack.addArrangedSubview(usernameField) + + // Password TextField + let passwordField = UITextField() + passwordField.borderStyle = .roundedRect + passwordField.attributedPlaceholder = featureRichAttributedString("Password (masked)") + passwordField.isSecureTextEntry = true + fieldsStack.addArrangedSubview(passwordField) + + // Credit Card Number TextField + let cardNumberField = UITextField() + cardNumberField.borderStyle = .roundedRect + cardNumberField.attributedPlaceholder = featureRichAttributedString("Credit Card Number (masked)") + cardNumberField.keyboardType = .numberPad + cardNumberField.accessibilityIdentifier = "nr-mask" + fieldsStack.addArrangedSubview(cardNumberField) + + // CVV TextField + let cvvField = UITextField() + cvvField.borderStyle = .roundedRect + cvvField.attributedPlaceholder = featureRichAttributedString("CVV (masked)") + cvvField.keyboardType = .numberPad + cvvField.isSecureTextEntry = true + fieldsStack.addArrangedSubview(cvvField) + + let sectionStack = UIStackView(arrangedSubviews: [sectionLabel, fieldsStack]) + sectionStack.axis = .vertical + sectionStack.spacing = 8 + return sectionStack + } +} diff --git a/Test Harness/NRTestApp/NRTestApp/ViewControllers/TextMaskingViewController.swift b/Test Harness/NRTestApp/NRTestApp/ViewControllers/TextMaskingViewController.swift index d5145020..15059abe 100644 --- a/Test Harness/NRTestApp/NRTestApp/ViewControllers/TextMaskingViewController.swift +++ b/Test Harness/NRTestApp/NRTestApp/ViewControllers/TextMaskingViewController.swift @@ -1,8 +1,8 @@ // -// UtilitiesViewController.swift +// TextMaskingViewController.swift // NRTestApp // -// Created by Chris Dillard on 5/30/25 +// Created by Chris Dillard on 7/25/25 // import UIKit diff --git a/Test Harness/NRTestApp/NRTestApp/ViewControllers/ViewController.swift b/Test Harness/NRTestApp/NRTestApp/ViewControllers/ViewController.swift index a7f69981..e77a0875 100644 --- a/Test Harness/NRTestApp/NRTestApp/ViewControllers/ViewController.swift +++ b/Test Harness/NRTestApp/NRTestApp/ViewControllers/ViewController.swift @@ -205,6 +205,8 @@ class ViewController: UIViewController { options.append(UtilOption(title: "Text Masking", handler: { [self] in textMaskingAction()})) + options.append(UtilOption(title: "Attributed String Text Masking", handler: { [self] in attributedStringTextMaskingAction()})) + options.append(UtilOption(title: "Collection View", handler: { [self] in collectionViewAction()})) options.append(UtilOption(title: "Diff Test View", handler: { [self] in diffTestViewAction()})) @@ -226,7 +228,6 @@ class ViewController: UIViewController { options.append(UtilOption(title: "SwiftUIViewRepresentable", handler: { [self] in swiftUIViewRepresentableTapped()})) - // In setupButtonsTable(), add these options: options.append(UtilOption(title: "Add Hello World Label", handler: { [self] in addHelloWorldLabel() })) options.append(UtilOption(title: "Remove Hello World Label", handler: { [self] in removeHelloWorldLabel() })) @@ -262,6 +263,10 @@ class ViewController: UIViewController { func textMaskingAction() { coordinator?.showTextMaskingController() } + + func attributedStringTextMaskingAction() { + coordinator?.showAttributedStringTextMaskingController() + } func collectionViewAction() { coordinator?.showCollectionController() diff --git a/Test Harness/NRTestApp/NRTestAppAsFramework.xctestplan b/Test Harness/NRTestApp/NRTestAppAsFramework.xctestplan new file mode 100644 index 00000000..40a3fb05 --- /dev/null +++ b/Test Harness/NRTestApp/NRTestAppAsFramework.xctestplan @@ -0,0 +1,39 @@ +{ + "configurations" : [ + { + "id" : "019C3755-F4EF-4C25-8E03-1F1947DF18D4", + "name" : "Configuration 1", + "options" : { + + } + } + ], + "defaultOptions" : { + + }, + "testTargets" : [ + { + "skippedTests" : [ + "NRTestAppTests\/testApodViewModel()", + "NRTestAppTests\/testAsyncInstrumentation()" + ], + "target" : { + "containerPath" : "container:NRTestApp.xcodeproj", + "identifier" : "2B459FD92E9EF52500CB66F3", + "name" : "NRTestAppAsFrameworkTests" + } + }, + { + "skippedTests" : [ + "NRTestAppUITests\/testARequests()", + "NRTestAppUITests\/testBRequests()" + ], + "target" : { + "containerPath" : "container:NRTestApp.xcodeproj", + "identifier" : "2B459FEF2E9EF52F00CB66F3", + "name" : "NRTestAppAsFrameworkUITests" + } + } + ], + "version" : 1 +} diff --git a/Test Harness/NRTestApp/NRTestAppAsFrameworkUITests-Info.plist b/Test Harness/NRTestApp/NRTestAppAsFrameworkUITests-Info.plist new file mode 100644 index 00000000..fc0f7984 --- /dev/null +++ b/Test Harness/NRTestApp/NRTestAppAsFrameworkUITests-Info.plist @@ -0,0 +1,11 @@ + + + + + NSAppTransportSecurity + + NSAllowsLocalNetworking + + + + diff --git a/Test Harness/NRTestApp/NRTestAppTests/NRTestAppFakeNavigationAction.swift b/Test Harness/NRTestApp/NRTestAppTests/NRTestAppFakeNavigationAction.swift index 74a72841..3ae3cdc5 100644 --- a/Test Harness/NRTestApp/NRTestAppTests/NRTestAppFakeNavigationAction.swift +++ b/Test Harness/NRTestApp/NRTestAppTests/NRTestAppFakeNavigationAction.swift @@ -7,7 +7,7 @@ import XCTest import WebKit -@testable import NRTestApp +@testable import NRTestAppAsFramework final class FakeNavigationAction: WKNavigationAction { let urlRequest: URLRequest diff --git a/Test Harness/NRTestApp/NRTestAppTests/NRTestAppNavigationTests.swift b/Test Harness/NRTestApp/NRTestAppTests/NRTestAppNavigationTests.swift index 7d5e1c7b..ff029706 100644 --- a/Test Harness/NRTestApp/NRTestAppTests/NRTestAppNavigationTests.swift +++ b/Test Harness/NRTestApp/NRTestAppTests/NRTestAppNavigationTests.swift @@ -6,7 +6,7 @@ // import XCTest -@testable import NRTestApp +@testable import NRTestAppAsFramework final class NRTestAppUITests: XCTestCase { diff --git a/Test Harness/NRTestApp/NRTestAppTests/NRTestAppTests.swift b/Test Harness/NRTestApp/NRTestAppTests/NRTestAppTests.swift index 7b589e5f..0e43f696 100644 --- a/Test Harness/NRTestApp/NRTestAppTests/NRTestAppTests.swift +++ b/Test Harness/NRTestApp/NRTestAppTests/NRTestAppTests.swift @@ -6,7 +6,7 @@ // import XCTest -@testable import NRTestApp +@testable import NRTestAppAsFramework final class NRTestAppTests: XCTestCase, URLAuthenticationChallengeSender { func use(_ credential: URLCredential, for challenge: URLAuthenticationChallenge) {} diff --git a/Test Harness/SessionReplayTest/SessionReplayTest.xcodeproj/xcshareddata/xcschemes/SessionReplayTest.xcscheme b/Test Harness/SessionReplayTest/SessionReplayTest.xcodeproj/xcshareddata/xcschemes/SessionReplayTest.xcscheme index b5ca9ad2..2033b615 100644 --- a/Test Harness/SessionReplayTest/SessionReplayTest.xcodeproj/xcshareddata/xcschemes/SessionReplayTest.xcscheme +++ b/Test Harness/SessionReplayTest/SessionReplayTest.xcodeproj/xcshareddata/xcschemes/SessionReplayTest.xcscheme @@ -37,14 +37,14 @@ enableASanStackUseAfterReturn = "YES" enableThreadSanitizer = "YES" disableMainThreadChecker = "YES" - disablePerformanceAntipatternChecker = "YES" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" enableGPUValidationMode = "1" - allowLocationSimulation = "YES"> + allowLocationSimulation = "YES" + disablePerformanceAntipatternChecker = "YES"> Clear(); } catch (std::invalid_argument& e) { - LLOG_AUDIT("Hex report not finalized: %s", e.what()); + // LLOG_AUDIT("Hex report not finalized: %s", e.what()); } catch (...) { - LLOG_AUDIT("Hex report not finalized:"); + // LLOG_AUDIT("Hex report not finalized:"); } } } diff --git a/libMobileAgent/src/Hex/src/HexStore.cxx b/libMobileAgent/src/Hex/src/HexStore.cxx index b678b1e8..88ea244f 100644 --- a/libMobileAgent/src/Hex/src/HexStore.cxx +++ b/libMobileAgent/src/Hex/src/HexStore.cxx @@ -27,8 +27,8 @@ namespace NewRelic { auto filename = generateFilename(); FILE* file = fopen(filename.c_str(), "wb"); if (file == nullptr) { - LLOG_ERROR("failed to write handled exception report to %s.\nerror %d: %s", filename.c_str(), errno, - strerror(errno)); + //LLOG_ERROR("failed to write handled exception report to %s.\nerror %d: %s", filename.c_str(), errno, + // strerror(errno)); return; } flatbuffers::FlatBufferBuilder builder{}; @@ -37,7 +37,7 @@ namespace NewRelic { auto size = fwrite(builder.GetBufferPointer(), sizeof(uint8_t), builder.GetSize(), file); if (size < builder.GetSize()) { if (ferror(file)) { - LLOG_ERROR("failed to write handled exception report.\nerror %d: %s", errno, strerror(errno)); + //LLOG_ERROR("failed to write handled exception report.\nerror %d: %s", errno, strerror(errno)); } } fclose(file); @@ -50,8 +50,8 @@ namespace NewRelic { std::lock_guard storeLock(_storeMutex); DIR* dirp = opendir(path.c_str()); if (dirp == nullptr) { - LLOG_ERROR("failed to open handled exception store dir: \"%s\".\nerror %d: %s", path.c_str(), errno, - strerror(errno)); + //LLOG_ERROR("failed to open handled exception store dir: \"%s\".\nerror %d: %s", path.c_str(), errno, + // strerror(errno)); return false; } struct dirent* dp = nullptr; @@ -74,7 +74,7 @@ namespace NewRelic { std::streamsize size = file.tellg(); if (size == -1) { - LLOG_ERROR("failed to get handled exception report file size: %s",filename.c_str()); + //LLOG_ERROR("failed to get handled exception report file size: %s",filename.c_str()); file.close(); } @@ -83,7 +83,7 @@ namespace NewRelic { if (file.read((char*) buf, size)) { callback(buf, size); } else { - LLOG_ERROR("failed to read file %s",filename.c_str()); + //LLOG_ERROR("failed to read file %s",filename.c_str()); } file.close(); remove(fullPath.str().c_str()); @@ -102,8 +102,8 @@ namespace NewRelic { std::lock_guard storeLock(_storeMutex); DIR* dirp = opendir(path.c_str()); if (dirp == nullptr) { - LLOG_ERROR("failed to open handled exception store dir: \"%s\".\nerror %d: %s", path.c_str(), errno, - strerror(errno)); + // LLOG_ERROR("failed to open handled exception store dir: \"%s\".\nerror %d: %s", path.c_str(), errno, + // strerror(errno)); return; } diff --git a/libMobileAgent/src/Hex/src/report/HexReport.cxx b/libMobileAgent/src/Hex/src/report/HexReport.cxx index a634c1e5..3491aa23 100644 --- a/libMobileAgent/src/Hex/src/report/HexReport.cxx +++ b/libMobileAgent/src/Hex/src/report/HexReport.cxx @@ -68,8 +68,8 @@ void HexReport::setAttributeNoValidation(const char* key, _longAttributes->add(std::string(key), value); // } } catch (std::exception& e) { - LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%d': %s", key, value, - e.what()); + //LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%d': %s", key, value, + // e.what()); } } @@ -80,8 +80,8 @@ void HexReport::setAttributeNoValidation(const char* key, _doubleAttributes->add(std::string(key), value); // } } catch (std::exception& e) { - LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%f': %s", key, value, - e.what()); + //LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%f': %s", key, value, + // e.what()); } } void HexReport::setAttributeNoValidation(const char* key, @@ -92,8 +92,8 @@ void HexReport::setAttributeNoValidation(const char* key, _stringAttributes->add(std::string(key), std::string(value)); // } } catch (std::exception& e) { - LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%s': %s", key, value, - e.what()); + //LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%s': %s", key, value, + // e.what()); } } @@ -104,8 +104,8 @@ void HexReport::setAttributeNoValidation(const char* key, _booleanAttributes->add(std::string(key), value); // } } catch (std::exception& e) { - LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%s': %s", key, - value ? "true" : "false", e.what()); + //LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%s': %s", key, + // value ? "true" : "false", e.what()); } } @@ -117,8 +117,8 @@ void HexReport::setAttribute(const char* key, _longAttributes->add(std::string(key), value); } } catch (std::exception& e) { - LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%d': %s", key, value, - e.what()); + //LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%d': %s", key, value, + // e.what()); } } void HexReport::setAttribute(const char* key, @@ -128,8 +128,8 @@ void HexReport::setAttribute(const char* key, _doubleAttributes->add(std::string(key), value); } } catch (std::exception& e) { - LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%f': %s", key, value, - e.what()); + //LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%f': %s", key, value, + // e.what()); } } @@ -141,8 +141,8 @@ void HexReport::setAttribute(const char* key, _stringAttributes->add(std::string(key), std::string(value)); } } catch (std::exception& e) { - LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%s': %s", key, value, - e.what()); + // LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%s': %s", key, value, + // e.what()); } } @@ -153,8 +153,8 @@ void HexReport::setAttribute(const char* key, _booleanAttributes->add(std::string(key), value); } } catch (std::exception& e) { - LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%s': %s", key, - value ? "true" : "false", e.what()); + // LLOG_ERROR("Handled Exception: Failed to insert attribute key, '%s', and value, '%s': %s", key, + // value ? "true" : "false", e.what()); } } diff --git a/libMobileAgent/src/Utilities/Utilities/Utilities.xcodeproj/project.pbxproj b/libMobileAgent/src/Utilities/Utilities/Utilities.xcodeproj/project.pbxproj index c0d038f5..7152d927 100644 --- a/libMobileAgent/src/Utilities/Utilities/Utilities.xcodeproj/project.pbxproj +++ b/libMobileAgent/src/Utilities/Utilities/Utilities.xcodeproj/project.pbxproj @@ -306,7 +306,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -384,7 +384,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -422,7 +422,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 16.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks",