隨着最近發佈的Kotlin 1.3,我據說了建立多平臺移動應用程序的能力🤔 html
如今能夠在個人 android 和 ios 應用程序之間共享代碼??? 這背後的魔力是什麼?android
讓我向你展現我如何成功建立個人第一個 Android 和 iOS 兼容模塊,以及如何將其集成到實際應用程序中。ios
Kotlin 的最新版本強制執行多平臺語言的概念,您已經可使用 Kotlin 生成 JVM 二進制文件和 JS 包,如今能夠生成 Native 框架!git
對於原生我想說的是 iOS 代碼,但不單單是!根據官方文檔,能夠生成與許多本機架構兼容的代碼: github
我將只關注 Kotlin-Native iOS 兼容性,並向你演示如何生成與 Android 和 iPhone 兼容的共享 kotlin 代碼的移動應用程序!json
Mhhmmm讓我猜測什麼是完美的 IDE,兼容 Gradle 和 Android 🤔swift
固然 IntelliJIdea 😁(你也可使用 Android Studio)api
爲了建立個人項目,我複製了由 JetBrain 製做的官方 Kotlin-Conf 應用程序 的分支,並修改了源代碼!xcode
這是我製做的簡單應用程序,你寫了一個 github 用戶的登陸名,它顯示了他的完整名字,它的頭像和他的公司。它不是一個複雜的應用程序,但它包含一些 Http 調用,一個 Json 反序列化,而且可使用 MVP 進行架構
這個多平臺項目由3個模塊組成:
你能夠直接從這些模塊或公共模塊的內部定義特定於平臺的實現:這裏 iosMain & jvmMain
Kotlin 本地使用 Konan(一種LLVM編譯器)從咱們的通用模塊生成 .framework。對於 Android 開發人員:.framework至關於 .jar
必須在你的 XCode 項目中導入此框架:
Kotlin 最初是爲了生成 JVM 字節碼而建立的。
可是隻使用 Kotlin 類:Int,Double,List,Map 等,如今能夠將這些對象與平臺實現綁定。
你能夠看到當前實現看你的所產生的 .h .framework,使用該通用類:
它將在 common.h 文件中生成這種代碼:
響應很簡單:幾乎全部不依賴於UI或平臺的東西!
我正在爲個人項目開發 MVP,我在個人公共模塊中添加了 Presenter,它的視圖,存儲庫,api 和模型:
這裏惟一的平臺特定層是 API,讓我向您解釋根據平臺得到不一樣代碼的不一樣方法:
在 Android 上的產品風格中使用相同的邏輯:全部風格應該公開相同的公共類(若是它們被咱們的項目使用),你能夠指定特定的 Gradle 依賴項,這裏是個人 GithubAPI 中使用的 HTTP Ktor 庫 :
從個人 GithubApi,我可使用 HttpClient 類,它在 Android 和 iO 上有不一樣的實現
注意,你可使用 kotlin 協同程序在咱們的通用模塊中執行異步方法!
使用 Ktor,我使用 kotlinx-serialization lib 將 json 解碼爲模型
Kotlin-Native 容許你將通用代碼編譯到框架,將類型綁定到平臺類型,但它也容許你直接在 Kotlin 中編寫 iPhone 代碼!
我不是鼓勵你在 Kotlin 中建立全部的 iOS 類,可是你能夠直接在 Kotlin 中編寫一些特定於平臺的版本,讓我給你看一個例子,若是我在公共模塊中建立一個接口,用於簡單的存儲:
您能夠直接在生成的 .framework 中提供其 iOS 實現,只需在 iosMain 模塊中建立一個文件,而後使用 ios 類在 Kotlin 中編寫代碼 :
你能夠在公共模塊內部進行接口,例如 PlatformLogger:
而後我在每一個平臺上建立了實現,這裏是android app模塊:
在個人 XCode 項目中,我建立了一個 PlatformLoggerIOS,實現了 PlatformLogger 協議 :
咱們能夠直接從構造函數提供這些 PlatformLogger 做爲 G ithubRepository 的依賴項。我用來建立一個名爲 DependencyManager 的類,進行一些惰性初始化,存儲在 Android 上的 Application 中,以及 iOS 上的 AppDelegate 中:
在個人代碼中,我可使用 GithubPresenter!
我只須要建立一個片斷及其佈局,使用個人 DependencyManager 我能夠檢索個人 GithubPresenter,而後收聽 EditText 的內容如下載並顯示 github 用戶。
使用 storyboard 和一個簡單的 ViewController,我實現了個人 GithubPresenter 的視圖 :
這裏個人 GithubController 實現了 GithubView,並經過個人 DependencyManager 檢索 presenter
我可使用個人演示者從個人 TextField 的內容下載 github 用戶,而後輕鬆地顯示它
對於 kotlin 原生的將來,你能想象到的是驚人的!
想象一下,當咱們使用的全部庫都將在 core/jvm/ios 中實現時,咱們能夠在這個框架中編寫全部架構代碼,而且只在每一個平臺上開發 UI!
今天,建立一個多平臺應用程序並非一件容易的事,智能的自動完成是危險的,你在編譯代碼時遇到一些隨機問題,你不能輕易地在你的共同代碼中附加一個調試器。一些 kotlin 代碼在 swift 中沒有它們的等價物,例如我沒有成功爲個人記錄器建立一個伴隨對象(我試圖從Jake Wharton 重現像Timber這樣的概念)
但不要忘記這是一項很是年輕的技術!幾個月前不可能!
我不耐煩地瞭解 Kotlin-Native,並建立一些與 Android 和 iPhone 兼容的新庫
我再次給你個人 android/ios 應用程序的代碼,不要猶豫,給我發一些評論!個人 GitHub