{"id":84316,"date":"2024-11-18T00:31:02","date_gmt":"2024-11-17T21:01:02","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/"},"modified":"2024-11-18T00:31:02","modified_gmt":"2024-11-17T21:01:02","slug":"enhance-ios-development-with-kotlin-multiplatform-library-1h02","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/","title":{"rendered":"\u062a\u0648\u0633\u0639\u0647 iOS \u0631\u0627 \u0628\u0627 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0686\u0646\u062f \u067e\u0644\u062a\u0641\u0631\u0645\u06cc Kotlin \u062a\u0642\u0648\u06cc\u062a \u06a9\u0646\u06cc\u062f"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            Kotlin Multiplatform (KMP) \u06cc\u06a9 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0631\u0627 \u0642\u0627\u062f\u0631 \u0645\u06cc \u0633\u0627\u0632\u062f \u062a\u0627 \u0645\u0646\u0637\u0642 \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 \u0686\u0646\u062f\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u0627\u0632 \u062c\u0645\u0644\u0647 iOS \u0648 Android \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u0646\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0647\u0627\u06cc \u062e\u0627\u0635 \u067e\u0644\u062a \u0641\u0631\u0645 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u0648\u0627\u0628\u0633\u062a\u0647 \u0628\u0647 \u067e\u0644\u062a \u0641\u0631\u0645 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f. \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0646\u062d\u0648\u0647 \u0627\u062f\u063a\u0627\u0645 KMP \u0628\u0627 iOS \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u0648 \u0646\u062d\u0648\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0631\u0627\u0628\u0637\u200c\u0647\u0627\u06cc Kotlin \u062f\u0631 Swift\u060c \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u0631\u0627\u0628\u0637\u200c\u0647\u0627 \u062f\u0631 Swift \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646\u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Swift UI \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f.<\/p>\n<p>\u062a\u0645\u0631\u06a9\u0632 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0631\u0631\u0633\u06cc \u06cc\u06a9 \u0631\u0648\u06cc\u06a9\u0631\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0627\u062c\u062a\u0646\u0627\u0628 \u0645\u06cc \u06a9\u0646\u062f expect\/actual \u0627\u0644\u06af\u0648\u0647\u0627 \u062f\u0631 \u0639\u0648\u0636\u060c \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0627\u062f\u063a\u0627\u0645 \u0631\u0627 \u0628\u0627 \u0628\u0647 \u062d\u062f\u0627\u0642\u0644 \u0631\u0633\u0627\u0646\u062f\u0646 \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 API\u0647\u0627\u06cc \u067e\u0644\u062a\u0641\u0631\u0645\u06cc \u06a9\u0647 \u062f\u0631 KMP \u062f\u0631 \u0645\u0639\u0631\u0636 \u0646\u0645\u0627\u06cc\u0634 \u0646\u06cc\u0633\u062a\u0646\u062f\u060c \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0627 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Swift UI \u062e\u0648\u0627\u0647\u06cc\u0645 \u0633\u0627\u062e\u062a \u06a9\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc\u060c \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0646\u0637\u0642 \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u062f\u0631 Kotlin \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u067e\u0644\u062a\u0641\u0631\u0645 \u062e\u0627\u0635 \u062f\u0631 Swift \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Mutlipform Kotlin \u062f\u0631 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0627\u0633\u062a\u0648\u062f\u06cc\u0648<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639\u060c \u0628\u0627\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Android Studio \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 KMP \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0645\u0631\u062c\u0639\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u067e\u0631\u0648\u0698\u0647 \u0646\u0645\u0648\u0646\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0631\u0627 build.gradle.kts \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0634\u0627\u0645\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0645\u0647\u0645 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0686\u0646\u062f \u067e\u0644\u062a\u0641\u0631\u0645\u06cc \u0627\u0633\u062a.<\/p>\n<p>  \u0645\u0631\u0627\u062d\u0644 \u06a9\u0644\u06cc\u062f\u06cc:<\/p>\n<p>\u0627\u0632 \u0633\u0627\u062e\u062a\u0627\u0631 \u0627\u0648\u0644\u06cc\u0647 \u067e\u0631\u0648\u0698\u0647 KMP \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0645\u0631\u062c\u0639 \u0646\u0645\u0648\u0646\u0647 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f<br \/>\n\u0644\u06cc\u0633\u062a\u06cc \u0627\u0632 \u0627\u0647\u062f\u0627\u0641 iOS \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f iosX64\u060c iosArm64\u060c iosSimulatorArm64 \u062f\u0631 \u0634\u0645\u0627 build.gradle.kts.<br \/>\n\u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f XCFramework \u0628\u0627 \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u062a\u0645\u0627\u0645 \u0627\u0647\u062f\u0627\u0641 \u0628\u0647 \u0686\u0627\u0631\u0686\u0648\u0628<\/p>\n<p>\u0646\u06a9\u062a\u0647 \u06a9\u0644\u06cc\u062f\u06cc \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0646\u0627\u0645 \u0645\u0639\u0646\u0627\u062f\u0627\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0641\u0631\u06cc\u0645\u0648\u0631\u06a9 \u062e\u0648\u062f \u0628\u062f\u0647\u06cc\u062f \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u0632 \u0647\u0645\u0627\u0646 \u0646\u0627\u0645 \u0628\u0631\u0627\u06cc \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u0628\u0627\u06cc\u0646\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f..<\/p>\n<p>\u062d\u062f\u0627\u0642\u0644 build.gradle.kts \u0641\u0627\u06cc\u0644 \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<p>import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi<br \/>\nimport org.jetbrains.kotlin.gradle.dsl.JvmTarget<br \/>\nimport org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFramework<\/p>\n<p>plugins {<br \/>\n    alias(libs.plugins.kotlinMultiplatform)<br \/>\n    alias(libs.plugins.androidLibrary)<br \/>\n}<\/p>\n<p>group = &#8220;io.github.arskov&#8221;<br \/>\nversion = &#8220;1.0.0&#8221;<\/p>\n<p>\/\/ Use some name for the framework. It will be used as main import in Swift<br \/>\nval iosXCFrameworkName = &#8220;KmpLib&#8221;<br \/>\nval binaryName = &#8220;kmp-lib&#8221;<\/p>\n<p>kotlin {<\/p>\n<p>    androidTarget {<br \/>\n        publishLibraryVariants(&#8220;release&#8221;)<br \/>\n        @OptIn(ExperimentalKotlinGradlePluginApi::class)<br \/>\n        compilerOptions {<br \/>\n            jvmTarget.set(JvmTarget.JVM_1_8)<br \/>\n        }<br \/>\n    }<\/p>\n<p>    val xcf = XCFramework(iosXCFrameworkName)<br \/>\n    val iosTargets = listOf(iosX64(), iosArm64(), iosSimulatorArm64())<br \/>\n    iosTargets.forEach {<br \/>\n        it.binaries.framework {<br \/>\n            baseName = iosXCFrameworkName<br \/>\n            xcf.add(this)<br \/>\n        }<br \/>\n    }<\/p>\n<p>    sourceSets {<br \/>\n        commonMain {<br \/>\n            dependencies {<br \/>\n                \/\/ Put necessary KMP compatible dependencies here<br \/>\n            }<br \/>\n        }<br \/>\n        commonTest {<br \/>\n            dependencies {<br \/>\n                implementation(libs.kotlin.test)<br \/>\n            }<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>android {<br \/>\n    namespace = &#8220;io.github.arskov&#8221;<br \/>\n    compileSdk = libs.versions.android.compileSdk.get().toInt()<br \/>\n    defaultConfig {<br \/>\n        minSdk = libs.versions.android.minSdk.get().toInt()<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648\u0638\u06cc\u0641\u0647 Gradle \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u06cc\u06a9 XCFramework \u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 iOS \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0645\u0639\u0645\u0627\u0631\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc<\/p>\n<p>package io.github.arskov<\/p>\n<p>class MultiplatformService(<br \/>\n    private val cryptoProvider: CryptoProvider,<br \/>\n    private val storeProvider: StoreProvider<br \/>\n) {<\/p>\n<p>    @Throws(StoreException::class, EncryptionException::class)<br \/>\n    fun storeData(data: PlainData, encryptionKey: ByteArray?) {<br \/>\n        if (!data.encrypted &amp;&amp; encryptionKey != null) {<br \/>\n            val encryptedData =<br \/>\n                cryptoProvider.encrypt(op = EncryptOp.ENCRYPT, key = encryptionKey, data = data.content)<br \/>\n            val encryptedPlainData =<br \/>\n                PlainData(id = data.id, encrypted = true, updated = 0L, content = encryptedData)<br \/>\n            storeProvider.store(encryptedPlainData)<br \/>\n        } else {<br \/>\n            storeProvider.store(data)<br \/>\n        }<br \/>\n    }<\/p>\n<p>    @Throws(StoreException::class, EncryptionException::class)<br \/>\n    fun loadData(id: Long, encryptionKey: ByteArray?): PlainData {<br \/>\n        val data = storeProvider.load(id)<br \/>\n        if (data.encrypted &amp;&amp; encryptionKey != null) {<br \/>\n            val decryptedData = cryptoProvider.encrypt(op = EncryptOp.DECRYPT, key = encryptionKey, data = data.content)<br \/>\n            return PlainData(id = data.id, encrypted = false, updated = 0L, content = decryptedData)<br \/>\n        }<br \/>\n        return data<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u062f\u0647 \u0627\u0635\u0644\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u067e\u0630\u06cc\u0631\u0634 \u062f\u0627\u062f\u0647 \u0647\u0627\u060c \u0627\u0646\u062c\u0627\u0645 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0648 \u0630\u062e\u06cc\u0631\u0647 \u0627\u0631\u0632\u0634 \u062f\u0631 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0633\u0627\u062f\u06af\u06cc\u060c \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u067e\u06cc\u0634 \u0641\u0631\u0636 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u062f\u0627\u0631\u06cc\u0645 StoreProvider\u060c \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u0633\u0645\u062a \u0633\u0648\u0626\u06cc\u0641\u062a \u0646\u06cc\u0632 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f. \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0622\u0646\u0686\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u06cc\u0646 \u0631\u0627 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u06a9\u0646\u06cc\u0645 MultiplatformService \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0645\u0648\u0646\u0647 UI Swift. \u062f\u0631 \u0633\u0648\u0626\u06cc\u0641\u062a \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0645\u0627 \u0631\u0627 \u0645\u06cc \u0633\u0627\u0632\u06cc\u0645 MultiplatformService \u0645\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc Swift \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u06cc\u0645 CryptoProvider \u0648 StoreProvider.<\/p>\n<p>  \u0633\u0627\u062e\u062a XCFramework<\/p>\n<p>XCFramework \u0645\u062d\u0641\u0638\u0647\u200c\u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 \u0686\u0646\u062f\u06cc\u0646 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0628\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0634\u0645\u0627 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062a\u0627 \u0628\u0647\u200c\u0637\u0648\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u0631 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647\u200c\u0647\u0627 \u0648 \u0634\u0628\u06cc\u0647\u200c\u0633\u0627\u0632\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 iOS \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<p>  \u0645\u0631\u0627\u062d\u0644 \u0633\u0627\u062e\u062a XCFramework:<\/p>\n<p>\u0646\u0627\u0645 \u0686\u0627\u0631\u0686\u0648\u0628 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f: \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u062f\u0627\u0631\u0627\u06cc \u06cc\u06a9 \u0646\u0627\u0645 \u0648\u0627\u0636\u062d \u0648 \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f \u0627\u0633\u062a\u060c \u0645\u0627\u0646\u0646\u062f KmpLib.<\/p>\n<p>\u067e\u0644\u062a\u0641\u0631\u0645 \u0647\u0627\u06cc \u0647\u062f\u0641 \u0631\u0627 \u0645\u0634\u062e\u0635 \u06a9\u0646\u06cc\u062f: \u062a\u0639\u0631\u06cc\u0641 \u0645\u0639\u0645\u0627\u0631\u06cc \u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f iosArm64 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u0647\u0627\u06cc \u0641\u06cc\u0632\u06cc\u06a9\u06cc \u0648 iosSimulatorArm64 \u0628\u0631\u0627\u06cc \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u0647\u0627<\/p>\n<p>Build Task \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f: \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f .\/gradlew task \u0628\u0631\u0627\u06cc \u062f\u06cc\u062f\u0646 \u06a9\u0627\u0631\u0647\u0627\u06cc \u0627\u062d\u062a\u0645\u0627\u0644\u06cc \u0627\u0633\u0645\u0628\u0644\u06cc \u06a9\u0647 \u062f\u0627\u0631\u06cc\u062f. \u0627\u0632 \u0648\u0638\u06cc\u0641\u0647 Gradle \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f .\/gradlew assembleKmpLibXCFramework \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a XCFramework. \u062e\u0631\u0648\u062c\u06cc \u062f\u0631 \u0648\u0627\u0642\u0639 \u062e\u0648\u0627\u0647\u062f \u0634\u062f kmp-lib\/library\/build\/XCFrameworks\/{debug|release}\/ \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0627\u06af\u0631 \u0628\u0647 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u062e\u0648\u062f \u0646\u0627\u0645\u06cc \u0628\u062f\u0647\u06cc\u062f\u060c Gradle \u0648\u0638\u06cc\u0641\u0647 assembleXCFramework \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>  \u0646\u0645\u0648\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Swift UI<\/p>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 Swift UI \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 KMP \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0645\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u06a9 \u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc \u0627\u0632 \u0639\u0645\u0644\u06a9\u0631\u062f \u0622\u0646 \u062f\u0631 \u0633\u0637\u062d \u0628\u0627\u0644\u0627 \u0622\u0648\u0631\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc: \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc \u0634\u0648\u0646\u062f CryptoProvider \u0631\u0627\u0628\u0637 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u062f\u0631 \u0633\u0648\u0626\u06cc\u0641\u062a<\/p>\n<p>\u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc: \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 InMemoryStoreProvider \u06cc\u0627 \u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc<\/p>\n<p>\u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc: \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>  \u0646\u0645\u0648\u0646\u0647 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631:<\/p>\n<p>\u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0646\u0645\u0648\u0646\u0647 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f.<br \/>\n\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0648 \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc Kotlin.<br \/>\n\u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u062a\u0639\u0627\u0645\u0644 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u06cc\u0646 Swift \u0648 KMP \u0631\u0627 \u0628\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f.<\/p>\n<p>\u0645\u0639\u0645\u0627\u0631\u06cc \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u06cc\u0646\u06cc\u0645\u0627\u0644\u06cc\u0633\u062a\u06cc \u0627\u0633\u062a \u0627\u0645\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0686\u0646\u062f \u067e\u0644\u062a\u0641\u0631\u0645\u06cc Kotlin \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u062a\u0648\u0633\u0639\u0647 iOS \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u0646\u062f.<\/p>\n<p>  \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 XCFramework \u0628\u0647 Xcode<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 XCFramework \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 Xcode \u062e\u0648\u062f\u060c \u0627\u06cc\u0646 \u0645\u0631\u0627\u062d\u0644 \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062c\u0627\u062f\u0648\u06af\u0631 Xcode \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062c\u062f\u06cc\u062f iOS Swift UI \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0645\u0631\u0627\u062d\u0644 \u062e\u0627\u0635\u06cc \u0646\u062f\u0627\u0631\u06cc\u062f\u060c \u0641\u0642\u0637 \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc Xcode \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f.<br \/>\n\u0631\u0648\u06cc \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u062a\u0627 a \u0628\u0627\u0632 \u0634\u0648\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u067e\u0631\u0648\u0698\u0647.<br \/>\n\u0632\u06cc\u0631 \u0686\u0627\u0631\u0686\u0648\u0628 \u0647\u0627\u060c \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627 \u0648 \u0645\u062d\u062a\u0648\u0627\u06cc \u062c\u0627\u0633\u0627\u0632\u06cc \u0634\u062f\u0647\u060c \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f + \u062f\u06a9\u0645\u0647<br \/>\n\u0645\u0633\u06cc\u0631 \u0631\u0627 \u0628\u0647 XCFramework \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<br \/>\nkmp-lib\/library\/build\/XCFrameworks\/debug\/KmpLib.xcframework. \u0686\u0627\u0631\u0686\u0648\u0628 \u062f\u0631 \u0628\u062e\u0634 Frameworks \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647 \u062f\u0631 \u067e\u0627\u0646\u0644 \u062f\u0631\u062e\u062a \u0633\u0645\u062a \u0686\u067e \u0638\u0627\u0647\u0631 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0627\u062f\u063a\u0627\u0645 \u0628\u0647 \u0633\u0648\u0626\u06cc\u0641\u062a \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u06a9\u0627\u062a\u0644\u06cc\u0646 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f.<\/p>\n<p>  \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc KMP \u062f\u0631 \u0633\u0648\u0626\u06cc\u0641\u062a<\/p>\n<p>\u062f\u0631 \u0645\u062b\u0627\u0644 \u062e\u0648\u062f\u060c \u0645\u0627 \u0622\u0646 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u0645 KmpLib \u0641\u0631\u06cc\u0645\u0648\u0631\u06a9 \u0648 \u0627\u06a9\u0646\u0648\u0646 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u0645 \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u0622\u0634\u06a9\u0627\u0631 \u0634\u062f\u0647 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0633\u0648\u0626\u06cc\u0641\u062a \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645. \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u06a9\u0644\u06cc\u062f\u06cc \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632:<\/p>\n<p>import KmpLib<\/p>\n<p>class IosCryptoProvider: CryptoProvider {<br \/>\n    func encrypt(op: EncryptOp, key: KotlinByteArray, data: KotlinByteArray)<br \/>\n        throws -&gt; KotlinByteArray<br \/>\n    {<br \/>\n        \/\/ Ensure the key is not empty<br \/>\n        guard key.size &gt; 0 else {<br \/>\n            throw NSError(<br \/>\n                domain: &#8220;CryptoError&#8221;, code: 1,<br \/>\n                userInfo: [NSLocalizedDescriptionKey: &#8220;Key must not be empty&#8221;])<br \/>\n        }<br \/>\n        \/\/ Create a result array of the same size as the data<br \/>\n        let result = KotlinByteArray(size: data.size)<br \/>\n        \/\/ Perform XOR encryption<br \/>\n        for i in 0..&lt;data.size {<br \/>\n            let dataByte = data.get(index: i)<br \/>\n            let keyByte = key.get(index: i % key.size)<br \/>\n            result.set(index: i, value: dataByte ^ keyByte)<br \/>\n        }<br \/>\n        return result<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>ServiceLocator \u06a9\u0647 \u062d\u0627\u0648\u06cc \u06a9\u062f \u0627\u0635\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u06cc\u06a9 Singleton \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0646 \u0646\u0645\u0648\u0646\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062c\u0639\u0628\u0647 \u0645\u06cc \u06a9\u0646\u062f MultiplatformService:<\/p>\n<p>import Foundation<br \/>\nimport KmpLib<\/p>\n<p>class ServiceLocator {<br \/>\n    static let sharedInstance = ServiceLocator()<\/p>\n<p>    private let mutliplatformService: MultiplatformService!<br \/>\n    private let storeProvider: StoreProvider!<\/p>\n<p>    private init() {<br \/>\n        \/\/ Swift implementation of the CryptoProvider protocol exposed from KMP<br \/>\n        let cryptoProvider = IosCryptoProvider()<br \/>\n        \/\/ KMP implementation of Stor<br \/>\n        storeProvider = InMemoryStoreProvider()<br \/>\n        mutliplatformService = MultiplatformService(<br \/>\n            cryptoProvider: cryptoProvider, storeProvider: storeProvider)<br \/>\n    }<\/p>\n<p>    func getMultiplatformService() -&gt; MultiplatformService {<br \/>\n        return self.mutliplatformService<br \/>\n    }<\/p>\n<p>    func getStoreProvider() -&gt; StoreProvider {<br \/>\n        return self.storeProvider<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0641\u0627\u06cc\u0644 ContentView.swift \u062d\u0627\u0648\u06cc \u0645\u0646\u0637\u0642 \u0627\u0635\u0644\u06cc \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u0633\u062a:<\/p>\n<p>\u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u062d\u062a\u0648\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<br \/>\n\u0645\u062a\u0646 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<br \/>\n\u062f\u06a9\u0645\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0648 \u0630\u062e\u06cc\u0631\u0647 \u0645\u062d\u062a\u0648\u0627<br \/>\n\u06a9\u0646\u062a\u0631\u0644 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0645\u062a\u0646 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u062f\u0631 HEX<br \/>\n\u062f\u06a9\u0645\u0647 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u062d\u062a\u0648\u0627<\/p>\n<p>            Button(action: {<br \/>\n                let service = ServiceLocator.sharedInstance<br \/>\n                    .getMultiplatformService()<br \/>\n                let store = ServiceLocator.sharedInstance.getStoreProvider()<br \/>\n                let plainData = PlainData(<br \/>\n                    id: 1,<br \/>\n                    encrypted: false,<br \/>\n                    updated: 0,<br \/>\n                    content: self.plainDataText.toKotlinByteArray()<br \/>\n                )<br \/>\n                do {<br \/>\n                    try service.storeData(<br \/>\n                        data: plainData,<br \/>\n                        encryptionKey: encryptionKey.toKotlinByteArray())<br \/>\n                    let storedData = try store.load(id: 1)<br \/>\n                    self.encryptedDataText = storedData.content.toHexString()<\/p>\n<p>                } catch {<br \/>\n                    print(&#8220;error: \\(error)&#8221;)<br \/>\n                }<br \/>\n            })<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062c\u0632\u0626\u06cc\u0627\u062a \u0645\u0647\u0645\u060c \u06a9\u0647 \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0631\u062e\u06cc \u0627\u0632 \u062a\u0648\u0627\u0628\u0639 \u0627\u0641\u0632\u0648\u0646\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645 KotlinByteArray \u0648 String \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0628\u06cc\u0646 \u0622\u0646\u0647\u0627 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0646\u06cc\u062f. <\/p>\n<p>\u062f\u0631 \u062a\u0648\u0644\u06cc\u062f\u060c \u0627\u06cc\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u06a9\u067e\u06cc \u0627\u0631\u0632\u0627\u0646 \u0646\u06cc\u0633\u062a\u060c \u0648 \u0628\u0647 \u062e\u0635\u0648\u0635 \u0628\u0627 \u0631\u0648\u0634 \u0647\u0627\u06cc \u067e\u06cc\u0634 \u0641\u0631\u0636\u06cc \u06a9\u0647 KMP \u0628\u0631\u0627\u06cc \u0622\u0646\u0647\u0627 \u062f\u0631 \u0645\u0639\u0631\u0636 \u0646\u0645\u0627\u06cc\u0634 \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f KotlinByteArray\u060c \u0645\u0627\u0646\u0646\u062f get(i)\u060c set(i, value). \u062f\u0631 \u0645\u0642\u0627\u0644\u0627\u062a \u0628\u0639\u062f\u06cc \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06af\u0631\u0641\u062a. \u0628\u0627 \u0645\u0627 \u0647\u0645\u0631\u0627\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f:<\/p>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/p>\n<p>\u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u06cc\u06a9 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0686\u0646\u062f \u067e\u0644\u062a\u0641\u0631\u0645\u06cc Kotlin \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 iOS \u0627\u0631\u0627\u0626\u0647 \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a. \u0628\u0627 \u067e\u06cc\u0631\u0648\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0646\u0637\u0642 \u06a9\u0633\u0628\u200c\u0648\u06a9\u0627\u0631 \u0631\u0627 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0624\u062b\u0631 \u062f\u0631 \u0628\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645\u200c\u0647\u0627 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f\u060c \u0628\u062f\u0648\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u062f\u0631 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc\u200c\u0647\u0627\u06cc \u0622\u0646 \u062a\u062d\u0642\u06cc\u0642 \u06a9\u0646\u06cc\u062f expect\/actual API \u0647\u0627 \u0646\u0645\u0648\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Swift UI \u0627\u062f\u063a\u0627\u0645 \u0639\u0645\u0644\u06cc \u0631\u0627\u0628\u0637\u200c\u0647\u0627\u06cc KMP \u062f\u0631 Swift \u0631\u0627 \u0628\u0631\u062c\u0633\u062a\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u067e\u062a\u0627\u0646\u0633\u06cc\u0644 \u062a\u0648\u0633\u0639\u0647 \u0686\u0646\u062f \u067e\u0644\u062a\u0641\u0631\u0645\u06cc \u0633\u0627\u062f\u0647 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u06a9\u0627\u0648\u0634 \u0628\u06cc\u0634\u062a\u0631\u060c \u0646\u0645\u0648\u0646\u0647 \u06a9\u0627\u0645\u0644 \u0631\u0627 \u062f\u0631 GitHub \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<div data-article-id=\"2108299\" id=\"article-body\">\n<p>Kotlin Multiplatform (KMP) \u06cc\u06a9 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0631\u0627 \u0642\u0627\u062f\u0631 \u0645\u06cc \u0633\u0627\u0632\u062f \u062a\u0627 \u0645\u0646\u0637\u0642 \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 \u0686\u0646\u062f\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u0627\u0632 \u062c\u0645\u0644\u0647 iOS \u0648 Android \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u0646\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0647\u0627\u06cc \u062e\u0627\u0635 \u067e\u0644\u062a \u0641\u0631\u0645 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u0648\u0627\u0628\u0633\u062a\u0647 \u0628\u0647 \u067e\u0644\u062a \u0641\u0631\u0645 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f. \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0646\u062d\u0648\u0647 \u0627\u062f\u063a\u0627\u0645 KMP \u0628\u0627 iOS \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u0648 \u0646\u062d\u0648\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0631\u0627\u0628\u0637\u200c\u0647\u0627\u06cc Kotlin \u062f\u0631 Swift\u060c \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u0631\u0627\u0628\u0637\u200c\u0647\u0627 \u062f\u0631 Swift \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646\u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Swift UI \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f.<\/p>\n<p>\u062a\u0645\u0631\u06a9\u0632 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0628\u0631\u0631\u0633\u06cc \u06cc\u06a9 \u0631\u0648\u06cc\u06a9\u0631\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0627\u062c\u062a\u0646\u0627\u0628 \u0645\u06cc \u06a9\u0646\u062f <code>expect\/actual<\/code> \u0627\u0644\u06af\u0648\u0647\u0627 \u062f\u0631 \u0639\u0648\u0636\u060c \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0627\u062f\u063a\u0627\u0645 \u0631\u0627 \u0628\u0627 \u0628\u0647 \u062d\u062f\u0627\u0642\u0644 \u0631\u0633\u0627\u0646\u062f\u0646 \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 API\u0647\u0627\u06cc \u067e\u0644\u062a\u0641\u0631\u0645\u06cc \u06a9\u0647 \u062f\u0631 KMP \u062f\u0631 \u0645\u0639\u0631\u0636 \u0646\u0645\u0627\u06cc\u0634 \u0646\u06cc\u0633\u062a\u0646\u062f\u060c \u0633\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0627 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Swift UI \u062e\u0648\u0627\u0647\u06cc\u0645 \u0633\u0627\u062e\u062a \u06a9\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc\u060c \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f. \u0645\u0646\u0637\u0642 \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u062f\u0631 Kotlin \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u067e\u0644\u062a\u0641\u0631\u0645 \u062e\u0627\u0635 \u062f\u0631 Swift \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<hr\/>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87_Mutlipform_Kotlin_%D8%AF%D8%B1_%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF_%D8%A7%D8%B3%D8%AA%D9%88%D8%AF%DB%8C%D9%88\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Mutlipform Kotlin \u062f\u0631 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0627\u0633\u062a\u0648\u062f\u06cc\u0648<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D9%85%D8%B1%D8%A7%D8%AD%D9%84_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C\" >\u0645\u0631\u0627\u062d\u0644 \u06a9\u0644\u06cc\u062f\u06cc:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C_%D9%88_%D9%85%D9%86%D8%B7%D9%82_%D8%AA%D8%AC%D8%A7%D8%B1%DB%8C\" >\u0645\u0639\u0645\u0627\u0631\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D8%B3%D8%A7%D8%AE%D8%AA_XCFramework\" >\u0633\u0627\u062e\u062a XCFramework<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D9%85%D8%B1%D8%A7%D8%AD%D9%84_%D8%B3%D8%A7%D8%AE%D8%AA_XCFramework\" >\u0645\u0631\u0627\u062d\u0644 \u0633\u0627\u062e\u062a XCFramework:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D9%86%D9%85%D9%88%D9%86%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Swift_UI\" >\u0646\u0645\u0648\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Swift UI<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D9%86%D9%85%D9%88%D9%86%D9%87_%DA%AF%D8%B1%D8%AF%D8%B4_%DA%A9%D8%A7%D8%B1\" >\u0646\u0645\u0648\u0646\u0647 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D9%88%D8%A7%D8%B1%D8%AF_%DA%A9%D8%B1%D8%AF%D9%86_XCFramework_%D8%A8%D9%87_Xcode\" >\u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 XCFramework \u0628\u0647 Xcode<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D8%B1%D8%A7%D8%A8%D8%B7_%D9%87%D8%A7%DB%8C_KMP_%D8%AF%D8%B1_%D8%B3%D9%88%D8%A6%DB%8C%D9%81%D8%AA\" >\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc KMP \u062f\u0631 \u0633\u0648\u0626\u06cc\u0641\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/enhance-ios-development-with-kotlin-multiplatform-library-1h02\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87_Mutlipform_Kotlin_%D8%AF%D8%B1_%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF_%D8%A7%D8%B3%D8%AA%D9%88%D8%AF%DB%8C%D9%88\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Mutlipform Kotlin \u062f\u0631 \u0627\u0646\u062f\u0631\u0648\u06cc\u062f \u0627\u0633\u062a\u0648\u062f\u06cc\u0648<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639\u060c \u0628\u0627\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Android Studio \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 KMP \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0645\u0631\u062c\u0639\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u067e\u0631\u0648\u0698\u0647 \u0646\u0645\u0648\u0646\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0631\u0627 <code>build.gradle.kts<\/code> \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0634\u0627\u0645\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0645\u0647\u0645 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0686\u0646\u062f \u067e\u0644\u062a\u0641\u0631\u0645\u06cc \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%A7%D8%AD%D9%84_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C\"><\/span>\n<p>  \u0645\u0631\u0627\u062d\u0644 \u06a9\u0644\u06cc\u062f\u06cc:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\u0627\u0632 \u0633\u0627\u062e\u062a\u0627\u0631 \u0627\u0648\u0644\u06cc\u0647 \u067e\u0631\u0648\u0698\u0647 KMP \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0645\u0631\u062c\u0639 \u0646\u0645\u0648\u0646\u0647 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f<\/li>\n<li>\u0644\u06cc\u0633\u062a\u06cc \u0627\u0632 \u0627\u0647\u062f\u0627\u0641 iOS \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f <code>iosX64<\/code>\u060c <code>iosArm64<\/code>\u060c <code>iosSimulatorArm64<\/code> \u062f\u0631 \u0634\u0645\u0627 <code>build.gradle.kts<\/code>.<\/li>\n<li>\u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f <code>XCFramework<\/code> \u0628\u0627 \u06cc\u06a9 \u0645\u062a\u063a\u06cc\u0631 \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u062a\u0645\u0627\u0645 \u0627\u0647\u062f\u0627\u0641 \u0628\u0647 \u0686\u0627\u0631\u0686\u0648\u0628<\/li>\n<li>\n<strong>\u0646\u06a9\u062a\u0647 \u06a9\u0644\u06cc\u062f\u06cc \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0646\u0627\u0645 \u0645\u0639\u0646\u0627\u062f\u0627\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0641\u0631\u06cc\u0645\u0648\u0631\u06a9 \u062e\u0648\u062f \u0628\u062f\u0647\u06cc\u062f \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u0632 \u0647\u0645\u0627\u0646 \u0646\u0627\u0645 \u0628\u0631\u0627\u06cc \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u0628\u0627\u06cc\u0646\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/strong>.<\/li>\n<\/ul>\n<p>\u062d\u062f\u0627\u0642\u0644 <code>build.gradle.kts<\/code> \u0641\u0627\u06cc\u0644 \u0628\u0647 \u0634\u06a9\u0644 \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"k\">import<\/span> <span class=\"nn\">org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi<\/span>\n<span class=\"k\">import<\/span> <span class=\"nn\">org.jetbrains.kotlin.gradle.dsl.JvmTarget<\/span>\n<span class=\"k\">import<\/span> <span class=\"nn\">org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFramework<\/span>\n\n<span class=\"nf\">plugins<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nf\">alias<\/span><span class=\"p\">(<\/span><span class=\"n\">libs<\/span><span class=\"p\">.<\/span><span class=\"n\">plugins<\/span><span class=\"p\">.<\/span><span class=\"n\">kotlinMultiplatform<\/span><span class=\"p\">)<\/span>\n    <span class=\"nf\">alias<\/span><span class=\"p\">(<\/span><span class=\"n\">libs<\/span><span class=\"p\">.<\/span><span class=\"n\">plugins<\/span><span class=\"p\">.<\/span><span class=\"n\">androidLibrary<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"n\">group<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"io.github.arskov\"<\/span>\n<span class=\"n\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"1.0.0\"<\/span>\n\n<span class=\"c1\">\/\/ Use some name for the framework. It will be used as main import in Swift<\/span>\n<span class=\"kd\">val<\/span> <span class=\"py\">iosXCFrameworkName<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"KmpLib\"<\/span>\n<span class=\"kd\">val<\/span> <span class=\"py\">binaryName<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"kmp-lib\"<\/span>\n\n<span class=\"nf\">kotlin<\/span> <span class=\"p\">{<\/span>\n\n    <span class=\"nf\">androidTarget<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nf\">publishLibraryVariants<\/span><span class=\"p\">(<\/span><span class=\"s\">\"release\"<\/span><span class=\"p\">)<\/span>\n        <span class=\"nd\">@OptIn<\/span><span class=\"p\">(<\/span><span class=\"nc\">ExperimentalKotlinGradlePluginApi<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">)<\/span>\n        <span class=\"nf\">compilerOptions<\/span> <span class=\"p\">{<\/span>\n            <span class=\"n\">jvmTarget<\/span><span class=\"p\">.<\/span><span class=\"k\">set<\/span><span class=\"p\">(<\/span><span class=\"nc\">JvmTarget<\/span><span class=\"p\">.<\/span><span class=\"nc\">JVM_1_8<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"kd\">val<\/span> <span class=\"py\">xcf<\/span> <span class=\"p\">=<\/span> <span class=\"nc\">XCFramework<\/span><span class=\"p\">(<\/span><span class=\"n\">iosXCFrameworkName<\/span><span class=\"p\">)<\/span>\n    <span class=\"kd\">val<\/span> <span class=\"py\">iosTargets<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">listOf<\/span><span class=\"p\">(<\/span><span class=\"nf\">iosX64<\/span><span class=\"p\">(),<\/span> <span class=\"nf\">iosArm64<\/span><span class=\"p\">(),<\/span> <span class=\"nf\">iosSimulatorArm64<\/span><span class=\"p\">())<\/span>\n    <span class=\"n\">iosTargets<\/span><span class=\"p\">.<\/span><span class=\"nf\">forEach<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">it<\/span><span class=\"p\">.<\/span><span class=\"n\">binaries<\/span><span class=\"p\">.<\/span><span class=\"nf\">framework<\/span> <span class=\"p\">{<\/span>\n            <span class=\"n\">baseName<\/span> <span class=\"p\">=<\/span> <span class=\"n\">iosXCFrameworkName<\/span>\n            <span class=\"n\">xcf<\/span><span class=\"p\">.<\/span><span class=\"nf\">add<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"nf\">sourceSets<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nf\">commonMain<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nf\">dependencies<\/span> <span class=\"p\">{<\/span>\n                <span class=\"c1\">\/\/ Put necessary KMP compatible dependencies here<\/span>\n            <span class=\"p\">}<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"nf\">commonTest<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nf\">dependencies<\/span> <span class=\"p\">{<\/span>\n                <span class=\"nf\">implementation<\/span><span class=\"p\">(<\/span><span class=\"n\">libs<\/span><span class=\"p\">.<\/span><span class=\"n\">kotlin<\/span><span class=\"p\">.<\/span><span class=\"n\">test<\/span><span class=\"p\">)<\/span>\n            <span class=\"p\">}<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"nf\">android<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">namespace<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"io.github.arskov\"<\/span>\n    <span class=\"n\">compileSdk<\/span> <span class=\"p\">=<\/span> <span class=\"n\">libs<\/span><span class=\"p\">.<\/span><span class=\"n\">versions<\/span><span class=\"p\">.<\/span><span class=\"n\">android<\/span><span class=\"p\">.<\/span><span class=\"n\">compileSdk<\/span><span class=\"p\">.<\/span><span class=\"k\">get<\/span><span class=\"p\">().<\/span><span class=\"nf\">toInt<\/span><span class=\"p\">()<\/span>\n    <span class=\"nf\">defaultConfig<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">minSdk<\/span> <span class=\"p\">=<\/span> <span class=\"n\">libs<\/span><span class=\"p\">.<\/span><span class=\"n\">versions<\/span><span class=\"p\">.<\/span><span class=\"n\">android<\/span><span class=\"p\">.<\/span><span class=\"n\">minSdk<\/span><span class=\"p\">.<\/span><span class=\"k\">get<\/span><span class=\"p\">().<\/span><span class=\"nf\">toInt<\/span><span class=\"p\">()<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648\u0638\u06cc\u0641\u0647 Gradle \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u06cc\u06a9 XCFramework \u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 iOS \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C_%D9%88_%D9%85%D9%86%D8%B7%D9%82_%D8%AA%D8%AC%D8%A7%D8%B1%DB%8C\"><\/span>\n<p>  \u0645\u0639\u0645\u0627\u0631\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"k\">package<\/span> <span class=\"nn\">io.github.arskov<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">MultiplatformService<\/span><span class=\"p\">(<\/span>\n    <span class=\"k\">private<\/span> <span class=\"kd\">val<\/span> <span class=\"py\">cryptoProvider<\/span><span class=\"p\">:<\/span> <span class=\"nc\">CryptoProvider<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">private<\/span> <span class=\"kd\">val<\/span> <span class=\"py\">storeProvider<\/span><span class=\"p\">:<\/span> <span class=\"nc\">StoreProvider<\/span>\n<span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n\n    <span class=\"nd\">@Throws<\/span><span class=\"p\">(<\/span><span class=\"nc\">StoreException<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">,<\/span> <span class=\"nc\">EncryptionException<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">fun<\/span> <span class=\"nf\">storeData<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">:<\/span> <span class=\"nc\">PlainData<\/span><span class=\"p\">,<\/span> <span class=\"n\">encryptionKey<\/span><span class=\"p\">:<\/span> <span class=\"nc\">ByteArray<\/span><span class=\"p\">?)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(!<\/span><span class=\"n\">data<\/span><span class=\"p\">.<\/span><span class=\"n\">encrypted<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">encryptionKey<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"kd\">val<\/span> <span class=\"py\">encryptedData<\/span> <span class=\"p\">=<\/span>\n                <span class=\"n\">cryptoProvider<\/span><span class=\"p\">.<\/span><span class=\"nf\">encrypt<\/span><span class=\"p\">(<\/span><span class=\"n\">op<\/span> <span class=\"p\">=<\/span> <span class=\"nc\">EncryptOp<\/span><span class=\"p\">.<\/span><span class=\"nc\">ENCRYPT<\/span><span class=\"p\">,<\/span> <span class=\"n\">key<\/span> <span class=\"p\">=<\/span> <span class=\"n\">encryptionKey<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span> <span class=\"p\">=<\/span> <span class=\"n\">data<\/span><span class=\"p\">.<\/span><span class=\"n\">content<\/span><span class=\"p\">)<\/span>\n            <span class=\"kd\">val<\/span> <span class=\"py\">encryptedPlainData<\/span> <span class=\"p\">=<\/span>\n                <span class=\"nc\">PlainData<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span> <span class=\"p\">=<\/span> <span class=\"n\">data<\/span><span class=\"p\">.<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">encrypted<\/span> <span class=\"p\">=<\/span> <span class=\"k\">true<\/span><span class=\"p\">,<\/span> <span class=\"n\">updated<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">0L<\/span><span class=\"p\">,<\/span> <span class=\"n\">content<\/span> <span class=\"p\">=<\/span> <span class=\"n\">encryptedData<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">storeProvider<\/span><span class=\"p\">.<\/span><span class=\"nf\">store<\/span><span class=\"p\">(<\/span><span class=\"n\">encryptedPlainData<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n            <span class=\"n\">storeProvider<\/span><span class=\"p\">.<\/span><span class=\"nf\">store<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"nd\">@Throws<\/span><span class=\"p\">(<\/span><span class=\"nc\">StoreException<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">,<\/span> <span class=\"nc\">EncryptionException<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">fun<\/span> <span class=\"nf\">loadData<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Long<\/span><span class=\"p\">,<\/span> <span class=\"n\">encryptionKey<\/span><span class=\"p\">:<\/span> <span class=\"nc\">ByteArray<\/span><span class=\"p\">?):<\/span> <span class=\"nc\">PlainData<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">val<\/span> <span class=\"py\">data<\/span> <span class=\"p\">=<\/span> <span class=\"n\">storeProvider<\/span><span class=\"p\">.<\/span><span class=\"nf\">load<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">.<\/span><span class=\"n\">encrypted<\/span> <span class=\"p\">&amp;&amp;<\/span> <span class=\"n\">encryptionKey<\/span> <span class=\"p\">!=<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"kd\">val<\/span> <span class=\"py\">decryptedData<\/span> <span class=\"p\">=<\/span> <span class=\"n\">cryptoProvider<\/span><span class=\"p\">.<\/span><span class=\"nf\">encrypt<\/span><span class=\"p\">(<\/span><span class=\"n\">op<\/span> <span class=\"p\">=<\/span> <span class=\"nc\">EncryptOp<\/span><span class=\"p\">.<\/span><span class=\"nc\">DECRYPT<\/span><span class=\"p\">,<\/span> <span class=\"n\">key<\/span> <span class=\"p\">=<\/span> <span class=\"n\">encryptionKey<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span> <span class=\"p\">=<\/span> <span class=\"n\">data<\/span><span class=\"p\">.<\/span><span class=\"n\">content<\/span><span class=\"p\">)<\/span>\n            <span class=\"k\">return<\/span> <span class=\"nc\">PlainData<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span> <span class=\"p\">=<\/span> <span class=\"n\">data<\/span><span class=\"p\">.<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">encrypted<\/span> <span class=\"p\">=<\/span> <span class=\"k\">false<\/span><span class=\"p\">,<\/span> <span class=\"n\">updated<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">0L<\/span><span class=\"p\">,<\/span> <span class=\"n\">content<\/span> <span class=\"p\">=<\/span> <span class=\"n\">decryptedData<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">data<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u062f\u0647 \u0627\u0635\u0644\u06cc \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u067e\u0630\u06cc\u0631\u0634 \u062f\u0627\u062f\u0647 \u0647\u0627\u060c \u0627\u0646\u062c\u0627\u0645 \u06cc\u06a9 \u0639\u0645\u0644\u06cc\u0627\u062a \u0631\u0645\u0632\u0646\u06af\u0627\u0631\u06cc \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0648 \u0630\u062e\u06cc\u0631\u0647 \u0627\u0631\u0632\u0634 \u062f\u0631 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0633\u0627\u062f\u06af\u06cc\u060c \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u067e\u06cc\u0634 \u0641\u0631\u0636 \u062f\u0631 \u062d\u0627\u0641\u0638\u0647 \u062f\u0627\u0631\u06cc\u0645 <code>StoreProvider<\/code>\u060c \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u0633\u0645\u062a \u0633\u0648\u0626\u06cc\u0641\u062a \u0646\u06cc\u0632 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f. \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0622\u0646\u0686\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0627\u06cc\u0646 \u0631\u0627 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u06a9\u0646\u06cc\u0645 <code>MultiplatformService<\/code> \u0628\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0645\u0648\u0646\u0647 UI Swift. \u062f\u0631 \u0633\u0648\u0626\u06cc\u0641\u062a \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0645\u0627 \u0631\u0627 \u0645\u06cc \u0633\u0627\u0632\u06cc\u0645 <code>MultiplatformService<\/code> \u0645\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc Swift \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u06cc\u0645 <code>CryptoProvider<\/code> \u0648 <code>StoreProvider<\/code>.<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B3%D8%A7%D8%AE%D8%AA_XCFramework\"><\/span>\n<p>  \u0633\u0627\u062e\u062a XCFramework<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>XCFramework \u0645\u062d\u0641\u0638\u0647\u200c\u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0627\u0632 \u0686\u0646\u062f\u06cc\u0646 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0628\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0634\u0645\u0627 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062a\u0627 \u0628\u0647\u200c\u0637\u0648\u0631 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u0631 \u0631\u0648\u06cc \u062f\u0633\u062a\u06af\u0627\u0647\u200c\u0647\u0627 \u0648 \u0634\u0628\u06cc\u0647\u200c\u0633\u0627\u0632\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 iOS \u06a9\u0627\u0631 \u06a9\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%A7%D8%AD%D9%84_%D8%B3%D8%A7%D8%AE%D8%AA_XCFramework\"><\/span>\n<p>  \u0645\u0631\u0627\u062d\u0644 \u0633\u0627\u062e\u062a XCFramework:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li>\n<strong>\u0646\u0627\u0645 \u0686\u0627\u0631\u0686\u0648\u0628 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<\/strong>: \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u062f\u0627\u0631\u0627\u06cc \u06cc\u06a9 \u0646\u0627\u0645 \u0648\u0627\u0636\u062d \u0648 \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f \u0627\u0633\u062a\u060c \u0645\u0627\u0646\u0646\u062f <code>KmpLib<\/code>.<\/li>\n<li>\n<strong>\u067e\u0644\u062a\u0641\u0631\u0645 \u0647\u0627\u06cc \u0647\u062f\u0641 \u0631\u0627 \u0645\u0634\u062e\u0635 \u06a9\u0646\u06cc\u062f<\/strong>: \u062a\u0639\u0631\u06cc\u0641 \u0645\u0639\u0645\u0627\u0631\u06cc \u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f <code>iosArm64<\/code> \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u06af\u0627\u0647 \u0647\u0627\u06cc \u0641\u06cc\u0632\u06cc\u06a9\u06cc \u0648 <code>iosSimulatorArm64<\/code> \u0628\u0631\u0627\u06cc \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u0647\u0627<\/li>\n<li>\n<strong>Build Task \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/strong>: \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f <code>.\/gradlew task<\/code> \u0628\u0631\u0627\u06cc \u062f\u06cc\u062f\u0646 \u06a9\u0627\u0631\u0647\u0627\u06cc \u0627\u062d\u062a\u0645\u0627\u0644\u06cc \u0627\u0633\u0645\u0628\u0644\u06cc \u06a9\u0647 \u062f\u0627\u0631\u06cc\u062f. \u0627\u0632 \u0648\u0638\u06cc\u0641\u0647 Gradle \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f <code>.\/gradlew assembleKmpLibXCFramework<\/code> \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a XCFramework. \u062e\u0631\u0648\u062c\u06cc \u062f\u0631 \u0648\u0627\u0642\u0639 \u062e\u0648\u0627\u0647\u062f \u0634\u062f <code>kmp-lib\/library\/build\/XCFrameworks\/{debug|release}\/<\/code> \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0627\u06af\u0631 \u0628\u0647 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u062e\u0648\u062f \u0646\u0627\u0645\u06cc \u0628\u062f\u0647\u06cc\u062f\u060c Gradle \u0648\u0638\u06cc\u0641\u0647 assembleXCFramework \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<\/ol>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D9%85%D9%88%D9%86%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Swift_UI\"><\/span>\n<p>  \u0646\u0645\u0648\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Swift UI<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 Swift UI \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 KMP \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0645\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06cc\u06a9 \u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc \u0627\u0632 \u0639\u0645\u0644\u06a9\u0631\u062f \u0622\u0646 \u062f\u0631 \u0633\u0637\u062d \u0628\u0627\u0644\u0627 \u0622\u0648\u0631\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<ul>\n<li>\n<strong>\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc<\/strong>: \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc \u0634\u0648\u0646\u062f <code>CryptoProvider<\/code> \u0631\u0627\u0628\u0637 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u062f\u0631 \u0633\u0648\u0626\u06cc\u0641\u062a<\/li>\n<li>\n<strong>\u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc<\/strong>: \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>InMemoryStoreProvider<\/code> \u06cc\u0627 \u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc<\/li>\n<li>\n<strong>\u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc<\/strong>: \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D9%85%D9%88%D9%86%D9%87_%DA%AF%D8%B1%D8%AF%D8%B4_%DA%A9%D8%A7%D8%B1\"><\/span>\n<p>  \u0646\u0645\u0648\u0646\u0647 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li>\u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0646\u0645\u0648\u0646\u0647 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0648 \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc Kotlin.<\/li>\n<li>\u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u062a\u0639\u0627\u0645\u0644 \u06cc\u06a9\u067e\u0627\u0631\u0686\u0647 \u0628\u06cc\u0646 Swift \u0648 KMP \u0631\u0627 \u0628\u0647 \u0646\u0645\u0627\u06cc\u0634 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f.<\/li>\n<\/ol>\n<p><\/p>\n<p>\u0645\u0639\u0645\u0627\u0631\u06cc \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u06cc\u0646\u06cc\u0645\u0627\u0644\u06cc\u0633\u062a\u06cc \u0627\u0633\u062a \u0627\u0645\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0686\u0646\u062f \u067e\u0644\u062a\u0641\u0631\u0645\u06cc Kotlin \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u062a\u0648\u0633\u0639\u0647 iOS \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u0646\u062f.<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D9%88%D8%A7%D8%B1%D8%AF_%DA%A9%D8%B1%D8%AF%D9%86_XCFramework_%D8%A8%D9%87_Xcode\"><\/span>\n<p>  \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 XCFramework \u0628\u0647 Xcode<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 XCFramework \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062f\u0631 \u067e\u0631\u0648\u0698\u0647 Xcode \u062e\u0648\u062f\u060c \u0627\u06cc\u0646 \u0645\u0631\u0627\u062d\u0644 \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f:<\/p>\n<ol>\n<li>\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062c\u0627\u062f\u0648\u06af\u0631 Xcode \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062c\u062f\u06cc\u062f iOS Swift UI \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0645\u0631\u0627\u062d\u0644 \u062e\u0627\u0635\u06cc \u0646\u062f\u0627\u0631\u06cc\u062f\u060c \u0641\u0642\u0637 \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc Xcode \u0631\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0631\u0648\u06cc \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f \u062a\u0627 a \u0628\u0627\u0632 \u0634\u0648\u062f <strong>\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u067e\u0631\u0648\u0698\u0647<\/strong>. <\/li>\n<li>\u0632\u06cc\u0631 <strong>\u0686\u0627\u0631\u0686\u0648\u0628 \u0647\u0627\u060c \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627 \u0648 \u0645\u062d\u062a\u0648\u0627\u06cc \u062c\u0627\u0633\u0627\u0632\u06cc \u0634\u062f\u0647<\/strong>\u060c \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <strong>+<\/strong> \u062f\u06a9\u0645\u0647<\/li>\n<li>\u0645\u0633\u06cc\u0631 \u0631\u0627 \u0628\u0647 XCFramework \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<br \/>\n<code>kmp-lib\/library\/build\/XCFrameworks\/debug\/KmpLib.xcframework<\/code>. \u0686\u0627\u0631\u0686\u0648\u0628 \u062f\u0631 \u0628\u062e\u0634 Frameworks \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647 \u062f\u0631 \u067e\u0627\u0646\u0644 \u062f\u0631\u062e\u062a \u0633\u0645\u062a \u0686\u067e \u0638\u0627\u0647\u0631 \u0645\u06cc \u0634\u0648\u062f.<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5seekwc5thczkew4yt8m.png\" alt=\"\u062a\u0646\u0638\u06cc\u0645\u0627\u062a Xcode\" loading=\"lazy\" width=\"800\" height=\"500\" title=\"\"><\/p>\n<p>\u0627\u06cc\u0646 \u0627\u062f\u063a\u0627\u0645 \u0628\u0647 \u0633\u0648\u0626\u06cc\u0641\u062a \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0647 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u06a9\u0627\u062a\u0644\u06cc\u0646 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f.<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D8%B1%D8%A7%D8%A8%D8%B7_%D9%87%D8%A7%DB%8C_KMP_%D8%AF%D8%B1_%D8%B3%D9%88%D8%A6%DB%8C%D9%81%D8%AA\"><\/span>\n<p>  \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc KMP \u062f\u0631 \u0633\u0648\u0626\u06cc\u0641\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0645\u062b\u0627\u0644 \u062e\u0648\u062f\u060c \u0645\u0627 \u0622\u0646 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u0645 <code>KmpLib<\/code> \u0641\u0631\u06cc\u0645\u0648\u0631\u06a9 \u0648 \u0627\u06a9\u0646\u0648\u0646 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u0645 \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u0622\u0634\u06a9\u0627\u0631 \u0634\u062f\u0647 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0633\u0648\u0626\u06cc\u0641\u062a \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645. \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u06a9\u0644\u06cc\u062f\u06cc \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight swift\"><code><span class=\"kd\">import<\/span> <span class=\"kt\">KmpLib<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"kt\">IosCryptoProvider<\/span><span class=\"p\">:<\/span> <span class=\"kt\">CryptoProvider<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">func<\/span> <span class=\"nf\">encrypt<\/span><span class=\"p\">(<\/span><span class=\"nv\">op<\/span><span class=\"p\">:<\/span> <span class=\"kt\">EncryptOp<\/span><span class=\"p\">,<\/span> <span class=\"nv\">key<\/span><span class=\"p\">:<\/span> <span class=\"kt\">KotlinByteArray<\/span><span class=\"p\">,<\/span> <span class=\"nv\">data<\/span><span class=\"p\">:<\/span> <span class=\"kt\">KotlinByteArray<\/span><span class=\"p\">)<\/span>\n        <span class=\"k\">throws<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"kt\">KotlinByteArray<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Ensure the key is not empty<\/span>\n        <span class=\"k\">guard<\/span> <span class=\"n\">key<\/span><span class=\"o\">.<\/span><span class=\"n\">size<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">throw<\/span> <span class=\"kt\">NSError<\/span><span class=\"p\">(<\/span>\n                <span class=\"nv\">domain<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"CryptoError\"<\/span><span class=\"p\">,<\/span> <span class=\"nv\">code<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n                <span class=\"nv\">userInfo<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"kt\">NSLocalizedDescriptionKey<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Key must not be empty\"<\/span><span class=\"p\">])<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"c1\">\/\/ Create a result array of the same size as the data<\/span>\n        <span class=\"k\">let<\/span> <span class=\"nv\">result<\/span> <span class=\"o\">=<\/span> <span class=\"kt\">KotlinByteArray<\/span><span class=\"p\">(<\/span><span class=\"nv\">size<\/span><span class=\"p\">:<\/span> <span class=\"n\">data<\/span><span class=\"o\">.<\/span><span class=\"n\">size<\/span><span class=\"p\">)<\/span>\n        <span class=\"c1\">\/\/ Perform XOR encryption<\/span>\n        <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"k\">in<\/span> <span class=\"mi\">0<\/span><span class=\"o\">..&lt;<\/span><span class=\"n\">data<\/span><span class=\"o\">.<\/span><span class=\"n\">size<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">let<\/span> <span class=\"nv\">dataByte<\/span> <span class=\"o\">=<\/span> <span class=\"n\">data<\/span><span class=\"o\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nv\">index<\/span><span class=\"p\">:<\/span> <span class=\"n\">i<\/span><span class=\"p\">)<\/span>\n            <span class=\"k\">let<\/span> <span class=\"nv\">keyByte<\/span> <span class=\"o\">=<\/span> <span class=\"n\">key<\/span><span class=\"o\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nv\">index<\/span><span class=\"p\">:<\/span> <span class=\"n\">i<\/span> <span class=\"o\">%<\/span> <span class=\"n\">key<\/span><span class=\"o\">.<\/span><span class=\"n\">size<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">result<\/span><span class=\"o\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nv\">index<\/span><span class=\"p\">:<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"nv\">value<\/span><span class=\"p\">:<\/span> <span class=\"n\">dataByte<\/span> <span class=\"o\">^<\/span> <span class=\"n\">keyByte<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">result<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>ServiceLocator \u06a9\u0647 \u062d\u0627\u0648\u06cc \u06a9\u062f \u0627\u0635\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u06cc\u06a9 Singleton \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0646 \u0646\u0645\u0648\u0646\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062c\u0639\u0628\u0647 \u0645\u06cc \u06a9\u0646\u062f <code>MultiplatformService<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight swift\"><code><span class=\"kd\">import<\/span> <span class=\"kt\">Foundation<\/span>\n<span class=\"kd\">import<\/span> <span class=\"kt\">KmpLib<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"kt\">ServiceLocator<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">static<\/span> <span class=\"k\">let<\/span> <span class=\"nv\">sharedInstance<\/span> <span class=\"o\">=<\/span> <span class=\"kt\">ServiceLocator<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"k\">let<\/span> <span class=\"nv\">mutliplatformService<\/span><span class=\"p\">:<\/span> <span class=\"kt\">MultiplatformService<\/span><span class=\"o\">!<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"k\">let<\/span> <span class=\"nv\">storeProvider<\/span><span class=\"p\">:<\/span> <span class=\"kt\">StoreProvider<\/span><span class=\"o\">!<\/span>\n\n    <span class=\"kd\">private<\/span> <span class=\"nf\">init<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Swift implementation of the CryptoProvider protocol exposed from KMP<\/span>\n        <span class=\"k\">let<\/span> <span class=\"nv\">cryptoProvider<\/span> <span class=\"o\">=<\/span> <span class=\"kt\">IosCryptoProvider<\/span><span class=\"p\">()<\/span>\n        <span class=\"c1\">\/\/ KMP implementation of Stor<\/span>\n        <span class=\"n\">storeProvider<\/span> <span class=\"o\">=<\/span> <span class=\"kt\">InMemoryStoreProvider<\/span><span class=\"p\">()<\/span>\n        <span class=\"n\">mutliplatformService<\/span> <span class=\"o\">=<\/span> <span class=\"kt\">MultiplatformService<\/span><span class=\"p\">(<\/span>\n            <span class=\"nv\">cryptoProvider<\/span><span class=\"p\">:<\/span> <span class=\"n\">cryptoProvider<\/span><span class=\"p\">,<\/span> <span class=\"nv\">storeProvider<\/span><span class=\"p\">:<\/span> <span class=\"n\">storeProvider<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"kd\">func<\/span> <span class=\"nf\">getMultiplatformService<\/span><span class=\"p\">()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"kt\">MultiplatformService<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">mutliplatformService<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"kd\">func<\/span> <span class=\"nf\">getStoreProvider<\/span><span class=\"p\">()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"kt\">StoreProvider<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">storeProvider<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0641\u0627\u06cc\u0644 ContentView.swift \u062d\u0627\u0648\u06cc \u0645\u0646\u0637\u0642 \u0627\u0635\u0644\u06cc \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u0633\u062a:<\/p>\n<ul>\n<li>\u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0645\u062d\u062a\u0648\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0645\u062a\u0646 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u062f\u06a9\u0645\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0648 \u0630\u062e\u06cc\u0631\u0647 \u0645\u062d\u062a\u0648\u0627<\/li>\n<li>\u06a9\u0646\u062a\u0631\u0644 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u0645\u062a\u0646 \u0631\u0645\u0632\u06af\u0630\u0627\u0631\u06cc \u0634\u062f\u0647 \u062f\u0631 HEX<\/li>\n<li>\u062f\u06a9\u0645\u0647 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0648 \u0631\u0645\u0632\u06af\u0634\u0627\u06cc\u06cc \u0645\u062d\u062a\u0648\u0627\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight swift\"><code>            <span class=\"kt\">Button<\/span><span class=\"p\">(<\/span><span class=\"nv\">action<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n                <span class=\"k\">let<\/span> <span class=\"nv\">service<\/span> <span class=\"o\">=<\/span> <span class=\"kt\">ServiceLocator<\/span><span class=\"o\">.<\/span><span class=\"n\">sharedInstance<\/span>\n                    <span class=\"o\">.<\/span><span class=\"nf\">getMultiplatformService<\/span><span class=\"p\">()<\/span>\n                <span class=\"k\">let<\/span> <span class=\"nv\">store<\/span> <span class=\"o\">=<\/span> <span class=\"kt\">ServiceLocator<\/span><span class=\"o\">.<\/span><span class=\"n\">sharedInstance<\/span><span class=\"o\">.<\/span><span class=\"nf\">getStoreProvider<\/span><span class=\"p\">()<\/span>\n                <span class=\"k\">let<\/span> <span class=\"nv\">plainData<\/span> <span class=\"o\">=<\/span> <span class=\"kt\">PlainData<\/span><span class=\"p\">(<\/span>\n                    <span class=\"nv\">id<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n                    <span class=\"nv\">encrypted<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\n                    <span class=\"nv\">updated<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n                    <span class=\"nv\">content<\/span><span class=\"p\">:<\/span> <span class=\"k\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">plainDataText<\/span><span class=\"o\">.<\/span><span class=\"nf\">toKotlinByteArray<\/span><span class=\"p\">()<\/span>\n                <span class=\"p\">)<\/span>\n                <span class=\"k\">do<\/span> <span class=\"p\">{<\/span>\n                    <span class=\"k\">try<\/span> <span class=\"n\">service<\/span><span class=\"o\">.<\/span><span class=\"nf\">storeData<\/span><span class=\"p\">(<\/span>\n                        <span class=\"nv\">data<\/span><span class=\"p\">:<\/span> <span class=\"n\">plainData<\/span><span class=\"p\">,<\/span>\n                        <span class=\"nv\">encryptionKey<\/span><span class=\"p\">:<\/span> <span class=\"n\">encryptionKey<\/span><span class=\"o\">.<\/span><span class=\"nf\">toKotlinByteArray<\/span><span class=\"p\">())<\/span>\n                    <span class=\"k\">let<\/span> <span class=\"nv\">storedData<\/span> <span class=\"o\">=<\/span> <span class=\"k\">try<\/span> <span class=\"n\">store<\/span><span class=\"o\">.<\/span><span class=\"nf\">load<\/span><span class=\"p\">(<\/span><span class=\"nv\">id<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n                    <span class=\"k\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">encryptedDataText<\/span> <span class=\"o\">=<\/span> <span class=\"n\">storedData<\/span><span class=\"o\">.<\/span><span class=\"n\">content<\/span><span class=\"o\">.<\/span><span class=\"nf\">toHexString<\/span><span class=\"p\">()<\/span>\n\n                <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">{<\/span>\n                    <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"error: <\/span><span class=\"se\">\\(<\/span><span class=\"n\">error<\/span><span class=\"se\">)<\/span><span class=\"s\">\"<\/span><span class=\"p\">)<\/span>\n                <span class=\"p\">}<\/span>\n            <span class=\"p\">})<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062c\u0632\u0626\u06cc\u0627\u062a \u0645\u0647\u0645\u060c \u06a9\u0647 \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0631\u062e\u06cc \u0627\u0632 \u062a\u0648\u0627\u0628\u0639 \u0627\u0641\u0632\u0648\u0646\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645 <code>KotlinByteArray<\/code> \u0648 <code>String<\/code> \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0628\u06cc\u0646 \u0622\u0646\u0647\u0627 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0646\u06cc\u062f. <\/p>\n<p>\u062f\u0631 \u062a\u0648\u0644\u06cc\u062f\u060c \u0627\u06cc\u0646 \u0639\u0645\u0644\u06cc\u0627\u062a \u06a9\u067e\u06cc \u0627\u0631\u0632\u0627\u0646 \u0646\u06cc\u0633\u062a\u060c \u0648 \u0628\u0647 \u062e\u0635\u0648\u0635 \u0628\u0627 \u0631\u0648\u0634 \u0647\u0627\u06cc \u067e\u06cc\u0634 \u0641\u0631\u0636\u06cc \u06a9\u0647 KMP \u0628\u0631\u0627\u06cc \u0622\u0646\u0647\u0627 \u062f\u0631 \u0645\u0639\u0631\u0636 \u0646\u0645\u0627\u06cc\u0634 \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f <code>KotlinByteArray<\/code>\u060c \u0645\u0627\u0646\u0646\u062f <code>get(i)<\/code>\u060c <code>set(i, value)<\/code>. \u062f\u0631 \u0645\u0642\u0627\u0644\u0627\u062a \u0628\u0639\u062f\u06cc \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u06cc \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646 \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06af\u0631\u0641\u062a. \u0628\u0627 \u0645\u0627 \u0647\u0645\u0631\u0627\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2grx4j8533fo8unv1c2n.png\" alt=\"\u0646\u0645\u0648\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\" loading=\"lazy\" width=\"800\" height=\"1706\" title=\"\"><\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u06cc\u06a9 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06af\u0627\u0645 \u0628\u0647 \u06af\u0627\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc \u0686\u0646\u062f \u067e\u0644\u062a\u0641\u0631\u0645\u06cc Kotlin \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 iOS \u0627\u0631\u0627\u0626\u0647 \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a. \u0628\u0627 \u067e\u06cc\u0631\u0648\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0645\u0646\u0637\u0642 \u06a9\u0633\u0628\u200c\u0648\u06a9\u0627\u0631 \u0631\u0627 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0624\u062b\u0631 \u062f\u0631 \u0628\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645\u200c\u0647\u0627 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f\u060c \u0628\u062f\u0648\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u062f\u0631 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc\u200c\u0647\u0627\u06cc \u0622\u0646 \u062a\u062d\u0642\u06cc\u0642 \u06a9\u0646\u06cc\u062f <code>expect\/actual<\/code> API \u0647\u0627 \u0646\u0645\u0648\u0646\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 Swift UI \u0627\u062f\u063a\u0627\u0645 \u0639\u0645\u0644\u06cc \u0631\u0627\u0628\u0637\u200c\u0647\u0627\u06cc KMP \u062f\u0631 Swift \u0631\u0627 \u0628\u0631\u062c\u0633\u062a\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u067e\u062a\u0627\u0646\u0633\u06cc\u0644 \u062a\u0648\u0633\u0639\u0647 \u0686\u0646\u062f \u067e\u0644\u062a\u0641\u0631\u0645\u06cc \u0633\u0627\u062f\u0647 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u06a9\u0627\u0648\u0634 \u0628\u06cc\u0634\u062a\u0631\u060c \u0646\u0645\u0648\u0646\u0647 \u06a9\u0627\u0645\u0644 \u0631\u0627 \u062f\u0631 GitHub \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang Kotlin Multiplatform (KMP) \u06cc\u06a9 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u0631\u0627 \u0642\u0627\u062f\u0631 \u0645\u06cc \u0633\u0627\u0632\u062f \u062a\u0627 \u0645\u0646\u0637\u0642 \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u0631\u0627 \u062f\u0631 \u0686\u0646\u062f\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u0627\u0632 \u062c\u0645\u0644\u0647 iOS \u0648 Android \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u0646\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0647\u0627\u06cc \u062e\u0627\u0635 \u067e\u0644\u062a \u0641\u0631\u0645 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc \u0648\u0627\u0628\u0633\u062a\u0647 \u0628\u0647 \u067e\u0644\u062a &hellip;<\/p>\n","protected":false},"author":2,"featured_media":84317,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-84316","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/84316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=84316"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/84316\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/84317"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=84316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=84316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=84316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}