From 315310fc040f86b70e12c25fa8c610a75e0a953b Mon Sep 17 00:00:00 2001 From: Andrew Reed Date: Fri, 25 Nov 2022 10:54:21 +0000 Subject: [PATCH 1/3] Initial --- .github/workflows/release.yml | 4 +- .idea/artifacts/Segmenkt_jslegacy_0_0_9.xml | 8 ++ library/Segmenkt.podspec | 39 +++++++ library/build.gradle.kts | 23 +++- library/gradle.properties | 16 +-- library/src/androidMain/AndroidManifest.xml | 4 +- .../com/myunidays/segmenkt/Analytics.kt | 107 ++++++++++++++++++ .../kotlin/com/myunidays/segmenkt/Platform.kt | 3 + .../com/myunidays/segmenkt/Analytics.kt | 17 +++ .../com/myunidays/segmenkt/Configuration.kt | 37 ++++++ .../kotlin/com/myunidays/segmenkt/Platform.kt | 9 ++ .../kotlin/com/myunidays/segmenkt/WriteKey.kt | 14 +++ .../com/myunidays/segmenkt/Analytics.kt | 37 ++++++ .../kotlin/com/myunidays/segmenkt/Platform.kt | 3 + .../com/myunidays/segmenkt/Analytics.kt | 33 ++++++ .../kotlin/com/myunidays/segmenkt/platform.kt | 3 + 16 files changed, 345 insertions(+), 12 deletions(-) create mode 100644 .idea/artifacts/Segmenkt_jslegacy_0_0_9.xml create mode 100644 library/Segmenkt.podspec create mode 100644 library/src/androidMain/kotlin/com/myunidays/segmenkt/Analytics.kt create mode 100644 library/src/androidMain/kotlin/com/myunidays/segmenkt/Platform.kt create mode 100644 library/src/commonMain/kotlin/com/myunidays/segmenkt/Analytics.kt create mode 100644 library/src/commonMain/kotlin/com/myunidays/segmenkt/Configuration.kt create mode 100644 library/src/commonMain/kotlin/com/myunidays/segmenkt/Platform.kt create mode 100644 library/src/commonMain/kotlin/com/myunidays/segmenkt/WriteKey.kt create mode 100644 library/src/iosMain/kotlin/com/myunidays/segmenkt/Analytics.kt create mode 100644 library/src/iosMain/kotlin/com/myunidays/segmenkt/Platform.kt create mode 100644 library/src/jsMain/kotlin/com/myunidays/segmenkt/Analytics.kt create mode 100644 library/src/jsMain/kotlin/com/myunidays/segmenkt/platform.kt diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6410589..38d45ec 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,7 @@ jobs: - name: Build run: ./gradlew build - name: Run create xcframework - run: ./gradlew assembleLibraryXCFramework + run: ./gradlew assembleSegmenktXCFramework - name: Run publish run: ./gradlew publish env: @@ -51,7 +51,7 @@ jobs: env: GITHUB_TOKEN: ${{ github.token }} with: - upload_url: https://uploads.github.com/repos/MyUNiDAYS/libraryname/releases/${{ steps.lastRelease.outputs.id }}/assets?name=${{ github.ref_name }}.zip + upload_url: https://uploads.github.com/repos/MyUNiDAYS/Segmenkt/releases/${{ steps.lastRelease.outputs.id }}/assets?name=${{ github.ref_name }}.zip asset_path: build/${{ github.ref_name }}.zip asset_name: ${{ github.ref_name }}.zip asset_content_type: application/zip \ No newline at end of file diff --git a/.idea/artifacts/Segmenkt_jslegacy_0_0_9.xml b/.idea/artifacts/Segmenkt_jslegacy_0_0_9.xml new file mode 100644 index 0000000..437eb77 --- /dev/null +++ b/.idea/artifacts/Segmenkt_jslegacy_0_0_9.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/library/build/libs + + + + + \ No newline at end of file diff --git a/library/Segmenkt.podspec b/library/Segmenkt.podspec new file mode 100644 index 0000000..40c3d05 --- /dev/null +++ b/library/Segmenkt.podspec @@ -0,0 +1,39 @@ +Pod::Spec.new do |spec| + spec.name = 'segmenkt' + spec.version = '0.0.8' + spec.homepage = 'Link to a Kotlin/Native module homepage' + spec.source = { :http=> ''} + spec.authors = '' + spec.license = '' + spec.summary = 'Some description for a Kotlin/Native module' + spec.vendored_frameworks = 'build/cocoapods/framework/segmenkt.framework' + spec.libraries = 'c++' + spec.ios.deployment_target = '10.0' + spec.dependency 'Analytics', '~> 4.1.6' + + spec.pod_target_xcconfig = { + 'KOTLIN_PROJECT_PATH' => ':', + 'PRODUCT_MODULE_NAME' => 'segmenkt', + } + + spec.script_phases = [ + { + :name => 'Build segmenkt', + :execution_position => :before_compile, + :shell_path => '/bin/sh', + :script => <<-SCRIPT + if [ "YES" = "$COCOAPODS_SKIP_KOTLIN_BUILD" ]; then + echo "Skipping Gradle build task invocation due to COCOAPODS_SKIP_KOTLIN_BUILD environment variable set to \"YES\"" + exit 0 + fi + set -ev + REPO_ROOT="$PODS_TARGET_SRCROOT" + "$REPO_ROOT/gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \ + -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \ + -Pkotlin.native.cocoapods.archs="$ARCHS" \ + -Pkotlin.native.cocoapods.configuration="$CONFIGURATION" + SCRIPT + } + ] + +end \ No newline at end of file diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 140ce18..4f7bd7a 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -10,6 +10,8 @@ version = MODULE_VERSION_NUMBER plugins { kotlin("multiplatform") + kotlin("plugin.serialization") version "1.6.21" + kotlin("native.cocoapods") id("com.android.library") id("org.jlleitschuh.gradle.ktlint") id("io.gitlab.arturbosch.detekt") @@ -70,7 +72,11 @@ kotlin { } val jsMain by getting val jsTest by getting - val androidMain by getting + val androidMain by getting { + dependencies { + api("com.segment.analytics.android:analytics:4.10.3") + } + } val androidTest by getting { dependencies { implementation("junit:junit:4.13.2") @@ -99,6 +105,21 @@ android { } } +kotlin { + cocoapods { + ios.deploymentTarget = "10.0" + noPodspec() + framework { isStatic = true } + pod("Analytics") { + version = "~> 4.1.6" + moduleName = "Segment" + source = git("https://github.com/Reedyuk/analytics-ios.git") { + branch = "master" + } + } + } +} + fun SigningExtension.whenRequired(block: () -> Boolean) { setRequired(block) } diff --git a/library/gradle.properties b/library/gradle.properties index 8630e96..6dfc3f0 100644 --- a/library/gradle.properties +++ b/library/gradle.properties @@ -5,14 +5,14 @@ signing.keyId="" signing.password="" MODULE_PACKAGE_NAME=com.myunidays -MODULE_VERSION_NUMBER=0.0.1 -MODULE_NAME=template-kotlin-library +MODULE_VERSION_NUMBER=0.0.9 +MODULE_NAME=segmenkt OPEN_SOURCE_REPO=https://oss.sonatype.org/service/local/staging/deploy/maven2/ -PUBLISH_NAME=template-kotlin-library -PUBLISH_DESCRIPTION= -PUBLISH_URL=https://github.com/MyUNiDAYS/template-kotlin-library +PUBLISH_NAME=Segmenkt +PUBLISH_DESCRIPTION=Kotlin Multiplatform Wrapper for Segment +PUBLISH_URL=https://github.com/MyUNiDAYS/Segmenkt -PUBLISH_SCM_URL=https://github.com/MyUNiDAYS/template-kotlin-library -PUBLISH_SCM_CONNECTION=scm:git://git@github.com:MyUNiDAYS/template-kotlin-library.git -PUBLISH_SCM_DEVELOPERCONNECTION=scm:git:ssh://git@github.com:MyUNiDAYS/template-kotlin-library.git \ No newline at end of file +PUBLISH_SCM_URL=https://github.com/MyUNiDAYS/Segmenkt +PUBLISH_SCM_CONNECTION=scm:git://git@github.com:MyUNiDAYS/Segmenkt.git +PUBLISH_SCM_DEVELOPERCONNECTION=scm:git:ssh://git@github.com:MyUNiDAYS/Segmenkt.git \ No newline at end of file diff --git a/library/src/androidMain/AndroidManifest.xml b/library/src/androidMain/AndroidManifest.xml index 06e76ad..09fe7cd 100644 --- a/library/src/androidMain/AndroidManifest.xml +++ b/library/src/androidMain/AndroidManifest.xml @@ -1,2 +1,4 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/library/src/androidMain/kotlin/com/myunidays/segmenkt/Analytics.kt b/library/src/androidMain/kotlin/com/myunidays/segmenkt/Analytics.kt new file mode 100644 index 0000000..3f5f86f --- /dev/null +++ b/library/src/androidMain/kotlin/com/myunidays/segmenkt/Analytics.kt @@ -0,0 +1,107 @@ +package com.myunidays.segmenkt + +import android.content.Context +import com.segment.analytics.Options +import com.segment.analytics.Properties +import com.segment.analytics.Traits +import java.util.concurrent.TimeUnit + +actual class Analytics internal constructor(val android: com.segment.analytics.Analytics) { + + actual companion object { + actual fun setupWithConfiguration(configuration: Configuration): Analytics { + val analyticsConfig = com.segment.analytics.Analytics.Builder(configuration.application as Context, configuration.writeKey) + .collectDeviceId(configuration.collectDeviceId) + .experimentalUseNewLifecycleMethods(configuration.useLifecycleObserver) + .flushInterval(configuration.flushInterval.toLong(), TimeUnit.SECONDS) + .flushQueueSize(configuration.flushAt) + .tag(if (configuration.tag.isNullOrBlank()) configuration.writeKey else configuration.tag + "-" + configuration.writeKey) + if (configuration.trackDeepLinks) analyticsConfig.trackDeepLinks() + if (configuration.trackApplicationLifecycleEvents) analyticsConfig.trackApplicationLifecycleEvents() + configuration.apiHost?.let { analyticsConfig.defaultApiHost(it) } + val analytics = analyticsConfig.build() + com.segment.analytics.Analytics.setSingletonInstance(analytics) + return Analytics(analytics) + } + actual fun shared(context: Any?): Analytics = + Analytics(com.segment.analytics.Analytics.with(context as? Context)) + } + + actual fun alias(userId: String, options: Map?) = + android.alias( + userId, + Options().apply { + options?.forEach { property -> + (property.key as? String)?.let { putContext(it, property.value) } + } + } + ) + + actual fun track(name: String, properties: Map?, options: Map?) = + android.track( + name, + Properties().apply { + properties?.forEach { property -> + (property.key as? String)?.let { putValue(it, property.value) } + } + }, + Options().apply { + options?.forEach { property -> + (property.key as? String)?.let { putContext(it, property.value) } + } + } + ) + + actual fun identify(userId: String, traits: Map?, options: Map?) = + android.identify( + userId, + Traits().apply { + traits?.forEach { trait -> + (trait.key as? String)?.let { putValue(it, trait.value) } + } + }, + Options().apply { + options?.forEach { property -> + (property.key as? String)?.let { putContext(it, property.value) } + } + } + ) + + actual fun screen( + screenTitle: String, + properties: Map?, + options: Map? + ) = android.screen( + null, + screenTitle, + Properties().apply { + properties?.forEach { property -> + (property.key as? String)?.let { putValue(it, property.value) } + } + }, + Options().apply { + options?.forEach { property -> + (property.key as? String)?.let { putContext(it, property.value) } + } + } + ) + + actual fun group(groupId: String, traits: Map?, options: Map?) = + android.group( + groupId, + Traits().apply { + traits?.forEach { trait -> + (trait.key as? String)?.let { putValue(it, trait.value) } + } + }, + Options().apply { + options?.forEach { property -> + (property.key as? String)?.let { putContext(it, property.value) } + } + } + ) + + actual fun reset() { + android.reset() + } +} diff --git a/library/src/androidMain/kotlin/com/myunidays/segmenkt/Platform.kt b/library/src/androidMain/kotlin/com/myunidays/segmenkt/Platform.kt new file mode 100644 index 0000000..fe78f7c --- /dev/null +++ b/library/src/androidMain/kotlin/com/myunidays/segmenkt/Platform.kt @@ -0,0 +1,3 @@ +package com.myunidays.segmenkt + +actual val platform = PlatformType.ANDROID diff --git a/library/src/commonMain/kotlin/com/myunidays/segmenkt/Analytics.kt b/library/src/commonMain/kotlin/com/myunidays/segmenkt/Analytics.kt new file mode 100644 index 0000000..c33ee12 --- /dev/null +++ b/library/src/commonMain/kotlin/com/myunidays/segmenkt/Analytics.kt @@ -0,0 +1,17 @@ +package com.myunidays.segmenkt + +expect class Analytics { + + companion object { + fun setupWithConfiguration(configuration: Configuration): Analytics + fun shared(context: Any? = null): Analytics + } + + fun track(name: String, properties: Map? = null, options: Map? = null) + fun identify(userId: String, traits: Map? = null, options: Map? = null) + fun alias(userId: String, options: Map? = null) + fun screen(screenTitle: String, properties: Map? = null, options: Map? = null) + fun group(groupId: String, traits: Map? = null, options: Map? = null) + + fun reset() +} diff --git a/library/src/commonMain/kotlin/com/myunidays/segmenkt/Configuration.kt b/library/src/commonMain/kotlin/com/myunidays/segmenkt/Configuration.kt new file mode 100644 index 0000000..a5f793a --- /dev/null +++ b/library/src/commonMain/kotlin/com/myunidays/segmenkt/Configuration.kt @@ -0,0 +1,37 @@ +package com.myunidays.segmenkt + +/** + * Configuration that analytics can use + * @property writeKey the Segment writeKey + * @property application defaults to `null` + * @property storageProvider Provider for storage class, defaults to `ConcreteStorageProvider` + * @property collectDeviceId collect deviceId, defaults to `false` + * @property trackApplicationLifecycleEvents automatically send track for Lifecycle events defaults to `false` + * @property useLifecycleObserver enables the use of LifecycleObserver Defaults to `false`. + * @property trackDeepLinks automatically track opened based on intents, defaults to `false` + * @property flushAt count of events at which we flush events, defaults to `20` + * @property flushInterval interval in seconds at which we flush events, defaults to `30 seconds` + * @property defaultSettings Settings object that will be used as fallback in case of network failure, defaults to empty + * @property autoAddSegmentDestination automatically add SegmentDestination plugin, defaults to `true` + * @property apiHost set a default apiHost to which Segment sends events, defaults to `api.segment.io/v1` + */ + +data class Configuration( + val writeKey: String, + val tag: String? = null, + val application: Any? = null, +// val storageProvider: StorageProvider, + val collectDeviceId: Boolean = false, + val trackApplicationLifecycleEvents: Boolean = false, + val useLifecycleObserver: Boolean = false, + val trackDeepLinks: Boolean = false, + val flushAt: Int = 20, + val flushInterval: Int = 30, +// val defaultSettings: Settings = Settings(), +// val autoAddSegmentDestination: Boolean = true, + val apiHost: String? = null, +// val cdnHost: String? = null +) { + constructor(writeKey: WriteKey, tag: String?, context: Any? = null) : + this(writeKey = writeKey.keyForPlatform(), tag = tag, application = context) +} diff --git a/library/src/commonMain/kotlin/com/myunidays/segmenkt/Platform.kt b/library/src/commonMain/kotlin/com/myunidays/segmenkt/Platform.kt new file mode 100644 index 0000000..cc05304 --- /dev/null +++ b/library/src/commonMain/kotlin/com/myunidays/segmenkt/Platform.kt @@ -0,0 +1,9 @@ +package com.myunidays.segmenkt + +expect val platform: PlatformType + +enum class PlatformType { + IOS, + ANDROID, + JS +} diff --git a/library/src/commonMain/kotlin/com/myunidays/segmenkt/WriteKey.kt b/library/src/commonMain/kotlin/com/myunidays/segmenkt/WriteKey.kt new file mode 100644 index 0000000..3fe97dc --- /dev/null +++ b/library/src/commonMain/kotlin/com/myunidays/segmenkt/WriteKey.kt @@ -0,0 +1,14 @@ +package com.myunidays.segmenkt + +data class WriteKey( + val android: String?, + val ios: String?, + val js: String? +) { + + fun keyForPlatform(): String = when (platform) { + PlatformType.IOS -> ios!! + PlatformType.ANDROID -> android!! + PlatformType.JS -> js!! + } +} diff --git a/library/src/iosMain/kotlin/com/myunidays/segmenkt/Analytics.kt b/library/src/iosMain/kotlin/com/myunidays/segmenkt/Analytics.kt new file mode 100644 index 0000000..03b2035 --- /dev/null +++ b/library/src/iosMain/kotlin/com/myunidays/segmenkt/Analytics.kt @@ -0,0 +1,37 @@ +package com.myunidays.segmenkt + +actual class Analytics internal constructor(val ios: cocoapods.Analytics.SEGAnalytics) { + + actual companion object { + actual fun setupWithConfiguration(configuration: Configuration): Analytics { + val analyticsConfig = cocoapods.Analytics.SEGAnalyticsConfiguration.configurationWithWriteKey(configuration.writeKey) + analyticsConfig.trackApplicationLifecycleEvents = configuration.trackApplicationLifecycleEvents + analyticsConfig.flushInterval = configuration.flushInterval.toDouble() + analyticsConfig.flushAt = configuration.flushAt.toULong() + analyticsConfig.trackDeepLinks = configuration.trackDeepLinks + cocoapods.Analytics.SEGAnalytics.setupWithConfiguration(analyticsConfig) + return shared(null) + } + + actual fun shared(context: Any?): Analytics = + Analytics(cocoapods.Analytics.SEGAnalytics.sharedAnalytics()) + } + + actual fun alias(userId: String, options: Map?) = ios.alias(userId, options?.let { mapOf("context" to it) }) + + actual fun track(name: String, properties: Map?, options: Map?) = ios.track(name, properties, options?.let { mapOf("context" to it) }) + + actual fun identify(userId: String, traits: Map?, options: Map?) = ios.identify(userId, traits, options?.let { mapOf("context" to it) }) + + actual fun screen( + screenTitle: String, + properties: Map?, + options: Map? + ) = ios.screen(screenTitle, properties, options?.let { mapOf("context" to it) }) + + actual fun group(groupId: String, traits: Map?, options: Map?) = ios.group(groupId, traits, options?.let { mapOf("context" to it) }) + + actual fun reset() { + ios.reset() + } +} diff --git a/library/src/iosMain/kotlin/com/myunidays/segmenkt/Platform.kt b/library/src/iosMain/kotlin/com/myunidays/segmenkt/Platform.kt new file mode 100644 index 0000000..90dfda3 --- /dev/null +++ b/library/src/iosMain/kotlin/com/myunidays/segmenkt/Platform.kt @@ -0,0 +1,3 @@ +package com.myunidays.segmenkt + +actual val platform = PlatformType.IOS diff --git a/library/src/jsMain/kotlin/com/myunidays/segmenkt/Analytics.kt b/library/src/jsMain/kotlin/com/myunidays/segmenkt/Analytics.kt new file mode 100644 index 0000000..e260a0a --- /dev/null +++ b/library/src/jsMain/kotlin/com/myunidays/segmenkt/Analytics.kt @@ -0,0 +1,33 @@ +package com.myunidays.segmenkt + +actual class Analytics { + actual companion object { + actual fun setupWithConfiguration(configuration: Configuration): Analytics { + return shared(null) + } + + actual fun shared(context: Any?): Analytics = Analytics() + } + + actual fun alias(userId: String, options: Map?) { + } + + actual fun track(name: String, properties: Map?, options: Map?) { + } + + actual fun identify(userId: String, traits: Map?, options: Map?) { + } + + actual fun screen( + screenTitle: String, + properties: Map?, + options: Map? + ) { + } + + actual fun group(groupId: String, traits: Map?, options: Map?) { + } + + actual fun reset() { + } +} diff --git a/library/src/jsMain/kotlin/com/myunidays/segmenkt/platform.kt b/library/src/jsMain/kotlin/com/myunidays/segmenkt/platform.kt new file mode 100644 index 0000000..e3b746c --- /dev/null +++ b/library/src/jsMain/kotlin/com/myunidays/segmenkt/platform.kt @@ -0,0 +1,3 @@ +package com.myunidays.segmenkt + +actual val platform: PlatformType = PlatformType.JS From 43b2295a52603a723a0d39ee69b8bd4838fde7e8 Mon Sep 17 00:00:00 2001 From: Andrew Reed Date: Fri, 25 Nov 2022 10:57:39 +0000 Subject: [PATCH 2/3] Updated readme --- README.md | 80 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index f7f2b74..9a6dca4 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,90 @@ -

