Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
b187b63195
feat: ios support 2026-03-05 00:00:18 +11:00
8 changed files with 73 additions and 4 deletions

View file

@ -1,5 +1,6 @@
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import java.net.URI
plugins { plugins {
alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlinMultiplatform)
@ -8,6 +9,7 @@ plugins {
alias(libs.plugins.composeMultiplatform) alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.composeCompiler) alias(libs.plugins.composeCompiler)
alias(libs.plugins.secretsGradle) alias(libs.plugins.secretsGradle)
alias(libs.plugins.spm)
} }
kotlin { kotlin {
@ -27,10 +29,17 @@ kotlin {
iosArm64(), iosArm64(),
iosSimulatorArm64() iosSimulatorArm64()
).forEach { iosTarget -> ).forEach { iosTarget ->
iosTarget.compilations {
getByName("main") {
cinterops.create("spmMaplibre")
}
}
iosTarget.binaries.framework { iosTarget.binaries.framework {
baseName = "ComposeApp" baseName = "ComposeApp"
isStatic = true isStatic = true
} }
// iosTarget.swiftPackageConfig(cinteropName = "banksia") {
// }
} }
sourceSets { sourceSets {
@ -109,3 +118,15 @@ compose.resources {
publicResClass = true publicResClass = true
packageOfResClass = "moe.lava.banksia.resources" packageOfResClass = "moe.lava.banksia.resources"
} }
swiftPackageConfig {
create("spmMaplibre") {
dependency {
remotePackageVersion(
url = URI("https://github.com/maplibre/maplibre-gl-native-distribution.git"),
products = { add("MapLibre") },
version = "6.17.1",
)
}
}
}

View file

@ -0,0 +1,15 @@
import Foundation
/**
This is a starting class to set up your bridge.
Ensure that your class is public and has the @objcMembers / @objc annotation.
This file has been created because the folder is empty.
Ignore this file if you don't need it or set "spmforkmp.disableStartupFile=true" inside your gradle file
**/
/**
@objcMembers public class StartHere: NSObject {
public override init() {
super.init()
}
}
**/

View file

@ -12,3 +12,5 @@ android.useAndroidX=true
#Ktor #Ktor
io.ktor.development=true io.ktor.development=true
kotlin.mpp.enableCInteropCommonization=true

View file

@ -29,9 +29,10 @@ material = "1.7.3"
material3 = "1.11.0-alpha02" material3 = "1.11.0-alpha02"
okio = "3.16.4" okio = "3.16.4"
playServicesLocation = "21.3.0" playServicesLocation = "21.3.0"
sqlite = "2.6.2"
room = "2.8.4" room = "2.8.4"
secretsGradlePlugin = "2.0.1" secretsGradlePlugin = "2.0.1"
spm = "1.4.9"
sqlite = "2.6.2"
wire = "5.5.0" wire = "5.5.0"
[libraries] [libraries]
@ -95,4 +96,5 @@ ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
ktor = { id = "io.ktor.plugin", version.ref = "ktor" } ktor = { id = "io.ktor.plugin", version.ref = "ktor" }
room = { id = "androidx.room", version.ref = "room" } room = { id = "androidx.room", version.ref = "room" }
secretsGradle = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin" } secretsGradle = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin" }
spm = { id = "io.github.frankois944.spmForKmp", version.ref = "spm" }
wire = { id = "com.squareup.wire", version.ref = "wire" } wire = { id = "com.squareup.wire", version.ref = "wire" }

View file

@ -46,5 +46,7 @@
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This permission is required to display your current location</string>
</dict> </dict>
</plist> </plist>

View file

@ -1,7 +1,9 @@
package moe.lava.banksia.room package moe.lava.banksia.room
import androidx.room.AutoMigration import androidx.room.AutoMigration
import androidx.room.ConstructedBy
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import androidx.room.RoomDatabaseConstructor
import androidx.room.TypeConverters import androidx.room.TypeConverters
import androidx.sqlite.driver.bundled.BundledSQLiteDriver import androidx.sqlite.driver.bundled.BundledSQLiteDriver
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -37,6 +39,7 @@ import androidx.room.Database as DatabaseAnnotation
] ]
) )
@TypeConverters(RouteTypeConverter::class) @TypeConverters(RouteTypeConverter::class)
@ConstructedBy(DatabaseConstructor::class)
abstract class Database : RoomDatabase() { abstract class Database : RoomDatabase() {
abstract val versionMetadataDao: VersionMetadataDao abstract val versionMetadataDao: VersionMetadataDao
abstract val routeDao: RouteDao abstract val routeDao: RouteDao
@ -54,3 +57,8 @@ abstract class Database : RoomDatabase() {
.build() .build()
} }
} }
@Suppress("KotlinNoActualForExpect")
expect object DatabaseConstructor : RoomDatabaseConstructor<Database> {
override fun initialize(): Database
}

View file

@ -1,14 +1,30 @@
package moe.lava.banksia.di package moe.lava.banksia.di
import androidx.room.Room
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import kotlinx.cinterop.ExperimentalForeignApi
import moe.lava.banksia.room.Database import moe.lava.banksia.room.Database
import org.koin.core.parameter.ParametersHolder import org.koin.core.parameter.ParametersHolder
import org.koin.core.scope.Scope import org.koin.core.scope.Scope
import org.koin.dsl.module import org.koin.dsl.module
import platform.Foundation.NSDocumentDirectory
import platform.Foundation.NSFileManager
import platform.Foundation.NSUserDomainMask
class IosDatabaseBuilder() : PlatformDatabaseBuilder { class IosDatabaseBuilder() : PlatformDatabaseBuilder {
@OptIn(ExperimentalForeignApi::class)
override fun getBuilder(): RoomDatabase.Builder<Database> { override fun getBuilder(): RoomDatabase.Builder<Database> {
TODO("Not yet implemented") val path = NSFileManager.defaultManager.URLForDirectory(
directory = NSDocumentDirectory,
inDomain = NSUserDomainMask,
appropriateForURL = null,
create = false,
error = null,
)
val dbPath = path!!.path + "/room.db"
return Room.databaseBuilder<Database>(
name = dbPath
)
} }
} }

View file

@ -1,9 +1,12 @@
package moe.lava.banksia.util package moe.lava.banksia.util
import platform.Foundation.NSLog
// TODO: use better logging functions maybe(?)
actual fun log(tag: String, msg: String) { actual fun log(tag: String, msg: String) {
TODO("Not yet implemented") NSLog("$tag: $msg")
} }
actual fun error(tag: String, msg: String, throwable: Throwable?) { actual fun error(tag: String, msg: String, throwable: Throwable?) {
TODO("Not yet implemented") NSLog("$tag: $msg: ${throwable?.stackTraceToString()}")
} }