{"id":366183,"date":"2024-05-21T02:53:58","date_gmt":"2024-05-21T02:53:58","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=366183"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T02:53:58","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=366183","title":{"rendered":"<span>\u0417\u0430\u0432\u043e\u0434\u0438\u043c \u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442\u044b \u0432 Compose Multiplatform<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/497\/851\/549\/497851549a01f71a14010fb007a7e99f.png\" width=\"1600\" height=\"941\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/497\/851\/549\/497851549a01f71a14010fb007a7e99f.png\"\/><\/figure>\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 (\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c)<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u042d\u0442\u043e \u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0441\u0442 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u042f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a (\u0442\u0430\u043a\u043e\u0432\u044b\u043c \u0441\u0435\u0431\u044f \u0441\u0447\u0438\u0442\u0430\u044e) \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u044f Compose Multiplatform. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0438 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e. \u0412\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0441\u0432\u043e\u0435, \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u044f \u043b\u0438\u0448\u044c \u0434\u0435\u043b\u044e\u0441\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<blockquote>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435<\/p>\n<\/blockquote>\n<h2>\u0427\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c?<\/h2>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <strong>Compose Multiplatform<\/strong>, \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 <strong>\u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442<\/strong>. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0435\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0446\u0435\u043d\u0442\u0440\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043a\u0438 \u0421\u0422\u041e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u0442\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e.<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/315\/ed6\/ab3\/315ed6ab32fd05810083620f1301f7d7.png\" width=\"376\" height=\"313\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/315\/ed6\/ab3\/315ed6ab32fd05810083620f1301f7d7.png\"\/><\/figure>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 MapKit \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043a \u0434\u043b\u044f Android, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f iOS. \u041d\u0430 <a href=\"https:\/\/yandex.ru\/dev\/mapkit\/doc\/ru\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u0439\u0442\u0435<\/a> \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/yandex\/mapkit-ios-demo\" rel=\"noopener noreferrer nofollow\">iOS<\/a> \u0438 <a href=\"https:\/\/github.com\/yandex\/mapkit-android-demo\" rel=\"noopener noreferrer nofollow\">Android<\/a> \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u043c\u043f\u043b\u0430\u043c\u0438.<\/p>\n<h2>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/h2>\n<h4>1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c native cocoapods<\/h4>\n<p>\u0421 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0438\u0437 <a href=\"https:\/\/kotlinlang.org\/docs\/native-cocoapods-libraries.html#with-custom-cinterop-options\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Kotlin<\/a>. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c Pod \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 build.gradle, \u043c\u043e\u0436\u0435\u043c \u0434\u0430\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438\u043b\u0438 \u0435\u0449\u0435 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0444\u043b\u0430\u0433\u0438 cinterop. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 cinterop. \u041e\u043d \u043f\u0440\u043e\u0447\u0442\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0443\u0436\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Objective-C \u0438 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u0430\u043c klib \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043b\u0435\u0433\u043a\u043e &#171;\u0442\u0440\u043e\u0433\u0430\u0442\u044c&#187; \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u044f common module. <span class=\"habrahidden\">\u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Kotlin \u0434\u0430\u0436\u0435 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f YandexMapsMobile.<\/span> <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/836\/e8b\/fa4\/836e8bfa4d1142a2e2281e56446277f6.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c pod\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c pod\" width=\"1130\" height=\"339\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/836\/e8b\/fa4\/836e8bfa4d1142a2e2281e56446277f6.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c pod<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"kotlin\">\/\/ build.gradle.kts  kotlin {     ios()      cocoapods {         summary = \"CocoaPods test library\"         homepage = \"https:\/\/github.com\/JetBrains\/kotlin\"          ios.deploymentTarget = \"13.5\"          pod(\"YandexMapsMobile\") {             version = \"4.4.0-lite\"         }     } }  \/\/ iosMain\/*.kt import cocoapods.YandexMapKit.*<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441\u0430\u043c\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c, \u043b\u0438\u043d\u043a\u043e\u0432\u0449\u0438\u043a \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u0442\u043e\u0436\u0435, \u0434\u0430\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430. \u041d\u043e \u0432\u043e\u0442, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0438\u043c\u043f\u043e\u0440\u0442:<\/p>\n<pre><code class=\"kotlin\">import cocoapods.YandexMapsMobile.YMKMapView<\/code><\/pre>\n<p>\u0422\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u044b\u043f\u0430\u043b\u0438\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u0449\u0438\u043a\u0430: <code>Undefined symbols: \"OBJC_CLASS \u043d\u0430-\u043d\u0430-\u043d\u0430 <\/code> \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e OpenGL \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u0430\u0440\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0438\u043d\u043a\u043e\u0432\u0449\u0438\u043a \u0432\u044b\u0434\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0436\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0441\u044f, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432 \u0441\u0440\u043e\u0447\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<h4>2. Framework and custom library<\/h4>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 YandexMapsMobile \u0432 framework, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0442\u043e\u0436\u0435 <a href=\"https:\/\/kotlinlang.org\/docs\/native-c-interop.html\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0448\u0438\u0440\u043e\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c framework \u0441\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0432\u043e\u0437\u043b\u0430\u0433\u0430\u0435\u043c \u044d\u0442\u0443 \u043d\u043e\u0448\u0443 \u043d\u0430 cocoapods.<br \/>&#171;<em>\u0410 \u043a\u0430\u043a \u0436\u0435 \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u044c framework, \u0430 \u043d\u0435 pod?<\/em>&#187; &#8212; \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u044f. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c .framework \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: <\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/yandex.ru\/dev\/mapkit\/doc\/ru\/faq\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435<\/a> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/c-villain\/YandexMapsMobile\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435<\/a> \u043e\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u043b\u044e\u0434\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 pod \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u044c framework \u0438\u0437 DerivedData (\u0442\u0443\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0435\u0442 \u2013 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0432\u0441\u0435)<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u0447\u0430 \u0441 .framework \u0440\u0435\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<ol>\n<li>\n<p>\u041a\u0438\u0434\u0430\u0435\u043c \u043a\u0443\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u0430\u0448 .framework<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c .def \u0444\u0430\u0439\u043b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043d\u0430\u0448\u0435\u043c framework<\/p>\n<\/li>\n<li>\n<p>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432 build.gradle.kts \u0438 \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f <s>\u0438\u043b\u0438 \u043d\u0435\u0442<\/s><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">\/\/ build.gradle.kts kotlin {   sourceSets {     val myYandexMapsMobileDefFilePath = \"$projectDir\/src\/nativeInterop\/cinterop\/YandexMapsMobile.def\"     val myYandexMapsMobileCompilerLinkerOpts = \"-F${projectDir}\/..\/iosApp\/\"     val myYandexMapsMobileIncludeDirs = \"$projectDir\/..\/iosApp\/Pods\/YandexMapsMobile\"     iosArm64 {         compilations.getByName(\"main\") {             val YandexMapsMobile by cinterops.creating {                 \/\/ Path to .def file                 packageName(\"cocoapods.YandexMapsMobile\")                 defFile(myYandexMapsMobileDefFilePath)                 includeDirs(myYandexMapsMobileIncludeDirs)                 compilerOpts(myYandexMapsMobileCompilerLinkerOpts)             }         }              binaries.all {             \/\/ Tell the linker where the framework is located.             linkerOpts(myYandexMapsMobileCompilerLinkerOpts)         }     }   } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c .def \u0444\u0430\u0439\u043b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 linker options \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Kotlin multiplatform. <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 &#171;\u043e\u0431\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c&#187;.<\/p>\n<h2>\u041f\u043b\u0430\u043d \u0411 <\/h2>\n<blockquote>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0442\u043e \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e! \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0438\u0436\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f.<\/p>\n<\/blockquote>\n<p>\u0418\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435. \u0427\u0435\u0440\u0435\u0437 Kotlin framework \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 Swift (\u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437 ComposeApp), \u0442\u0430\u043c \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 Swift (\u0432\u043a\u043b\u044e\u0447\u0430\u044f <code>UIViewController<\/code>) \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044e \u0432 DI, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u0441\u0448\u0430\u0440\u0438\u0432 \u043a\u043e\u0434 \u0434\u043b\u044f Kotlin. \u0414\u0430\u043b\u0435\u0435 \u0443\u0436\u0435 \u0432 iosMain \u0432 Kotlin \u043d\u0443\u0436\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 DI, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0431\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>UIKitView<\/code>. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/44a\/efa\/58a\/44aefa58a4fc01fd87b92f2170879e9c.png\" alt=\"\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b\" title=\"\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b\" width=\"915\" height=\"372\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/44a\/efa\/58a\/44aefa58a4fc01fd87b92f2170879e9c.png\"\/><\/p>\n<div><figcaption>\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b<\/figcaption><\/div>\n<\/figure>\n<h4>Podfile (iosApp)<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 swift \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0447\u0435\u0440\u0435\u0437 pod. Kotlin framework \u0442\u043e\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 pod \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d (native cocoapods), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 pod \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0432 \u0432 Podfile \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<pre><code># ..\/iosApp\/Podfile  platform :ios, '14.1'  target 'iosApp' do   use_frameworks!    pod 'composeApp', :path => '..\/composeApp'   pod 'YandexMapsMobile', '4.4.0-lite' # Yandex Maps SDK  end<\/code><\/pre>\n<h4>YandexMapView.kt (commonMain)<\/h4>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0440\u0442\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 Composabel expect \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 iosMain \u0438 \u0432 androidMain. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<pre><code class=\"kotlin\">@Composable expect fun YandexMap(     modifier: Modifier = Modifier,     enabled: Boolean = true,     zoom: Float = 14f,     location: LatLng? = null,     startPosition: LatLng? = null,     points: List&lt;PointMapModel>,     onPointClick: (id: Long) -> Unit,     customPosition: Boolean,     canSelectPosition: Boolean,     anotherLocationSelected: Boolean,     bottomFocusAreaPadding: Int,     onPositionSelected: (lat: Double, lng: Double) -> Unit,     onDragged: () -> Unit )<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430)<\/summary>\n<div class=\"spoiler__content\">\n<p><code>enabled<\/code> \u2013 \u0441\u0442\u0430\u0442\u0443\u0441 view (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u043c)<br \/><code>zoom<\/code> \u2013 \u0437\u0443\u043c \u043a\u0430\u0440\u0442\u044b (\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043a\u0430)<br \/><code>location<\/code> \u2013 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (latitude \u0438 longitude)<br \/><code>startPosition<\/code> \u2013 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u043a\u0430\u0440\u0442\u044b (\u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f)<br \/><code>points<\/code> \u2013 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u0421\u0422\u041e (\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442\u0434)<br \/><code>onPointClick<\/code> \u2013 callback \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0442\u043e\u0447\u043a\u0438 \u0421\u0422\u041e<br \/><code>customPosition<\/code> \u2013 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0442\u043e\u0447\u043a\u0430<br \/><code>canSelectPosition<\/code> \u2013 \u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0430\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443<br \/><code>anotherLocationSelected<\/code> \u2013 \u0441\u0442\u0430\u0442\u0443\u0441 (\u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e)<br \/><code>bottomFocusAreaPadding<\/code> \u2013 \u0440\u0430\u0437\u043c\u0435\u0440 bottomsheet, \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u0430\u0440\u0442\u0443<br \/><code>onPositionSelected<\/code> \u2013 callback \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e<br \/><code>onDragged<\/code> \u2013 callback \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0434\u0432\u0438\u043d\u0443\u043b \u043a\u0430\u0440\u0442\u0443 (\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c)<\/p>\n<\/div>\n<\/details>\n<h4>YandexMapProtocol.kt (iosMain)<\/h4>\n<p>\u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>UIViewController<\/code>, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u043b\u0435 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435. <\/p>\n<pre><code>interface YandexMapProtocol {      val viewController: UIViewController      fun addCameraListener(onDragged: () -> Unit)      fun addMapListener(onPositionSelect: (latitude: Double, longitude: Double) -> Unit)      fun addMapPointListener(onPointClick: (id: Long) -> Unit)      fun onMapStop()      fun onMapStart()      fun onMapMove(latLng: LatLng)      fun updateCustomPoint(latLng: LatLng? = null, visible: Boolean = true)      fun updateMyPoint(latLng: LatLng? = null, visible: Boolean = true)      fun updatePointsCollection(points: List&lt;PointMapModel>)      fun setupFocusRect(bottomFocusAreaPadding: Int)  }<\/code><\/pre>\n<h4>MapViewController.swift (iosApp)<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c YandexMapsMobile \u0438 UIKit. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0441\u0435 \u0437\u0430\u043d\u0435\u0441 \u0432 <a href=\"https:\/\/gist.github.com\/stakancheck\/1daef28a83c76039b6d661b544a10d36\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b<\/a>. <\/p>\n<details class=\"spoiler\">\n<summary>MapViewController.swift<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">import Foundation import YandexMapsMobile import ComposeApp import UIKit   class MapViewController: UIViewController {     private let locationMark: UIImage = UIImage(named: \"location_mark\")!     private let myLocatioPoint: UIImage = UIImage(named: \"my_location_point\")!          override func viewDidLoad() {         super.viewDidLoad()                  mapView = YMKMapView(frame: view.frame)         YMKMapKit.sharedInstance().onStart()         view.addSubview(mapView)                  map = mapView.mapWindow.map         addMyLocationPlacemark()         addCustomLocationPlacemark()                  map.addCameraListener(with: mapCameraListener)         map.addInputListener(with: mapInputListener)         pinsCollection = map.mapObjects.add()     }      private func move(to cameraPosition: YMKCameraPosition) {         map.move(with: cameraPosition, animation: YMKAnimation(type: .smooth, duration: 0.2))     }      private func addMyLocationPlacemark() {         myPointPlacemark = map.mapObjects.addPlacemark()         myPointPlacemark.setIconWith(             myLocatioPoint,             style: {                 let iconStyle = YMKIconStyle()                 iconStyle.anchor = NSValue(cgPoint: CGPoint(x: 0.5, y: 0.5))                 iconStyle.scale = 0.14                 iconStyle.flat = true                 return iconStyle             }()         )     }          private func addCustomLocationPlacemark() {         customPointPlacemark = map.mapObjects.addPlacemark()         customPointPlacemark.setIconWith(             locationMark,             style: {                 let iconStyle = YMKIconStyle()                 iconStyle.anchor = NSValue(cgPoint: CGPoint(x: 0.5, y: 1))                 iconStyle.scale = 0.14                 iconStyle.flat = false                 return iconStyle             }()         )     }      private var mapView: YMKMapView!     private var map: YMKMap!     private var myPointPlacemark: YMKPlacemarkMapObject!     private var customPointPlacemark: YMKPlacemarkMapObject!          private var pinsCollection: YMKMapObjectCollection!      private lazy var mapCameraListener: MapCameraListener = MapCameraListener()     private lazy var mapInputListener: MapInputListener = MapInputListener()     private lazy var mapPointListener: MapPointListener = MapPointListener(controller: self)          func addCameraListener(onDragged: @escaping () -> Void) {         mapCameraListener.onDragged = onDragged     }          func addInputListener(onPositionSelect: @escaping (_ latitude: Double, _ longitude: Double) -> Void = {_, _ in }) {         mapInputListener.onPositionSelect = onPositionSelect     }          func addPointListener(onPointClick: @escaping (KotlinLong) -> Void) {         mapPointListener.onPointClick = { id, latLng in             self.mapMove(latLng: latLng)             onPointClick(id)         }     }      func startMap() {         YMKMapKit.sharedInstance().onStart()     }          func stopMap() {         YMKMapKit.sharedInstance().onStop()     }          func mapMove(latLng: LatLng) {         move(to: YMKCameraPosition(target: YMKPoint(latitude: latLng.latitude, longitude: latLng.longitude), zoom: 16.0, azimuth: 0.0, tilt: 0.0))     }          func updateMyPoint(latLng: LatLng?, visible: Bool) {         if myPointPlacemark != nil {             if latLng != nil {                 myPointPlacemark.geometry = YMKPoint(latitude: latLng!.latitude, longitude: latLng!.longitude)             }             myPointPlacemark.isVisible = visible         }     }          func updateCustomPoint(latLng: LatLng?, visible: Bool) {         if customPointPlacemark != nil {             if latLng != nil {                 customPointPlacemark.geometry = YMKPoint(latitude: latLng!.latitude, longitude: latLng!.longitude)             }             customPointPlacemark.isVisible = visible         }     }          func updateFocusArea(bottomFocusAreaPadding: Int) {         let yVal = Float(mapView.mapWindow.height() - (bottomFocusAreaPadding as Int))         mapView.mapWindow.focusRect = YMKScreenRect(             topLeft: YMKScreenPoint(x: 0, y: 0),             bottomRight: YMKScreenPoint(                 x: Float(mapView.mapWindow.width()),                 y: yVal &lt; 0 ? 0 : yVal             )         )     }          func updatePointsCollection(points: [PointMapModel]) {         pinsCollection.clear()         if pinsCollection != nil {             points.forEach { point in                 let pin = pinsCollection.addPlacemark()                 pin.geometry = YMKPoint(latitude: point.latLng.latitude, longitude: point.latLng.longitude)                 pin.setIconWith(                     locationMark,                     style: {                         let iconStyle = YMKIconStyle()                         iconStyle.anchor = NSValue(cgPoint: CGPoint(x: 0.5, y: 1))                         iconStyle.scale = 0.14                         iconStyle.flat = false                         return iconStyle                     }()                 )                 pin.setTextWithText(                     point.name,                     style: {                         let textStyle = YMKTextStyle()                         textStyle.size = 10                         textStyle.placement = YMKTextStylePlacement.right                         textStyle.offset = 5                         return textStyle                     }()                 )                 pin.userData = PointUserData(id: point.id)                 pin.addTapListener(with: mapPointListener)             }         }     }          final private class MapInputListener: NSObject, YMKMapInputListener {         var onPositionSelect: (_ latitude: Double, _ longitude: Double) -> Void                  init(onPositionSelect: @escaping (_ latitude: Double, _ longitude: Double) -> Void = {_, _ in }) {             self.onPositionSelect = onPositionSelect         }                  func onMapTap(with map: YMKMap, point: YMKPoint) {             onPositionSelect(point.latitude, point.longitude)         }                  func onMapLongTap(with map: YMKMap, point: YMKPoint) {}     }          final private class MapCameraListener: NSObject, YMKMapCameraListener {         var onDragged: () -> Void                  init(onDragged: @escaping () -> Void = {}) {             self.onDragged = onDragged         }                  func onCameraPositionChanged(with map: YMKMap, cameraPosition: YMKCameraPosition, cameraUpdateReason: YMKCameraUpdateReason, finished: Bool) {             if (cameraUpdateReason == YMKCameraUpdateReason.gestures) {                 onDragged()             }         }     }          final private class MapPointListener: NSObject, YMKMapObjectTapListener {         var onPointClick: (KotlinLong, LatLng) -> Void                  init(controller: UIViewController, onPointClick: @escaping (KotlinLong, LatLng) -> Void = {_, _ in}) {             self.controller = controller             self.onPointClick = onPointClick         }                  func onMapObjectTap(with mapObject: YMKMapObject, point: YMKPoint) -> Bool {             let userData = mapObject.userData as! PointUserData             onPointClick(KotlinLong(value: userData.id), LatLng(latitude: point.latitude, longitude: point.longitude))             return true         }                  private weak var controller: UIViewController?     }          private struct PointUserData {         let id: Int64     } }  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>YandexMapProtocolImpl.swift (iosApp)<\/h4>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 iOS. \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043a\u0438\u043d\u0443\u0442\u044c \u0442\u0443\u0434\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e ViewController \u0438 &#171;\u0434\u0435\u0440\u0433\u0430\u0435\u043c&#187; \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u041a\u043e\u043b-\u0432\u043e \u0438 \u0441\u0443\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. <\/p>\n<p><a href=\"https:\/\/gist.github.com\/stakancheck\/2d363985405a93ccc1717aefd3625263\" rel=\"noopener noreferrer nofollow\">\u0424\u0430\u0439\u043b \u0441 \u043a\u043e\u0434\u043e\u043c. <\/a><\/p>\n<h4>KoinDI.ios.kt (iosMain)<\/h4>\n<p>\u041d\u0438\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 DI. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0431\u0449\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. <\/p>\n<pre><code class=\"kotlin\">fun initKoinIos(     mapProtocol: YandexMapProtocol ) {     startKoin {         modules(             module {                 single&lt;YandexMapProtocol> { mapProtocol }             } +             commonModule() +             listOf(platformModule())         )     }     Napier.base(DebugAntilog()) } <\/code><\/pre>\n<h4>iOSApp.swift<\/h4>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c \u0437\u0430\u043f\u0443\u0441\u043a DI \u0438 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u0430 \u043a\u0430\u0440\u0442\u044b. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443 <code>onStart()<\/code> \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>iOSApp.swift<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">import SwiftUI import ComposeApp import YandexMapsMobile  @main  struct iOSApp: App {     init() {         YMKMapKit.setApiKey(Constants().MAPKIT_API_KEY)         YMKMapKit.sharedInstance().onStart()         KoinDI_iosKt.doInitKoinIos(mapProtocol: YandexMapProtocolImpl())     }      var body: some Scene { WindowGroup { ContentView() } } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>YandexMapView.ios.kt (iosMain)<\/h4>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f actual \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u044d\u0442\u043e \u0438\u0437\u044a\u044f\u0442\u0438\u0435 \u0438\u0437 DI \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f.<\/p>\n<pre><code class=\"kotlin\">val yandexMapProtocol = koinInject&lt;YandexMapProtocol>().apply {         addCameraListener(onDragged)         addMapPointListener(onPointClick)     }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0432 UIKitView<\/p>\n<pre><code class=\"kotlin\">UIKitView(         factory = {             yandexMapProtocol.viewController.view         }, ...<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u0438\u043b\u0438 <a href=\"https:\/\/gist.github.com\/stakancheck\/636d4c63bb9944e0e4b228a939c4ace4\" rel=\"noopener noreferrer nofollow\">\u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>YandexMapView.ios.kt<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">@OptIn(ExperimentalForeignApi::class) @Composable actual fun YandexMap(     modifier: Modifier,     enabled: Boolean,     zoom: Float,     location: LatLng?,     startPosition: LatLng?,     points: List&lt;PointMapModel>,     onPointClick: (id: Long) -> Unit,     customPosition: Boolean,     canSelectPosition: State&lt;Boolean>,     anotherLocationSelected: Boolean,     bottomFocusAreaPadding: Int,     onPositionSelected: (lat: Double, lng: Double) -> Unit,     onDragged: () -> Unit ) {     val yandexMapProtocol = koinInject&lt;YandexMapProtocol>().apply {         addCameraListener(onDragged)         addMapPointListener(onPointClick)     }      LaunchedEffect(canSelectPosition) {         yandexMapProtocol.addMapListener { latitude, longitude ->             if (canSelectPosition.value) {                 yandexMapProtocol.updateCustomPoint(                     latLng = LatLng(latitude, longitude),                     visible = true                 )                 onPositionSelected(latitude, longitude)                 yandexMapProtocol.onMapMove(LatLng(latitude, longitude))             }         }     }      LaunchedEffect(Unit) {         yandexMapProtocol.onMapStart()         location?.let { latLng ->             Napier.d(tag = \"YandexMap\") { \"Update map user location\" }             if (customPosition) {                 yandexMapProtocol.onMapMove(latLng)             }             yandexMapProtocol.updateMyPoint(latLng)         }         startPosition?.let { latLng ->             yandexMapProtocol.onMapMove(latLng)             if (anotherLocationSelected &amp;&amp; canSelectPosition.value) {                 yandexMapProtocol.updateCustomPoint(                     latLng = latLng                 )             }         }         yandexMapProtocol.updateCustomPoint(             visible = anotherLocationSelected         )     }          LaunchedEffect(enabled) {         if (enabled) {             yandexMapProtocol.onMapStart()         } else {             yandexMapProtocol.onMapStop()         }     }      LaunchedEffect(points) {         yandexMapProtocol.updatePointsCollection(points)     }      DisposableEffect(Unit) {         onDispose {             yandexMapProtocol.onMapStop()         }     }      UIKitView(         factory = {             yandexMapProtocol.viewController.view         },         modifier = modifier.fillMaxSize(),         update = {             location?.let { latLng ->                 if (customPosition) {                     yandexMapProtocol.onMapMove(latLng)                 }                 yandexMapProtocol.updateMyPoint(latLng = latLng)             }             if (canSelectPosition.value) {                 yandexMapProtocol.updateCustomPoint(visible = anotherLocationSelected)             } else {                 yandexMapProtocol.updateCustomPoint(visible = false)             }             yandexMapProtocol.setupFocusRect(bottomFocusAreaPadding)         }     ) } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h2>\n<p>\u0415\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430 Kotlin, \u043d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e, \u0435\u0441\u043b\u0438 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u044c cinterop. \u0410 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u043b\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438 \u0437\u0430\u0432\u0435\u0434\u0435\u043c \u044d\u0442\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 SDK \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u044c. <\/p>\n<p>\u0411\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u044d\u0442\u043e native ?. <\/p>\n<h2>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p><a href=\"https:\/\/www.droidcon.com\/2022\/06\/28\/sdk-design-and-publishing-for-kotlin-multiplatform-mobile\/\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0443 c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 KMP \u043f\u0440\u043e\u0435\u043a\u0442\u0435 (\u043f\u0440\u043e framework, cinterop)<\/a><br \/><a href=\"https:\/\/medium.com\/@sbpetryaev\/introducing-yandex-maps-mapkit-to-your-ios-application-ca811333f6fb\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e Yandex Maps \u0432 pure iOS<\/a><br \/><a href=\"https:\/\/medium.com\/@mofeejegi\/calling-platform-specific-dependencies-in-kotlin-multiplatform-69dbc9a841a2\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u043e \u0432\u044b\u0437\u043e\u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 <\/a><br \/><a href=\"https:\/\/freedium.cfd\/swlh\/kotlin-multiplatform-ios-frameworks-dependencies-2320ca13ea30\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 iOS \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 KMP \u043f\u0440\u043e\u0435\u043a\u0442<\/a><br \/><span class=\"habrahidden\">\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 membres only, \u043d\u043e \u043d\u0438\u043a\u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0437\u0435\u0440\u043a\u0430\u043b\u0430<\/span><\/p>\n<h2>\u041f\u0440\u043e\u0449\u0430\u043d\u0438\u0435<\/h2>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438! \u041a\u043e\u0433\u0434\u0430 \u044f \u0441\u0430\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0442 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043c\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f. \u0412\u0438\u0434\u0435\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0438\u0436\u0435. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u0443\u0447\u0442\u0438\u0442\u0435, \u043c\u043d\u0435 17, \u0435\u0441\u043b\u0438 \u043e\u0431\u0438\u0434\u0438\u0442\u0435, \u0442\u043e \u043c\u0430\u043c\u0435 \u043f\u043e\u0436\u0430\u043b\u0443\u044e\u0441\u044c ?. <\/p>\n<p>\u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a \u043c\u044b \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u043e \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u044f \u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043c\u0435\u043d\u044f \u043e\u0442\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u0442\u044c, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043c\u043e\u0439 TG \u043a\u0430\u043d\u0430\u043b <a href=\"https:\/\/t.me\/stakan_live\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/stakan_live<\/a>. \u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0431\u043b\u043e\u0433 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u0436\u0438\u0437\u043d\u0438.<\/p>\n<\/blockquote>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/65aee6a8a5e031d47d37db63\" data-style=\"\" id=\"65aee6a8a5e031d47d37db63\" width=\"\"><\/div>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/65aee6fea5e031d47d37db7d\" data-style=\"\" id=\"65aee6fea5e031d47d37db7d\" width=\"\"><\/div>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/788554\/\"> https:\/\/habr.com\/ru\/articles\/788554\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<h2>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435 (\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c)<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u042d\u0442\u043e \u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0441\u0442 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u042f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a (\u0442\u0430\u043a\u043e\u0432\u044b\u043c \u0441\u0435\u0431\u044f \u0441\u0447\u0438\u0442\u0430\u044e) \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u044f Compose Multiplatform. \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0438 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e. \u0412\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0441\u0432\u043e\u0435, \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u044f \u043b\u0438\u0448\u044c \u0434\u0435\u043b\u044e\u0441\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<blockquote>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435<\/p>\n<\/blockquote>\n<h2>\u0427\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c?<\/h2>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <strong>Compose Multiplatform<\/strong>, \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 <strong>\u042f\u043d\u0434\u0435\u043a\u0441 \u041a\u0430\u0440\u0442<\/strong>. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0435\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0446\u0435\u043d\u0442\u0440\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043a\u0438 \u0421\u0422\u041e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u0442\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e.<\/p>\n<figure class=\"float\"><\/figure>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 MapKit \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043a \u0434\u043b\u044f Android, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f iOS. \u041d\u0430 <a href=\"https:\/\/yandex.ru\/dev\/mapkit\/doc\/ru\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u0439\u0442\u0435<\/a> \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/yandex\/mapkit-ios-demo\" rel=\"noopener noreferrer nofollow\">iOS<\/a> \u0438 <a href=\"https:\/\/github.com\/yandex\/mapkit-android-demo\" rel=\"noopener noreferrer nofollow\">Android<\/a> \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u043c\u043f\u043b\u0430\u043c\u0438.<\/p>\n<h2>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/h2>\n<h4>1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c native cocoapods<\/h4>\n<p>\u0421 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0438\u0437 <a href=\"https:\/\/kotlinlang.org\/docs\/native-cocoapods-libraries.html#with-custom-cinterop-options\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Kotlin<\/a>. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c Pod \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 build.gradle, \u043c\u043e\u0436\u0435\u043c \u0434\u0430\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438\u043b\u0438 \u0435\u0449\u0435 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0444\u043b\u0430\u0433\u0438 cinterop. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 cinterop. \u041e\u043d \u043f\u0440\u043e\u0447\u0442\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0443\u0436\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Objective-C \u0438 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u0430\u043c klib \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043b\u0435\u0433\u043a\u043e &#171;\u0442\u0440\u043e\u0433\u0430\u0442\u044c&#187; \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u044f common module. <span class=\"habrahidden\">\u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Kotlin \u0434\u0430\u0436\u0435 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f YandexMapsMobile.<\/span> <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c pod<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"kotlin\">\/\/ build.gradle.kts  kotlin {     ios()      cocoapods {         summary = \"CocoaPods test library\"         homepage = \"https:\/\/github.com\/JetBrains\/kotlin\"          ios.deploymentTarget = \"13.5\"          pod(\"YandexMapsMobile\") {             version = \"4.4.0-lite\"         }     } }  \/\/ iosMain\/*.kt import cocoapods.YandexMapKit.*<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441\u0430\u043c\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c, \u043b\u0438\u043d\u043a\u043e\u0432\u0449\u0438\u043a \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u0442\u043e\u0436\u0435, \u0434\u0430\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430. \u041d\u043e \u0432\u043e\u0442, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0438\u043c\u043f\u043e\u0440\u0442:<\/p>\n<pre><code class=\"kotlin\">import cocoapods.YandexMapsMobile.YMKMapView<\/code><\/pre>\n<p>\u0422\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u044b\u043f\u0430\u043b\u0438\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u0449\u0438\u043a\u0430: <code>Undefined symbols: \"OBJC_CLASS \u043d\u0430-\u043d\u0430-\u043d\u0430 <\/code> \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e OpenGL \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u0430\u0440\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0438\u043d\u043a\u043e\u0432\u0449\u0438\u043a \u0432\u044b\u0434\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0436\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0441\u044f, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432 \u0441\u0440\u043e\u0447\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<h4>2. Framework and custom library<\/h4>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 YandexMapsMobile \u0432 framework, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0442\u043e\u0436\u0435 <a href=\"https:\/\/kotlinlang.org\/docs\/native-c-interop.html\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a> \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0448\u0438\u0440\u043e\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c framework \u0441\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0432\u043e\u0437\u043b\u0430\u0433\u0430\u0435\u043c \u044d\u0442\u0443 \u043d\u043e\u0448\u0443 \u043d\u0430 cocoapods.<br \/>&#171;<em>\u0410 \u043a\u0430\u043a \u0436\u0435 \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u044c framework, \u0430 \u043d\u0435 pod?<\/em>&#187; &#8212; \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u044f. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c .framework \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: <\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/yandex.ru\/dev\/mapkit\/doc\/ru\/faq\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435<\/a> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/c-villain\/YandexMapsMobile\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435<\/a> \u043e\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u043b\u044e\u0434\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 pod \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u044c framework \u0438\u0437 DerivedData (\u0442\u0443\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0435\u0442 \u2013 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0432\u0441\u0435)<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u0447\u0430 \u0441 .framework \u0440\u0435\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<ol>\n<li>\n<p>\u041a\u0438\u0434\u0430\u0435\u043c \u043a\u0443\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u0430\u0448 .framework<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c .def \u0444\u0430\u0439\u043b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043d\u0430\u0448\u0435\u043c framework<\/p>\n<\/li>\n<li>\n<p>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432 build.gradle.kts \u0438 \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f <s>\u0438\u043b\u0438 \u043d\u0435\u0442<\/s><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"kotlin\">\/\/ build.gradle.kts kotlin {   sourceSets {     val myYandexMapsMobileDefFilePath = \"$projectDir\/src\/nativeInterop\/cinterop\/YandexMapsMobile.def\"     val myYandexMapsMobileCompilerLinkerOpts = \"-F${projectDir}\/..\/iosApp\/\"     val myYandexMapsMobileIncludeDirs = \"$projectDir\/..\/iosApp\/Pods\/YandexMapsMobile\"     iosArm64 {         compilations.getByName(\"main\") {             val YandexMapsMobile by cinterops.creating {                 \/\/ Path to .def file                 packageName(\"cocoapods.YandexMapsMobile\")                 defFile(myYandexMapsMobileDefFilePath)                 includeDirs(myYandexMapsMobileIncludeDirs)                 compilerOpts(myYandexMapsMobileCompilerLinkerOpts)             }         }              binaries.all {             \/\/ Tell the linker where the framework is located.             linkerOpts(myYandexMapsMobileCompilerLinkerOpts)         }     }   } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c .def \u0444\u0430\u0439\u043b \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 linker options \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Kotlin multiplatform. <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u0448\u0438\u0431\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 &#171;\u043e\u0431\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c&#187;.<\/p>\n<h2>\u041f\u043b\u0430\u043d \u0411 <\/h2>\n<blockquote>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0442\u043e \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e! \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0438\u0436\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f.<\/p>\n<\/blockquote>\n<p>\u0418\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435. \u0427\u0435\u0440\u0435\u0437 Kotlin framework \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 Swift (\u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437 ComposeApp), \u0442\u0430\u043c \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 Swift (\u0432\u043a\u043b\u044e\u0447\u0430\u044f <code>UIViewController<\/code>) \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044e \u0432 DI, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u0441\u0448\u0430\u0440\u0438\u0432 \u043a\u043e\u0434 \u0434\u043b\u044f Kotlin. \u0414\u0430\u043b\u0435\u0435 \u0443\u0436\u0435 \u0432 iosMain \u0432 Kotlin \u043d\u0443\u0436\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 DI, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0431\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>UIKitView<\/code>. <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0431\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b<\/figcaption><\/div>\n<\/figure>\n<h4>Podfile (iosApp)<\/h4>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 swift \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0447\u0435\u0440\u0435\u0437 pod. Kotlin framework \u0442\u043e\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 pod \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d (native cocoapods), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 pod \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0432 \u0432 Podfile \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<pre><code># ..\/iosApp\/Podfile  platform :ios, '14.1'  target 'iosApp' do   use_frameworks!    pod 'composeApp', :path => '..\/composeApp'   pod 'YandexMapsMobile', '4.4.0-lite' # Yandex Maps SDK  end<\/code><\/pre>\n<h4>YandexMapView.kt (commonMain)<\/h4>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0440\u0442\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 Composabel expect \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 iosMain \u0438 \u0432 androidMain. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<pre><code class=\"kotlin\">@Composable expect fun YandexMap(     modifier: Modifier = Modifier,     enabled: Boolean = true,     zoom: Float = 14f,     location: LatLng? = null,     startPosition: LatLng? = null,     points: List&lt;PointMapModel>,     onPointClick: (id: Long) -> Unit,     customPosition: Boolean,     canSelectPosition: Boolean,     anotherLocationSelected: Boolean,     bottomFocusAreaPadding: Int,     onPositionSelected: (lat: Double, lng: Double) -> Unit,     onDragged: () -> Unit )<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430)<\/summary>\n<div class=\"spoiler__content\">\n<p><code>enabled<\/code> \u2013 \u0441\u0442\u0430\u0442\u0443\u0441 view (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u043c)<br \/><code>zoom<\/code> \u2013 \u0437\u0443\u043c \u043a\u0430\u0440\u0442\u044b (\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043a\u0430)<br \/><code>location<\/code> \u2013 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (latitude \u0438 longitude)<br \/><code>startPosition<\/code> \u2013 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u043a\u0430\u0440\u0442\u044b (\u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f)<br \/><code>points<\/code> \u2013 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0447\u0435\u043a \u0421\u0422\u041e (\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442\u0434)<br \/><code>onPointClick<\/code> \u2013 callback \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0442\u043e\u0447\u043a\u0438 \u0421\u0422\u041e<br \/><code>customPosition<\/code> \u2013 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0442\u043e\u0447\u043a\u0430<br \/><code>canSelectPosition<\/code> \u2013 \u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0430\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443<br \/><code>anotherLocationSelected<\/code> \u2013 \u0441\u0442\u0430\u0442\u0443\u0441 (\u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e)<br \/><code>bottomFocusAreaPadding<\/code> \u2013 \u0440\u0430\u0437\u043c\u0435\u0440 bottomsheet, \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u0430\u0440\u0442\u0443<br \/><code>onPositionSelected<\/code> \u2013 callback \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e<br \/><code>onDragged<\/code> \u2013 callback \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0434\u0432\u0438\u043d\u0443\u043b \u043a\u0430\u0440\u0442\u0443 (\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c)<\/p>\n<\/div>\n<\/details>\n<h4>YandexMapProtocol.kt (iosMain)<\/h4>\n<p>\u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>UIViewController<\/code>, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u043b\u0435 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435. <\/p>\n<pre><code>interface YandexMapProtocol {      val viewController: UIViewController      fun addCameraListener(onDragged: () -> Unit)      fun addMapListener(onPositionSelect: (latitude: Double, longitude: Double) -> Unit)      fun addMapPointListener(onPointClick: (id: Long) -> Unit)      fun onMapStop()      fun onMapStart()      fun onMapMove(latLng: LatLng)      fun updateCustomPoint(latLng: LatLng? = null, visible: Boolean = true)      fun updateMyPoint(latLng: LatLng? = null, visible: Boolean = true)      fun updatePointsCollection(points: List&lt;PointMapModel>)      fun setupFocusRect(bottomFocusAreaPadding: Int)  }<\/code><\/pre>\n<h4>MapViewController.swift (iosApp)<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c YandexMapsMobile \u0438 UIKit. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u0441\u0435 \u0437\u0430\u043d\u0435\u0441 \u0432 <a href=\"https:\/\/gist.github.com\/stakancheck\/1daef28a83c76039b6d661b544a10d36\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b<\/a>. <\/p>\n<details class=\"spoiler\">\n<summary>MapViewController.swift<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">import Foundation import YandexMapsMobile import ComposeApp import UIKit   class MapViewController: UIViewController {     private let locationMark: UIImage = UIImage(named: \"location_mark\")!     private let myLocatioPoint: UIImage = UIImage(named: \"my_location_point\")!          override func viewDidLoad() {         super.viewDidLoad()                  mapView = YMKMapView(frame: view.frame)         YMKMapKit.sharedInstance().onStart()         view.addSubview(mapView)                  map = mapView.mapWindow.map         addMyLocationPlacemark()         addCustomLocationPlacemark()                  map.addCameraListener(with: mapCameraListener)         map.addInputListener(with: mapInputListener)         pinsCollection = map.mapObjects.add()     }      private func move(to cameraPosition: YMKCameraPosition) {         map.move(with: cameraPosition, animation: YMKAnimation(type: .smooth, duration: 0.2))     }      private func addMyLocationPlacemark() {         myPointPlacemark = map.mapObjects.addPlacemark()         myPointPlacemark.setIconWith(             myLocatioPoint,             style: {                 let iconStyle = YMKIconStyle()                 iconStyle.anchor = NSValue(cgPoint: CGPoint(x: 0.5, y: 0.5))                 iconStyle.scale = 0.14                 iconStyle.flat = true                 return iconStyle             }()         )     }          private func addCustomLocationPlacemark() {         customPointPlacemark = map.mapObjects.addPlacemark()         customPointPlacemark.setIconWith(             locationMark,             style: {                 let iconStyle = YMKIconStyle()                 iconStyle.anchor = NSValue(cgPoint: CGPoint(x: 0.5, y: 1))                 iconStyle.scale = 0.14                 iconStyle.flat = false                 return iconStyle      <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-366183","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/366183","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=366183"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/366183\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=366183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=366183"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=366183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}