Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build-logic/convention/src/main/kotlin/config/KmpConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ fun KotlinMultiplatformExtension.kmp(
getIosTargets(project, tvOSEnabled).forEach {
it.binaries.framework {
baseName = nativeName
isStatic = false
isStatic = true
export(libs.mokoResources)
Comment on lines 53 to 56

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Verify that iOS/tvOS integration copies moko-resources when the KMP framework is static.
rg -n -C2 --glob '!**/build/**' \
  'copy[A-Za-z0-9]*FrameworkResourcesToApp|copyFrameworkResourcesToApp|moko\.resources' \
  --glob '*.pbxproj' \
  --glob 'Podfile' \
  --glob 'Podfile.lock' \
  --glob '*.kts' \
  --glob '*.gradle' || true

echo
echo "Expected: at least one Xcode/Pod build phase references the generated copy task."

Repository: MateeDevs/MateeStarter

Length of output: 147


Add Xcode build phase to copy moko-resources from the static framework.

Line 51 makes the Apple framework static while exporting libs.mokoResources. Per moko-resources documentation, static Apple frameworks cannot carry their own resources; the app must run a separate Xcode build phase (e.g., copy<FrameworkName>FrameworkResourcesToApp or copyFrameworkResourcesToApp) after Kotlin compilation to copy resources in. No such configuration was found in the repository. Without this build phase, iOS/tvOS will lose access to strings, images, and localizations at runtime.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@build-logic/convention/src/main/kotlin/config/KmpConfig.kt` around lines 49 -
52, The framework is being built static (see the binaries.framework block with
baseName = nativeName, isStatic = true, export(libs.mokoResources)), but static
Apple frameworks can’t embed moko-resources, so add an Xcode "Run Script" build
phase to copy the framework resources into the app bundle after Kotlin
compilation; implement a script that runs in the app target (e.g., named
copy${nativeName}FrameworkResourcesToApp or copyFrameworkResourcesToApp) which
locates the built ${nativeName}.framework Resources directory and copies its
contents into ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH} (or use
the standard FRAMEWORKS_FOLDER_PATH/Resources paths), and ensure this phase runs
after the Kotlin/Gradle build step so strings/images/localizations from
moko-resources are available at runtime.

export(project(":shared:base"))
export(project(":shared:analytics"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ inline fun <reified T : Any> Project.extension(name: String, block: Action<T>) {
extensions.configure(name, block)
}

fun <BuildTypeT> NamedDomainObjectContainer<BuildTypeT>.demo(action: BuildTypeT.() -> Unit) {
fun <BuildTypeT : Any> NamedDomainObjectContainer<BuildTypeT>.demo(action: BuildTypeT.() -> Unit) {
create("demo", action)
}

Expand Down
9 changes: 4 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask
import org.gradle.kotlin.dsl.register
Comment thread
MatuskaDev marked this conversation as resolved.

plugins {
alias(libs.plugins.android.application) apply false
Expand All @@ -18,7 +19,7 @@ plugins {
}

fun String.isNonStable(): Boolean {
val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { toUpperCase().contains(it) }
val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { uppercase().contains(it) }
val regex = "^[0-9,.v-]+(-r)?$".toRegex()
val isStable = stableKeyword || regex.matches(this)
return isStable.not()
Expand All @@ -34,11 +35,9 @@ versionCatalogUpdate {
sortByKey.set(false)
keep {
keepUnusedVersions.set(true)
keepUnusedLibraries.set(true)
keepUnusedPlugins.set(true)
}
}

tasks.create<Delete>("clean") {
delete(rootProject.buildDir)
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}
2 changes: 0 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ moko.resources.disableStaticFrameworkWarning=true
sentiary.projectId=sL617ZwnlaW151ZJfDYc
sentiary.projectApiKey=tJr4F92ZaVxN4vBy/GFHICa9DhmimkhdBjETSAMXLxPn+j17ngXD8y+yQBvTgmuhhm3VvVRtv7qzpSoGvPLwNQ==
# Caches
kotlin.native.cacheKind.iosArm64=static
kotlin.native.cacheKind.iosSimulatorArm64=static
kotlin.incremental.native=false
org.gradle.caching=true
org.gradle.parallel=true
Expand Down
55 changes: 27 additions & 28 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,48 +1,47 @@
[versions]
sdk-min = "23"
sdk-target = "34"
sdk-compile = "35"
sdk-compile = "36"
Comment thread
MatuskaDev marked this conversation as resolved.
java = "21"
kotlin = "2.2.10"
gradlePlugin = "8.11.1"
kotlin = "2.3.20"
gradlePlugin = "8.13.2"
coroutines = "1.10.2"
dateTime = "0.6.0"
atomicFu = "0.23.2"
koin = "4.1.1"
androidXCore = "1.13.1"
androidXNavigation = "2.9.0-rc01"
dateTime = "0.7.1"
atomicFu = "0.32.1"
koin = "4.2.1"
androidXCore = "1.18.0"
androidXNavigation = "2.9.2"
material = "1.13.0"
material-icons = "1.7.3"
lifecycle = "2.9.3"
paging = "3.3.6"
composeBom = "2025.08.01"
jetbrains-composePlugin = "1.8.2"
activity = "1.10.1"
navigation = "2.9.3"
lifecycle = "2.10.0"
paging = "3.4.2"
composeBom = "2026.03.01"
jetbrains-composePlugin = "1.11.0-beta01" # Note: version 1.11.X fixes iOS lags
Comment thread
MatuskaDev marked this conversation as resolved.
Comment thread
JuliaJakubcova marked this conversation as resolved.
activity = "1.13.0"
navigation = "2.9.7"
accompanist = "0.36.0"
ktor = "3.2.3"
kermit = "2.0.8"
ktor = "3.4.2"
kermit = "2.1.0"
settings = "1.3.0"
googlePlayServices = "21.3.0"
ktLint = "11.6.0"
ktLint = "11.6.0" # Note: Do not update ktLint as they changed the ruleset
ktLint-rules = "0.3.8"
kotlinxImmutableCollections = "0.4.0"
konsist = "0.13.0"
kotlinxImmutableCollections = "0.4.0"
junit = "4.13.2"
coroutine-test = "1.8.1"
mokoResources = "0.25.0"
coroutine-test = "1.10.2"
mokoResources = "0.26.3"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
appcompat = "1.7.1"
versionCatalogueUpdate = "0.8.1"
versions = "0.49.0"
desugar = "2.1.2"
versionCatalogueUpdate = "1.1.0"
versions = "0.53.0"
desugar = "2.1.5"
uiautomator = "2.3.0"
molecule = "2.1.0"
skie = "0.10.6"
molecule = "2.2.0"
skie = "0.10.11"
firebase = "22.5.0"
googleServices = "4.4.3"
jetbrainsKotlinJvm = "2.2.10"
googleServices = "4.4.4"
sentiary = "1.0.1"

[libraries]
Expand Down Expand Up @@ -177,4 +176,4 @@ mateeStarter-kmp-library-core = "kmp-library:none"
mateeStarter-kmp-library-compose = "kmp-library-compose:none"
mateeStarter-kmp-framework-library = "kmp-framework-library:none"
mateeStarter-kmp-sentiary = "kmp-sentiary-library-convention:none"
jetbrains-kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "jetbrainsKotlinJvm" }
jetbrains-kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
7 changes: 4 additions & 3 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#Mon Apr 12 11:15:46 CEST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
Comment thread
MatuskaDev marked this conversation as resolved.
Comment thread
MatuskaDev marked this conversation as resolved.
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading
Loading