标签: kotlin-multiplatform

使用带有Kotlin多平台的Gradle子项目

我使用科特林多平台(JVM和JS),这在IDEA创建三个项目:demo,demo-jsdemo-jvm.

我想将公共代码拆分为更多子项目/子模块.让我们说我补充commonmod; 我如何编译?

现在的错误gradle run -p demo-jvm是:

demo/demo-js/src/main/kotlin/demo/commonmod/example.kt: (3, 12): Actual function 'getPlatform' has no corresponding expected declaration
Run Code Online (Sandbox Code Playgroud)

但我认为我这样做根本就是错误的,因为我不知道应该依赖什么(虽然我尝试过一些迭代).如果我解决了这个错误,我会得到其他的,然后是其他的,直到我回到这个.


作为一个最小但仍然很大的例子,我有:

demo/settings.gradle:

rootProject.name = 'demo'

include 'demo-jvm', 'demo-js', 'commonmod'
Run Code Online (Sandbox Code Playgroud)

demo/build.gradle:

buildscript { ... }

apply plugin: 'kotlin-platform-common'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version"
    testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version"
    testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version"
    compile project(':commonmod')
}
Run Code Online (Sandbox Code Playgroud)

demo/demo-jvm/settings.gradle:

rootProject.name = 'demo'
Run Code Online (Sandbox Code Playgroud)

demo/demo-jvm/build.gradle:

buildscript { ... }

apply plugin: 'kotlin-platform-jvm'
apply …
Run Code Online (Sandbox Code Playgroud)

gradle kotlin gradle-dependencies kotlin-multiplatform

7
推荐指数
1
解决办法
2159
查看次数

是否可以使用 Kotlin/Native 观察 iOS NSObject 值的变化

我正在尝试实现一个观察者,以更改 UserDefaults 中给定键的值,该值来自用 Kotlin/Native 编写的多平台项目的 ios 本机部分。这是我写的代码:

fun subscribeForDataChange(storeName: String, callback: () -> Unit) {
        NSUserDefaults(storeName).addObserver(
            object : NSObject() {
                fun observeValue(
                    observer: NSObject,
                    forKeyPath: String,
                    options: NSKeyValueObservingOptions,
                    context: COpaquePointer?
                ) {
                    callback()
                    print("Data Changed!!!")
                }
            },
            options = NSKeyValueObservingOptionNew,
            forKeyPath = DATA_KEY,
            context = null
        )

    }
Run Code Online (Sandbox Code Playgroud)

问题是我从来没有收到通知,很可能是因为observeValueNSObject 中没有定义,但是我还应该做什么才能实现这一点?

ios kotlin kotlin-native kotlin-multiplatform

7
推荐指数
1
解决办法
799
查看次数

将参数传递给 Kotlin/native 运行任务

我正在开发一个 Kotlin/Native 应用程序,我想通过 Gradle 向它传递参数。有类似的任务runDebugExecutableNative。有没有办法做类似的事情:

./gradlew runDebugExecutableNative --args='myFirstArg mySecondArg'

gradle kotlin kotlin-native kotlin-multiplatform

7
推荐指数
1
解决办法
998
查看次数

KMM:如何将共享模块引用到现有的 iOS 项目中

我已按照KMM 实践教程了解如何使用 KMM 构建示例应用程序,并且能够成功完成所有步骤!(Yu-huu!)现在我正在尝试在生产应用程序中做一个小型的 POC。所以我创建了一个新的KMM共享模块并将其添加到Android项目中。对于 Android 部分,它工作正常,但我不知道如何将共享模块包含到 iOS 应用程序中。

根据此链接,文件中应引用iOS项目目录gradle.properties

xcodeproj=~/iOSProjects/TestKMM
Run Code Online (Sandbox Code Playgroud)

但是当我尝试导入共享模块时,xcode 抱怨没有这样的模块:

在此输入图像描述

所以我认为仅仅引用 中的 iOS 项目gradle.properties是不够的。我一定还缺少其他东西。


另外,我检查了build共享模块的目录,据我所知,没有生成 iOS 工件。(这与存在 a 的实践教程项目不同bin/iosX64/debugFragmework/shared.framework/ ....。)

在此输入图像描述

android ios kotlin-multiplatform kotlin-multiplatform-mobile

7
推荐指数
1
解决办法
7044
查看次数

Kotlin 多平台 - 错误 ITMS-90171:无效的捆绑包结构

我尝试在 Apple App Store 上使用 Kotlin Multiplatform 分发 iOS 应用程序时遇到问题:

\n

错误

\n
\n

错误 ITMS-90171:“无效的捆绑结构 - 不允许二进制文件 \'Smiledu_app.app/Frameworks/shared.framework/shared\'。您的应用程序可以\xe2\x80\x99t 包含独立的可执行文件或库,除了支持的捆绑包的有效 CFBundleExecutable。有关 iOS 应用程序捆绑包结构的信息,请参阅https://developer.apple.com/go/?id=bundle-struct上的捆绑包编程指南。”

\n
\n

在此输入图像描述\n在此输入图像描述

\n

我检查它在“构建阶段”->“复制捆绑资源”中不存在

\n

在此输入图像描述

\n

这是我的 build.gradle.kts

