הוספת Kotlin Multiplatform לפרויקט קיים

כדי ליצור מודול Kotlin Multiplatform ‏ (KMP) בפרויקט Android, משתמשים בתבנית Kotlin Multiplatform Shared Module שזמינה ב-Android Studio Meerkat ובפלאגין Android Gradle בגרסה 8.8.0 ואילך.

תבנית המודול מאפשרת ליצור מודול חדש באופן אוטומטי עם ההגדרות המינימליות לטירגוט לפלטפורמות Android ו-iOS.

הגדרת המודול המשותף של KMP

כדי ליצור מודול KMP משותף:

  1. בוחרים באפשרות File > New > New Module (קובץ > חדש > מודול חדש).
  2. בוחרים בתבנית Kotlin Multiplatform Shared Module בחלונית Templates:
יצירת מודול KMP חדש
איור 1. יצירת מודול KMP חדש

השדות בתבנית הם:

  • Module name (שם המודול) – מגדיר את שם המודול ב-Gradle, וגם את שם המסגרת של iOS (אפשר לשנות אותו מאוחר יותר)
  • Package name – הגדרת שם החבילה של הקבצים במודול הזה
    1. לוחצים על סיום ומאפשרים ל-Gradle לסנכרן עם הפרויקט. יכול להיות שתתבקשו גם להוסיף את קובצי המודולים שנוצרו למערכת בקרת הגרסאות.

בסיום, בתצוגת הפרויקט ב-Android Studio יוצג המודול המשותף החדש יחד עם קבוצת מקורות לכל פלטפורמה.

תצוגת הפרויקט עם מודולים משותפים חדשים
איור 2. תצוגת הפרויקט עם מודולים משותפים חדשים

האשף של המודול לא מוסיף את המודול החדש שנוצר כיחסי תלות למודול קיים כלשהו. בשלב הבא, צריך לקשר את המודול המשותף לאחד מהמודולים הקיימים של Gradle, בדומה ליחסי תלות אחרים ב-Android.

dependencies {
    ...
    implementation(project(":shared"))
}

אחרי ההפעלה, תוכלו לגשת לקוד כרגיל. באפליקציה ל-Android אפשר לגשת לקוד שזמין ב-androidMain או ב-commonMain.

מידע נוסף על מבנה הפרויקט ב-Kotlin Multiplatform זמין במאמר היסודות של מבנה הפרויקט ב-Kotlin Multiplatform

הגדרת המודול המשותף באפליקציה ל-iOS

אי אפשר להשתמש במודולים של Kotlin ישירות ב-Swift, וצריך ליצור מסגרת בינארית מתומצתת.

תבנית המודול החדשה ב-Android Studio מגדירה את המודול המשותף כדי ליצור מסגרת לכל אחת מהארכיטקטורות של iOS. הקוד הבא מופיע בקובץ build.gradle.kts של המודול המשותף:

val xcfName = "sharedKit"

iosX64 {
  binaries.framework {
    baseName = xcfName
  }
}

iosArm64 {
  binaries.framework {
    baseName = xcfName
  }
}

iosSimulatorArm64 {
  binaries.framework {
    baseName = xcfName
  }
}

במאמר מבנה היררכי של פרויקט מוסבר איך מגדירים סוגי ארכיטקטורה אחרים.

כדי לאפשר גישה לקוד המשותף מהפרויקט ל-iOS, מוסיפים שלב סקריפט ליצירת מסגרת Kotlin לפני הידור מקורות ה-Swift:

  1. לוחצים לחיצה ימנית על הקובץ ב-Android Studio ובוחרים באפשרויות Open In ו-Open in Associated Application. אפליקציית iOS תיפתח ב-Xcode.
פתיחה באפליקציה המשויכת
איור 3. פתיחה באפליקציה המשויכת
  1. לוחצים לחיצה כפולה על שם הפרויקט בתפריט הניווט של הפרויקט כדי לפתוח את הגדרות הפרויקט.
תיבת הדו-שיח של הגדרות הפרויקט ב-Xcode
איור 4. תיבת הדו-שיח של הגדרות הפרויקט ב-Xcode
  1. כדי לזהות טוב יותר את הפעולה שמתבצעת בשלב הזה, משנים את שם ברירת המחדל של Run Script ל-Compile Kotlin Framework. לוחצים לחיצה כפולה על השם הרצת סקריפט כדי לערוך אותו.
  2. מרחיבים את שלב ה-build, ובשדה הטקסט Shell מזינים את קוד הסקריפט הבא:
הוספת שלב build חדש של סקריפט להרצה
איור 5. הפעלת שלב ה-build של הסקריפט
  1. גוררים את השלב הרצת סקריפט לפני השלב הדרכה של מקורות.

    הרצת שלב ה-build של הסקריפט לפני הידור המקורות
    איור 6. הרצת שלב ה-build של הסקריפט לפני הידור המקורות

  2. כדי ליצור את הפרויקט ב-Xcode, לוחצים על ‎⌘B או עוברים לתפריט Product ובוחרים באפשרות Build.

אם ה-build יושלם בהצלחה, יופיע הסמל הבא.

יצירת גרסה מוצלחת שמוצגת ב-Xcode
איור 7. ה-build הושלם בהצלחה

גישה לקוד המשותף באפליקציה ל-iOS

כדי לוודא שאפליקציית iOS יכולה לגשת לקוד מהמודול המשותף, מבצעים את הפעולות הבאות:

  1. בפרויקט ל-iOS, פותחים את הקובץ ContentView.swift בכתובת: Sources/View/ContentView.swift
  2. מוסיפים את הפונקציה import‏ sharedKit בחלק העליון של הקובץ.
  3. משנים את תצוגת הטקסט כך שתכלול את המידע של Platform_iosKt.platform() במחרוזת המוצגת, באופן הבא:

העדכון הזה בודק אם אפליקציית Fruitties יכולה להפעיל את הפונקציה platform() מהמודול המשותף, שאמורה להחזיר את הערך 'iOS' כשהיא פועלת בפלטפורמת iOS.

סימולטור Xcode שבו פועלת האפליקציה ל-iOS
איור 8. סימולטור Xcode שבו פועלת אפליקציית iOS

מקורות מידע נוספים

אם אתם מפתחים חדשים ב-KMP, תוכלו למצוא מדריכים נוספים במסמכי התיעוד הרשמיים של KMP. אם אתם מפתחים חדשים ב-iOS, כדאי לעיין במסמכי העזרה הבסיסיים של Swift.