Skip to content

Commit

Permalink
Pure Kotlin samples for iOS and watchOS. (JetBrains#3458)
Browse files Browse the repository at this point in the history
  • Loading branch information
olonho authored Oct 18, 2019
1 parent 4d7f39b commit 0b80666
Show file tree
Hide file tree
Showing 27 changed files with 1,454 additions and 599 deletions.
1 change: 1 addition & 0 deletions samples/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ val buildSamplesWithPlatformLibs by tasks.creating {
dependsOn(":opengl:assemble")
dependsOn(":uikit:assemble")
dependsOn(":coverage:assemble")
dependsOn(":watchos:assemble")
}

if (isWindows) {
Expand Down
3 changes: 2 additions & 1 deletion samples/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ if (isMacos) {
include(":opengl")
include(":uikit")
include(":coverage")
include(":watchos")
}

if (isWindows) {
include(":win32")
}
}
24 changes: 9 additions & 15 deletions samples/uikit/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,16 @@ Apple devices, such as an iPhone.

To build and run the sample do the following:

1. Open `samples/uikit/konan.xcodeproj` with Xcode.
1. Open `UIKitSample.xcodeproj` with Xcode, set development team to your own
and make bundle ID unique in project settings.
or
1a. Similarly modify `bundleIdPrefix` and `DEVELOPMENT_TEAM` in `project.yml` and
then generate Xcode project with `xcodegen` (https://github.com/yonaskolb/XcodeGen/).

2. Open the project's target through project navigator, go to tab 'General'.
In 'Identity' section change the bundle ID to the unique string in
reverse-DNS format. Then select the team in 'Signing' section.
2. Now build and run the application with Xcode on a connected iPhone or simulator.

See the
[Xcode documentation](https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/ConfiguringYourApp/ConfiguringYourApp.html#//apple_ref/doc/uid/TP40012582-CH28-SW2)
for more info.
Note that in this example we do not use storyboards, and instead create user interface
components programmatically. Defining UI with storyboards in pure Kotlin iOS applications
is supported as well.

3. Now build and run the application on a connected iPhone with Xcode.
(The compilation will be slow for the first time).

The sample consists of the Xcode project and Kotlin source code. Xcode project
contains the UI built with Interface Builder and headers for Objective-C classes,
which are implemented in Kotlin.

During build the executable compiled from Objective-C sources is replaced with
the one compiled from Kotlin sources.
342 changes: 342 additions & 0 deletions samples/uikit/UIKitSample.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,342 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 51;
objects = {

/* Begin PBXBuildFile section */
301A7F7B2E38A0507DE50BE1 /* ViewController.kt in Resources */ = {isa = PBXBuildFile; fileRef = 4CD08237C99EE51EF77078BB /* ViewController.kt */; };
562ACC5BA848F15EF1C8CA10 /* main.kt in Resources */ = {isa = PBXBuildFile; fileRef = FC430E849C9519096FC79E83 /* main.kt */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
4CD08237C99EE51EF77078BB /* ViewController.kt */ = {isa = PBXFileReference; lastKnownFileType = text; path = ViewController.kt; sourceTree = "<group>"; };
6B07A266844DA0A0E37CC68F /* UIKitSample.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = UIKitSample.app; sourceTree = BUILT_PRODUCTS_DIR; };
FC430E849C9519096FC79E83 /* main.kt */ = {isa = PBXFileReference; lastKnownFileType = text; path = main.kt; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXGroup section */
363F3F70F599800876E80E01 = {
isa = PBXGroup;
children = (
BBFEA7F68D9D6C62F2908D66 /* src */,
69EF9C159A26B77EFF55F942 /* Products */,
);
sourceTree = "<group>";
};
63755DA7308C68AF59C587B3 /* kotlin */ = {
isa = PBXGroup;
children = (
FC430E849C9519096FC79E83 /* main.kt */,
4CD08237C99EE51EF77078BB /* ViewController.kt */,
);
path = kotlin;
sourceTree = "<group>";
};
69EF9C159A26B77EFF55F942 /* Products */ = {
isa = PBXGroup;
children = (
6B07A266844DA0A0E37CC68F /* UIKitSample.app */,
);
name = Products;
sourceTree = "<group>";
};
B54757CDD36230AE01923800 /* iosMain */ = {
isa = PBXGroup;
children = (
63755DA7308C68AF59C587B3 /* kotlin */,
);
path = iosMain;
sourceTree = "<group>";
};
BBFEA7F68D9D6C62F2908D66 /* src */ = {
isa = PBXGroup;
children = (
B54757CDD36230AE01923800 /* iosMain */,
);
path = src;
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
F5227B97658961C9C73A6F2E /* UIKitSample */ = {
isa = PBXNativeTarget;
buildConfigurationList = B1A8070BD396A498BD833DC3 /* Build configuration list for PBXNativeTarget "UIKitSample" */;
buildPhases = (
9147B4CF5C06D4CF77ACF3FC /* GradleCompile */,
BE9081AF451571B84021AC67 /* Sources */,
D848DE0D231736CAB55BD443 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = UIKitSample;
productName = UIKitSample;
productReference = 6B07A266844DA0A0E37CC68F /* UIKitSample.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
2F795AF76B32ABD2043FD7B6 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1020;
TargetAttributes = {
F5227B97658961C9C73A6F2E = {
DevelopmentTeam = N462MKSJ7M;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 0D29F0838E0A64A05D02D666 /* Build configuration list for PBXProject "UIKitSample" */;
compatibilityVersion = "Xcode 10.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 363F3F70F599800876E80E01;
projectDirPath = "";
projectRoot = "";
targets = (
F5227B97658961C9C73A6F2E /* UIKitSample */,
);
};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
D848DE0D231736CAB55BD443 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
301A7F7B2E38A0507DE50BE1 /* ViewController.kt in Resources */,
562ACC5BA848F15EF1C8CA10 /* main.kt in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
9147B4CF5C06D4CF77ACF3FC /* GradleCompile */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = GradleCompile;
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "$SRCROOT/../gradlew -p $SRCROOT/.. packForXcode\n";
};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
BE9081AF451571B84021AC67 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */

/* Begin XCBuildConfiguration section */
30240F2C5B94778954FDDD23 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
ENABLE_BITCODE = YES;
INFOPLIST_FILE = plists/Ios/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited)";
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = org.jetbrains.UIKitSample;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = arm64;
};
name = Release;
};
ACEFD109F7738D0AE3383B13 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 4;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = N462MKSJ7M;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_VERSION = 5.0;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
C3420161DB9AF86DB7EEDFBE /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
ENABLE_BITCODE = YES;
INFOPLIST_FILE = plists/Ios/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited)";
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = org.jetbrains.UIKitSample;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = arm64;
};
name = Debug;
};
CDD41CD31E42F4CB22754575 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 4;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = N462MKSJ7M;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"DEBUG=1",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
0D29F0838E0A64A05D02D666 /* Build configuration list for PBXProject "UIKitSample" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CDD41CD31E42F4CB22754575 /* Debug */,
ACEFD109F7738D0AE3383B13 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
B1A8070BD396A498BD833DC3 /* Build configuration list for PBXNativeTarget "UIKitSample" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C3420161DB9AF86DB7EEDFBE /* Debug */,
30240F2C5B94778954FDDD23 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = "";
};
/* End XCConfigurationList section */
};
rootObject = 2F795AF76B32ABD2043FD7B6 /* Project object */;
}
Loading

0 comments on commit 0b80666

Please sign in to comment.