@@ -8,14 +8,22 @@ import com.squareup.kotlinpoet.ClassName
88import com.squareup.kotlinpoet.CodeBlock
99import com.squareup.kotlinpoet.KModifier
1010import com.squareup.kotlinpoet.PropertySpec
11+ import com.squareup.kotlinpoet.STRING
1112import com.squareup.kotlinpoet.TypeSpec
1213import dev.icerock.gradle.MultiplatformResourcesPluginExtension
1314import dev.icerock.gradle.generator.MRGenerator
1415import dev.icerock.gradle.tasks.CopyFrameworkResourcesToAppEntryPointTask
1516import dev.icerock.gradle.tasks.CopyFrameworkResourcesToAppTask
17+ import dev.icerock.gradle.utils.toEnumeration
18+ import org.apache.commons.codec.digest.DigestUtils
1619import org.gradle.api.Action
1720import org.gradle.api.Project
1821import org.gradle.api.Task
22+ import org.gradle.api.plugins.ExtensionAware
23+ import org.gradle.kotlin.dsl.findByType
24+ import org.gradle.kotlin.dsl.getByType
25+ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
26+ import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension
1927import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation
2028import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
2129import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
@@ -26,6 +34,7 @@ import org.jetbrains.kotlin.konan.file.zipDirAs
2634import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutImpl
2735import java.io.File
2836import java.io.InputStream
37+ import java.io.SequenceInputStream
2938import java.util.Properties
3039import java.util.zip.ZipEntry
3140import java.util.zip.ZipException
@@ -65,6 +74,21 @@ class AppleMRGenerator(
6574 .delegate(CodeBlock .of(" lazy { NSBundle.loadableBundle(\" $bundleIdentifier \" ) }" ))
6675 .build()
6776 )
77+
78+ mrClass.addProperty(
79+ PropertySpec .builder(" contentHash" , STRING , KModifier .PRIVATE )
80+ .initializer(" %S" , calculateResourcesHash())
81+ .build()
82+ )
83+ }
84+
85+ private fun calculateResourcesHash (): String {
86+ val inputStreams: List <InputStream > = resourcesGenerationDir.walkTopDown()
87+ .filterNot { it.isDirectory }
88+ .map { it.inputStream() }.toList()
89+ val singleInputStream: InputStream = SequenceInputStream (inputStreams.toEnumeration())
90+
91+ return singleInputStream.use { DigestUtils .md5Hex(it) }
6892 }
6993
7094 override fun getImports (): List <ClassName > = listOf (
@@ -172,7 +196,7 @@ class AppleMRGenerator(
172196
173197 if (framework.isStatic) {
174198 val resourcesExtension =
175- project.extensions.getByType( MultiplatformResourcesPluginExtension :: class .java )
199+ project.extensions.getByType< MultiplatformResourcesPluginExtension >( )
176200 if (resourcesExtension.disableStaticFrameworkWarning.not ()) {
177201 project.logger.warn(
178202 """
@@ -231,9 +255,14 @@ $linkTask produces static framework, Xcode should have Build Phase with copyFram
231255 " copyFrameworkResourcesToApp" ,
232256 CopyFrameworkResourcesToAppEntryPointTask ::class .java
233257 )
258+ val multiplatformExtension = project.extensions.getByType<KotlinMultiplatformExtension >()
259+ xcodeTask.configurationMapper = (multiplatformExtension as ? ExtensionAware )?.extensions
260+ ?.findByType<CocoapodsExtension >()
261+ ?.xcodeConfigurationToNativeBuildType
262+ ? : emptyMap()
234263
235264 if (framework.target.konanTarget == xcodeTask.konanTarget &&
236- framework.buildType.getName() == xcodeTask.configuration
265+ framework.buildType.getName() == xcodeTask.configuration?.toLowerCase()
237266 ) {
238267 xcodeTask.dependsOn(copyTask)
239268 }
0 commit comments