\n
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget\n\nplugins {\n    kotlin("multiplatform")\n    kotlin("native.cocoapods")\n    kotlin("plugin.serialization")\n    id("com.android.library")\n    id("kotlin-android-extensions")\n    id("com.squareup.sqldelight")\n}\n\nrepositories {\n    gradlePluginPortal()\n    google()\n    jcenter()\n    mavenCentral()\n    maven {\n        url = uri("https://dl.bintray.com/kotlin/kotlin-eap")\n    }\n}\n\ndependencies {\n    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.2.0")\n}\n\nconfigurations {\n    create("compileClasspath")\n}\n\nandroid {\n    compileSdkVersion(29)\n    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")\n    defaultConfig {\n        minSdkVersion(24)\n        targetSdkVersion(29)\n        versionCode = 1\n        versionName = "1.0"\n    }\n    buildTypes {\n        getByName("release") {\n            isMinifyEnabled = false\n        }\n …
Run Code Online (Sandbox Code Playgroud)

xcode app-store ios kotlin kotlin-multiplatform

7
推荐指数
1
解决办法
1212
查看次数

从 KMM 模块获取 applicationContext

我目前正在开发一个简单的 KMM 模块,需要它Context才能执行一些操作。我知道通过扩展Application类和进行依赖注入来实现这一点的方法。我现在正在尝试做什么 - 使该模块开箱即用,无需修改manifest或在启动时进行手动注入。我只是想知道这样做是不是一种不好的做法:

@SuppressLint("StaticFieldLeak")
object SomeUtil {

    private val context = Activity().applicationContext

}
Run Code Online (Sandbox Code Playgroud)

由于applicationContext返回Context整个应用程序并且我们正在初始化它一次,会出现泄漏吗?还是还有其他几点没做到?

也许还有其他一些可能性可以从模块获取应用程序上下文?我已经看到了一些从线程中检索它的示例,但据我了解,这将被(或已经)弃用。

UPD:这会导致错误。Activity()似乎是null。那么,有什么想法如何在没有 DI 和“MyApplication”的情况下实现这一目标吗?

android kotlin kotlin-native kotlin-multiplatform

7
推荐指数
2
解决办法
4088
查看次数

KMM 与公共(共享)模块中的 Java 源

由于平台限制,我们无法将 Java 源代码与 Kotlin Multiplatform Mobile 一起使用。

但如果 Kotlin 与 Java 100% 兼容,为什么我们不能将 Java 与 Kotlin Multiplatform Mobile 一起使用呢?我的意思是不仅在 Android 或 JVM 部分使用它,而且在共享代码的公共部分使用它。我们可以用 Java 编写 iOS 应用程序:)

java kotlin kotlin-multiplatform kmm kotlin-multiplatform-mobile

7
推荐指数
1
解决办法
2304
查看次数

具有 iOS Arm64 二进制框架 (.xcframework) 和 cinterop 的 KMM

我按照此处的指南尝试在新的 KMM 项目中使用不带 CocoaPods 的 iOS 框架:

https://kotlinlang.org/docs/kmm-add-dependency.html#without-cocoapods

我有一个现有的、工作的 .xcframework,我将其添加到 .xcframework 下的项目中shared/src。我添加了一个MyKit.def文件并在同一共享目录中src/nativeInterop/cinterop/更新了该文件:build.gradle.kts

MyKit.def 看起来像

language = Objective-C
modules = MyKit
package = MyKit
Run Code Online (Sandbox Code Playgroud)

构建.gradle.kts

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
    id("com.android.library")
}

kotlin {
    android()

    val iosTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
        if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
            ::iosArm64
        else
            ::iosX64

    iosTarget("ios") {
        binaries {
            framework {
                baseName = "shared"
            }
        }
    }
    sourceSets {
        val commonMain by getting
        val commonTest by getting { …
Run Code Online (Sandbox Code Playgroud)

android ios kotlin-multiplatform xcframework kotlin-multiplatform-mobile

7
推荐指数
1
解决办法
2229
查看次数

Gradle maven-publish / Sonatype 创建多个无法关闭的存储库

我正在尝试将一个库部署到 Maven Central(我之前已经做过很多次),但在本例中它包含针对不同平台的许多不同出版物。通过插件上传maven-publish可以工作,但我最终在 Sonatype 中得到了多个存储库,每个存储库都包含文件的子集:

在此输入图像描述

因此,我无法关闭存储库,因为某些文件总是丢失(只有所有存储库一起包含通过 Sonatype 验证所需的所有文件)。

Sonatype 文档说:

为用户 ID、IP 地址和用户代理的每个组合创建一个单独的临时存储库。(https://help.sonatype.com/repomanager2/staging-releases/managing-staging-repositories

不过,对于创建的存储库来说,所有三个参数都是相同的,因此它应该创建一个。在本地发布以及从 Github 操作发布时都会发生这种情况。

回购协议在这里: https: //github.com/1gravity/Kotlin-Bloc

这是发布脚本:https://github.com/1gravity/Kotlin-Bloc/blob/master/buildSrc/src/main/kotlin/bloc-publish.gradle.kts

非常感谢任何帮助!

gradle maven kotlin kotlin-multiplatform

7
推荐指数
1
解决办法
557
查看次数

用于 KMM 中互联网检查的 NetworkUtil

如何检查 KMM 中的互联网可用性(实际/预期)

安卓

actual class NetworkUtils actual constructor() {
    actual fun isNetworkAvailable(): Boolean {
        val connectivityManager =
            application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = connectivityManager.activeNetworkInfo
        return networkInfo != null && networkInfo.isConnected
    }
}
Run Code Online (Sandbox Code Playgroud)

常见的

expect class NetworkUtils() {
    fun isNetworkAvailable(): Boolean
}
Run Code Online (Sandbox Code Playgroud)

IOS


actual class NetworkUtils {
    actual fun isNetworkAvailable(): Boolean {
      //todo ?
        }
Run Code Online (Sandbox Code Playgroud)

}

kotlin-multiplatform

7
推荐指数
1
解决办法
486
查看次数