Skip to content

Commit

Permalink
iOS project sample with Xcodegen (#44)
Browse files Browse the repository at this point in the history
  • Loading branch information
DevSrSouza committed Mar 25, 2024
1 parent 66a0742 commit a75cba8
Show file tree
Hide file tree
Showing 12 changed files with 134 additions and 87 deletions.
9 changes: 4 additions & 5 deletions buildSrc/src/main/kotlin/Setup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ private fun BaseExtension.android() {

fun Project.kotlinMultiplatform(
withKotlinExplicitMode: Boolean = true,
iosPrefixName: String = "ios", // only used in ios sample
) {
plugins.withType<org.jetbrains.kotlin.gradle.plugin.KotlinBasePluginWrapper> {
extensions.configure<KotlinMultiplatformExtension> {
Expand All @@ -44,8 +43,8 @@ fun Project.kotlinMultiplatform(
}
macosX64()
macosArm64()
ios(iosPrefixName)
iosSimulatorArm64("${iosPrefixName}SimulatorArm64")
ios()
iosSimulatorArm64()

sourceSets {
/* Source sets structure
Expand Down Expand Up @@ -86,10 +85,10 @@ fun Project.kotlinMultiplatform(
val macosArm64Main by getting {
dependsOn(macosMain)
}
val iosMain = getByName(iosPrefixName + "Main").apply {
val iosMain by getting {
dependsOn(nativeMain)
}
val iosSimulatorArm64Main = getByName(iosPrefixName + "SimulatorArm64Main").apply {
val iosSimulatorArm64Main by getting {
dependsOn(iosMain)
}
}
Expand Down
1 change: 1 addition & 0 deletions sample-multiplatform-ios/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
LyricistSample.xcodeproj
5 changes: 5 additions & 0 deletions sample-multiplatform-ios/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# sample-multiplatform-ios

## Running
- Generate the xcodeproj by using [Xcodegen](https://github.com/yonaskolb/XcodeGen)
- Open the project (or run `xed .`)
25 changes: 25 additions & 0 deletions sample-multiplatform-ios/plist/Ios/Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>UILaunchStoryboardName</key>
<string>ComposeSample</string>
</dict>
</plist>
24 changes: 24 additions & 0 deletions sample-multiplatform-ios/plists/Ios/Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>UILaunchStoryboardName</key>
<string>LyricistSample</string>
</dict>
</plist>
35 changes: 35 additions & 0 deletions sample-multiplatform-ios/project.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: LyricistSample
options:
bundleIdPrefix: cafe.adriel.lyricist.sample
settings:

CODE_SIGN_IDENTITY: "iPhone Developer"
CODE_SIGN_STYLE: Automatic
MARKETING_VERSION: "1.0"
CURRENT_PROJECT_VERSION: "4"
SDKROOT: iphoneos
targets:
LyricistSample:
type: application
platform: iOS
deploymentTarget: "14.0"
info:
path: plists/Ios/Info.plist
properties:
UILaunchStoryboardName: LyricistSample
settings:
LIBRARY_SEARCH_PATHS: "$(inherited)"
ENABLE_BITCODE: "YES"
ONLY_ACTIVE_ARCH: "NO"
VALID_ARCHS: "arm64"
sources:
- path: src
excludes:
- "**/.gitkeep"
preBuildScripts:
- name: Build KMP
script: |
cd ../
./gradlew :sample-multiplatform:embedAndSignAppleFrameworkForXcode
dependencies:
- framework: "../sample-multiplatform/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)/ComposeShared.framework"
18 changes: 18 additions & 0 deletions sample-multiplatform-ios/src/ContentView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import UIKit
import SwiftUI
import ComposeShared

struct ComposeView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
MainViewControllerKt.MainViewController()
}

func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
}

struct ContentView: View {
var body: some View {
ComposeView()
.ignoresSafeArea(.keyboard) // Compose has own keyboard handler
}
}
10 changes: 10 additions & 0 deletions sample-multiplatform-ios/src/iOSApp.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import SwiftUI

@main
struct iOSApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
4 changes: 0 additions & 4 deletions sample-multiplatform/README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
# multiplatform sample

### Running iOS
- IPhone: `./gradlew :sample-multiplatform:iosDeployIPhone8Debug`
- IPad: `./gradlew :sample-multiplatform:iosDeployIPadDebug`

### Running MacOS Native app (Desktop using Kotlin Native)
```shell
./gradlew :sample-multiplatform:runNativeDebug
Expand Down
36 changes: 8 additions & 28 deletions sample-multiplatform/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat.Deb
import org.jetbrains.compose.desktop.application.dsl.TargetFormat.Dmg
import org.jetbrains.compose.desktop.application.dsl.TargetFormat.Msi
import org.jetbrains.compose.desktop.application.tasks.AbstractNativeMacApplicationPackageTask
// import org.jetbrains.compose.experimental.dsl.IOSDevices
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl

Expand All @@ -16,8 +15,6 @@ plugins {

kotlinMultiplatform(
withKotlinExplicitMode = false,
// this is required for the Compose iOS Application DSL expect a `uikit` target name.
iosPrefixName = "uikit",
)

android {
Expand All @@ -40,21 +37,16 @@ kotlin {
}
macosX64(macOsConfiguation)
macosArm64(macOsConfiguation)
val uikitConfiguration: KotlinNativeTarget.() -> Unit = {
binaries {
executable() {
entryPoint = "main"
freeCompilerArgs += listOf(
"-linker-option", "-framework", "-linker-option", "Metal",
"-linker-option", "-framework", "-linker-option", "CoreText",
"-linker-option", "-framework", "-linker-option", "CoreGraphics"
)
}
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach { iosTarget ->
iosTarget.binaries.framework {
baseName = "ComposeShared"
isStatic = true
}
}
iosX64("uikitX64", uikitConfiguration)
iosArm64("uikitArm64", uikitConfiguration)
iosSimulatorArm64("uikitSimulatorArm64", uikitConfiguration)

js(IR) {
browser()
Expand Down Expand Up @@ -161,17 +153,5 @@ afterEvaluate {
}

compose.experimental {
// uikit.application {
// bundleIdPrefix = "cafe.adriel.lyricist"
// projectName = "MultiplatformSample"
// /*deployConfigurations {
// simulator("IPhone8") {
// device = IOSDevices.IPHONE_8
// }
// simulator("IPad") {
// device = IOSDevices.IPAD_MINI_6th_Gen
// }
// }*/
// }
web.application {}
}
4 changes: 4 additions & 0 deletions sample-multiplatform/src/iosMain/kotlin/MainViewController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import androidx.compose.ui.window.ComposeUIViewController
import cafe.adriel.lyricist.sample.multiplatform.SampleApplication

fun MainViewController() = ComposeUIViewController { SampleApplication() }
50 changes: 0 additions & 50 deletions sample-multiplatform/src/uikitMain/kotlin/main.uikit.kt

This file was deleted.

0 comments on commit a75cba8

Please sign in to comment.