From e8b1e3aa8205e084b8a924defcd5035614f4c0fa Mon Sep 17 00:00:00 2001 From: Arkadii Ivanov Date: Tue, 14 Nov 2023 22:55:02 +0000 Subject: [PATCH] Updated Kotlin to 1.9.20 --- .github/workflows/build.yml | 2 +- app-ios-compose/.gitignore | 18 + .../app-ios-compose.xcodeproj/project.pbxproj | 396 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 39135 bytes .../xcschemes/xcschememanagement.plist | 14 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 63 +++ .../Assets.xcassets/Contents.json | 6 + .../Preview Assets.xcassets/Contents.json | 6 + .../app-ios-compose/RootView.swift | 15 + app-ios-compose/app-ios-compose/iOSApp.swift | 21 + app-ios-compose/build.gradle.kts | 74 ---- .../com/example/myapplication/ios/Main.kt | 79 ---- app-ios-swift/app-ios-swift/iOSApp.swift | 56 +-- compose-ui/build.gradle.kts | 23 +- .../example/myapplication/root/RootContent.kt | 21 +- .../myapplication/root/RootViewController.kt | 13 + gradle.properties | 3 - gradle/libs.versions.toml | 10 +- settings.gradle.kts | 1 - shared/build.gradle.kts | 5 +- .../shared/ApplicationLifecycle.kt | 83 ++++ 24 files changed, 701 insertions(+), 234 deletions(-) create mode 100644 app-ios-compose/.gitignore create mode 100644 app-ios-compose/app-ios-compose.xcodeproj/project.pbxproj create mode 100644 app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/xcuserdata/arkivanov.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 app-ios-compose/app-ios-compose.xcodeproj/xcuserdata/arkivanov.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 app-ios-compose/app-ios-compose/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 app-ios-compose/app-ios-compose/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 app-ios-compose/app-ios-compose/Assets.xcassets/Contents.json create mode 100644 app-ios-compose/app-ios-compose/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 app-ios-compose/app-ios-compose/RootView.swift create mode 100644 app-ios-compose/app-ios-compose/iOSApp.swift delete mode 100644 app-ios-compose/build.gradle.kts delete mode 100644 app-ios-compose/src/iosMain/kotlin/com/example/myapplication/ios/Main.kt create mode 100644 compose-ui/src/iosMain/kotlin/com/example/myapplication/root/RootViewController.kt create mode 100644 shared/src/iosMain/kotlin/com/example/myapplication/shared/ApplicationLifecycle.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b253fcd..cea5d39 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ on: jobs: macos-build: name: Build on macOS - runs-on: macos-11 + runs-on: macos-latest steps: - name: Checkout uses: actions/checkout@v3 diff --git a/app-ios-compose/.gitignore b/app-ios-compose/.gitignore new file mode 100644 index 0000000..97d5de8 --- /dev/null +++ b/app-ios-compose/.gitignore @@ -0,0 +1,18 @@ +DerivedData/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ +*.moved-aside +*.xccheckout +*.xcscmblueprint +*.hmap +*.ipa +*.dSYM.zip +*.dSYM +Pods diff --git a/app-ios-compose/app-ios-compose.xcodeproj/project.pbxproj b/app-ios-compose/app-ios-compose.xcodeproj/project.pbxproj new file mode 100644 index 0000000..638214b --- /dev/null +++ b/app-ios-compose/app-ios-compose.xcodeproj/project.pbxproj @@ -0,0 +1,396 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 79C0D4422B04058B0060E3BF /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79C0D4412B04058B0060E3BF /* iOSApp.swift */; }; + 79C0D4462B04058C0060E3BF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 79C0D4452B04058C0060E3BF /* Assets.xcassets */; }; + 79C0D44A2B04058C0060E3BF /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 79C0D4492B04058C0060E3BF /* Preview Assets.xcassets */; }; + 79C0D4542B04113E0060E3BF /* RootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79C0D4532B04113E0060E3BF /* RootView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 79C0D43E2B04058B0060E3BF /* app-ios-compose.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "app-ios-compose.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 79C0D4412B04058B0060E3BF /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; }; + 79C0D4452B04058C0060E3BF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 79C0D4492B04058C0060E3BF /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 79C0D4532B04113E0060E3BF /* RootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootView.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 79C0D43B2B04058B0060E3BF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 79C0D4352B04058B0060E3BF = { + isa = PBXGroup; + children = ( + 79C0D4402B04058B0060E3BF /* app-ios-compose */, + 79C0D43F2B04058B0060E3BF /* Products */, + ); + sourceTree = ""; + }; + 79C0D43F2B04058B0060E3BF /* Products */ = { + isa = PBXGroup; + children = ( + 79C0D43E2B04058B0060E3BF /* app-ios-compose.app */, + ); + name = Products; + sourceTree = ""; + }; + 79C0D4402B04058B0060E3BF /* app-ios-compose */ = { + isa = PBXGroup; + children = ( + 79C0D4412B04058B0060E3BF /* iOSApp.swift */, + 79C0D4532B04113E0060E3BF /* RootView.swift */, + 79C0D4452B04058C0060E3BF /* Assets.xcassets */, + 79C0D4482B04058C0060E3BF /* Preview Content */, + ); + path = "app-ios-compose"; + sourceTree = ""; + }; + 79C0D4482B04058C0060E3BF /* Preview Content */ = { + isa = PBXGroup; + children = ( + 79C0D4492B04058C0060E3BF /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 79C0D43D2B04058B0060E3BF /* app-ios-compose */ = { + isa = PBXNativeTarget; + buildConfigurationList = 79C0D44D2B04058C0060E3BF /* Build configuration list for PBXNativeTarget "app-ios-compose" */; + buildPhases = ( + 79C0D4502B0407380060E3BF /* ShellScript */, + 79C0D43A2B04058B0060E3BF /* Sources */, + 79C0D43B2B04058B0060E3BF /* Frameworks */, + 79C0D43C2B04058B0060E3BF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "app-ios-compose"; + productName = "app-ios-compose"; + productReference = 79C0D43E2B04058B0060E3BF /* app-ios-compose.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 79C0D4362B04058B0060E3BF /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; + TargetAttributes = { + 79C0D43D2B04058B0060E3BF = { + CreatedOnToolsVersion = 14.3.1; + }; + }; + }; + buildConfigurationList = 79C0D4392B04058B0060E3BF /* Build configuration list for PBXProject "app-ios-compose" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 79C0D4352B04058B0060E3BF; + productRefGroup = 79C0D43F2B04058B0060E3BF /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 79C0D43D2B04058B0060E3BF /* app-ios-compose */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 79C0D43C2B04058B0060E3BF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 79C0D44A2B04058C0060E3BF /* Preview Assets.xcassets in Resources */, + 79C0D4462B04058C0060E3BF /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 79C0D4502B0407380060E3BF /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd \"$SRCROOT/..\"\n./gradlew :compose-ui:embedAndSignAppleFrameworkForXcode\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 79C0D43A2B04058B0060E3BF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 79C0D4542B04113E0060E3BF /* RootView.swift in Sources */, + 79C0D4422B04058B0060E3BF /* iOSApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 79C0D44B2B04058C0060E3BF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 79C0D44C2B04058C0060E3BF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 79C0D44E2B04058C0060E3BF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = ""; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"app-ios-compose/Preview Content\""; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../compose-ui/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", + ); + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 13.3; + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-framework", + shared, + ); + PRODUCT_BUNDLE_IDENTIFIER = "orgIdentifier.app-ios-compose"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 79C0D44F2B04058C0060E3BF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = ""; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"app-ios-compose/Preview Content\""; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../compose-ui/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)", + ); + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 13.3; + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-framework", + shared, + ); + PRODUCT_BUNDLE_IDENTIFIER = "orgIdentifier.app-ios-compose"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 79C0D4392B04058B0060E3BF /* Build configuration list for PBXProject "app-ios-compose" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 79C0D44B2B04058C0060E3BF /* Debug */, + 79C0D44C2B04058C0060E3BF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 79C0D44D2B04058C0060E3BF /* Build configuration list for PBXNativeTarget "app-ios-compose" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 79C0D44E2B04058C0060E3BF /* Debug */, + 79C0D44F2B04058C0060E3BF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 79C0D4362B04058B0060E3BF /* Project object */; +} diff --git a/app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/xcuserdata/arkivanov.xcuserdatad/UserInterfaceState.xcuserstate b/app-ios-compose/app-ios-compose.xcodeproj/project.xcworkspace/xcuserdata/arkivanov.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..821d5dc2093869d48ecb98f75e190122c16cb0b5 GIT binary patch literal 39135 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 + + + + SchemeUserState + + app-ios-compose.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/app-ios-compose/app-ios-compose/Assets.xcassets/AccentColor.colorset/Contents.json b/app-ios-compose/app-ios-compose/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/app-ios-compose/app-ios-compose/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app-ios-compose/app-ios-compose/Assets.xcassets/AppIcon.appiconset/Contents.json b/app-ios-compose/app-ios-compose/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..532cd72 --- /dev/null +++ b/app-ios-compose/app-ios-compose/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,63 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app-ios-compose/app-ios-compose/Assets.xcassets/Contents.json b/app-ios-compose/app-ios-compose/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/app-ios-compose/app-ios-compose/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app-ios-compose/app-ios-compose/Preview Content/Preview Assets.xcassets/Contents.json b/app-ios-compose/app-ios-compose/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/app-ios-compose/app-ios-compose/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app-ios-compose/app-ios-compose/RootView.swift b/app-ios-compose/app-ios-compose/RootView.swift new file mode 100644 index 0000000..4563978 --- /dev/null +++ b/app-ios-compose/app-ios-compose/RootView.swift @@ -0,0 +1,15 @@ +import SwiftUI +import shared + +struct RootView: UIViewControllerRepresentable { + let root: RootComponent + + func makeUIViewController(context: Context) -> UIViewController { + let controller = RootViewControllerKt.rootViewController(root: root) + controller.overrideUserInterfaceStyle = .light + return controller + } + + func updateUIViewController(_ uiViewController: UIViewController, context: Context) { + } +} diff --git a/app-ios-compose/app-ios-compose/iOSApp.swift b/app-ios-compose/app-ios-compose/iOSApp.swift new file mode 100644 index 0000000..bcb9095 --- /dev/null +++ b/app-ios-compose/app-ios-compose/iOSApp.swift @@ -0,0 +1,21 @@ +import SwiftUI +import shared + +@main +struct iOSApp: App { + @UIApplicationDelegateAdaptor(AppDelegate.self) + var appDelegate: AppDelegate + + var body: some Scene { + WindowGroup { + RootView(root: appDelegate.root) + .ignoresSafeArea(.all) + } + } +} + +class AppDelegate: NSObject, UIApplicationDelegate { + let root: RootComponent = DefaultRootComponent( + componentContext: DefaultComponentContext(lifecycle: ApplicationLifecycle()) + ) +} diff --git a/app-ios-compose/build.gradle.kts b/app-ios-compose/build.gradle.kts deleted file mode 100644 index 9cbaf87..0000000 --- a/app-ios-compose/build.gradle.kts +++ /dev/null @@ -1,74 +0,0 @@ -import org.jetbrains.compose.experimental.dsl.IOSDevices -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget - -plugins { - alias(libs.plugins.kotlin.multiplatform) - alias(libs.plugins.jetbrains.compose) -} - -@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) -kotlin { - targetHierarchy.default() - - listOf( - iosX64("uikitX64"), - iosArm64("uikitArm64"), - iosSimulatorArm64("uikitSimulatorArm64"), - ).forEach { - it.binaries { - executable { - entryPoint = "com.example.myapplication.ios.main" - freeCompilerArgs += listOf( - "-linker-option", "-framework", "-linker-option", "Metal", - "-linker-option", "-framework", "-linker-option", "CoreText", - "-linker-option", "-framework", "-linker-option", "CoreGraphics" - ) - } - } - } - - sourceSets { - - val commonMain by getting { - dependencies { - implementation(project(":shared")) - implementation(project(":compose-ui")) - - implementation(libs.decompose.decompose) - implementation(libs.decompose.extensionsComposeJetbrains) - } - } - } - - targets.withType { - binaries.all { - // TODO: the current compose binary surprises LLVM, so disable checks for now. - freeCompilerArgs += "-Xdisable-phases=VerifyBitcode" - } - } -} - -compose.experimental { - uikit.application { - bundleIdPrefix = "com.example.myapplication.ios" - projectName = "DecomposeTemplate" - - deployConfigurations { - simulator("IPhone12Pro") { - // Usage: ./gradlew iosDeployIPhone12ProDebug - device = IOSDevices.IPHONE_12_PRO - } - - /* - * Usage: ./gradlew iosDeployDeviceDebug - * - * If your are getting "A valid provisioning profile for this executable was not found" error, - * see: https://developer.apple.com/forums/thread/128121?answerId=403323022#403323022 - */ - connectedDevice("Device") { - // Uncomment and fill with your Team ID - // teamId = "" - } - } - } -} diff --git a/app-ios-compose/src/iosMain/kotlin/com/example/myapplication/ios/Main.kt b/app-ios-compose/src/iosMain/kotlin/com/example/myapplication/ios/Main.kt deleted file mode 100644 index ddcfeaa..0000000 --- a/app-ios-compose/src/iosMain/kotlin/com/example/myapplication/ios/Main.kt +++ /dev/null @@ -1,79 +0,0 @@ -@file:OptIn(ExperimentalForeignApi::class, BetaInteropApi::class) - -package com.example.myapplication.ios - -import androidx.compose.ui.window.ComposeUIViewController -import com.arkivanov.decompose.DefaultComponentContext -import com.arkivanov.essenty.lifecycle.LifecycleRegistry -import com.arkivanov.essenty.lifecycle.destroy -import com.arkivanov.essenty.lifecycle.resume -import com.arkivanov.essenty.lifecycle.stop -import com.example.myapplication.root.RootContent -import com.example.myapplication.shared.root.DefaultRootComponent -import kotlinx.cinterop.BetaInteropApi -import kotlinx.cinterop.ExperimentalForeignApi -import kotlinx.cinterop.autoreleasepool -import kotlinx.cinterop.cstr -import kotlinx.cinterop.memScoped -import kotlinx.cinterop.toCValues -import platform.Foundation.NSStringFromClass -import platform.UIKit.UIApplication -import platform.UIKit.UIApplicationDelegateProtocol -import platform.UIKit.UIApplicationDelegateProtocolMeta -import platform.UIKit.UIApplicationMain -import platform.UIKit.UIResponder -import platform.UIKit.UIResponderMeta -import platform.UIKit.UIScreen -import platform.UIKit.UIWindow - -fun main() { - val args = emptyArray() - memScoped { - val argc = args.size + 1 - val argv = (arrayOf("skikoApp") + args).map { it.cstr.ptr }.toCValues() - autoreleasepool { - UIApplicationMain(argc, argv, null, NSStringFromClass(SkikoAppDelegate)) - } - } -} - -class SkikoAppDelegate @OverrideInit constructor() : UIResponder(), UIApplicationDelegateProtocol { - companion object : UIResponderMeta(), UIApplicationDelegateProtocolMeta - - private val lifecycle = LifecycleRegistry() - - private val root = DefaultRootComponent( - componentContext = DefaultComponentContext(lifecycle = lifecycle), - ) - - private var _window: UIWindow? = null - override fun window() = _window - override fun setWindow(window: UIWindow?) { - _window = window - } - - override fun application( - application: UIApplication, - didFinishLaunchingWithOptions: Map?, - ): Boolean { - window = UIWindow(frame = UIScreen.mainScreen.bounds) - - window!!.rootViewController = ComposeUIViewController { - RootContent(component = root) - } - window!!.makeKeyAndVisible() - return true - } - - override fun applicationDidBecomeActive(application: UIApplication) { - lifecycle.resume() - } - - override fun applicationWillResignActive(application: UIApplication) { - lifecycle.stop() - } - - override fun applicationWillTerminate(application: UIApplication) { - lifecycle.destroy() - } -} diff --git a/app-ios-swift/app-ios-swift/iOSApp.swift b/app-ios-swift/app-ios-swift/iOSApp.swift index a15e511..fa8675c 100644 --- a/app-ios-swift/app-ios-swift/iOSApp.swift +++ b/app-ios-swift/app-ios-swift/iOSApp.swift @@ -5,64 +5,16 @@ import shared struct iOSApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate: AppDelegate - - private var rootHolder: RootHolder { appDelegate.getRootHolder() } var body: some Scene { WindowGroup { - RootView(rootHolder.root) - .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in - LifecycleRegistryExtKt.resume(rootHolder.lifecycle) - } - .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in - LifecycleRegistryExtKt.pause(rootHolder.lifecycle) - } - .onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in - LifecycleRegistryExtKt.stop(rootHolder.lifecycle) - } - .onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification)) { _ in - LifecycleRegistryExtKt.destroy(rootHolder.lifecycle) - } + RootView(appDelegate.root) } } } class AppDelegate: NSObject, UIApplicationDelegate { - private var rootHolder: RootHolder? - - func application(_ application: UIApplication, shouldSaveSecureApplicationState coder: NSCoder) -> Bool { - return false - } - - func application(_ application: UIApplication, shouldRestoreSecureApplicationState coder: NSCoder) -> Bool { - return false - } - - fileprivate func getRootHolder() -> RootHolder { - if (rootHolder == nil) { - rootHolder = RootHolder(savedState: nil) - } - - return rootHolder! - } -} - -private class RootHolder { - let lifecycle: LifecycleRegistry - let root: RootComponent - - init(savedState: ParcelableParcelableContainer?) { - lifecycle = LifecycleRegistryKt.LifecycleRegistry() - - root = DefaultRootComponent( - componentContext: DefaultComponentContext( - lifecycle: lifecycle, - stateKeeper: nil, - instanceKeeper: nil, - backHandler: nil - ) - ) - - LifecycleRegistryExtKt.create(lifecycle) - } + let root: RootComponent = DefaultRootComponent( + componentContext: DefaultComponentContext(lifecycle: ApplicationLifecycle()) + ) } diff --git a/compose-ui/build.gradle.kts b/compose-ui/build.gradle.kts index 75b157f..f3c82f9 100644 --- a/compose-ui/build.gradle.kts +++ b/compose-ui/build.gradle.kts @@ -4,9 +4,9 @@ plugins { alias(libs.plugins.jetbrains.compose) } -@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) kotlin { - targetHierarchy.default() + applyDefaultHierarchyTemplate() + jvm() androidTarget { @@ -17,14 +17,23 @@ kotlin { } } - iosX64() - iosArm64() - iosSimulatorArm64() + listOf( + iosX64(), + iosArm64(), + iosSimulatorArm64() + ).forEach { + it.binaries.framework { + baseName = "shared" // Used in app-ios-compose + + export(project(":shared")) + export(libs.decompose.decompose) + } + } sourceSets { val commonMain by getting { dependencies { - implementation(project(":shared")) + api(project(":shared")) // Compose Libraries implementation(compose.ui) @@ -32,7 +41,7 @@ kotlin { implementation(compose.material) // Decompose Libraries - implementation(libs.decompose.decompose) + api(libs.decompose.decompose) implementation(libs.decompose.extensionsComposeJetbrains) } } diff --git a/compose-ui/src/commonMain/kotlin/com/example/myapplication/root/RootContent.kt b/compose-ui/src/commonMain/kotlin/com/example/myapplication/root/RootContent.kt index d5aac8f..c019231 100644 --- a/compose-ui/src/commonMain/kotlin/com/example/myapplication/root/RootContent.kt +++ b/compose-ui/src/commonMain/kotlin/com/example/myapplication/root/RootContent.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -22,15 +23,17 @@ fun RootContent( component: RootComponent, modifier: Modifier = Modifier, ) { - Surface(modifier = modifier.fillMaxSize().windowInsetsPadding(WindowInsets.systemBars)) { - Children( - stack = component.stack, - modifier = Modifier.fillMaxSize(), - animation = stackAnimation(fade() + scale()) - ) { - when (val instance = it.instance) { - is Child.Main -> MainContent(component = instance.component) - is Child.Welcome -> WelcomeContent(component = instance.component) + MaterialTheme { + Surface(modifier = modifier.fillMaxSize().windowInsetsPadding(WindowInsets.systemBars)) { + Children( + stack = component.stack, + modifier = Modifier.fillMaxSize(), + animation = stackAnimation(fade() + scale()) + ) { + when (val instance = it.instance) { + is Child.Main -> MainContent(component = instance.component) + is Child.Welcome -> WelcomeContent(component = instance.component) + } } } } diff --git a/compose-ui/src/iosMain/kotlin/com/example/myapplication/root/RootViewController.kt b/compose-ui/src/iosMain/kotlin/com/example/myapplication/root/RootViewController.kt new file mode 100644 index 0000000..737c675 --- /dev/null +++ b/compose-ui/src/iosMain/kotlin/com/example/myapplication/root/RootViewController.kt @@ -0,0 +1,13 @@ +package com.example.myapplication.root + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.ui.Modifier +import androidx.compose.ui.window.ComposeUIViewController +import com.example.myapplication.root.RootContent +import com.example.myapplication.shared.root.RootComponent +import platform.UIKit.UIViewController + +fun rootViewController(root: RootComponent): UIViewController = + ComposeUIViewController { + RootContent(component = root, modifier = Modifier.fillMaxSize()) + } diff --git a/gradle.properties b/gradle.properties index e5a581d..649dfa4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,6 +11,3 @@ android.nonTransitiveRClass=true #MPP kotlin.mpp.enableCInteropCommonization=true kotlin.mpp.androidSourceSetLayoutVersion=2 - -#Compose -org.jetbrains.compose.experimental.uikit.enabled=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b95612c..bc11747 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] project = "1.0.0" -kotlin = "1.9.0" +kotlin = "1.9.20" agp = "8.0.2" jvmTarget = "11" @@ -9,12 +9,12 @@ android-minSdk = "24" android-compileSdk = "34" android-targetSdk = "34" -compose-jetbrains = "1.5.0-beta02" +compose-jetbrains = "1.5.10" -androidx-activityCompose = "1.8.0-alpha06" +androidx-activityCompose = "1.8.0" -decompose = "2.1.0-compose-experimental-alpha-07" -essenty = "1.2.0-alpha-06" +decompose = "2.1.4-compose-experimental" +essenty = "1.2.0" [plugins] diff --git a/settings.gradle.kts b/settings.gradle.kts index b6d8c74..bf9afed 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,4 +18,3 @@ include(":shared") include(":compose-ui") include(":app-android") include(":app-desktop") -include(":app-ios-compose") diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 0407363..5f758a1 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -4,9 +4,8 @@ plugins { alias(libs.plugins.kotlin.parcelize) } -@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) kotlin { - targetHierarchy.default() + applyDefaultHierarchyTemplate() jvm() @@ -24,7 +23,7 @@ kotlin { iosSimulatorArm64() ).forEach { it.binaries.framework { - baseName = "shared" + baseName = "shared" // Used in app-ios-swift export(libs.decompose.decompose) export(libs.essenty.lifecycle) diff --git a/shared/src/iosMain/kotlin/com/example/myapplication/shared/ApplicationLifecycle.kt b/shared/src/iosMain/kotlin/com/example/myapplication/shared/ApplicationLifecycle.kt new file mode 100644 index 0000000..8147cd7 --- /dev/null +++ b/shared/src/iosMain/kotlin/com/example/myapplication/shared/ApplicationLifecycle.kt @@ -0,0 +1,83 @@ +package com.example.myapplication.shared + +import com.arkivanov.essenty.lifecycle.Lifecycle +import com.arkivanov.essenty.lifecycle.LifecycleRegistry +import com.arkivanov.essenty.lifecycle.destroy +import com.arkivanov.essenty.lifecycle.pause +import com.arkivanov.essenty.lifecycle.resume +import com.arkivanov.essenty.lifecycle.start +import com.arkivanov.essenty.lifecycle.stop +import kotlinx.cinterop.BetaInteropApi +import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.cinterop.ObjCAction +import platform.Foundation.NSNotificationCenter +import platform.Foundation.NSNotificationName +import platform.Foundation.NSSelectorFromString +import platform.UIKit.UIApplicationDidBecomeActiveNotification +import platform.UIKit.UIApplicationDidEnterBackgroundNotification +import platform.UIKit.UIApplicationWillEnterForegroundNotification +import platform.UIKit.UIApplicationWillResignActiveNotification +import platform.UIKit.UIApplicationWillTerminateNotification + +/* + * Available in Decompose since 2.2.0-alpha05/2.2.0-compose-experimental-alpha05. + * Remove when stable. + */ +class ApplicationLifecycle private constructor( + private val lifecycle: LifecycleRegistry, +) : Lifecycle by lifecycle { + + constructor() : this(lifecycle = LifecycleRegistry()) + + init { + addObserver(name = UIApplicationWillEnterForegroundNotification, selectorName = "willEnterForeground") + addObserver(name = UIApplicationDidBecomeActiveNotification, selectorName = "didBecomeActive") + addObserver(name = UIApplicationWillResignActiveNotification, selectorName = "willResignActive") + addObserver(name = UIApplicationDidEnterBackgroundNotification, selectorName = "didEnterBackground") + addObserver(name = UIApplicationWillTerminateNotification, selectorName = "willTerminate") + } + + @OptIn(ExperimentalForeignApi::class) + private fun addObserver(name: NSNotificationName, selectorName: String) { + NSNotificationCenter.defaultCenter.addObserver( + name = name, + `object` = null, + observer = this, + selector = NSSelectorFromString(selectorName), + ) + } + + @Suppress("unused") + @OptIn(BetaInteropApi::class) + @ObjCAction + fun willEnterForeground() { + lifecycle.start() + } + + @Suppress("unused") + @OptIn(BetaInteropApi::class) + @ObjCAction + fun didBecomeActive() { + lifecycle.resume() + } + + @Suppress("unused") + @OptIn(BetaInteropApi::class) + @ObjCAction + fun willResignActive() { + lifecycle.pause() + } + + @Suppress("unused") + @OptIn(BetaInteropApi::class) + @ObjCAction + fun didEnterBackground() { + lifecycle.stop() + } + + @OptIn(BetaInteropApi::class) + @ObjCAction + fun willTerminate() { + lifecycle.destroy() + } +}