iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0

Keyword: KMM in exist project


KMM這麼好,但是我們專案已經開發了五年了,整個Code Base十分龐大,裡面還都是我多年的心血,現在轉換成KMM還來得及嘛?

答案是:當然可以

再次請出第一天這張圖

https://github.com/officeyuli/itHome2021/raw/main/day1/KMM-release-scheme_Blogpost.jpeg

根據KMM的架構圖,只要把共用的商業邏輯抽出來到shared module內就可以,而雙平台原本的畫面呈現仍然可以保留,對於Android開發者來說,更是只要把商業邏輯以下的部分修改依賴即可.當然,如果你在裡面用了像是LiveData,Room這些只有Android才有的組件的話,由於iOS不能理解這些,所以可能要重寫或是修改.

這時候就只能祈禱大家平常有遵守架構與clean architecture來寫了

建立shared Module

為了讓雙方能夠共用,我們要先建立一個shared Module.首先,先用AndroidStudio打開已經先寫好的Android專案,根據File ⇒New ⇒ Module來建立一個Module

然後拉到最下面,可以找到KMM Shared Module(如果有安裝KMM Plugin的話),可以把Module 的名稱改成熟悉的shared

https://github.com/officeyuli/itHome2021/raw/main/day28/sharedModule.png

按下Finish就可以看到熟悉的shared結構出現了

在Android使用shared Module

有了Module後,必須要在Gradle設定,讓Android的部分可以享受到shared內的程式碼.

在gradle(Android)的dependencies內 加上這行

implementation project(':shared')

然後同步Gradle.

接下來可以在專案的任意地方,嘗試使用shared的內容,在shared中,有一些KMM幫我們預先建好的物件可以用來測試有沒有成功.

比如說我在某個Fragment加上

Log.e("KMMExample", "Hello from shared module: " + (Greeting().greeting()))

執行出來有結果就是成功了

https://github.com/officeyuli/itHome2021/raw/main/day28/kmmLog.jpg

然後可以把商業邏輯一步一步的搬進shared中,記得不同平台的實作要使用Expect/Actual分開.

建立iOS專案

(下面的圖都是偷官網的)

接下來建立一個iOS專案,打開Xcode,選擇File ⇒New ⇒ Project.跳出專案精靈.

然後切換到iOS頁籤,選擇建立一個App

https://github.com/officeyuli/itHome2021/raw/main/day28/ios-project-wizard-1.png

然後打上專案名稱

https://github.com/officeyuli/itHome2021/raw/main/day28/ios-project-wizard-2.png

然後會需要選擇專案的位置 ,這邊請指向你的Android專案的Root .

然後你在Android Studio內應該就能看到剛剛建立的iOS專案了

https://github.com/officeyuli/itHome2021/raw/main/day28/ios-project-in-as.png

你可以把他改名成我們熟悉的iosApp

https://github.com/officeyuli/itHome2021/raw/main/day28/ios-directory-renamed-in-as.png

讓iOS跑KMM

然後我們要追加一些設定,讓iOS在編譯的時期也能夠執行KMM的Script產生必要檔案.

首先,在Xcode左邊點兩下專案名稱,來打開專案設定

在Build Phases的頁籤左上的地方,點加號 ,然後選擇New Run Script Phase.來建立一個新的Script

https://github.com/officeyuli/itHome2021/raw/main/day28/xcode-run-script-phase-1.png

在script內加上這段

cd "$SRCROOT/.."
./gradlew :shared:embedAndSignAppleFrameworkForXcode

https://github.com/officeyuli/itHome2021/raw/main/day28/xcode-add-run-phase-2.png

然後把新增加的這段Run Script往上提到 Compile Sources之上 Dependencies之下

https://github.com/officeyuli/itHome2021/raw/main/day28/xcode-run-script-phase-3.png

接下來 切換上面的頁籤到Build Settings 找到Search Paths下面的Framework Search Path

(有點難找,可以直接搜尋)

https://github.com/officeyuli/itHome2021/raw/main/day28/xcode-add-framework-search-path.png

裡面加上這段

$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)

再找到 Linking 下面的Other Linker flags

https://github.com/officeyuli/itHome2021/raw/main/day28/xcode-add-flag.png

同樣加上

$(inherited) -framework shared

然後執行專案,如果正常設定應該會成功編譯並且出現畫面

https://github.com/officeyuli/itHome2021/raw/main/day28/iosSreen0.jpg

引入Shared Module

在Xcode中修改ContentView的內容

//這是swift
import SwiftUI
import shared //加入這行來使用shared

struct ContentView: View {
    var body: some View {
        Text(Greeting().greeting())
                .padding()//這行使用了shared裡面的Greeting物件
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

如果正常編譯通過,應該會出現以下畫面

https://github.com/officeyuli/itHome2021/raw/main/day28/iosScreen.jpg

大功告成!接下來就跟一般的KMM專案相同的流程開發了!


上一篇
Day 27:DB也是假的 建立Mock SQLDelight
下一篇
Day 29: 跨平台比較
系列文
挑戰 Kotlin Multiplatform Mobile 跨平台開發,透過共同的Kotlin模組同時打造iOS與Android應用!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言