diff --git a/ios/Measure.xcworkspace/contents.xcworkspacedata b/ios/Measure.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..c2cc016b9
--- /dev/null
+++ b/ios/Measure.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/ios/Measure.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Measure.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000..18d981003
--- /dev/null
+++ b/ios/Measure.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Measure.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Measure.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 000000000..c46d00437
--- /dev/null
+++ b/ios/Measure.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,15 @@
+{
+ "originHash" : "ca2b70622bceaacf465c6a2c4faed710abda8bd95f89c1332e1e2cdfe26063c1",
+ "pins" : [
+ {
+ "identity" : "plcrashreporter",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/microsoft/plcrashreporter",
+ "state" : {
+ "revision" : "6752f71de206f6a53fa6a758c3660fd9a7fe7527",
+ "version" : "1.11.2"
+ }
+ }
+ ],
+ "version" : 3
+}
diff --git a/ios/Measure.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate b/ios/Measure.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 000000000..054d81e6c
Binary files /dev/null and b/ios/Measure.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/ios/MeasureDemo/MeasureDemo.xcodeproj/project.pbxproj b/ios/MeasureDemo/MeasureDemo.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..80f5fd0e1
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo.xcodeproj/project.pbxproj
@@ -0,0 +1,396 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 56;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 524CC5812C6A180F001AB506 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524CC5802C6A180F001AB506 /* AppDelegate.swift */; };
+ 524CC5832C6A180F001AB506 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524CC5822C6A180F001AB506 /* SceneDelegate.swift */; };
+ 524CC5852C6A180F001AB506 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524CC5842C6A180F001AB506 /* ViewController.swift */; };
+ 524CC5882C6A180F001AB506 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 524CC5872C6A180F001AB506 /* Base */; };
+ 524CC58A2C6A1811001AB506 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 524CC5892C6A1811001AB506 /* Assets.xcassets */; };
+ 524CC58D2C6A1811001AB506 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 524CC58C2C6A1811001AB506 /* Base */; };
+ 524CC5E82C6A4C10001AB506 /* MeasureSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 524CC5E72C6A4C10001AB506 /* MeasureSDK.framework */; };
+ 524CC5E92C6A4C10001AB506 /* MeasureSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 524CC5E72C6A4C10001AB506 /* MeasureSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 524CC5E62C6A4B9F001AB506 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ 524CC5E92C6A4C10001AB506 /* MeasureSDK.framework in Embed Frameworks */,
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 524CC57D2C6A180F001AB506 /* MeasureDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MeasureDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 524CC5802C6A180F001AB506 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 524CC5822C6A180F001AB506 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
+ 524CC5842C6A180F001AB506 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
+ 524CC5872C6A180F001AB506 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 524CC5892C6A1811001AB506 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 524CC58C2C6A1811001AB506 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 524CC58E2C6A1811001AB506 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 524CC5E72C6A4C10001AB506 /* MeasureSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MeasureSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 524CC57A2C6A180F001AB506 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 524CC5E82C6A4C10001AB506 /* MeasureSDK.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 524CC5742C6A180F001AB506 = {
+ isa = PBXGroup;
+ children = (
+ 524CC57F2C6A180F001AB506 /* MeasureDemo */,
+ 524CC57E2C6A180F001AB506 /* Products */,
+ 524CC5942C6A1923001AB506 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 524CC57E2C6A180F001AB506 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC57D2C6A180F001AB506 /* MeasureDemo.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 524CC57F2C6A180F001AB506 /* MeasureDemo */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC5802C6A180F001AB506 /* AppDelegate.swift */,
+ 524CC5822C6A180F001AB506 /* SceneDelegate.swift */,
+ 524CC5842C6A180F001AB506 /* ViewController.swift */,
+ 524CC5862C6A180F001AB506 /* Main.storyboard */,
+ 524CC5892C6A1811001AB506 /* Assets.xcassets */,
+ 524CC58B2C6A1811001AB506 /* LaunchScreen.storyboard */,
+ 524CC58E2C6A1811001AB506 /* Info.plist */,
+ );
+ path = MeasureDemo;
+ sourceTree = "";
+ };
+ 524CC5942C6A1923001AB506 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC5E72C6A4C10001AB506 /* MeasureSDK.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 524CC57C2C6A180F001AB506 /* MeasureDemo */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 524CC5912C6A1811001AB506 /* Build configuration list for PBXNativeTarget "MeasureDemo" */;
+ buildPhases = (
+ 524CC5792C6A180F001AB506 /* Sources */,
+ 524CC57A2C6A180F001AB506 /* Frameworks */,
+ 524CC57B2C6A180F001AB506 /* Resources */,
+ 524CC5E62C6A4B9F001AB506 /* Embed Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = MeasureDemo;
+ productName = MeasureDemo;
+ productReference = 524CC57D2C6A180F001AB506 /* MeasureDemo.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 524CC5752C6A180F001AB506 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1530;
+ LastUpgradeCheck = 1530;
+ TargetAttributes = {
+ 524CC57C2C6A180F001AB506 = {
+ CreatedOnToolsVersion = 15.3;
+ };
+ };
+ };
+ buildConfigurationList = 524CC5782C6A180F001AB506 /* Build configuration list for PBXProject "MeasureDemo" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 524CC5742C6A180F001AB506;
+ productRefGroup = 524CC57E2C6A180F001AB506 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 524CC57C2C6A180F001AB506 /* MeasureDemo */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 524CC57B2C6A180F001AB506 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 524CC58A2C6A1811001AB506 /* Assets.xcassets in Resources */,
+ 524CC58D2C6A1811001AB506 /* Base in Resources */,
+ 524CC5882C6A180F001AB506 /* Base in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 524CC5792C6A180F001AB506 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 524CC5852C6A180F001AB506 /* ViewController.swift in Sources */,
+ 524CC5812C6A180F001AB506 /* AppDelegate.swift in Sources */,
+ 524CC5832C6A180F001AB506 /* SceneDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 524CC5862C6A180F001AB506 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 524CC5872C6A180F001AB506 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 524CC58B2C6A1811001AB506 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 524CC58C2C6A1811001AB506 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 524CC58F2C6A1811001AB506 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 524CC5902C6A1811001AB506 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 524CC5922C6A1811001AB506 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = MeasureDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.measure.MeasureDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 524CC5932C6A1811001AB506 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = MeasureDemo/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.measure.MeasureDemo;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 524CC5782C6A180F001AB506 /* Build configuration list for PBXProject "MeasureDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 524CC58F2C6A1811001AB506 /* Debug */,
+ 524CC5902C6A1811001AB506 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 524CC5912C6A1811001AB506 /* Build configuration list for PBXNativeTarget "MeasureDemo" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 524CC5922C6A1811001AB506 /* Debug */,
+ 524CC5932C6A1811001AB506 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 524CC5752C6A180F001AB506 /* Project object */;
+}
diff --git a/ios/MeasureDemo/MeasureDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/MeasureDemo/MeasureDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..919434a62
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/MeasureDemo/MeasureDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/MeasureDemo/MeasureDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000..18d981003
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/MeasureDemo/MeasureDemo.xcodeproj/project.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate b/ios/MeasureDemo/MeasureDemo.xcodeproj/project.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 000000000..543365eb2
Binary files /dev/null and b/ios/MeasureDemo/MeasureDemo.xcodeproj/project.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/ios/MeasureDemo/MeasureDemo.xcodeproj/xcuserdata/edpu.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/MeasureDemo/MeasureDemo.xcodeproj/xcuserdata/edpu.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 000000000..7f18445b8
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo.xcodeproj/xcuserdata/edpu.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,14 @@
+
+
+
+
+ SchemeUserState
+
+ MeasureDemo.xcscheme_^#shared#^_
+
+ orderHint
+ 1
+
+
+
+
diff --git a/ios/MeasureDemo/MeasureDemo/AppDelegate.swift b/ios/MeasureDemo/MeasureDemo/AppDelegate.swift
new file mode 100644
index 000000000..c6dc1a5c7
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo/AppDelegate.swift
@@ -0,0 +1,33 @@
+//
+// AppDelegate.swift
+// MeasureDemo
+//
+// Created by Adwin Ross on 12/08/24.
+//
+
+import UIKit
+import MeasureSDK
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ // Override point for customization after application launch.
+ Measure.start()
+ return true
+ }
+
+ // MARK: UISceneSession Lifecycle
+
+ func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
+ // Called when a new scene session is being created.
+ // Use this method to select a configuration to create the new scene with.
+ return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+ }
+
+ func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
+ // Called when the user discards a scene session.
+ // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+ // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+ }
+}
+
diff --git a/ios/MeasureDemo/MeasureDemo/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/MeasureDemo/MeasureDemo/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 000000000..eb8789700
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/MeasureDemo/MeasureDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/MeasureDemo/MeasureDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..13613e3ee
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/MeasureDemo/MeasureDemo/Assets.xcassets/Contents.json b/ios/MeasureDemo/MeasureDemo/Assets.xcassets/Contents.json
new file mode 100644
index 000000000..73c00596a
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/MeasureDemo/MeasureDemo/Base.lproj/LaunchScreen.storyboard b/ios/MeasureDemo/MeasureDemo/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 000000000..865e9329f
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/MeasureDemo/MeasureDemo/Base.lproj/Main.storyboard b/ios/MeasureDemo/MeasureDemo/Base.lproj/Main.storyboard
new file mode 100644
index 000000000..25a763858
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo/Base.lproj/Main.storyboard
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/MeasureDemo/MeasureDemo/Info.plist b/ios/MeasureDemo/MeasureDemo/Info.plist
new file mode 100644
index 000000000..dd3c9afda
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo/Info.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ $(PRODUCT_MODULE_NAME).SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
diff --git a/ios/MeasureDemo/MeasureDemo/SceneDelegate.swift b/ios/MeasureDemo/MeasureDemo/SceneDelegate.swift
new file mode 100644
index 000000000..af9a9bf4d
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo/SceneDelegate.swift
@@ -0,0 +1,51 @@
+//
+// SceneDelegate.swift
+// MeasureDemo
+//
+// Created by Adwin Ross on 12/08/24.
+//
+
+import UIKit
+
+class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+
+ var window: UIWindow?
+
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+ // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+ // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+ // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+ guard let _ = (scene as? UIWindowScene) else { return }
+ }
+
+ func sceneDidDisconnect(_ scene: UIScene) {
+ // Called as the scene is being released by the system.
+ // This occurs shortly after the scene enters the background, or when its session is discarded.
+ // Release any resources associated with this scene that can be re-created the next time the scene connects.
+ // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
+ }
+
+ func sceneDidBecomeActive(_ scene: UIScene) {
+ // Called when the scene has moved from an inactive state to an active state.
+ // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
+ }
+
+ func sceneWillResignActive(_ scene: UIScene) {
+ // Called when the scene will move from an active state to an inactive state.
+ // This may occur due to temporary interruptions (ex. an incoming phone call).
+ }
+
+ func sceneWillEnterForeground(_ scene: UIScene) {
+ // Called as the scene transitions from the background to the foreground.
+ // Use this method to undo the changes made on entering the background.
+ }
+
+ func sceneDidEnterBackground(_ scene: UIScene) {
+ // Called as the scene transitions from the foreground to the background.
+ // Use this method to save data, release shared resources, and store enough scene-specific state information
+ // to restore the scene back to its current state.
+ }
+
+
+}
+
diff --git a/ios/MeasureDemo/MeasureDemo/ViewController.swift b/ios/MeasureDemo/MeasureDemo/ViewController.swift
new file mode 100644
index 000000000..a0380016b
--- /dev/null
+++ b/ios/MeasureDemo/MeasureDemo/ViewController.swift
@@ -0,0 +1,99 @@
+//
+// ViewController.swift
+// MeasureDemo
+//
+// Created by Adwin Ross on 12/08/24.
+//
+
+import UIKit
+
+class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
+
+ let crashTypes = [
+ "Abort",
+ "Bad Pointer",
+ "Corrupt Memory",
+ "Corrupt Object",
+ "Deadlock",
+ "NSException",
+ "Stack Overflow",
+ "Zombie",
+ "Zombie NSException"
+ ]
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ let tableView = UITableView(frame: view.bounds, style: .plain)
+ tableView.delegate = self
+ tableView.dataSource = self
+
+ tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
+
+ view.addSubview(tableView)
+ }
+
+ // MARK: - UITableViewDataSource
+
+ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+ return crashTypes.count
+ }
+
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+ let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
+ cell.textLabel?.text = crashTypes[indexPath.row]
+ return cell
+ }
+
+ // MARK: - UITableViewDelegate
+
+ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+ let selectedCrashType = crashTypes[indexPath.row]
+ triggerCrash(type: selectedCrashType)
+ }
+
+ // MARK: - Crash Triggers
+
+ func triggerCrash(type: String) {
+ switch type {
+ case "Abort":
+ abort()
+ case "Bad Pointer":
+ let pointer = UnsafeMutableRawPointer(bitPattern: 0xdeadbeef)!
+ pointer.storeBytes(of: 0, as: Int.self)
+ case "Corrupt Memory":
+ let array = [1, 2, 3]
+ array.withUnsafeBufferPointer {
+ _ = $0.baseAddress!.advanced(by: 4).pointee
+ }
+ case "Corrupt Object":
+ let object: AnyObject = NSArray()
+ let _ = object.perform(Selector(("invalidSelector")))
+ case "Deadlock":
+ let queue = DispatchQueue(label: "deadlockQueue")
+ queue.sync {
+ queue.sync {}
+ }
+ case "NSException":
+ let array = NSArray()
+ print(array[1])
+ case "Stack Overflow":
+ func recurse() {
+ recurse()
+ }
+ recurse()
+ case "Zombie":
+ var object: NSObject? = NSObject()
+ let __weakObject = object
+ object = nil
+ print(__weakObject!.description)
+ case "Zombie NSException":
+ var exception: NSException? = NSException(name: .genericException, reason: "Test", userInfo: nil)
+ let __weakException = exception
+ exception = nil
+ __weakException?.raise()
+ default:
+ break
+ }
+ }
+}
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.pbxproj b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..043ac6bc8
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.pbxproj
@@ -0,0 +1,398 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 56;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 523C1AA72C6B14730081D1CC /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 523C1AA62C6B14730081D1CC /* AppDelegate.m */; };
+ 523C1AAA2C6B14730081D1CC /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 523C1AA92C6B14730081D1CC /* SceneDelegate.m */; };
+ 523C1AAD2C6B14730081D1CC /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 523C1AAC2C6B14730081D1CC /* ViewController.m */; };
+ 523C1AB02C6B14730081D1CC /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 523C1AAF2C6B14730081D1CC /* Base */; };
+ 523C1AB22C6B14770081D1CC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 523C1AB12C6B14770081D1CC /* Assets.xcassets */; };
+ 523C1AB52C6B14770081D1CC /* Base in Resources */ = {isa = PBXBuildFile; fileRef = 523C1AB42C6B14770081D1CC /* Base */; };
+ 523C1AB82C6B14770081D1CC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 523C1AB72C6B14770081D1CC /* main.m */; };
+ 523C1AC02C6B14AC0081D1CC /* MeasureSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 523C1ABF2C6B14AC0081D1CC /* MeasureSDK.framework */; };
+ 523C1AC12C6B14AC0081D1CC /* MeasureSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 523C1ABF2C6B14AC0081D1CC /* MeasureSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 523C1AC22C6B14AC0081D1CC /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ 523C1AC12C6B14AC0081D1CC /* MeasureSDK.framework in Embed Frameworks */,
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 523C1AA22C6B14730081D1CC /* MeasureDemoObjc.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MeasureDemoObjc.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 523C1AA52C6B14730081D1CC /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
+ 523C1AA62C6B14730081D1CC /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
+ 523C1AA82C6B14730081D1CC /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = ""; };
+ 523C1AA92C6B14730081D1CC /* SceneDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = ""; };
+ 523C1AAB2C6B14730081D1CC /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; };
+ 523C1AAC2C6B14730081D1CC /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; };
+ 523C1AAF2C6B14730081D1CC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 523C1AB12C6B14770081D1CC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 523C1AB42C6B14770081D1CC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 523C1AB62C6B14770081D1CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 523C1AB72C6B14770081D1CC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ 523C1ABF2C6B14AC0081D1CC /* MeasureSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MeasureSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 523C1A9F2C6B14730081D1CC /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 523C1AC02C6B14AC0081D1CC /* MeasureSDK.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 523C1A992C6B14730081D1CC = {
+ isa = PBXGroup;
+ children = (
+ 523C1AA42C6B14730081D1CC /* MeasureDemoObjc */,
+ 523C1AA32C6B14730081D1CC /* Products */,
+ 523C1ABE2C6B14AC0081D1CC /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 523C1AA32C6B14730081D1CC /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 523C1AA22C6B14730081D1CC /* MeasureDemoObjc.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 523C1AA42C6B14730081D1CC /* MeasureDemoObjc */ = {
+ isa = PBXGroup;
+ children = (
+ 523C1AA52C6B14730081D1CC /* AppDelegate.h */,
+ 523C1AA62C6B14730081D1CC /* AppDelegate.m */,
+ 523C1AA82C6B14730081D1CC /* SceneDelegate.h */,
+ 523C1AA92C6B14730081D1CC /* SceneDelegate.m */,
+ 523C1AAB2C6B14730081D1CC /* ViewController.h */,
+ 523C1AAC2C6B14730081D1CC /* ViewController.m */,
+ 523C1AAE2C6B14730081D1CC /* Main.storyboard */,
+ 523C1AB12C6B14770081D1CC /* Assets.xcassets */,
+ 523C1AB32C6B14770081D1CC /* LaunchScreen.storyboard */,
+ 523C1AB62C6B14770081D1CC /* Info.plist */,
+ 523C1AB72C6B14770081D1CC /* main.m */,
+ );
+ path = MeasureDemoObjc;
+ sourceTree = "";
+ };
+ 523C1ABE2C6B14AC0081D1CC /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 523C1ABF2C6B14AC0081D1CC /* MeasureSDK.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 523C1AA12C6B14730081D1CC /* MeasureDemoObjc */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 523C1ABB2C6B14770081D1CC /* Build configuration list for PBXNativeTarget "MeasureDemoObjc" */;
+ buildPhases = (
+ 523C1A9E2C6B14730081D1CC /* Sources */,
+ 523C1A9F2C6B14730081D1CC /* Frameworks */,
+ 523C1AA02C6B14730081D1CC /* Resources */,
+ 523C1AC22C6B14AC0081D1CC /* Embed Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = MeasureDemoObjc;
+ productName = MeasureDemoObjc;
+ productReference = 523C1AA22C6B14730081D1CC /* MeasureDemoObjc.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 523C1A9A2C6B14730081D1CC /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastUpgradeCheck = 1530;
+ TargetAttributes = {
+ 523C1AA12C6B14730081D1CC = {
+ CreatedOnToolsVersion = 15.3;
+ };
+ };
+ };
+ buildConfigurationList = 523C1A9D2C6B14730081D1CC /* Build configuration list for PBXProject "MeasureDemoObjc" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 523C1A992C6B14730081D1CC;
+ productRefGroup = 523C1AA32C6B14730081D1CC /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 523C1AA12C6B14730081D1CC /* MeasureDemoObjc */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 523C1AA02C6B14730081D1CC /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 523C1AB22C6B14770081D1CC /* Assets.xcassets in Resources */,
+ 523C1AB52C6B14770081D1CC /* Base in Resources */,
+ 523C1AB02C6B14730081D1CC /* Base in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 523C1A9E2C6B14730081D1CC /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 523C1AAD2C6B14730081D1CC /* ViewController.m in Sources */,
+ 523C1AA72C6B14730081D1CC /* AppDelegate.m in Sources */,
+ 523C1AB82C6B14770081D1CC /* main.m in Sources */,
+ 523C1AAA2C6B14730081D1CC /* SceneDelegate.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 523C1AAE2C6B14730081D1CC /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 523C1AAF2C6B14730081D1CC /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 523C1AB32C6B14770081D1CC /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 523C1AB42C6B14770081D1CC /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 523C1AB92C6B14770081D1CC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ 523C1ABA2C6B14770081D1CC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 523C1ABC2C6B14770081D1CC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = MeasureDemoObjc/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.measure.MeasureDemoObjc;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 523C1ABD2C6B14770081D1CC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = MeasureDemoObjc/Info.plist;
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.measure.MeasureDemoObjc;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 523C1A9D2C6B14730081D1CC /* Build configuration list for PBXProject "MeasureDemoObjc" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 523C1AB92C6B14770081D1CC /* Debug */,
+ 523C1ABA2C6B14770081D1CC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 523C1ABB2C6B14770081D1CC /* Build configuration list for PBXNativeTarget "MeasureDemoObjc" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 523C1ABC2C6B14770081D1CC /* Debug */,
+ 523C1ABD2C6B14770081D1CC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 523C1A9A2C6B14730081D1CC /* Project object */;
+}
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..919434a62
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000..18d981003
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 000000000..cf2c2f6bd
Binary files /dev/null and b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/project.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/xcuserdata/edpu.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/xcuserdata/edpu.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 000000000..20d208447
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc.xcodeproj/xcuserdata/edpu.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,14 @@
+
+
+
+
+ SchemeUserState
+
+ MeasureDemoObjc.xcscheme_^#shared#^_
+
+ orderHint
+ 0
+
+
+
+
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/AppDelegate.h b/ios/MeasureDemoObjc/MeasureDemoObjc/AppDelegate.h
new file mode 100644
index 000000000..dd532f1d5
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/AppDelegate.h
@@ -0,0 +1,14 @@
+//
+// AppDelegate.h
+// MeasureDemoObjc
+//
+// Created by Adwin Ross on 13/08/24.
+//
+
+#import
+
+@interface AppDelegate : UIResponder
+
+
+@end
+
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/AppDelegate.m b/ios/MeasureDemoObjc/MeasureDemoObjc/AppDelegate.m
new file mode 100644
index 000000000..87d5db1db
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/AppDelegate.m
@@ -0,0 +1,42 @@
+//
+// AppDelegate.m
+// MeasureDemoObjc
+//
+// Created by Adwin Ross on 13/08/24.
+//
+
+#import "AppDelegate.h"
+#import "MeasureSDK/MeasureSDK.h"
+
+@interface AppDelegate ()
+
+@end
+
+@implementation AppDelegate
+
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ // Override point for customization after application launch.
+ [Measure start];
+ return YES;
+}
+
+
+#pragma mark - UISceneSession lifecycle
+
+
+- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
+ // Called when a new scene session is being created.
+ // Use this method to select a configuration to create the new scene with.
+ return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
+}
+
+
+- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet *)sceneSessions {
+ // Called when the user discards a scene session.
+ // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+ // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+}
+
+
+@end
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/MeasureDemoObjc/MeasureDemoObjc/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 000000000..eb8789700
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/MeasureDemoObjc/MeasureDemoObjc/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..13613e3ee
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/Assets.xcassets/Contents.json b/ios/MeasureDemoObjc/MeasureDemoObjc/Assets.xcassets/Contents.json
new file mode 100644
index 000000000..73c00596a
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/Base.lproj/LaunchScreen.storyboard b/ios/MeasureDemoObjc/MeasureDemoObjc/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 000000000..865e9329f
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/Base.lproj/Main.storyboard b/ios/MeasureDemoObjc/MeasureDemoObjc/Base.lproj/Main.storyboard
new file mode 100644
index 000000000..808a21ce7
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/Base.lproj/Main.storyboard
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/Info.plist b/ios/MeasureDemoObjc/MeasureDemoObjc/Info.plist
new file mode 100644
index 000000000..81ed29b76
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/Info.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/SceneDelegate.h b/ios/MeasureDemoObjc/MeasureDemoObjc/SceneDelegate.h
new file mode 100644
index 000000000..8122cf0f8
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/SceneDelegate.h
@@ -0,0 +1,15 @@
+//
+// SceneDelegate.h
+// MeasureDemoObjc
+//
+// Created by Adwin Ross on 13/08/24.
+//
+
+#import
+
+@interface SceneDelegate : UIResponder
+
+@property (strong, nonatomic) UIWindow * window;
+
+@end
+
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/SceneDelegate.m b/ios/MeasureDemoObjc/MeasureDemoObjc/SceneDelegate.m
new file mode 100644
index 000000000..4a2702880
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/SceneDelegate.m
@@ -0,0 +1,57 @@
+//
+// SceneDelegate.m
+// MeasureDemoObjc
+//
+// Created by Adwin Ross on 13/08/24.
+//
+
+#import "SceneDelegate.h"
+
+@interface SceneDelegate ()
+
+@end
+
+@implementation SceneDelegate
+
+
+- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
+ // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+ // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+ // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+}
+
+
+- (void)sceneDidDisconnect:(UIScene *)scene {
+ // Called as the scene is being released by the system.
+ // This occurs shortly after the scene enters the background, or when its session is discarded.
+ // Release any resources associated with this scene that can be re-created the next time the scene connects.
+ // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
+}
+
+
+- (void)sceneDidBecomeActive:(UIScene *)scene {
+ // Called when the scene has moved from an inactive state to an active state.
+ // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
+}
+
+
+- (void)sceneWillResignActive:(UIScene *)scene {
+ // Called when the scene will move from an active state to an inactive state.
+ // This may occur due to temporary interruptions (ex. an incoming phone call).
+}
+
+
+- (void)sceneWillEnterForeground:(UIScene *)scene {
+ // Called as the scene transitions from the background to the foreground.
+ // Use this method to undo the changes made on entering the background.
+}
+
+
+- (void)sceneDidEnterBackground:(UIScene *)scene {
+ // Called as the scene transitions from the foreground to the background.
+ // Use this method to save data, release shared resources, and store enough scene-specific state information
+ // to restore the scene back to its current state.
+}
+
+
+@end
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/ViewController.h b/ios/MeasureDemoObjc/MeasureDemoObjc/ViewController.h
new file mode 100644
index 000000000..a9141f5eb
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/ViewController.h
@@ -0,0 +1,14 @@
+//
+// ViewController.h
+// MeasureDemoObjc
+//
+// Created by Adwin Ross on 13/08/24.
+//
+
+#import
+
+@interface ViewController : UIViewController
+
+
+@end
+
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/ViewController.m b/ios/MeasureDemoObjc/MeasureDemoObjc/ViewController.m
new file mode 100644
index 000000000..d2e66a840
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/ViewController.m
@@ -0,0 +1,106 @@
+//
+// ViewController.m
+// MeasureDemoObjc
+//
+// Created by Adwin Ross on 13/08/24.
+//
+
+#import "ViewController.h"
+
+@interface ViewController ()
+
+@property (nonatomic, strong) NSArray *crashTypes;
+
+@end
+
+@implementation ViewController
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ // Initialize the crash types array
+ self.crashTypes = @[
+ @"Abort",
+ @"Bad Pointer",
+ @"Corrupt Memory",
+ @"Corrupt Object",
+ @"Deadlock",
+ @"NSException",
+ @"Stack Overflow",
+ @"Zombie",
+ @"Zombie NSException"
+ ];
+
+ // Create the table view
+ UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
+ tableView.delegate = self;
+ tableView.dataSource = self;
+
+ // Register a simple UITableViewCell class for use in creating cells
+ [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
+
+ // Add the table view to the view controller's view
+ [self.view addSubview:tableView];
+}
+
+#pragma mark - UITableViewDataSource
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return self.crashTypes.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
+ cell.textLabel.text = self.crashTypes[indexPath.row];
+ return cell;
+}
+
+#pragma mark - UITableViewDelegate
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+ NSString *selectedCrashType = self.crashTypes[indexPath.row];
+ [self triggerCrash:selectedCrashType];
+}
+
+#pragma mark - Crash Triggers
+
+- (void)triggerCrash:(NSString *)type {
+ if ([type isEqualToString:@"Abort"]) {
+ abort();
+ } else if ([type isEqualToString:@"Bad Pointer"]) {
+ int *pointer = (int *)0xdeadbeef;
+ *pointer = 0;
+ } else if ([type isEqualToString:@"Corrupt Memory"]) {
+ int array[3] = {1, 2, 3};
+ int corruptValue = array[4]; // Accessing out of bounds memory
+ NSLog(@"%d", corruptValue);
+ } else if ([type isEqualToString:@"Corrupt Object"]) {
+ id object = [NSArray new];
+ [object performSelector:NSSelectorFromString(@"invalidSelector")];
+ } else if ([type isEqualToString:@"Deadlock"]) {
+ dispatch_queue_t queue = dispatch_queue_create("deadlockQueue", NULL);
+ dispatch_sync(queue, ^{
+ dispatch_sync(queue, ^{
+ // This will cause a deadlock
+ });
+ });
+ } else if ([type isEqualToString:@"NSException"]) {
+ NSArray *array = @[];
+ NSLog(@"%@", array[1]); // This will throw an exception
+ } else if ([type isEqualToString:@"Stack Overflow"]) {
+ [self causeStackOverflow];
+ } else if ([type isEqualToString:@"Zombie"]) {
+ __weak id object = [NSObject new];
+ NSLog(@"%@", [object description]); // Accessing a zombie object
+ } else if ([type isEqualToString:@"Zombie NSException"]) {
+ __weak NSException *exception = [NSException exceptionWithName:@"TestException" reason:@"Testing" userInfo:nil];
+ exception = nil;
+ [exception raise]; // This will crash due to a zombie exception
+ }
+}
+
+- (void)causeStackOverflow {
+ [self causeStackOverflow]; // Recursive call to cause a stack overflow
+}
+
+@end
diff --git a/ios/MeasureDemoObjc/MeasureDemoObjc/main.m b/ios/MeasureDemoObjc/MeasureDemoObjc/main.m
new file mode 100644
index 000000000..0c4e72f56
--- /dev/null
+++ b/ios/MeasureDemoObjc/MeasureDemoObjc/main.m
@@ -0,0 +1,18 @@
+//
+// main.m
+// MeasureDemoObjc
+//
+// Created by EdPu on 13/08/24.
+//
+
+#import
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+ NSString * appDelegateClassName;
+ @autoreleasepool {
+ // Setup code that might create autoreleased objects goes here.
+ appDelegateClassName = NSStringFromClass([AppDelegate class]);
+ }
+ return UIApplicationMain(argc, argv, nil, appDelegateClassName);
+}
diff --git a/ios/MeasureSDK/MeasureSDK.xcodeproj/project.pbxproj b/ios/MeasureSDK/MeasureSDK.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..4cd76a6e3
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK.xcodeproj/project.pbxproj
@@ -0,0 +1,585 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 56;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 523C1AC52C6B1B850081D1CC /* CrashReporter in Frameworks */ = {isa = PBXBuildFile; productRef = 523C1AC42C6B1B850081D1CC /* CrashReporter */; };
+ 524CC5C32C6A4B12001AB506 /* MeasureSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 524CC5BA2C6A4B11001AB506 /* MeasureSDK.framework */; };
+ 524CC5C82C6A4B12001AB506 /* MeasureSDKTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524CC5C72C6A4B12001AB506 /* MeasureSDKTests.swift */; };
+ 524CC5C92C6A4B12001AB506 /* MeasureSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 524CC5BD2C6A4B11001AB506 /* MeasureSDK.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 524CC5DC2C6A4B48001AB506 /* CoreDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524CC5D22C6A4B48001AB506 /* CoreDataManager.swift */; };
+ 524CC5DD2C6A4B48001AB506 /* MeasureModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 524CC5D42C6A4B48001AB506 /* MeasureModel.xcdatamodeld */; };
+ 524CC5DE2C6A4B48001AB506 /* MeasureCrashReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524CC5D72C6A4B48001AB506 /* MeasureCrashReporter.swift */; };
+ 524CC5DF2C6A4B48001AB506 /* Measure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524CC5D92C6A4B48001AB506 /* Measure.swift */; };
+ 524CC5EE2C6A55F0001AB506 /* CrashReportManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524CC5ED2C6A55F0001AB506 /* CrashReportManager.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 524CC5C42C6A4B12001AB506 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 524CC5B12C6A4B11001AB506 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 524CC5B92C6A4B11001AB506;
+ remoteInfo = MeasureSDK;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 524CC5BA2C6A4B11001AB506 /* MeasureSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MeasureSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 524CC5BD2C6A4B11001AB506 /* MeasureSDK.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MeasureSDK.h; sourceTree = ""; };
+ 524CC5C22C6A4B12001AB506 /* MeasureSDKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MeasureSDKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 524CC5C72C6A4B12001AB506 /* MeasureSDKTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeasureSDKTests.swift; sourceTree = ""; };
+ 524CC5D22C6A4B48001AB506 /* CoreDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataManager.swift; sourceTree = ""; };
+ 524CC5D62C6A4B48001AB506 /* MeasureModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MeasureModel.xcdatamodel; sourceTree = ""; };
+ 524CC5D72C6A4B48001AB506 /* MeasureCrashReporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeasureCrashReporter.swift; sourceTree = ""; };
+ 524CC5D92C6A4B48001AB506 /* Measure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Measure.swift; sourceTree = ""; };
+ 524CC5ED2C6A55F0001AB506 /* CrashReportManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashReportManager.swift; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 524CC5B72C6A4B11001AB506 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 523C1AC52C6B1B850081D1CC /* CrashReporter in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 524CC5BF2C6A4B12001AB506 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 524CC5C32C6A4B12001AB506 /* MeasureSDK.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 524CC5B02C6A4B11001AB506 = {
+ isa = PBXGroup;
+ children = (
+ 524CC5BC2C6A4B11001AB506 /* MeasureSDK */,
+ 524CC5C62C6A4B12001AB506 /* MeasureSDKTests */,
+ 524CC5BB2C6A4B11001AB506 /* Products */,
+ );
+ sourceTree = "";
+ };
+ 524CC5BB2C6A4B11001AB506 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC5BA2C6A4B11001AB506 /* MeasureSDK.framework */,
+ 524CC5C22C6A4B12001AB506 /* MeasureSDKTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 524CC5BC2C6A4B11001AB506 /* MeasureSDK */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC5DA2C6A4B48001AB506 /* Config */,
+ 524CC5D32C6A4B48001AB506 /* CoreData */,
+ 524CC5D82C6A4B48001AB506 /* CrashReporter */,
+ 524CC5DB2C6A4B48001AB506 /* Utils */,
+ 524CC5D52C6A4B48001AB506 /* XCDataModel */,
+ 524CC5BD2C6A4B11001AB506 /* MeasureSDK.h */,
+ );
+ path = MeasureSDK;
+ sourceTree = "";
+ };
+ 524CC5C62C6A4B12001AB506 /* MeasureSDKTests */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC5C72C6A4B12001AB506 /* MeasureSDKTests.swift */,
+ );
+ path = MeasureSDKTests;
+ sourceTree = "";
+ };
+ 524CC5D32C6A4B48001AB506 /* CoreData */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC5D22C6A4B48001AB506 /* CoreDataManager.swift */,
+ );
+ path = CoreData;
+ sourceTree = "";
+ };
+ 524CC5D52C6A4B48001AB506 /* XCDataModel */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC5D42C6A4B48001AB506 /* MeasureModel.xcdatamodeld */,
+ );
+ path = XCDataModel;
+ sourceTree = "";
+ };
+ 524CC5D82C6A4B48001AB506 /* CrashReporter */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC5D72C6A4B48001AB506 /* MeasureCrashReporter.swift */,
+ 524CC5ED2C6A55F0001AB506 /* CrashReportManager.swift */,
+ );
+ path = CrashReporter;
+ sourceTree = "";
+ };
+ 524CC5DA2C6A4B48001AB506 /* Config */ = {
+ isa = PBXGroup;
+ children = (
+ 524CC5D92C6A4B48001AB506 /* Measure.swift */,
+ );
+ path = Config;
+ sourceTree = "";
+ };
+ 524CC5DB2C6A4B48001AB506 /* Utils */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ path = Utils;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 524CC5B52C6A4B11001AB506 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 524CC5C92C6A4B12001AB506 /* MeasureSDK.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 524CC5B92C6A4B11001AB506 /* MeasureSDK */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 524CC5CC2C6A4B12001AB506 /* Build configuration list for PBXNativeTarget "MeasureSDK" */;
+ buildPhases = (
+ 524CC5B52C6A4B11001AB506 /* Headers */,
+ 524CC5B62C6A4B11001AB506 /* Sources */,
+ 524CC5B72C6A4B11001AB506 /* Frameworks */,
+ 524CC5B82C6A4B11001AB506 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = MeasureSDK;
+ packageProductDependencies = (
+ 523C1AC42C6B1B850081D1CC /* CrashReporter */,
+ );
+ productName = MeasureSDK;
+ productReference = 524CC5BA2C6A4B11001AB506 /* MeasureSDK.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+ 524CC5C12C6A4B12001AB506 /* MeasureSDKTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 524CC5CF2C6A4B12001AB506 /* Build configuration list for PBXNativeTarget "MeasureSDKTests" */;
+ buildPhases = (
+ 524CC5BE2C6A4B12001AB506 /* Sources */,
+ 524CC5BF2C6A4B12001AB506 /* Frameworks */,
+ 524CC5C02C6A4B12001AB506 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 524CC5C52C6A4B12001AB506 /* PBXTargetDependency */,
+ );
+ name = MeasureSDKTests;
+ productName = MeasureSDKTests;
+ productReference = 524CC5C22C6A4B12001AB506 /* MeasureSDKTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 524CC5B12C6A4B11001AB506 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1530;
+ LastUpgradeCheck = 1530;
+ TargetAttributes = {
+ 524CC5B92C6A4B11001AB506 = {
+ CreatedOnToolsVersion = 15.3;
+ };
+ 524CC5C12C6A4B12001AB506 = {
+ CreatedOnToolsVersion = 15.3;
+ };
+ };
+ };
+ buildConfigurationList = 524CC5B42C6A4B11001AB506 /* Build configuration list for PBXProject "MeasureSDK" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 524CC5B02C6A4B11001AB506;
+ packageReferences = (
+ 523C1AC32C6B1B850081D1CC /* XCRemoteSwiftPackageReference "plcrashreporter" */,
+ );
+ productRefGroup = 524CC5BB2C6A4B11001AB506 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 524CC5B92C6A4B11001AB506 /* MeasureSDK */,
+ 524CC5C12C6A4B12001AB506 /* MeasureSDKTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 524CC5B82C6A4B11001AB506 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 524CC5C02C6A4B12001AB506 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 524CC5B62C6A4B11001AB506 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 524CC5DE2C6A4B48001AB506 /* MeasureCrashReporter.swift in Sources */,
+ 524CC5DD2C6A4B48001AB506 /* MeasureModel.xcdatamodeld in Sources */,
+ 524CC5EE2C6A55F0001AB506 /* CrashReportManager.swift in Sources */,
+ 524CC5DF2C6A4B48001AB506 /* Measure.swift in Sources */,
+ 524CC5DC2C6A4B48001AB506 /* CoreDataManager.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 524CC5BE2C6A4B12001AB506 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 524CC5C82C6A4B12001AB506 /* MeasureSDKTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 524CC5C52C6A4B12001AB506 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 524CC5B92C6A4B11001AB506 /* MeasureSDK */;
+ targetProxy = 524CC5C42C6A4B12001AB506 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 524CC5CA2C6A4B12001AB506 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_INSTALL_OBJC_HEADER = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ 524CC5CB2C6A4B12001AB506 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ CURRENT_PROJECT_VERSION = 1;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.4;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_INSTALL_OBJC_HEADER = YES;
+ VALIDATE_PRODUCT = YES;
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ 524CC5CD2C6A4B12001AB506 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 12;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ OTHER_SWIFT_FLAGS = "-no-verify-emitted-module-interface";
+ PRODUCT_BUNDLE_IDENTIFIER = com.measure.MeasureSDK;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_OBJC_HEADER = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 524CC5CE2C6A4B12001AB506 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 12;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ OTHER_SWIFT_FLAGS = "-no-verify-emitted-module-interface";
+ PRODUCT_BUNDLE_IDENTIFIER = com.measure.MeasureSDK;
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_OBJC_HEADER = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 524CC5D02C6A4B12001AB506 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.measure.MeasureSDKTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 524CC5D12C6A4B12001AB506 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.measure.MeasureSDKTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 524CC5B42C6A4B11001AB506 /* Build configuration list for PBXProject "MeasureSDK" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 524CC5CA2C6A4B12001AB506 /* Debug */,
+ 524CC5CB2C6A4B12001AB506 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 524CC5CC2C6A4B12001AB506 /* Build configuration list for PBXNativeTarget "MeasureSDK" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 524CC5CD2C6A4B12001AB506 /* Debug */,
+ 524CC5CE2C6A4B12001AB506 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 524CC5CF2C6A4B12001AB506 /* Build configuration list for PBXNativeTarget "MeasureSDKTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 524CC5D02C6A4B12001AB506 /* Debug */,
+ 524CC5D12C6A4B12001AB506 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+ 523C1AC32C6B1B850081D1CC /* XCRemoteSwiftPackageReference "plcrashreporter" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/microsoft/plcrashreporter";
+ requirement = {
+ kind = exactVersion;
+ version = 1.11.2;
+ };
+ };
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 523C1AC42C6B1B850081D1CC /* CrashReporter */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 523C1AC32C6B1B850081D1CC /* XCRemoteSwiftPackageReference "plcrashreporter" */;
+ productName = CrashReporter;
+ };
+/* End XCSwiftPackageProductDependency section */
+
+/* Begin XCVersionGroup section */
+ 524CC5D42C6A4B48001AB506 /* MeasureModel.xcdatamodeld */ = {
+ isa = XCVersionGroup;
+ children = (
+ 524CC5D62C6A4B48001AB506 /* MeasureModel.xcdatamodel */,
+ );
+ currentVersion = 524CC5D62C6A4B48001AB506 /* MeasureModel.xcdatamodel */;
+ name = MeasureModel.xcdatamodeld;
+ path = /Users/edpu/Documents/Workspace/measure/ios/MeasureSDK/MeasureSDK/XCDataModel/MeasureModel.xcdatamodeld;
+ sourceTree = "";
+ versionGroupType = wrapper.xcdatamodel;
+ };
+/* End XCVersionGroup section */
+ };
+ rootObject = 524CC5B12C6A4B11001AB506 /* Project object */;
+}
diff --git a/ios/MeasureSDK/MeasureSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/MeasureSDK/MeasureSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..919434a62
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/MeasureSDK/MeasureSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/MeasureSDK/MeasureSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 000000000..18d981003
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/MeasureSDK/MeasureSDK.xcodeproj/project.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate b/ios/MeasureSDK/MeasureSDK.xcodeproj/project.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 000000000..e69f54405
Binary files /dev/null and b/ios/MeasureSDK/MeasureSDK.xcodeproj/project.xcworkspace/xcuserdata/edpu.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/ios/MeasureSDK/MeasureSDK.xcodeproj/xcuserdata/edpu.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/MeasureSDK/MeasureSDK.xcodeproj/xcuserdata/edpu.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 000000000..499bb41d5
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK.xcodeproj/xcuserdata/edpu.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,14 @@
+
+
+
+
+ SchemeUserState
+
+ MeasureSDK.xcscheme_^#shared#^_
+
+ orderHint
+ 2
+
+
+
+
diff --git a/ios/MeasureSDK/MeasureSDK/Config/Measure.swift b/ios/MeasureSDK/MeasureSDK/Config/Measure.swift
new file mode 100644
index 000000000..41b4b694c
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK/Config/Measure.swift
@@ -0,0 +1,16 @@
+//
+// Measure.swift
+// Measure
+//
+// Created by Adwin Ross on 12/08/24.
+//
+
+import Foundation
+
+@objc public class Measure: NSObject {
+ private override init() {}
+
+ @objc public static func start() {
+ CrashReportManager.shared.start()
+ }
+}
diff --git a/ios/MeasureSDK/MeasureSDK/CoreData/CoreDataManager.swift b/ios/MeasureSDK/MeasureSDK/CoreData/CoreDataManager.swift
new file mode 100644
index 000000000..bbcc4d5c1
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK/CoreData/CoreDataManager.swift
@@ -0,0 +1,45 @@
+//
+// CoreDataManager.swift
+// Measure
+//
+// Created by Adwin Ross on 12/08/24.
+//
+
+import Foundation
+import CoreData
+
+class CoreDataManager {
+ static let shared = CoreDataManager()
+
+ private let persistentContainer: NSPersistentContainer
+ private lazy var mainContext: NSManagedObjectContext = {
+ let context = persistentContainer.viewContext
+ context.mergePolicy = NSMergePolicy(merge: .mergeByPropertyStoreTrumpMergePolicyType)
+ return context
+ }()
+
+ private init() {
+ guard let modelURL = Bundle(for: type(of: self)).url(forResource: "MeasureModel", withExtension:"momd") else {
+ fatalError("Error loading model from bundle")
+ }
+
+ guard let mom = NSManagedObjectModel(contentsOf: modelURL) else {
+ fatalError("Error initializing mom from: \(modelURL)")
+ }
+ persistentContainer = NSPersistentContainer(name: "MeasureModel", managedObjectModel: mom)
+ persistentContainer.loadPersistentStores(completionHandler: { (storeDescription, error) in
+ if let error = error as NSError? {
+ fatalError("Unresolved error \(error), \(error.userInfo)")
+ }
+ })
+ }
+
+ // MARK: - Private Context Creation
+
+ private func newBackgroundContext() -> NSManagedObjectContext {
+ let context = persistentContainer.newBackgroundContext()
+ context.mergePolicy = NSMergePolicy(merge: .mergeByPropertyObjectTrumpMergePolicyType)
+ return context
+ }
+}
+
diff --git a/ios/MeasureSDK/MeasureSDK/CrashReporter/CrashReportManager.swift b/ios/MeasureSDK/MeasureSDK/CrashReporter/CrashReportManager.swift
new file mode 100644
index 000000000..47b2ca773
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK/CrashReporter/CrashReportManager.swift
@@ -0,0 +1,20 @@
+//
+// CrashReportManager.swift
+// MeasureSDK
+//
+// Created by Adwin Ross on 12/08/24.
+//
+
+import Foundation
+
+class CrashReportManager {
+ static let shared = CrashReportManager()
+ let crashReporter = MeasureCrashReporter()
+
+ private init() {}
+
+ func start() {
+ crashReporter.initializeCrashReporter(with: UUID().uuidString)
+ crashReporter.handleCrashReport()
+ }
+}
diff --git a/ios/MeasureSDK/MeasureSDK/CrashReporter/MeasureCrashReporter.swift b/ios/MeasureSDK/MeasureSDK/CrashReporter/MeasureCrashReporter.swift
new file mode 100644
index 000000000..698e41a83
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK/CrashReporter/MeasureCrashReporter.swift
@@ -0,0 +1,49 @@
+//
+// CrashReporter.swift
+// Measure
+//
+// Created by Adwin Ross on 12/08/24.
+//
+
+import Foundation
+import CrashReporter
+
+class MeasureCrashReporter {
+ private let crashReporter = PLCrashReporter()
+
+ func initializeCrashReporter(with sessionId: String) {
+ do {
+ let customData = ["session_id": sessionId]
+ do {
+ let jsonData = try JSONSerialization.data(withJSONObject: customData, options: [])
+ crashReporter.customData = jsonData
+ } catch {
+ print("Error converting dictionary to JSON data: \(error)")
+ }
+ try crashReporter.enableAndReturnError()
+ } catch {
+ print("Could not enable crash reporter: \(error)")
+ }
+ }
+
+ func handleCrashReport() {
+ if crashReporter.hasPendingCrashReport() {
+ do {
+ let crashPath = crashReporter.crashReportPath()
+ let crashData = try crashReporter.loadPendingCrashReportDataAndReturnError()
+ let crashReport = try PLCrashReport(data: crashData)
+
+ // Convert the crash report to a human-readable string
+ let crashReportString = PLCrashReportTextFormatter.stringValue(for: crashReport, with: PLCrashReportTextFormatiOS)
+
+ // Save the crash report to a file or send it to your server
+ print(crashReportString ?? "No crash report string")
+
+ // Purge the report
+ crashReporter.purgePendingCrashReport()
+ } catch {
+ print("Could not load crash report: \(error)")
+ }
+ }
+ }
+}
diff --git a/ios/MeasureSDK/MeasureSDK/MeasureSDK.h b/ios/MeasureSDK/MeasureSDK/MeasureSDK.h
new file mode 100644
index 000000000..054089ffc
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK/MeasureSDK.h
@@ -0,0 +1,16 @@
+//
+// MeasureSDK.h
+// MeasureSDK
+//
+// Created by Adwin Ross on 12/08/24.
+//
+
+#import
+
+//! Project version number for MeasureSDK.
+FOUNDATION_EXPORT double MeasureSDKVersionNumber;
+
+//! Project version string for MeasureSDK.
+FOUNDATION_EXPORT const unsigned char MeasureSDKVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
diff --git a/ios/MeasureSDK/MeasureSDK/XCDataModel/MeasureModel.xcdatamodeld/MeasureModel.xcdatamodel/contents b/ios/MeasureSDK/MeasureSDK/XCDataModel/MeasureModel.xcdatamodeld/MeasureModel.xcdatamodel/contents
new file mode 100644
index 000000000..ae6e40d3f
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDK/XCDataModel/MeasureModel.xcdatamodeld/MeasureModel.xcdatamodel/contents
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/ios/MeasureSDK/MeasureSDKTests/MeasureSDKTests.swift b/ios/MeasureSDK/MeasureSDKTests/MeasureSDKTests.swift
new file mode 100644
index 000000000..396a0f7b3
--- /dev/null
+++ b/ios/MeasureSDK/MeasureSDKTests/MeasureSDKTests.swift
@@ -0,0 +1,36 @@
+//
+// MeasureSDKTests.swift
+// MeasureSDKTests
+//
+// Created by Adwin Ross on 12/08/24.
+//
+
+import XCTest
+@testable import MeasureSDK
+
+final class MeasureSDKTests: XCTestCase {
+
+ override func setUpWithError() throws {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+ override func tearDownWithError() throws {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() throws {
+ // This is an example of a functional test case.
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ // Any test you write for XCTest can be annotated as throws and async.
+ // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
+ // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
+ }
+
+ func testPerformanceExample() throws {
+ // This is an example of a performance test case.
+ self.measure {
+ // Put the code you want to measure the time of here.
+ }
+ }
+
+}