KotlinマルチプラットフォームがProfiでどのように実装されたか

こんにちは、Habr!私はプロ会社のチームリーダー、ミシャ・イグナトフです。私のチームは、AndroidおよびiOS用のクライアント側モバイルアプリを担当しています。2019年から本番環境でKotlinMultiplatformを使用しています。この特定のテクノロジーを選択した理由、導入方法、通過した主要な段階、および結論を説明します。





Kotlinマルチプラットフォームについて簡単に説明します

Kotlin Multiplatform , Kotlin, . 2020 JetBrains Kotlin Multiplatform Mobile () — SDK, Android iOS. —  -. UI- , .





Kotlin Multiplatform

- . , React Native Flutter , . Kotlin Multiplatform . 









  1. , Kotlin, . . Android jar aar-, iOS — Universal Framework. .





  2. Kotlin Swift





    iOS-. — . , , .









  3. - . 70% , . , , . , , — Android Kotlin iOS Swift. — - UX ( : , , , ..).





. , . — , . , .





1.

— API-, .  





GraphQL. — multiline . , . , . , - . «» . . 





«» . . , «» .





. Android- shared. - object



, . — iOS-.





package ru.profi.shared.queries.client.city

/**
*     [Params.term]
*/
object GeoSelectorWarpQuery : WarpQuery<Params> {

   override val hash: String? = "\$GQLID{c9d4adbb7b9ef49fc044064b9a3e662b}"

   override val dirtyQuery = listOf("\$term").let { (term) ->
       """
       query geoSelector($term: String) {
         suggestions: simpleGeoSelector(term: $term, first: 100) {
           edges {
             node {
               name
               geoCityId
               regionName
               hostname
               countryId
             }
           }
         }
       }
       """
   }.trimIndent()
}
      
      



Android
override fun getQuery() = GeoSelectorWarpQuery.getQuery()
      
      



iOS
import KotlinComponents

struct GraphQLWarpRequests {

    static let GeoSelectorWarpQuery = GeoSelectorWarpQuery()
		...
}

let model = GraphQLRequestModel(query: GraphQLWarpRequests.GeoSelectorWarpQuery.getQuery(), variables: variables)
      
      



. , . iOS 0,8 . «» . 





, Kotlin. , pull request backend. , .





Kotlin ultiplatform. .





2. SDK

in-house Clickhouse. backend API . . , , , , .





. network client — ktor. . 





, . SQLDelight — . 





kotlinx.coroutines. kotlinx.serialization.





, unit-. , .





Android , iOS «» . XCode Firebase Crashlytics . , .





, CrashKiOS Touchlab. CoroutineExceptionHandler, . 





, . «». — CoroutineScope



.





Kotlin Multiplatform . SDK .





3. - Android

, , . , , .





iOS - . . — Objective-C . , .





Android - Kotlin. iOS.





IceRock.dev. , KMM . .





  1. Kotlin Multiplatform gradle-.

    , , sourceSets .





  2. - commonMain.

    , JVM Android, commonMain



    . , .





  3. JVM/Android .

    org.json kotlinx.serialization JodaTime klock. expect/actual



    .





  4. commonMain JVM- , .

    , JVM IOException



    kotlin.Exception



    , ConcurrentHashMap



    Stately.





  5. commonMain Android- , .

    Android SDK Service



    , WebSocket



    . Kotlin . 





    SocketService



    .





    SocketService
    interface SocketService {
    
        /**
         *     [chatUrl].        [callback]
         */
        fun connect(chatUrl: String, callback: (SocketEvent) -> Unit)
    
        /**
         *      .
         */
        fun disconnect()
    
        /**
         *   [msg]     
         */
        fun send(msg: String)
    }
    
          
          



  6. API .

    iOS runtime- Kotlin, SDK callback onError



    . .





- . .





IceRock.dev . .





Kotlin Multiplatform - . UI UX . , - , .





. Kotlin Multiplatform — iOS . Android- iOS. , . 





. Android- build- . . iOS- , Gradle. .





— iOS. , , iOS . . Kotlin , .





. , KMM , . Kotlin Multiplatform . . Slack Telegram, Kotlin Multiplatform.





, . , . , . . , . 





現在、さまざまな複雑さの10の共通モジュールがすでにあり、ビジネスロジックを共通コードに移行し続けています。Kotlin Multiplatform Mobileは、モバイルアプリケーション開発の世界を征服する準備ができていると確信しています。








All Articles