Template Kotlin Library -GitHub last commit -

+

SegmenKT Kotlin SDK GitHub last commit

-The Template Kotlin Library SDK +Segment + Kotlin = SegmenKT + +The SegmenKT Kotlin SDK is a Kotlin-first SDK for Segment. Its API is similar to the Segment Android SDK but also supports multiplatform projects, enabling you to use Segment directly from your common source targeting iOS and Android. ## Installation ### KMM ``` -implementation("com.myunidays:package:0.0.1") +implementation("com.myunidays:segmenkt:0.0.4") ``` ### Android ``` -implementation("com.myunidays:package-android:0.0.1") +implementation("com.myunidays:segmenkt-android:0.0.4") ``` ### iOS -Add to the binary to your swift package like this: +Run gradle task in this project +``` +./gradlew assembleXCFramework +``` -```swift - .binaryTarget( - name: "project", - url: "https://github.com/MyUNiDAYS/template-kotlin-library/releases/download/0.0.1/0.0.1.zip", - checksum: "8c35293a410f4ec5d150c4f5464f6b5cf04a1a15d1ae9c29126bb0b7a7dc2a54" - ), +Locate the framework in the following directory ``` +build/XCFrameworks/ +``` +Add the xcframework file to your xcode project, OR you can grab it from this repo in Examples/ios/frameworks/ + +### JS + +At the moment there is a JS target but it is currently filled with TODO's so it's not recommended to be used yet. -Where 0.0.1 is the release number, you will also need to change the checksum, xcode will tell you the different checksum if its wrong and just update that from the error message. +#### Important + +In order for ios to work you will also need to include the segment framework to your ios project. ## How to use -### KMM +Initialise segment with a config -### Android +### Kotlin +``` +val segmentConfig = Configuration( + writeKey = WriteKey( + android = "123", + ios = "ABC", + js = "1" + ), + context = context +) +Analytics.setupWithConfiguration(segmentConfig) +``` -### iOS +No need to define a key for iOS if you are using just Android. + +### Swift +``` +let segmentConfig = Configuration(writeKey: WriteKey(android: nil, ios: "", js: nil), context: nil) +Analytics.Companion().setupWithConfiguration(configuration: segmentConfig) +``` + +Then when you want to **Track**, **Identify**, **Group**, **Screen** + +### Kotlin +``` +Analytics.shared().track("Cool Event") +Analytics.shared().identify("1") +Analytics.shared().group("1") +Analytics.shared().screen("Cool Screen") +``` + +### Swift +``` +Analytics.Companion().shared(context: nil).track(name: "Cool Event", properties: nil) +Analytics.Companion().shared(context: nil).identify(userId: "1", traits: nil) +Analytics.Companion().shared(context: nil).group(groupId: "1", traits: nil) +Analytics.Companion().shared(context: nil).screen(screenTitle: "Cool Screen", properties: nil) +``` + +## Examples + +Run the examples from the examples directory for KMM, Android and iOS ## Contributing From ef30339da4e966b9c11c6d0f7653d9b111a0893b Mon Sep 17 00:00:00 2001 From: Andrew Reed Date: Fri, 25 Nov 2022 10:58:27 +0000 Subject: [PATCH 3/3] Adjusted version in the readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9a6dca4..2277436 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,13 @@ The SegmenKT Kotlin SDK is a Kotlin-first SDK for Segment. Its API is similar to ### KMM ``` -implementation("com.myunidays:segmenkt:0.0.4") +implementation("com.myunidays:segmenkt:0.0.9") ``` ### Android ``` -implementation("com.myunidays:segmenkt-android:0.0.4") +implementation("com.myunidays:segmenkt-android:0.0.9") ``` ### iOS