Sending arguments to the build server

When you send a build to the server, you can provide more parameters. The server incorporates those parameters into the build process as build hints.

These hints are often called "build hints" or "build arguments." They behave like compiler flags that tune the build server’s behavior. That makes them useful for fast iteration on new functionality without rebuilding plugin UI for every change. They’re also useful when you need to expose low-level behavior such as customizing the Android manifest XML or the iOS plist.

Launch Codename One Settings from the Maven project root, then select Hints in the left navigation rail. The hints use the key=value style.

mvn cn1:settings
The build hints UI in Codename One Settings
Figure 320. The build hints UI in Codename One Settings

You can also set the build hints directly in the codenameone_settings.properties file. When you do that, each setting must start with the codename1.arg. prefix. For example, android.debug=true becomes codename1.arg.android.debug=true.

Application code can read a custom build argument through Display.getProperty():

class AppArgSnippet {
    public void readArgument() {
        String arg = Display.getInstance().getProperty("AppArg", null);
    }
}

The table below consolidates build hints across platforms from the annotations and build-hint catalog. It includes names, types, defaults, annotation forms, and descriptions, including aliases and open-ended hint families.

Most of the commonly used hints also have a compiler-checked form: an annotation in com.codename1.annotations.buildhints that you put on the application’s main class. Written that way a misspelled name is an unknown symbol and an unsupported value is an unknown enum constant, instead of a properties line that is accepted, never read, and has no effect. The Annotation column below names that form where one exists. Setting the same hint both ways fails the build.

Each annotation groups the hints of one platform, and the attribute names match the part of the hint name after the prefix, so codename1.arg.ios.pods is @Ios(pods = …​):

@Android(themeMode = ThemeMode.MODERN, minSdkVersion = AndroidMinSdk.API_24)
@Build(nativeTheme = ThemeMode.MODERN)
@DesktopBuild(titleBar = DesktopTitleBar.NATIVE, width = 1280, height = 800)
@Ios(themeMode = ThemeMode.MODERN,
     newStorageLocation = Toggle.ON,
     pods = {"Intercom", "AFNetworking"})
public class BuildHintAnnotationSnippet {
}

That’s the same as writing these lines in codenameone_settings.properties:

codename1.arg.and.themeMode=modern
codename1.arg.android.min_sdk_version=24
codename1.arg.nativeTheme=modern
codename1.arg.desktop.titleBar=native
codename1.arg.desktop.width=1280
codename1.arg.desktop.height=800
codename1.arg.ios.themeMode=modern
codename1.arg.ios.newStorageLocation=true
codename1.arg.ios.pods=Intercom,AFNetworking

Three things in that example are worth calling out.

A hint whose value is a list takes a Java array, and the build joins it with the separator that hint uses — a comma for ios.pods, so you never have to remember which hint wants which delimiter.

A boolean hint takes Toggle, not boolean. Toggle.ON and Toggle.OFF say what you want, and leaving the attribute out entirely means you have said nothing, so the build service applies whatever it applies today. That’s why the Default column reads (set by the build) for these hints: the annotation records no default of its own, by design: a value compiled into your app can’t follow the build service when the service changes it.

A hint with a closed set of values takes an enum, so @Ios(themeMode = …​) offers you the four themes that exist and rejects anything else at compile time. Hints whose accepted values are open-ended stay String.

The long tail of hints has no annotation, and neither do the open-ended families such as android.permission.<NAME>, because a Java annotation can’t express a map. Set those in codenameone_settings.properties exactly as before. You can mix the two forms in one project, as long as no single hint is declared in both.

Build hints are the one part of Codename One that doesn’t promise source compatibility, and that’s deliberate.

Everywhere else, code that compiles against one release keeps compiling against the next. Here, a hint that changes its name, its type or its accepted values is meant to stop compiling, so you find out at your desk. The alternative is what the properties file has always done: accept the line, never read it, and leave you with a build that succeeds and an app that doesn’t do what you asked.

The failure is always on the client side, never on the build service. A hint reaches the service as a name and a string, and the service goes on accepting the strings it always did — an app already built keeps building, and an older Codename One keeps talking to a newer service. A changed hint breaks a compile in your project, with the attribute named.

If a release does take an annotation away, the properties form of the same hint still works, so the upgrade costs a line in codenameone_settings.properties rather than being one you can’t take.

All build hints

Table 14. Build hints
NameTypeDefaultAnnotationDescription

and.captureRecord

string

(none)

(none)

Override alias of android.captureRecord, read after it and winning when set.

and.facebook_permissions

string

(none)

(none)

Override alias of android.facebook_permissions, read after it and winning when set. IPhoneBuilder also falls back to it when ios.facebook_permissions is unset.

and.themeMode

auto, modern, hololight, legacy

(set by the build)

@Android(themeMode)

auto, modern / material, hololight (default for existing apps), legacy. auto and modern / material opt in to the CSS-generated Android Material 3 theme from native-themes/android-material/theme.css. hololight is Android Holo Light (what the framework shipped on API 14+ before this refactor). legacy loads the pre-Holo Android theme. The legacy alias cn1.androidTheme is still accepted, and and.hololight=true still maps to hololight. The default stays on hololight for existing apps until you flip in a future release.

android.NotificationChannel.description

string

Remote notifications

(none)

android.NotificationChannel.enableLights

boolean

true

(none)

android.NotificationChannel.enableVibration

boolean

false

(none)

android.NotificationChannel.id

string

cn1-channel

(none)

android.NotificationChannel.importance

int

2

(none)

android.NotificationChannel.lightColor

string

(none)

(none)

android.NotificationChannel.name

string

Notifications

(none)

android.NotificationChannel.vibrationPattern

string

(none)

(none)

android.accessibilityGuard

boolean

false

(none)

android.accessibilityGuard.allow

string

(none)

(none)

android.accessibilityGuard.mode

string

exit

(none)

android.activity.launchMode

string

(set by the build)

@Android(activityLaunchMode)

Allows explicitly setting the android:launchMode attribute of the main activity in android. Default is "singleTop," but for some applications you may need to change this behaviour. In particular, apps that are meant to open a file type will need to set this to "singleTask." See Android docs for the activity element for more information about the android:launchMode attribute.

android.activityClassBody

string

(none)

(none)

android.activityClassImports

string

(none)

(none)

android.adaptiveIconBackground

string

#ffffff

(none)

Background color to use for adaptive icons when android.enableAdaptiveIcons=true and no background image is supplied. Defaults to #ffffff and is written as @color/ic_launcher_background.

android.adaptiveIconBackgroundImage

string

(none)

(none)

Optional path (relative to the root of the native Android project) to an image file to use as the adaptive icon background when android.enableAdaptiveIcons=true. If this property is set, it overrides android.adaptiveIconBackground.

android.allowBackup

boolean

true

(none)

android.androidAuto.messaging

boolean

false

(none)

android.androidAuto.minCarApiLevel

int

1

(none)

android.androidAuto.navigation

boolean

false

(none)

android.androidAuto.poi

boolean

false

(none)

android.anyDensity

boolean

true

(none)

android.apacheLegacy

boolean

false

(none)

android.appBundle

boolean

(set by the build)

@Android(appBundle)

Produces an Android App Bundle (.aab) rather than an APK. Required for new Play Store submissions.

android.appReview.version

version

2.0.1

(none)

android.ar.required

boolean

false

(none)

android.arrcompile

string

(none)

(none)

android.arrimplementation

string

(none)

(none)

android.asyncPaint

boolean

true

(none)

Boolean true/false defaults to true. Toggles the Android pipeline between the legacy pipeline (false) and new pipeline (true)

android.background_push_handling

boolean

false

(none)

android.billingclient.version

version

8.0.0

(none)

The Play Billing Library version an in-app-purchase app is built against, defaulting to 8.0.0. Codename One’s billing implementation uses the ProductDetails API, so 8.0.0 is also the minimum: Play Billing removed the older SkuDetails API, and a build set lower is refused with an explanation rather than a page of compiler errors. The default is the lowest version Google still accepts for new apps and updates, and the only one at that level whose library is content with minSdkVersion 21; every later release requires 23. Setting a newer version raises android.min_sdk_version to match, because the library’s own manifest would otherwise fail the merge.

android.blockExternalStoragePermission

boolean

false

(none)

Boolean true/false defaults to false. Disables the external storage (SD card) permission

android.blockLabel

boolean

false

(none)

Boolean true/false defaults to false. Leaves android:label off the generated <application> tag so a label set through android.xapplication_attr or a merged manifest is the one that survives. Honoured by the wear module’s tag as well as the phone’s.

android.blockReadMediaPermissions

boolean

(none)

(none)

Boolean true/false, defaults to the value of android.blockExternalStoragePermission. Suppresses the READ_MEDIA_VIDEO and READ_MEDIA_AUDIO permissions that playing a URI adds on API 33 and above

android.bluetooth.neverForLocation

boolean

true

(none)

android.bluetooth.required

boolean

false

(none)

android.buildToolsVersion

version

(set by the build)

@Android(buildToolsVersion)

Android build-tools version. It also selects the compile SDK, so there is no separate compile-SDK hint.

android.call.video

boolean

false

(none)

Whether the manifest declares CAMERA, which video calls need. Overrides call.video on Android. CallConfiguration.videoSupported(true) is a runtime decision no scanner can see, so the build has to be told here as well; without it Calls.getCapabilities() omits CAPABILITY_VIDEO.

android.captureRecord

string

(set by the build)

@Android(captureRecord)

Indicates whether the RECORD_AUDIO permission should be requested. Can be enabled or any other value to disable this option

android.carAppVersion

version

1.4.0

(none)

android.credentialsPlayServicesVersion

string

(none)

(none)

android.credentialsVersion

version

1.3.0

(none)

android.cusom_layout

string

(none)

(none)

android.cusom_layout*

string

(none)

(properties file only)

Numbered custom layout resources: android.cusom_layout1, android.cusom_layout2 and upward. The misspelling is load-bearing: it’s the key the builder actually reads, so correcting it drops the layout with no warning.

android.cusom_layout1

string

(none)

(none)

Applies to any number of layouts as long as they’re in sequence (for example, android.cusom_layout2, android.cusom_layout3 etc.). Will write the content of the argument as a layout XML file and give it the name cusom_layout1.xml onwards. This can be used by native code to work with XML files

android.customActivity

string

CodenameOneActivity

(none)

android.customTabsVersion

version

1.8.0

(none)

android.debug

boolean

(set by the build)

@Android(debug)

Whether to include the debug version in the build. Left alone, this follows [#release] rather than a fixed value, so a build that selects neither still produces something installable.

android.decouplePlayServiceVersions

string

(none)

(none)

android.delayPushCompletion

boolean

false

(none)

android.disableR8

boolean

(set by the build)

@Android(disableR8)

Turns off R8, falling back to the older shrinker. Note that hardening requires R8, so this conflicts with harden.level.

android.disableR8FullMode

boolean

true

(none)

android.disableScreenshots

boolean

false

(none)

android.documentProvider.enabled

boolean

false

(none)

The Android counterpart of ios.documentProvider.enabled, and the supported way to declare the feature when the code that publishes lives in a cn1lib rather than in the app: the build’s usage scan reads the application’s own classes, so an app that only calls a library which publishes documents goes undetected. Falls back to ios.documentProvider.enabled when unset, so a project that sets one gets both.

android.enableAdaptiveIcons

boolean

false

(none)

Boolean true/false defaults to false. Enables Android adaptive icon generation in Android Gradle builds. When enabled, Codename One generates mipmap launcher resources (ic_launcher, ic_launcher_foreground, and adaptive XML in mipmap-anydpi-v26) and uses them in the application manifest (android:icon and android:roundIcon).

android.enableProguard

boolean

(set by the build)

@Android(enableProguard)

Boolean true/false defaults to true. Allows disabling the proguard obfuscation even on release builds, notice that this isn’t recommended

android.excludeBolts

boolean

false

(none)

android.extendAppCompatActivity

boolean

false

(none)

android.facebookSdkVersion

version

16.2.0

(none)

android.facebook_permissions

string

"public_profile","email","user_friends"

(none)

Permissions for Facebook used in the Android build target, applicable only if Facebook native integration is used.

android.file_paths

string

` <files-path name="app_files" path="." /><external-files-path name="app_external_files" path="." /><external-cache-path name="app_external_cache" path="." /><external-path name="external" path="." />`

(none)

The FileProvider roots written into file_paths.xml, besides the cache/intent_files one the framework always needs. A file has to be under one of these for the application to hand it to another application — when sharing, or when dragging it out. Setting this replaces the default rather than adding to it.

android.firebaseAnalytics

boolean

false

(none)

android.firebaseAnalyticsVersion

version

21.5.0

(none)

android.firebaseCoreVersion

string

(none)

(none)

android.firebaseMessagingVersion

string

(none)

(none)

android.foldableSupport

boolean

false

(none)

android.forceJava8Builder

boolean

false

(none)

android.foregroundServiceType

string

dataSync

(none)

android.fridaDebugLogging

boolean

(none)

(none)

Boolean true/false defaults to false. If true, it will add verbose debug logs during frida detection to show which check if fails on.

android.fridaDetection

boolean

false

(none)

Boolean true/false defaults to false. Indicates whether the app should check for the presence of the Frida dynamic instrumentation toolkit on the device. If Frida is detected, the app will exit. This uses the [frida-blocker](https://github.com/shannah/frida-blocker) library to perform the frida detection.

android.fridaVersion

string

(none)

(none)

x.y.z The version of [frida-blocker](https://github.com/shannah/frida-blocker) to use to perform frida detection. This is only relevant if android.fridaDetection=true. If omitted, it will use the latest tested version in the build server.

android.fullScreenIntent

boolean

false

(none)

android.googleAdUnitId

string

(none)

(none)

Allows integrating admob/google play ads, this is effectively identical to google.adUnitId but only applies to Android

android.googleAdUnitTestDevice

string

C6783E2486F0931D9D09FABC65094FDF

(none)

Device key used to mark a specific Android device as a test device for Google Play ads defaults to C6783E2486F0931D9D09FABC65094FDF

android.gpsPermission

boolean

false

(none)

Indicates whether the GPS permission should be requested, it’s autodetected by default if you use the location API. But, some code might want to explicitly define it

android.gradle.androidx

list (newline delimited)

(none)

(none)

android.gradleDep

list (; delimited)

(set by the build)

@Android(gradleDep)

Gradle dependency statements to add to the app module, such as implementation 'com.example:lib:1.0'.

android.gradlePlugin

list (newline delimited)

(none)

(none)

android.gradleVersion

string

(none)

(none)

Opts the build into Gradle 9. 9 builds with Gradle 9.8.0 and Android Gradle plugin 9.4.1 instead of the default Gradle 8 toolchain. An explicit 9.x release of 9.6.0 or newer (the oldest Gradle that plugin runs on) is also accepted, with a difference between where the build runs: a local build (android-source, or Gradle on your machine) downloads and uses exactly that release, while the Codename One build cloud has one Gradle 9 installed and builds every accepted 9.x value with its Gradle 9.8.0. Older 9.x releases and Gradle 10 are refused. Kotlin sources are compiled by the plugin’s built-in Kotlin, so a hint that applies kotlin-android itself fails on this path, and so does any Gradle plugin a hint adds that still uses the variant API Android Gradle plugin 9 removed.

android.hce

boolean

false

(none)

android.hceAids

string

F0010203040506

(none)

android.hceCategory

string

other

(none)

android.hceDescription

string

(none)

(none)

android.hceRequireUnlock

boolean

false

(none)

android.headphoneCallback

boolean

false

(none)

Boolean true/false defaults to false. When set to true it assumes the main class has two methods: headphonesConnected & headphonesDisconnected which it invokes appropriately as needed

android.health.background

boolean

false

(none)

android.health.connectVersion

string

1.1.0-alpha07

(none)

android.health.history

boolean

false

(none)

android.health.privacyPolicyUrl

string

(none)

(none)

android.health.read

string

(none)

(none)

android.health.write

string

(none)

(none)

android.hideOverlayWindows

boolean

false

(none)

Boolean true/false defaults to false. Declares the android.permission.HIDE_OVERLAY_WINDOWS permission needed by DeviceIntegrity.setHideOverlayWindows() on Android 12+, for apps that call the runtime API without enabling android.tapjackingGuard. A normal install-time permission, so the user sees no prompt.

android.hideStatusBar

boolean

(set by the build)

@Android(hideStatusBar)

Hides the Android status bar.

android.hms.pushVersion

string

6.3.0.302

(none)

android.home.playServicesVersion

string

16.0.0-beta1

(none)

android.includeGPlayServices

boolean

true

(none)

Deprecated, please android.playService.*! Indicates whether Google Play Services should be included into the build, defaults to false but that might change based on the functionality of the application and other build hints. Adding Google Play Services support allows you to use a more refined location implementation and invoke some Google specific functionality from native code.

android.includeMavenCentral

boolean

false

(none)

android.installLocation

auto, internalOnly, preferExternal

(set by the build)

@Android(installLocation)

Maps to android:installLocation manifest entry defaults to auto. Can also be set to internalOnly or preferExternal.

android.invite.appLinks

boolean

true

(none)

Whether the build injects the android:autoVerify intent filter for the invite link domain into the main activity. Set it to false only when declaring the filter yourself through android.xintent_filter; with no filter at all an invite link opens the browser instead of the app.

android.invite.signingFingerprint

list (, delimited)

(none)

(none)

Comma separated SHA-256 signing certificate fingerprints, in colon separated hex, enrolled in the shared assetlinks.json alongside the one derived from the build’s keystore. Apps distributed through Play App Signing must add the app signing certificate fingerprint from the Play Console here: Google re-signs the app, so the upload key the build holds isn’t the certificate Android verifies against. Without it, App Links verification fails on every Play install and nothing reports an error.

android.java8

string

(none)

(none)

Accepted and ignored. A Java 6 source level was produced by running retrolambda over the compiled classes; retrolambda has been removed, so Android builds always use a Java 8 source level. Setting this to false logs a notice and changes nothing.

android.keyboardOpen

boolean

true

(none)

Boolean true/false defaults to true. Toggles the new async keyboard mode that leaves the keyboard open while you move between text components

android.kotlinStdlibAlignment

boolean

true

(none)

Boolean true/false defaults to true. Kotlin 1.8.0 moved the contents of kotlin-stdlib-jdk7 and kotlin-stdlib-jdk8 into kotlin-stdlib and left the two shims empty. A build that reaches kotlin-stdlib 1.8 or newer through one dependency and an older kotlin-stdlib-jdk8 through another then carries the same classes twice and fails in checkReleaseDuplicateClasses, naming Kotlin artifacts you never asked for. The 1.8.x line ships no Gradle module metadata to say the two overlap; from 1.9.22 JetBrains ships it. This adds that missing statement, as a Gradle capability: from 1.8.0 up, kotlin-stdlib provides what the shims provide, so Gradle drops the redundant shim. It moves no version, which is what keeps it out of your way — a version pin, a force, an enforced BOM, a range or a Kotlin compiler older than 1.8 all resolve exactly as they did without it. Below 1.8.0 nothing happens at all, because there the shims still hold the only copy of their classes. Set to false to manage these coordinates yourself.

android.largeScreens

boolean

true

(none)

android.licenseKey

string

(set by the build)

@Android(licenseKey)

The license key for the Android app, this is required if you use in-app purchase on Android

android.locales

string

(none)

(none)

android.locationButton.exclusive

string

auto

(none)

Whether ACCESS_FINE_LOCATION is declared onlyForLocationButton, which means the system grants precise location through the location button and never any other way. Defaults to auto: the build infers it, declaring the flag when the application uses LocationButton and nothing else from the location or maps packages. Set false when the application reaches precise location through native Android code, which the class scan can’t see because Gradle compiles it later, and true to declare the flag whenever the build declares the permission at all, whatever the inference would have chosen. Neither value makes the build declare a permission it otherwise would not: an application whose only location use is invisible to the class scan gets no declaration to flag, and reaches precise location through its own android.xpermissions entry.

android.manifest.queries

string

(none)

(none)

Embeds XML content into the <queries> section of the Android manifest file. This is required in Android 11 for package visibility. See queries element Android documentation.

android.maps.provider

string

(none)

(none)

Android’s own native map provider, overriding maps.provider.

android.messagingService

string

(none)

(none)

android.migrateToAndroidX

boolean

true

(none)

android.min_sdk_version

19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36

(set by the build)

@Android(minSdkVersion)

The least SDK required to run this app, the default value changes based on functionality but can be as low as 7. This corresponds to the XML attribute android:minSdkVersion.

android.mockLocation

boolean

true

(none)

Boolean true/false defaults to true. Toggles the mock location permission which is on by default, this allows easier debugging of Android device location based services

android.mopubId

string

(none)

(none)

android.multidex

boolean

(set by the build)

@Android(multidex)

Multidex lets an Android binary reference more than 65536 methods. Set [Toggle#OFF] to opt out, which builds a little faster and reinstates the limit.

android.nearby.computerProfile

boolean

false

(none)

Offers the computer device profile in the companion-device chooser. Only read when the app uses nearby ranging, transport or companion association.

android.nearby.glassesProfile

boolean

false

(none)

Offers the glasses device profile in the companion-device chooser, on the same terms as android.nearby.computerProfile.

android.nearby.watchProfile

boolean

false

(none)

Offers the watch device profile in the companion-device chooser, on the same terms as android.nearby.computerProfile.

android.newFirebaseMessaging

boolean

(set by the build)

@Android(newFirebaseMessaging)

Uses the current Firebase Cloud Messaging integration. Requires AndroidX and Gradle 8.13 or newer.

android.nonconsumable

string

(none)

(none)

Comma delimited string of items that are non-consumable in the in-app purchase API

android.normalScreens

boolean

true

(none)

android.onCreate

string

(none)

(none)

android.onDeviceDebug

boolean

(set by the build)

@OnDeviceDebug(android)

Boolean true/false defaults to false. When true, the generated AndroidManifest.xml is marked android:debuggable="true", R8/proguard is disabled, and the build is pinned to debug-only (android.release is forced off and android.debug is forced on) so a stray hint can’t ship a release-signed APK that’s debuggable="true". Pair with the cn1:android-on-device-debugging Maven goal (or the bundled IntelliJ run configs) to install, launch, forward JDWP, and stream logcat through adb. Has no effect on builds that don’t carry it — release builds are unaffected. See the On-Device Debugging (Android) chapter for the full flow.

android.permission.*

string

(none)

(properties file only)

true/false. Whether to include a particular permission. Preferred over android.xpermissions because it avoids conflicts with libraries. See Android’s Manifest.permission documentation for the full list. The optional .maxSdkVersion suffix becomes the maxSdkVersion attribute of the generated <uses-permission> tag, and .required marks the permission required.

android.playIntegrity

boolean

false

(none)

android.playIntegrity.verifyUrl

string

(none)

(none)

android.playIntegrityVersion

version

1.4.0

(none)

android.playService.*

string

(none)

(properties file only)

Opts a single Google Play service in or out. The sibling <name>.minPlayServicesVersion pins its version.

android.playService.ads

boolean

false

(none)

android.playService.analytics

string

(none)

(none)

android.playService.appInvite

boolean

false

(none)

android.playService.auth

string

(none)

(none)

android.playService.base

string

(none)

(none)

android.playService.cast

boolean

false

(none)

android.playService.drive

boolean

false

(none)

android.playService.fitness

boolean

false

(none)

android.playService.games

boolean

false

(none)

android.playService.gcm

string

(none)

(none)

android.playService.identity

boolean

false

(none)

android.playService.indexing

boolean

false

(none)

android.playService.location

string

(none)

(none)

android.playService.maps

string

(none)

(none)

android.playService.nearby

boolean

false

(none)

android.playService.panorama

boolean

false

(none)

android.playService.plus

boolean

false

(none)

android.playService.safetynet

boolean

false

(none)

android.playService.vision

boolean

false

(none)

android.playService.wallet

boolean

false

(none)

android.playService.wearable

boolean

false

(none)

android.playServicesVersion

string

(none)

(none)

The version number of play services to build against. Experimental. Use with caution as building against versions other than the server default may introduce incompatibilities with some Codename One APIs.

android.proguardKeep

list (newline delimited)

(set by the build)

@Android(proguardKeep)

Arguments for the keep option in proguard allowing you to keep a pattern of files for example, -keep class com.mypackage.ProblemClass { *; }

android.proguardKeepOverride

string

Exceptions, InnerClasses, Signature, Deprecated, SourceFile, LineNumberTable, Annotation, EnclosingMethod

(none)

android.pushSound

string

(none)

(none)

android.pushVibratePattern

string

(none)

(none)

Comma delimited long values to describe the push pattern of vibrate used for the setVibrate native method

android.release

boolean

(set by the build)

@Android(release)

true/false defaults to true - indicates whether to include the release version in the build

android.removeBasePermissions

boolean

false

(none)

Boolean true/false defaults to false. Disables the built-in permissions specifically INTERNET permission (that is, no networking…​)

android.repositories

list (newline delimited)

(set by the build)

@Android(repositories)

Extra Gradle repositories to resolve dependencies from.

android.requestReadMediaPermissions

boolean

false

(none)

Boolean true/false defaults to false. Declares READ_MEDIA_IMAGES, READ_MEDIA_VIDEO and READ_MEDIA_AUDIO on API 33 and above even when the build detected no media playback. READ_MEDIA_IMAGES is only ever added by this hint

android.rootCheck

boolean

false

(none)

Boolean true/false defaults to false. Indicates whether the app should check for root access on the device. If root access is detected, the app will exit.

android.rootbeerVersion

version

0.1.0

(none)

android.shareFilter

string

(none)

(none)

android.sharedUserId

string

(none)

(none)

Allows adding a manifest attribute for the sharedUserId option

android.sharedUserLabel

string

(none)

(none)

Allows adding a manifest attribute for the sharedUserLabel option

android.shrinkResources

boolean

false

(none)

Boolean true/false defaults to false. Used only in conjunction with android.enableProguard. Strips out unused resources to reduce apk size. Since 7.0

android.signingV1

boolean

(none)

(none)

true/false Default true. See https://source.android.com/docs/security/features/apksigning

android.signingV2

boolean

(none)

(none)

true/false Default true. See https://source.android.com/docs/security/features/apksigning

android.signingV3

boolean

(none)

(none)

true/false Default true. See https://source.android.com/docs/security/features/apksigning

android.signingV4

boolean

(none)

(none)

true/false Default true. See https://source.android.com/docs/security/features/apksigning

android.smallScreens

boolean

true

(none)

Boolean true/false defaults to true. Corresponds to the android:smallScreens XML attribute and allows disabling the support for small phones

android.stack_size

string

(none)

(none)

Size in bytes for the Android stack thread

android.statusbar_hidden

boolean

false

(none)

true/false defaults to false. When set to true hides the status bar on Android devices.

android.store_ids

string

(none)

(none)

android.streamMode

string

(none)

(none)

The mode in which the volume key should behave, defaults to OS default. Allows setting it to music for music playback apps

android.stringsXml

string

(none)

(none)

Allows injecting more entries into the strings.xml file using a value that includes something like this <string name="key1">value1</string><string name="key2">value2</string>

android.style

string

(none)

(none)

Allows injecting more data into the styles.xml file right before the closing resources tag

android.supportScreens

string

(none)

(none)

android.supportV4

boolean

(none)

(none)

Boolean true/false defaults to false but that can change based on usage (for example, push implicitly activates this). Indicates whether the android support v4 library should be included in the build

android.supportv4Dep

list (newline delimited)

(none)

(none)

android.surfaces.complicationUpdateSeconds

int

0

(none)

UPDATE_PERIOD_SECONDS on the generated complication service. Zero, the default, means the system never polls on a timer and the complication updates only when the app pushes new data.

android.surfaces.exactAlarms

boolean

false

(none)

android.tapjackingGuard

boolean

false

(none)

Boolean true/false defaults to false. Switches on tapjacking / screen-overlay protection at launch, so touches that arrive while another app’s window covers this one are detected and dropped. See the security chapter.

android.tapjackingGuard.hideOverlays

boolean

true

(none)

Boolean true/false defaults to true. Also asks Android 12+ to hide overlay windows drawn over the app, which is the only mitigation that covers native peer components, and declares the HIDE_OVERLAY_WINDOWS permission it requires. Only relevant if android.tapjackingGuard=true.

android.tapjackingGuard.mode

string

block

(none)

block (default), strict, report or off. block drops gestures that start on a fully obscured window, report only observes, strict also drops touches where only part of the window is covered (which benign system UI can trigger). Only relevant if android.tapjackingGuard=true.

android.targetSDKVersion

int

(set by the build)

@Android(targetSDKVersion)

The Android SDK the build compiles against. Unset, the build server uses the highest platform it has installed, so leaving this alone tracks the server rather than pinning a number. Not every target works: the source may have limitations, and not all SDK targets are installed.

android.textureView

boolean

false

(none)

android.theme

string

Light

(none)

Light or Dark defaults to Light. On Android 4+ the default Holo theme is used to render the native widgets sometimes and this indicates whether holo light or holo dark is used. This doesn’t affect the Codename One theme but that might change in the future.

android.topDependency

list (newline delimited)

(set by the build)

@Android(topDependency)

Statements added to the top-level Gradle build file rather than the app module.

android.tv

boolean

false

(none)

true/false (defaults to false). Marks the build as an Android TV / Google TV app. Adds the LEANBACK_LAUNCHER intent category to the launcher activity (so the app appears on the TV home screen), declares the android.software.leanback feature, makes android.hardware.touchscreen optional (so it installs on touchless TVs), and generates a 320×180 launcher banner (@drawable/tv_banner) from the app icon. The same APK still installs and runs on phones and tablets, and CN.isTV() returns true at runtime on a TV.

android.useAndroidX

boolean

(set by the build)

@Android(useAndroidX)

Use Android X instead of support libraries. This will also run a find/replace on all source files to replace support libraries and artifacts with AndroidX equivalents.

android.useGradle8

string

(none)

(none)

android.uses_feature.*

string

(none)

(properties file only)

Adds a <uses-feature> element named by the suffix.

android.uses_permission.*

string

(none)

(properties file only)

Adds a <uses-permission> element named by the suffix.

android.versionCode

string

(none)

(none)

Allows overriding the auto generated version number with a custom internal version number specifically used for the XML attribute android:versionCode

android.watchModule

boolean

true

(none)

Boolean true/false defaults to true. Set to false to build the phone app alone in a companion build: the wearable link stays, no watch module is generated, and the phone output matches what it was before the watch app existed.

android.watchVersionCode

int

(none)

(none)

The wear module’s version code, stated outright. Play requires it to be higher than the phone’s, so a value other than a whole number above android.versionCode fails the build rather than being replaced without a word. Leave it unset to derive the value from android.watchVersionCodeOffset.

android.watchVersionCodeOffset

int

100000000

(none)

How far above the phone’s version code the wear module’s sits when android.watchVersionCode is unset. The default leaves room for the phone app to keep incrementing without ever catching up.

android.wear

boolean

false

(none)

android.wear.complicationsVersion

string

1.2.1

(none)

Version of androidx.wear.watchface:watchface-complications-data-source added to the wear module. Kept out of android.gradleDependencies because that hint feeds the phone module too, and these libraries declare minSdk 26.

android.wear.guavaVersion

string

31.1-android

(none)

Version of com.google.guava:guava added to the wear module alongside the tiles and complications libraries, which need it at runtime.

android.wear.protoLayoutVersion

string

1.2.1

(none)

Version of the androidx.wear.protolayout libraries the generated tile service builds its layout with.

android.wear.standalone

string

(none)

(none)

android.wear.tilesVersion

string

1.4.1

(none)

Version of androidx.wear.tiles added to the wear module when the app declares a tile.

android.web_loading_hidden

boolean

false

(none)

true/false defaults to false - set to true to hide the progress indicator that appears when loading a web page on Android.

android.windowVersion

version

1.3.0

(none)

android.xactivity

xml

(none)

(none)

Allows injecting more attributes into the activity tag in the Android XML

android.xapplication

xml

(set by the build)

@Android(xapplication)

defaults to an empty string. Allows developers of native Android code to add text within the application block to define things such as widgets, services etc.

android.xapplication_attr

xml

(none)

(none)

Allows injecting more attributes into the application` tag in the Android XML

android.xgradle

list (newline delimited)

(set by the build)

@Android(xgradle)

Arbitrary text spliced into the generated app-module Gradle file.

android.xgradle_default_config

list (newline delimited)

(none)

(none)

android.xintent_filter

xml

(none)

(none)

Allows adding an intent filter to the main android activity

android.xlargeScreens

boolean

true

(none)

android.xlayout_attr

string

(none)

(none)

android.xmanifest

xml

(none)

(none)

android.xpermissions

xml

(set by the build)

@Android(xpermissions)

more permissions for the Android manifest

desktop.adaptToRetina

boolean

(set by the build)

@DesktopBuild(adaptToRetina)

Boolean true/false defaults to true. When set to true some values will ve implicitly doubled to deal with retina displays and icons etc. Will use higher DPI’s

desktop.fontSizes

string

(none)

(none)

Indicates the sizes in pixels for the system fonts as a comma delimited string containing 3 numbers for small,medium,large fonts.

desktop.fullscreen

boolean

(set by the build)

@DesktopBuild(fullscreen)

Starts the desktop build in full-screen mode.

desktop.height

int

(set by the build)

@DesktopBuild(height)

Height in pixels for the form in desktop builds, will be doubled for retina grade displays. Defaults to 600.

desktop.interactiveScrollbars

boolean

(set by the build)

@DesktopBuild(interactiveScrollbars)

Enables grab-able, click-to-page desktop scrollbars.

desktop.resizable

boolean

(set by the build)

@DesktopBuild(resizable)

Boolean true/false defaults to true. Indicates whether the UI in the desktop build is resizable

desktop.theme

string

(none)

(none)

Name of the theme res file (without the ".res" extension) to use as the "native" theme. By default this is native indicating iOS theme on Mac and Windows Metro on Windows. If its something else then the app will try to load the file /themeName.res (placed in native/Java SE directory).

desktop.themeMac

string

(none)

(none)

Same as desktop.theme but specific to macOS

desktop.themeMode

string

(set by the build)

@DesktopBuild(themeMode)

Which native theme a desktop build installs, and the one hint that decides whether a desktop application looks like the platform it’s running on. One desktop binary runs on Windows, macOS and Linux, so the value is resolved against the machine the application starts on rather than at build time. auto, native and modern are one value under three spellings and select the host’s own look: Fluent, Aqua or Adwaita. Naming a theme outright with fluent, aqua or adwaita pins that one look on every machine instead, which is what an application with a deliberate cross-platform identity wants. legacy, which is also the default, keeps whatever the application was built and tested against before these themes existed, and custom installs no framework theme at all so the application’s own is the only one loaded. The per-value and per-platform tables, and how this relates to the iOS, Android, macOS and cross-platform theme hints, are on the @DesktopBuild annotation itself. Read by the JavaSE port at runtime rather than by a builder, so unlike most hints here it changes what the running application does rather than what’s produced for it.

desktop.themeWin

string

(none)

(none)

Same as desktop.theme but specific to Windows

desktop.title

string

(none)

(none)

desktop.titleBar

native, custom, toolbar

(set by the build)

@DesktopBuild(titleBar)

How the desktop window is framed: native for the OS title bar and menu bar, custom for an undecorated window with a Codename One drawn title bar, or toolbar for the legacy in-app Toolbar. An unrecognized value falls back to native with a warning.

desktop.width

int

(set by the build)

@DesktopBuild(width)

Width in pixels for the form in desktop builds, will be doubled for retina grade displays. Defaults to 800.

desktop.win.cef

boolean

(none)

(none)

Whether to use CEF for media and BrowserComponent instead of JavaFX in windows desktop builds. true/false. Default value is false (Jan 2021), but this will be changed to true in a future version.

desktop.windowsOutput

string

(none)

(none)

Can be exe or msi depending on desired results

KeepScreenOn

boolean

false

(none)

androidx.appcompat.version

string

(none)

(none)

block_server_registration

boolean

(none)

(none)

true/false flag defaults to false. By default Codename One applications register with the Codename One server. Setting this to true blocks them from sending information to the Codename One cloud, which is kept for statistical purposes and may be used to provide more installation stats in the future.

build.cn1Version

string

(none)

(none)

Pro/Enterprise only. Pins the cloud build to a specific released Codename One version using the Maven release scheme (for example 7.0.182), or to master to build against the current development head. The build server fetches that version’s framework artifacts. Pro accounts can target versions published within the last two months; Enterprise within the last six months. Requesting an older version, a version that was never published, or using this hint without a Pro/Enterprise subscription fails the build with an explanatory error. See Versioned builds.

build.incSources

string

(none)

(none)

build.testReporter

string

(none)

(none)

build.unitTest

string

(none)

(none)

call.video

boolean

false

(none)

Whether video calls are offered, on both platforms. ios.call.video and android.call.video override it per platform.

cn1.androidTheme

string

(none)

(none)

Deprecated alias for and.themeMode (AndroidGradleBuilder.java:4097). Both names configure one setting, so declaring this alongside @Android(themeMode) is a conflict.

cn1.buildKey

string

(none)

(none)

cn1.entitled

boolean

true

(none)

cn1.harden.forceOff

string

(none)

(none)

cn1.hardenLevel

string

off

(none)

cn1.hardened

boolean

false

(none)

cn1.hardening.libraryJars

string

(none)

(none)

cn1.mappingId

string

(none)

(none)

cn1.nativeTheme

string

(none)

(none)

Deprecated alias for nativeTheme (AndroidGradleBuilder.java:4099, IPhoneBuilder.java:947). Both names configure one setting, so declaring this alongside @Build(nativeTheme) is a conflict.

codename1.mac.appid

string

(none)

(none)

Mac Native cloud builds only. The Mac bundle identifier registered in App Store Connect / Apple Developer. Distinct from codename1.ios.appid because Apple treats the iOS and Mac App Store records as separate products. Required for cloud Mac builds.

codename1.mac.certificate

string

(none)

(none)

Mac Native cloud builds only. Path to the .p12 file containing the Mac signing certificate(s) — Mac App Distribution (3rd Party Mac Developer Application) for App Store builds, Developer ID Application for Developer ID builds, or both bundled into the same P12 when macNative.distribution=both. Not interchangeable with the iOS distribution certificate. Required for cloud Mac builds.

codename1.mac.certificatePassword

secret

(none)

(none)

Mac Native cloud builds only. Password to unlock the P12 referenced by codename1.mac.certificate. Required for cloud Mac builds.

codename1.mac.provision

string

(none)

(none)

Mac Native cloud builds only. Path to the Mac provisioning profile (.provisionprofile). Apple issues distinct provisioning profiles for Mac App Store and Developer ID distribution — pass the one that matches the chosen channel.

db.legacy

string

(none)

(none)

delayPushCompletion

boolean

false

(none)

facebook.appId

string

(set by the build)

@Build(facebookAppId)

The application ID for an app that requires native Facebook login integration, this defaults to null which means native Facebook support shouldn’t be in the app

facebook.clientToken

secret

(none)

(none)

The client token for an app that requires native Facebook login integration, this is required if the facebook.appId is set.

gcm.sender_id

string

(set by the build)

@Build(gcmSenderId)

The Android/chrome push identifier, see the push section for more details

google.adUnitId

string

(none)

(none)

Allows integrating Admob/Google Play ads into the application see this

gradleDependencies

list (newline delimited)

(none)

(none)

harden.*

string

(none)

(properties file only)

The whole hardening namespace is swept into the hardening engine’s configuration, so a hint added there reaches it without a dedicated reader.

harden.*.enabled

string

(none)

(properties file only)

Enables or disables hardening for one platform slice.

harden.allowUnhardenedLocalBuild

boolean

(set by the build)

@Hardening(allowUnhardenedLocalBuild)

Permits a local or source build to run with hardening requested but not applied. Without it such a build is refused, so a hardened app is never shipped from a target that can’t actually harden it.

harden.controlFlow

off, on

(set by the build)

@Hardening(controlFlow)

Overrides control-flow obfuscation independently of harden.level.

harden.ios.enabled

boolean

true

(none)

harden.keep

text_block

(set by the build)

@Hardening(keep)

Keep rules in ProGuard syntax, one per line, for classes that are resolved by name at runtime and so can’t be found by the automatic analysis. Same syntax as android.proguardKeep, so existing rules port directly. Rules are separated by newlines only, because a semicolon is legal inside a rule body such as { *; }.

harden.level

off, standard, aggressive, paranoid

(set by the build)

@Hardening(level)

Master switch for app hardening: off, standard, aggressive or paranoid. An unrecognized value fails the build rather than being treated as off.

harden.mac.enabled

boolean

true

(none)

harden.rename

boolean

(set by the build)

@Hardening(rename)

Overrides symbol renaming independently of harden.level.

harden.strings

off, constants, all

(set by the build)

@Hardening(strings)

Overrides string obfuscation independently of harden.level: off, constants or all.

harden.tv.enabled

boolean

true

(none)

harden.watch.enabled

boolean

true

(none)

invite.domain

string

cloud.codenameone.com

(none)

The host that serves Codename One invite links (https://<host>/i/<slug>/<code>;). Changing it points the generated Android App Link intent filter and the iOS associated domain at a different link service; the matching apple-app-site-association and assetlinks.json must be served from that host.

invite.slug

string

(none)

(none)

This app’s path segment in its invite links (https://<host>/i/<slug>/<code>;), shown in the invite settings of the build console. Set it so the generated Android App Link filter matches only this app’s own links. The link domain is shared by every invite-enabled app, so when this is unset the filter matches every invite link on the domain and a device with two such apps installed may show a chooser or open the other one.

java.version

int

8

(none)

Valid values include 5 or 8. Indicates the JVM version that should be used for server compilation, this is defined by default for newly created apps based on the Java 8 mode selection

mac.desktop-vm

string

(none)

(none)

The JVM the should be bundled with Mac desktop build. Mac desktop builds only. Supported values: zuluFx8, zulu11, zuluFx11

maps.provider

string

(none)

(none)

Selects the native map provider. android.maps.provider and ios.maps.provider override it for one platform.

nativeTheme

modern, native, legacy, custom

(set by the build)

@Build(nativeTheme)

native, modern, legacy, custom (default unset). Cross-platform override that sets ios.themeMode and and.themeMode together when those aren’t set explicitly. modern = liquid glass + Material 3, legacy = iOS 7 flat + Holo Light, custom disables the framework native theme entirely. The legacy alias cn1.nativeTheme is still accepted. native is modern plus the desktop: it additionally selects the host’s own desktop theme — Fluent, Aqua or Adwaita — the way desktop.themeMode = auto does. modern stops short of the desktop on purpose, because it predates the desktop themes by years and an application that set it for its phone builds never asked for its desktop screens to be redrawn. desktop.themeMode overrides this hint either way, and the full per-platform table is on the @DesktopBuild annotation.

nativeVerify

string

(none)

(none)

strict or warn turns on ParparVM’s native signature check for this build; anything else leaves it off, which is the default. ParparVM encodes the whole Java signature in the C function name, so a native spelled even slightly differently never reaches the linker as an error: the correctly named symbol is simply absent, the dead-code pass reads that as unused, and the feature ships inert. ios.nativeVerify, linux.nativeVerify and windows.nativeVerify override it for one platform.

noExtraResources

boolean

(set by the build)

@Build(noExtraResources)

true/false (defaults to false). Blocks codename one from injecting its own resources when set to true, the only effect this has is in slightly reducing archive size. This might have adverse effects on some features of Codename One so it isn’t recommended.

pgo.trainingSeconds

int

(set by the build)

@Build(pgoTrainingSeconds)

How long, in seconds, the instrumented application runs when ios.pgo, macos.pgo or linux.pgo is on. Defaults to 60; a value below 10 or above 300 is brought into that range. Ignored when no profile-guided build is requested. See Profile-guided optimization in the developer guide.

requireKotlinStdlib

string

(none)

(none)

tvMain

string

(none)

(none)

var.*

string

(none)

(properties file only)

Defines a variable that any other hint can interpolate as ${var.name}, with ${var.name:default} for a fallback.

vserv.allowSkipping

boolean

true

(none)

vserv.category

int

29

(none)

vserv.countryCode

string

null

(none)

vserv.locale

string

en_US

(none)

vserv.networkCode

string

null

(none)

vserv.scaleMode

boolean

false

(none)

vserv.transition

int

300000

(none)

vserv.zone

string

(none)

(none)

watchMain

string

(none)

(none)

watchStandalone

boolean

false

(none)

xxx.minPlayServicesVersion

string

(none)

(none)

This is a special case build hint. You can use any prefix to the build hint and the convention is to use your cn1lib name. It’s identical to android.minPlayServicesVersion with the exception that the "highest version wins." That way if your cn1lib requires play services 9+ and uses: myLib.minPlayServicesVersion=9.0.0 and another library has otherLib.minPlayServicesVersion=10.0.0 then play services will be 10.0.0

ios.*.appext.*

string

(none)

(properties file only)

Per-app-extension signing. ios.debug.appext.<Name>.* and ios.release.appext.<Name>.* are collapsed to unqualified keys before the request is sent.

ios.NFCReaderUsageDescription

string

(none)

(none)

ios.NS*UsageDescription

string

(none)

(properties file only)

Info.plist privacy strings. The commonly used keys are catalogued individually and exposed through @IosPrivacy; this entry covers the open tail that the builder sweeps by prefix.

ios.NSBluetoothAlwaysUsageDescription

string

(set by the build)

@IosPrivacy(bluetoothAlwaysUsageDescription)

Why the app uses Bluetooth. Supplied automatically when the app references com.codename1.bluetooth; set it to say something more specific than the default.

ios.NSBluetoothPeripheralUsageDescription

string

(set by the build)

@IosPrivacy(bluetoothPeripheralUsageDescription)

The pre-iOS 13 spelling of the Bluetooth usage description, supplied and overridable on the same terms.

ios.NSBonjourServices

string

(none)

(none)

ios.NSCalendarsFullAccessUsageDescription

string

(set by the build)

@IosPrivacy(calendarsFullAccessUsageDescription)

The text iOS shows when the app first asks for the calendars full access. It becomes the NSCalendarsFullAccessUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSCalendarsUsageDescription

string

(set by the build)

@IosPrivacy(calendarsUsageDescription)

The text iOS shows when the app first asks for the calendars. It becomes the NSCalendarsUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSCalendarsWriteOnlyAccessUsageDescription

string

(set by the build)

@IosPrivacy(calendarsWriteOnlyAccessUsageDescription)

The text iOS shows when the app first asks for the calendars write only access. It becomes the NSCalendarsWriteOnlyAccessUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSCameraUsageDescription

string

(set by the build)

@IosPrivacy(cameraUsageDescription)

The text iOS shows when the app first asks for the camera. It becomes the NSCameraUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSHealthShareUsageDescription

string

(set by the build)

@IosPrivacy(healthShareUsageDescription)

The text iOS shows when the app first asks for the health share. It becomes the NSHealthShareUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSHealthUpdateUsageDescription

string

(set by the build)

@IosPrivacy(healthUpdateUsageDescription)

The text iOS shows when the app first asks for the health update. It becomes the NSHealthUpdateUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSLocalNetworkUsageDescription

string

(set by the build)

@IosPrivacy(localNetworkUsageDescription)

The text iOS shows when the app first asks for the local network. It becomes the NSLocalNetworkUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSLocationAlwaysAndWhenInUseUsageDescription

string

(set by the build)

@IosPrivacy(locationAlwaysAndWhenInUseUsageDescription)

The text iOS shows when the app first asks for the location always and when in use. It becomes the NSLocationAlwaysAndWhenInUseUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSLocationAlwaysUsageDescription

string

(set by the build)

@IosPrivacy(locationAlwaysUsageDescription)

The text iOS shows when the app first asks for the location always. It becomes the NSLocationAlwaysUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSLocationWhenInUseUsageDescription

string

(set by the build)

@IosPrivacy(locationWhenInUseUsageDescription)

The text iOS shows when the app first asks for the location when in use. It becomes the NSLocationWhenInUseUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSMicrophoneUsageDescription

string

(set by the build)

@IosPrivacy(microphoneUsageDescription)

The text iOS shows when the app first asks for the microphone. It becomes the NSMicrophoneUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSNearbyInteractionAllowOnceUsageDescription

string

(set by the build)

@IosPrivacy(nearbyInteractionAllowOnceUsageDescription)

The pre-iOS 16 spelling of the nearby-interaction usage description, supplied automatically when the app references the nearby APIs.

ios.NSNearbyInteractionUsageDescription

string

(set by the build)

@IosPrivacy(nearbyInteractionUsageDescription)

Why the app measures distance and direction to nearby devices. Supplied automatically when the app references the nearby APIs; set it to say something more specific than the default.

ios.NSRemindersFullAccessUsageDescription

string

(set by the build)

@IosPrivacy(remindersFullAccessUsageDescription)

The text iOS shows when the app first asks for the reminders full access. It becomes the NSRemindersFullAccessUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSRemindersUsageDescription

string

(set by the build)

@IosPrivacy(remindersUsageDescription)

The text iOS shows when the app first asks for the reminders. It becomes the NSRemindersUsageDescription key in Info.plist. The App Store rejects an app that touches this resource without one.

ios.NSSpeechRecognitionUsageDescription

string

(set by the build)

@IosPrivacy(speechRecognitionUsageDescription)

Why the app sends speech for recognition. Supplied automatically when the app references the speech APIs; set it to say something more specific.

ios.NSXXXUsageDescription

string

(none)

(none)

iOS privacy flags for using certain APIs. Starting with Xcode 8, you’re required to add usage description strings for certain APIs. Find a full list of the available keys in Apple’s docs. Some relevant ones include ios.NSCameraUsageDescription, ios.NSContactsUsageDescription, ios.NSLocationAlwaysUsageDescription, NSLocationUsageDescription, ios.NSMicrophoneUsageDescription, ios.NSPhotoLibraryAddUsageDescription, ios.NSSpeechRecognitionUsageDescription, ios.NSSiriUsageDescription

ios.UIRequiredDeviceCapabilities

string

(none)

(none)

ios.actionSheetStyle

string

(none)

(none)

ios.add_libs

list (; delimited)

(set by the build)

@Ios(addLibs)

A semicolon separated list of libraries that should be linked to the app to build it

ios.afterFinishLaunching

string

(none)

(none)

Objective-C code that can be injected into the iOS app delegate at the bottom of the body of the didFinishLaunchingWithOptions callback method

ios.appAttest

boolean

false

(none)

ios.appAttest.environment

string

(none)

(none)

ios.appUsesNonExemptEncryption

string

(none)

(none)

ios.app_groups

string

(none)

(none)

Space-delimited list of app groups that this app belongs to as described in Apple’s documentation. These are added to the entitlements file with key com.apple.security.application-groups.

ios.appext.NAME.provisioningURL

string

(none)

(none)

Cloud device builds only. URL of the provisioning profile for a generic app extension dropped into ios/app_extensions/NAME/ (or a generated extension such as CN1Widgets), used when the extension folder doesn’t bundle a .mobileprovision itself. The profile is installed on the build machine and added to the export options per bundle id. Used for both debug and release builds unless a qualified variant (below) is set. An extension is signed against its own App ID, so a device build with no profile for it — by any of the three carriers — is refused unless the app’s own profile is a wildcard that covers the extension’s bundle id.

ios.applicationDidEnterBackground

string

(none)

(none)

Objective-C code that can be injected into the iOS callback method (message) applicationDidEnterBackground.

ios.applicationQueriesSchemes

list (, delimited)

(set by the build)

@Ios(applicationQueriesSchemes)

Comma separated list of url schemes that canExecute will respect on iOS. If the url scheme isn’t mentioned here canExecute will return false starting with iOS 9. Notice that this collides with ios.plistInject when used with the <key>LSApplicationQueriesSchemes</key>…​ value so you should use one or the other. For example, to enable canExecute for a url like myurl://xys you can use: myurl,myotherurl

ios.application_exits

boolean

(none)

(none)

true/false (defaults to false). Indicates whether the application should exit on home button press. The default is to exit, leaving the application running is only tested at the moment.

ios.associatedDomains

string

(none)

(none)

Comma-delimited list of domains associated with this app. Each domain should be prefixed by a supported prefix. For example, "applinks:" or "webcredentials:." See Apple’s documentation on Associated domains for more information.

ios.backgroundProcessingIds

string

(none)

(none)

ios.background_modes

string

(none)

(none)

ios.beforeFinishLaunching

text_block

(set by the build)

@Ios(beforeFinishLaunching)

Objective-C code that can be injected into the iOS app delegate at the top of the body of the didFinishLaunchingWithOptions callback method

ios.bitcode

boolean

false

(none)

true/false defaults to false. Enables bitcode support for the build.

ios.blockScreenshotsOnEnterBackground

boolean

false

(none)

true/false (defaults to false). Indicates that app should prevent iOS from taking screenshots when app enters background. Described here.

ios.bluetooth.background

string

(none)

(none)

ios.buildType

string

debug

(none)

ios.bundleVersion

version

(set by the build)

@Ios(bundleVersion)

Indicates the version number of the bundle, this is useful if you want to create a minor version number change for the beta testing support

ios.call.appGroup

string

(none)

(none)

The App Group the call directory extension shares with the app. The extension runs in its own process, so the blocked-number list is handed over through the group rather than passed in. Defaults to group.<packageName>.

ios.call.directory.buildSettings.*

string

(none)

(properties file only)

Xcode build settings for the generated call directory extension target. PRODUCT_BUNDLE_IDENTIFIER is read in two places — the target’s own settings and the CN1CallDirectoryExtensionIdentifier the host plist carries — so an override has to reach both or the app asks the system to reload an identifier nothing installed.

ios.call.icon

string

(none)

(none)

A template image in the bundle shown beside the call in the system UI.

ios.call.providerName

string

(none)

(none)

The name shown above a call in the system call UI. Defaults to the app’s display name. Baked into Info.plist because CallKit needs it during launch, before any of your code has run.

ios.call.pushTTL

int

30

(none)

Seconds a pushed call waits for your code before the system ends it as unanswered.

ios.call.recents

boolean

true

(none)

Whether calls appear in the system call log.

ios.call.ringtone

string

(none)

(none)

A sound file in the bundle to ring incoming calls with. Defaults to the system ringtone.

ios.call.unknownCaller

string

(none)

(none)

The name shown when a VoIP push carries no displayName.

ios.call.video

boolean

false

(none)

Whether the provider offers video calls. Overrides call.video on iOS.

ios.carplay.audio

boolean

false

(none)

ios.carplay.messaging

boolean

false

(none)

ios.carplay.navigation

boolean

false

(none)

ios.carplay.poi

boolean

false

(none)

ios.continuity.sync

boolean

(none)

(none)

Whether this project wants the iCloud key-value store behind com.codename1.continuity.sync. Left unset the build decides from the bytecode, which is usually what you want. Set false when the App ID has no iCloud capability and the app can live without a synced store: the entitlement is dropped and SyncedStore reports itself unsupported at runtime rather than the build failing to sign. Set true to say so explicitly, which is what lets the signing preflight check the profile before the build is sent. Handing work to a nearby device is unaffected either way — that half needs no entitlement.

ios.convertSignalsToExceptions

boolean

true

(none)

ios.criticalAlerts

boolean

false

(none)

ios.crypto.gcm

boolean

true

(none)

Whether AES-GCM is compiled into the crypto library. On by default wherever the crypto API is used; set false to leave it out and keep the binary smaller. The secure vault needs it.

ios.debug.archs

string

(none)

(none)

Can be set to "armv7" to force iOS debug builds to be 32 bit. By default, debug builds are 64 bit only.

ios.debug.distributionMethod

string

(none)

(none)

Specifies distribution type for debug iOS builds only. This is used for enterprise or ad-hoc builds (using values "enterprise" and "ad-hoc" respectively).

ios.debug.teamId

string

(none)

(none)

Specifies the team ID associated with the iOS debug provisioning profile and certificate.

ios.delayPushCompletion

boolean

false

(none)

ios.dependencyManager

auto, cocoapods, spm, both, none

(set by the build)

@Ios(dependencyManager)

Which native dependency manager to use: auto picks one from whichever of ios.pods and ios.spm.packages is set, and cocoapods, spm or both require the matching hint to be set. An unrecognized value fails the build.

ios.deployment_target

version

(set by the build)

@Ios(deploymentTarget)

Minimum iOS version the build targets. Set it to the lowest iOS you actually support; a higher value excludes older devices from the App Store listing.

ios.detectJailbreak

boolean

false

(none)

true/false (defaults to false). When true, the iOS app will exit on launch if it detects that it’s running on a jailbroken device.

ios.devLocale

string

(none)

(none)

ios.disableScreenshots

boolean

false

(none)

ios.distributionMethod

string

(none)

(none)

Specifies distribution type for debug iOS builds. This is used for enterprise or ad-hoc builds (using values "enterprise" and "ad-hoc" respectively).

ios.documentProvider.appGroup

string

(none)

(none)

App Group id starting with 'group.' shared by the app and the generated CN1Documents extension, defaulting to 'group.' followed by the app’s package name. This id carries everything the two processes share: the app publishes its index into the group and the extension reads it from there, so without it the published location appears empty.

ios.documentProvider.buildSettings.*

string

(none)

(properties file only)

Overrides an Xcode build setting for the generated document provider extension. Applied last, so it wins over the generated defaults.

ios.documentProvider.deploymentTarget

version

16.0

(none)

Minimum OS version the generated extension runs on. At or above 16.0 the extension is an NSFileProviderReplicatedExtension; below it Codename One generates the deprecated NSFileProviderExtension instead. The host app’s own deployment target is unaffected.

ios.documentProvider.displayName

string

(none)

(none)

Name shown for this location in the file browser. Defaults to the app’s display name.

ios.documentProvider.enabled

boolean

false

(none)

Declares that this project publishes documents to the system file browser. The build detects a reference to com.codename1.documents on its own, so this is redundant for the build itself; it exists because the Certificate Wizard and the signing preflight work without reading bytecode and need to know that the CN1Documents extension will be generated.

ios.documentProvider.extension

boolean

true

(none)

Set false to skip the iOS lowering entirely — no extension target, no app group, no plist keys — leaving com.codename1.documents an inert no-op at runtime.

ios.enableAutoplayVideo

boolean

false

(none)

Boolean true/false defaults to false. Makes videos "autoplay" when loaded on iOS

ios.enableBadgeClear

boolean

true

(none)

Boolean true/false defaults to true. Clears the badge value with every load of the app, this is useful if the app doesn’t manually keep track of number values for the badge

ios.enableGalleryMultiselect

boolean

false

(none)

ios.enableStatusBar7

boolean

true

(none)

ios.entitlements.*

string

(none)

(properties file only)

Adds an arbitrary entitlement key to the generated entitlements file.

ios.entitlements.com.apple.developer

string

(none)

(none)

ios.entitlements.com.apple.developer.applesignin

string

(none)

(none)

ios.entitlements.com.apple.developer.healthkit

boolean

false

(none)

ios.entitlements.com.apple.developer.homekit

string

(none)

(none)

ios.entitlements.com.apple.developer.networking.HotspotConfiguration

string

(none)

(none)

ios.entitlements.com.apple.developer.nfc.hce

string

(none)

(none)

ios.entitlements.com.apple.developer.nfc.readersession.formats

string

(none)

(none)

ios.entitlementsInject

xml

(none)

(none)

Content to inject into the iOS entitlements file. This should be in the Plist XML format. See Apple Entitlements Documentation.

ios.facebook.usePods

boolean

true

(none)

ios.facebook.version

string

~>5.6.0

(none)

ios.facebook_permissions

string

(none)

(none)

Permissions for Facebook used in the Android build target, applicable only if Facebook native integration is used.

ios.failOnWarning

boolean

false

(none)

ios.fieldNullChecks

boolean

false

(none)

ios.fileSharingEnabled

boolean

false

(none)

ios.firebaseAnalytics

boolean

false

(none)

ios.firebaseAnalyticsVersion

string

(none)

(none)

ios.force64

boolean

false

(none)

ios.glAppDelegateBody

string

(none)

(none)

Objective-C code that can be injected into the iOS app delegate within the body of the file before the end. This only makes sence for methods that aren’t already declared in the class

ios.glAppDelegateHeader

text_block

(set by the build)

@Ios(glAppDelegateHeader)

Objective-C code that can be injected into the iOS app delegate at the top of the file. For example, if you need to include headers or make special imports for other injected code

ios.googleAdUnitId

string

(none)

(none)

Allows integrating admob/google play ads, this is effectively identical to google.adUnitId but only applies to iOS

ios.googleAdUnitIdPadding

string

(none)

(none)

Indicates the amount of padding to pass to the Google Ads placed at the bottom of the screen with google.adUnitId

ios.googleAdUnitTestDevice

string

97cfc76e5efbc6dfa7eb2e6857b613a0

(none)

ios.gplus.clientId

string

(none)

(none)

ios.hceAids

string

(none)

(none)

ios.headphoneCallback

boolean

false

(none)

Boolean true/false defaults to false. When set to true it assumes the main class has two methods: headphonesConnected & headphonesDisconnected which it invokes appropriately as needed

ios.health.backgroundDelivery

boolean

false

(none)

ios.health.recalibrateEstimates

boolean

false

(none)

ios.health.required

boolean

false

(none)

ios.home.appGroup

string

(none)

(none)

ios.home.commissioning

boolean

true

(none)

ios.home.commissioning.buildSettings.*

string

(none)

(properties file only)

Overrides an Xcode build setting for the Matter commissioning extension.

ios.home.commissioning.displayName

string

(none)

(none)

ios.home.commissioning.fabric

string

(none)

(none)

ios.home.commissioning.vendorId

string

0xFFF1

(none)

ios.home.required

boolean

false

(none)

ios.includeNullChecks

boolean

true

(none)

ios.includePush

boolean

(set by the build)

@Ios(includePush)

true/false (defaults to false). Whether to include the push capabilities in the iOS build. Notice that the IDE plugin has an "Include Push" check box you should use under the iOS section.

ios.intents.appIntents

boolean

true

(none)

ios.intents.minDeploymentTarget

string

(none)

(none)

ios.interface_orientation

string

(set by the build)

@Ios(interfaceOrientation)

UIInterfaceOrientationPortrait by default. Indicates the orientation, one or more of (separated by colon :): UIInterfaceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight. Notice that the IDE plugin has an "Interface Orientation" combo box you should use under the iOS section.

ios.invite.appClip

boolean

true

(none)

Whether the build generates and embeds the App Clip that makes invite attribution exact on iOS. The App Store carries no referrer of its own, so without the clip an iOS install can’t be attributed at all. Set it to false only if you ship an App Clip of your own: the build then generates no clip, but the app still carries the shared app group and the reader, so a clip of yours that writes the handoff below is still picked up. This is the ONLY hint that suppresses the clip: ios.invite.universalLinks=false means you manage the associated domains yourself and leaves the clip, the shared app group and the reader in place, because an app that configured its own domains correctly still needs them.

THE HANDOFF, for a clip of your own. Write one entry into the NSUserDefaults suite named by ios.invite.appGroup, under the key cn1-invite-app-clip-handoff. The value is a dictionary with code, a string holding the invite code taken from the last path segment of the invite url, and clicked, a number holding the tap time as whole seconds since the epoch. clicked may be omitted, and the App Clip is the only thing that ever observes that time — the invocation never reaches the redirect — so a clip that drops it leaves every attribution dated zero. A code containing a newline is rejected on the way in.

Then call synchronize on the suite before returning. A clip is killed without notice the moment the App Store sheet takes over, and the write IS the attribution — there is no second chance to make it.

Don’t clear the entry after writing it. The installed app reads it, keeps it until its own record is durable, and clears it then; a clip that clears its own copy destroys the code whenever that write fails or the process exits first, and the install is then reported as organic permanently.

ios.invite.appGroup

string

(none)

(none)

The app group the invite App Clip hands the invite code to the installed app through. Defaults to group.<package name>.cn1invite, and is added to ios.app_groups automatically. It must start with group. and must be registered on your developer account, or the clip and the app both sign and neither can read what the other wrote.

ios.invite.appStoreId

string

(none)

(none)

The numeric App Store identifier of this app, which the invite App Clip uses to offer the full app through SKOverlay. Leave it unset before your first release: the clip still records the invite code, it simply shows no install sheet until the app exists in the store.

ios.invite.buildSettings.*

string

(none)

(properties file only)

Xcode build settings for the generated invite App Clip target. The clip is a separate application bundle embedded in the app, so its deployment target and device family are its own and an override reaches only it.

ios.invite.universalLinks

boolean

true

(none)

Whether the build appends applinks: for the invite link domain to ios.associatedDomains and requests the matching com.apple.developer.associated-domains entitlement. Set it to false to manage both yourself. The provisioning profile must grant the Associated Domains capability either way, or invite links open Safari instead of the app with no error reported.

ios.keyboardOpen

boolean

true

(none)

Flips between iOS keyboard open mode and autofold keyboard mode. Defaults to true which means the keyboard will remain open and not fold automatically when editing moves to another field.

ios.keychainAccessGroup

string

(none)

(none)

Space-delimited list of keychain access groups that this app has access to as described in Apple’s documentation. These are added to the entitlements file with the key keychain-access-groups.

ios.launchPlaceholder

boolean

true

(none)

ios.locationUsageDescription

string

(none)

(none)

This flag is required for iOS 8 and newer if you’re using the location API. It needs to include a description of the reason for which you need access to the users location

ios.lowMemCamera

boolean

false

(none)

ios.maps.provider

string

(none)

(none)

iOS’s own native map provider, overriding maps.provider.

ios.metal.colorSpace

string

sRGB

(none)

Selects the CAMetalLayer.colorspace for the Metal renderer. Accepts sRGB (default), displayP3, deviceRGB, linearSRGB, extendedSRGB, extendedLinearSRGB, or none. See Working with iOS / Choosing a color space for the full table.

ios.minDeploymentTarget

version

(set by the build)

@Ios(minDeploymentTarget)

The null and empty-string reads of this hint are presence checks; 6.0 is the substantive one.

ios.mopubAdSize

string

MOPUB_BANNER_SIZE

(none)

ios.mopubId

string

(none)

(none)

ios.mopubTabletAdSize

string

MOPUB_LEADERBOARD_SIZE

(none)

ios.mopubTabletId

string

(none)

(none)

ios.multitasking

boolean

true

(none)

Set to true to enable iOS multitasking and split-screen support. This only works if ios.xcode_verson=9.2.

ios.nativeVerify

string

(none)

(none)

nativeVerify for the iOS translation alone.

ios.nearby.accessoryServices

list (, delimited)

(none)

(none)

Bluetooth service UUIDs published as NSAccessorySetupBluetoothServices, so AccessorySetupKit can show a picker for them. Unset publishes none.

ios.nearby.background

boolean

false

(none)

Requests the nearby-interaction entitlement and the background mode that go with ranging while backgrounded. Off by default because the entitlement has to be on the provisioning profile, and requesting it without one fails signing for every ranging app.

ios.nearby.serviceType

string

(none)

(none)

Bonjour service type the nearby transport advertises. Derived from the package name when unset.

ios.newStorageLocation

boolean

(set by the build)

@Ios(newStorageLocation)

Stores app files under the documents directory rather than caches, which is the location Apple recommends but which may break compatibility with an app that already shipped. Described in this issue

ios.noUIWebView

boolean

true

(none)

ios.no_strip

boolean

false

(none)

ios.notificationPermissionAtLaunch

boolean

false

(none)

true/false (defaults to false). Backward-compatibility flag for the pre-issue-#4876 behavior. By default, the iOS notification permission prompt is deferred until the app calls Push.register() or schedules a LocalNotification, matching the Android flow and giving the developer a chance to display a rationale screen first. Set this hint to true to restore the legacy behavior in which the prompt fires automatically inside application:didFinishLaunchingWithOptions: as soon as the app launches. Existing apps relying on the prompt being shown at launch should set this to true; new apps should leave it disabled and trigger the prompt explicitly when they’re ready to ask for permission.

ios.objC

boolean

(set by the build)

@Ios(objC)

Added the -ObjC compile flag to the project files which some native libraries require

ios.onDeviceDebug

boolean

(set by the build)

@OnDeviceDebug(ios)

Boolean true/false defaults to false. When true, the iOS build links a small JDWP listener thread (cn1_debugger) into the binary and the ParparVM translator emits source-line and locals metadata so a desktop proxy can serve the running app to any JDWP-speaking debugger. Has no effect on release builds. See the On-Device Debugging (iOS) chapter for the full flow.

ios.onDeviceDebug.proxyHost

string

(set by the build)

@OnDeviceDebug(iosProxyHost)

Hostname or IP address the device-side listener dials to reach the desktop proxy. Default 127.0.0.1 (correct for the native iOS simulator). For a physical device, set this to the developer laptop’s LAN IP. Has no effect unless ios.onDeviceDebug=true.

ios.onDeviceDebug.proxyPort

int

(set by the build)

@OnDeviceDebug(iosProxyPort)

TCP port on ios.onDeviceDebug.proxyHost where the proxy is listening for the device. Default 55333. Has no effect unless ios.onDeviceDebug=true.

ios.onDeviceDebug.waitForAttach

boolean

(set by the build)

@OnDeviceDebug(iosWaitForAttach)

Boolean true/false defaults to false. When true, the app blocks at startup until the proxy connects and the IDE tells the VM to continue. Useful when the breakpoint to investigate fires during app boot. Has no effect unless ios.onDeviceDebug=true.

ios.openURLInject

xml

(none)

(none)

ios.optimizer

string

on

(none)

ios.pgo

boolean

(set by the build)

@Ios(pgo)

Cloud builds only, Pro plan and above. Profile-guided optimization: compiles the application twice. An instrumented build runs unattended on an iOS simulator for pgo.trainingSeconds, and the profile it records drives the optimizer for the binary that ships. The build fails when the profile can’t be collected, rather than deliver a binary built without one. Can’t be combined with ios.buildForSimulator. See Profile-guided optimization in the developer guide.

ios.plistInject

xml

(set by the build)

@Ios(plistInject)

entries to inject into the iOS plist file during build.

ios.pods

list (, delimited)

(set by the build)

@Ios(pods)

A comma separated list of Cocoa Pods that should be linked to the app to build it. For example, AFNetworking ~> 2.6, ORStackView ~> 3.0, SwiftyJSON ~> 2.3

ios.pods.build.*

string

(none)

(properties file only)

Overrides an Xcode build setting for the generated CocoaPods project.

ios.pods.build.CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES

string

(none)

(none)

ios.pods.build.CLANG_ENABLE_MODULES

string

(none)

(none)

ios.pods.platform

version

(set by the build)

@Ios(podsPlatform)

Sets the Cocoapods 'platform' for the Cocoapods. Some Cocoapods require a minimum platform level. For example, ios.pods.platform=7.0.

ios.pods.sources

list (, delimited)

(set by the build)

@Ios(podsSources)

Extra CocoaPods spec repositories to search, in addition to the default trunk.

ios.pods.use_frameworks!

boolean

false

(none)

ios.prerendered_icon

boolean

(set by the build)

@Ios(prerenderedIcon)

true/false defaults to false. The iOS build process adapts the submitted icon for iOS conventions (adding an overlay) that might not be appropriate on some icons. Setting this to true leaves the icon unchanged (only scaled).

ios.project_type

ios, ipad, iphone

(set by the build)

@Ios(projectType)

one of ios, ipad, iphone (defaults to ios). Indicates whether the resulting binary is targeted to the iphone only or ipad only. Notice that the IDE plugin has a "Project Type" combo box you should use under the iOS section.

ios.release.archs

string

(none)

(none)

Can be set to "arm64" to only build iOS release builds for 64 bit. By default, release builds are both 32 and 64 bit.

ios.release.distributionMethod

string

(none)

(none)

Specifies distribution type for release iOS builds only. This is used for enterprise or ad-hoc builds (using values "enterprise" and "ad-hoc" respectively).

ios.release.teamId

string

(none)

(none)

Specifies the team ID associated with the iOS release provisioning profile and certificate.

ios.rpmalloc

string

(none)

(none)

true/false Use rpmalloc instead of malloc/free for memory allocation in ParparVM. This will cause the deployment target to be changed to a minimum of iOS 8.0.

ios.shareAppGroup

string

(none)

(none)

ios.spm.packages

list (; delimited)

(set by the build)

@Ios(spmPackages)

Swift Package Manager packages to link, one per entry, each written as identity|url|requirement.

ios.spm.products.*

string

(none)

(properties file only)

Selects which products of a Swift Package Manager package to link, keyed by package identity.

ios.statusBarFG

string

(none)

(none)

ios.statusbar_hidden

boolean

(none)

(none)

true/false defaults to false. Hides the iOS status bar if set to true.

ios.superfastBuild

boolean

false

(none)

ios.surfaces.appGroup

string

(none)

(none)

ios.surfaces.buildSettings.*

string

(none)

(properties file only)

Overrides an Xcode build setting for the external-surfaces extension.

ios.surfaces.deploymentTarget

version

16.1

(none)

ios.surfaces.extension

boolean

true

(none)

ios.surfaces.frequentUpdates

boolean

false

(none)

ios.swiftVersion

version

5.0

(none)

ios.teamId

string

(set by the build)

@Ios(teamId)

Specifies the team ID associated with the iOS provisioning profile and certificate. Use ios.debug.teamId and ios.release.teamId to specify different team IDs for debug and release builds respectively.

ios.testFlight

boolean

(none)

(none)

Boolean true/false defaults to false and works only for pro accounts. Enables the testflight support in the release binaries for easy beta testing. Notice that the IDE plugin has a "Test Flight" check box you should use under the iOS section.

ios.themeGeneration

26, 27

(set by the build)

@Ios(themeGeneration)

26 (default) or 27: which iOS design generation the modern theme targets. Consulted only when [#themeMode()] resolves to modern/liquid; every other mode ignores it. Unset means 26, so an application that says nothing keeps the theme it has. 27 selects the generation built from native-themes/ios-modern/gen27.css.

ios.themeMode

auto, modern, ios7, legacy

(set by the build)

@Ios(themeMode)

auto (default), modern, ios7, legacy. auto (unset) keeps the existing iOS 7 flat theme so pre-refactor screenshot goldens and apps see no behavior change. modern / liquid opts in to the CSS-generated iOS Modern (liquid-glass) theme shipped from native-themes/ios-modern/theme.css. ios7 / flat is the same as auto - pre-liquid iOS 7 flat theme; legacy / iphone loads the pre-iOS 7 iPhone theme. The auto → modern flip is planned for a future release.

ios.timeSensitiveNotifications

boolean

false

(none)

ios.twoDigitVersion

boolean

false

(none)

ios.urlScheme

string

(set by the build)

@Ios(urlScheme)

Allows intercepting a URL call using the syntax <string>urlPrefix<string>

ios.urlSchemes

string

(none)

(none)

ios.useAVKit

boolean

true

(none)

Use AVKit for video components on iOS rather than MPMoviePlayerController on iOS versions 8 through 12. iOS 13 will always use AVKit, and iOS 7 and lower will always use MPMoviePlayerController. Default value false

ios.useJavascriptCore

boolean

false

(none)

ios.usePhotoKitForMultigallery

boolean

false

(none)

ios.usePrintf

boolean

false

(none)

ios.useWKWebView

boolean

true

(none)

ios.usesBackgroundProcessing

boolean

false

(none)

ios.viewDidLoad

string

(none)

(none)

Objective-C code that can be injected into the iOS callback method (message) viewDidLoad

ios.viewDidLoadInclude

string

(none)

(none)

ios.vpn.tunnel

boolean

false

(none)

Generates the iOS packet tunnel: a Network Extension carrying a virtual machine, running the VpnTunnel subclass named by ios.vpn.tunnel.class. Two things have to be true, and this hint is the second: the app references com.codename1.vpn.tunnel, and the App ID holds com.apple.developer.networking.networkextension, which Apple grants case by case rather than self-serve. Setting this hint is the project asserting the grant — generating the target without it fails codesigning with an error naming an entitlement nobody asked for, which is why referencing the package alone never produces one. BOTH App IDs need the grant: the extension is the provider, and the app drives it through NETunnelProviderManager, which is Network Extension API as well — so the build writes the entitlement into the app and into the extension, and refuses before the archive if either provisioning profile doesn’t grant it. A device archive also needs a provisioning profile for the extension’s own App ID, <packageName>.vpntunnel, passed as ios.appext.CN1VpnTunnel.provisioningData or .provisioningURL. Left false, the build produces no extension and Tunnels.isSupported() answers false. The extension carries the translated program and the virtual machine and NO networking stack: com.codename1.io.Socket and everything else that reaches Util.getImplementation() finds nothing there, and ParparVM’s java.net is URI and URL. An iOS tunnel can therefore inspect, rewrite, drop and forward packets, but it can’t relay them to a remote server — on Android it can, because the tunnel runs in the app’s own process. The extension is a translation of its own, rooted at the tunnel: it carries what the tunnel reaches and nothing of the application, so a tunnel that reaches for the app’s own classes fails the extension’s link rather than misbehaving at runtime.

ios.vpn.tunnel.buildSettings.*

string

(none)

(properties file only)

Xcode build settings for the generated packet tunnel extension target. PRODUCT_BUNDLE_IDENTIFIER is read in two places — the target’s own settings and the CN1VpnTunnelExtensionIdentifier the host plist carries, which is how the app names the provider it starts — so an override has to reach both or the app asks the system to start an extension installed under some other name.

ios.vpn.tunnel.class

string

(none)

(none)

Which VpnTunnel subclass the generated packet tunnel extension runs, fully qualified — for example com.example.MyTunnel. Required when ios.vpn.tunnel is true. It has to be named rather than discovered: VpnTunnel is a class rather than an interface, so the shared class scanner skips it, and an app may have several subclasses while an extension runs exactly one. A wrong guess would build the wrong tunnel into the extension and fail at link on a symbol nobody wrote. The build checks the name against the compiled classes and refuses one it can’t find, rather than letting the generated entry point fail javac on a source file the developer never wrote. It has to be a class this project compiles: the translator reads loose class files, so a tunnel that lives only inside a submitted library jar is never translated and can’t be the extension’s entry point.

ios.wallet.appGroup

string

(none)

(none)

App Group id starting with group. shared by the app and the generated Wallet extensions. The app publishes pass entries into this group through com.codename1.payment.WalletExtension and the group is added to the app and extension entitlements automatically. Required when ios.wallet.extension=true.

ios.wallet.authEndpoint

string

(none)

(none)

HTTPS URL the generated login UI extension POSTs {"username","password"} to; the JSON response’s token is stored in the App Group for the provisioning request. Required when ios.wallet.includeUI=true.

ios.wallet.extension

boolean

false

(none)

Boolean true/false defaults to false. Generates an Apple Wallet issuer provisioning extension (the "From apps on your iPhone" flow in the Wallet app) and embeds it in the build. Requires ios.wallet.appGroup and ios.wallet.issuerEndpoint. See the Apple Wallet Extension chapter.

ios.wallet.generateRequestInject

string

(none)

(none)

Swift injected at the generate-request marker of the non-UI Wallet extension.

ios.wallet.generateResponseInject

string

(none)

(none)

Swift injected at the generate-response marker of the non-UI Wallet extension.

ios.wallet.includeUI

boolean

false

(none)

Boolean true/false defaults to false. Also generates the Wallet authorization UI extension - a login form shown inside the Wallet app when the app reports that authentication is required. Requires ios.wallet.authEndpoint.

ios.wallet.issuerEndpoint

string

(none)

(none)

HTTPS URL of the issuer backend endpoint that produces the encrypted provisioning payload. The generated extension POSTs Apple’s certificates/nonce plus the card identifier and auth token there as JSON. Required when ios.wallet.extension=true.

ios.wallet.nonuiExtensionName

string

WalletNonUIExtension

(none)

ios.wallet.nonuiImportsInject

string

(none)

(none)

Extra import lines for the non-UI Wallet extension.

ios.wallet.passEntriesInject

string

(none)

(none)

Swift injected where the non-UI Wallet extension lists its pass entries.

ios.wallet.remotePassEntriesInject

string

(none)

(none)

Swift injected where the non-UI Wallet extension lists its remote pass entries.

ios.wallet.statusInject

string

(none)

(none)

Swift injected at the status marker of the non-UI Wallet extension.

ios.wallet.uiAuthRequestInject

string

(none)

(none)

Swift injected at the auth-request marker of the UI Wallet extension.

ios.wallet.uiAuthResponseInject

string

(none)

(none)

Swift injected at the auth-response marker of the UI Wallet extension.

ios.wallet.uiExtensionName

string

WalletUIExtension

(none)

ios.wallet.uiImportsInject

string

(none)

(none)

Extra import lines for the UI Wallet extension.

ios.wallet.uiViewDidLoadInject

string

(none)

(none)

Swift injected into viewDidLoad of the UI Wallet extension.

ios.xcode_version

26, 27

(set by the build)

@Ios(xcodeVersion)

Which Xcode the build server compiles with. Unset lets the server choose: it prefers its own default and falls back to the newest Xcode it carries, so a server that hasn’t been re-imaged keeps building. Naming one opts out of that fallback — a version the server doesn’t have fails the build rather than substituting a toolchain nobody asked for, which would archive against an unintended SDK with nothing in the log to say so. Builds are claimed off a shared queue, so an Xcode that some servers carry and others don’t makes a build pass or fail at random. That’s a fleet out of step and worth reporting, not a hint to tune. The constants are the majors a current build server image carries, a set that belongs to the image rather than to this framework. To name a version outside them — a minor such as 27.1, or a major shipped since this release — write a plain codename1.arg.ios.xcode_version=<version> line in codenameone_settings.properties. Leaving this attribute at [IosXcodeVersion#DEFAULT] writes nothing, so the two don’t conflict. Read only by the build service; a local build uses the Xcode xcode-select points at and ignores this.

ios.zbar_flash

boolean

true

(none)

javascript.allowBrowserTranslation

boolean

false

(none)

true/false (defaults to false). By default the page opts out of browser machine translation (<meta name="google" content="notranslate"> and translate="no"), because a translator rewriting the page under the running app, or loading it through a translation proxy, breaks it. Set to true to let the browser offer translation.

javascript.darkreaderLock

boolean

true

(none)

true/false (defaults to true). Emits <meta name="darkreader-lock"> so the Dark Reader extension leaves the app’s own colors alone. Dark Reader honours the lock in its default Dynamic mode only; its Filter, Filter+ and Static modes ignore it. Set to false to omit the tag.

javascript.desktopTheme

string

auto

(none)

The native theme a desktop browser gets. auto (default) picks Windows Fluent, macOS Aqua or GNOME Adwaita from the browser’s operating system when nativeTheme=native; phones and tablets keep the iOS and Android themes. fluent, aqua or adwaita pins one theme for every desktop browser, so the bundle carries only that one. none keeps the mobile themes on the desktop too.

javascript.includeVideoJS

boolean

false

(none)

javascript.inject.afterHead

string

(none)

(none)

Content to be injected into the index.html file at the end of the <head> tag.

javascript.inject.beforeHead

string

(none)

(none)

Content to be injected into the index.html file at the beginning of the <head> tag.

javascript.inject_proxy

boolean

true

(none)

true/false (defaults to true). The ParparVM builder generates a same-origin proxy bundle and configures the app to use it. Setting this to false disables both proxy generation and proxy URL injection.

javascript.minifying

boolean

(none)

(none)

true/false (defaults to true). By default the JavaScript code is minified to reduce file size. You may optionally disable minification by setting javascript.minifying to false.

javascript.native.theme

string

(none)

(none)

An explicit native theme resource, such as /WindowsFluentTheme.res, used in every browser instead of the one the theme hints and the browser would pick.

javascript.port

string

(none)

(none)

parparvm (default) or teavm. Selects the public JavaScript compiler for cloud builds. teavm retains the original builder as a compatibility fallback.

javascript.portSources

string

(none)

(none)

javascript.proxy.allowedTargets

string

(none)

(none)

Comma-separated target origins, host names, or wildcard subdomains that a generated proxy may access, for example https://api.example.com,*.services.example.org. If omitted, the proxy accepts any HTTP or HTTPS target and the build emits a warning.

javascript.proxy.target

string

jakarta-servlet

(none)

The generated ParparVM proxy deployment platform. Supported values are jakarta-servlet (default), javax-servlet, node, php, aws-lambda, google-cloud-functions, cloudflare-workers, and none.

javascript.proxy.url

string

(none)

(none)

The URL of an existing proxy to use for network requests. Setting it suppresses generated proxy packaging unless javascript.proxy.target is also set. If javascript.inject_proxy is false, this build hint is ignored.

javascript.pruneThemes

boolean

true

(none)

true/false (defaults to true). The build ships only the native themes the application can reach from its theme hints, plus any theme its code names as a string. Set to false for an application that loads a native theme by a name it computes or reads from configuration, which no build can see.

javascript.sourceFilesCopied

boolean

(none)

(none)

true/false (defaults to false). Setting this flag to true will cause available java source files to be included in the resulting .zip and .war files. These may be used by Chrome during debugging.

javascript.stopOnErrors

boolean

(none)

(none)

true/false (defaults to true). Causes a TeaVM JavaScript build to fail when the compiler reports warnings. Setting this to false may allow the fallback builder to complete, but can turn compiler diagnostics into runtime failures that are more difficult to debug.

javascript.teavm.version

string

(none)

(none)

(Optional) The version of TeaVM to use for the build. Use caution, only use this property if you know what you’re doing!

javascript.textSelection

boolean

false

(none)

true/false (defaults to false). Makes read-only text — labels, span labels and non-editable text areas — selectable and copyable in every form, using the framework’s own text selection. A mouse selects by dragging; a touch screen selects with a long press, so a swipe still scrolls.

javascript.titleBar

string

toolbar

(none)

How a desktop native theme presents the form title and commands in a browser. toolbar (default) keeps the Toolbar in the app, styled by the desktop theme. html shows the title in an HTML title bar and the commands in an HTML menu bar above the app, the way the native desktop ports use the window title and the system menu bar.

linux.arch

string

(none)

(none)

linux.cc

string

(none)

(none)

linux.debug

boolean

false

(none)

linux.libc

string

glibc

(none)

linux.musl

boolean

false

(none)

linux.muslNativeCc

boolean

false

(none)

linux.nativeVerify

string

(none)

(none)

nativeVerify for the native Linux translation alone.

linux.pgo

boolean

false

(none)

Cloud builds only, Pro plan and above. true/false. Profile-guided optimization for the native Linux build: an instrumented binary runs unattended on the build host for pgo.trainingSeconds, and the profile it records drives the optimizer for the binary that ships. The linux.arch being built has to be one the build host can run. See Profile-guided optimization.

linux.toolchain

string

(none)

(none)

desktop.mac.cef

boolean

(none)

(none)

Whetherto use CEF for media or BrowserComponent instead of JavaFX in Mac desktop builds. true/false. Default value is false (Jan 2021), but this will be changed to true in a future version.

macNative.appCategory

string

(none)

(none)

Mac Native builds only. LSApplicationCategoryType in the generated Info.plist. Default public.app-category.utilities.

macNative.bundleId

string

(none)

(none)

Mac Native builds only. Used only when macNative.deriveBundleId=false. Default: <packageName>.mac.

macNative.copyright

string

(none)

(none)

Mac Native builds only. NSHumanReadableCopyright in the Info.plist. Defaults to Copyright (c) <year> <vendor>.

macNative.deriveBundleId

boolean

true

(none)

Mac Native builds only. true (default) maps to Xcode’s DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER=YES (Xcode appends .maccatalyst to the iOS bundle ID). Set to false to take the bundle ID verbatim from macNative.bundleId.

macNative.distribution

string

appStore

(none)

Mac Native builds only. appStore (default), developerID, or both. Selects which entitlements + ExportOptions plist + signing certificate to emit. both emits parallel -AppStore.entitlements / -DeveloperID.entitlements and matching ExportOptions-*-Mac.plist files so a single project can be archived to either channel.

macNative.enabled

boolean

false

(none)

macNative.entitlements.allowJit

string

(none)

(none)

Mac Native builds only. true enables com.apple.security.cs.allow-jit for hardened runtime. ParparVM is AOT-compiled so this is false by default; flip when bundling a JIT-using cn1lib.

macNative.entitlements.appSandbox

string

(none)

(none)

Mac Native builds only. true enables com.apple.security.app-sandbox. Default is true for the appStore channel (Mac App Store requires the sandbox), false for developerID.

macNative.entitlements.device.camera

boolean

(none)

(none)

Sandboxed Mac Native builds only. Toggles com.apple.security.device.camera. Defaults to whether the app sets ios.NSCameraUsageDescription, so an app that asks for the camera gets the entitlement without naming it twice.

macNative.entitlements.device.microphone

boolean

(none)

(none)

Sandboxed Mac Native builds only. Toggles com.apple.security.device.microphone. Defaults to whether the app sets ios.NSMicrophoneUsageDescription.

macNative.entitlements.extra

string

(none)

(none)

Mac Native builds only. Free-form XML inserted verbatim inside the <dict>…​</dict> of the generated entitlements plist. Use for entitlements Codename One doesn’t expose individually.

macNative.entitlements.files.userSelected

string

readwrite

(none)

Mac Native builds only. readwrite (default), readonly, or none. Sets the matching com.apple.security.files.user-selected.* entitlement.

macNative.entitlements.hardenedRuntime

string

(none)

(none)

Mac Native builds only. true enables hardened runtime restrictions. Default is true for developerID (notarization requires it), false for appStore.

macNative.entitlements.network.client

string

(none)

(none)

Mac Native builds only. Toggles com.apple.security.network.client. Default true.

macNative.entitlements.network.server

string

(none)

(none)

Mac Native builds only. Toggles com.apple.security.network.server. Default false.

macNative.entitlements.personalInformation.calendars

boolean

(none)

(none)

Sandboxed Mac Native builds only. Toggles com.apple.security.personal-information.calendars, which gates all EventKit access. Defaults to whether the app sets any calendar or reminder usage description, including the write-only and reminders-only ones.

macNative.fixedWindowSize

string

(none)

(none)

Mac Native builds only. Opt-in. Format <width>x<height> — for example 1024x685. When set, the Catalyst window’s UISceneSession.sizeRestrictions minimum and maximum are pinned to the requested size so every launch produces a byte-identical window. Default unset, in which case the window is resizable. The CI screenshot pipeline turns this on to keep the strict-pixel golden comparison stable; production apps should leave it off.

macNative.iosMinDeploymentTarget

version

13.1

(none)

Mac Native builds only. iOS deployment-target floor for the Catalyst slice (IPHONEOS_DEPLOYMENT_TARGET). Default 13.1. The plugin coerces the iOS slice’s minimum upward when set.

macNative.minDeploymentTarget

version

10.15

(none)

Mac Native builds only. Minimum macOS version (MACOSX_DEPLOYMENT_TARGET). Default 10.15 — earlier versions don’t support Mac Catalyst.

macNative.multiWindow

boolean

false

(none)

Mac Native builds only. Declares that the app uses com.codename1.ui.Window, which needs multiple UIScenes and exists only on the Mac Catalyst slice. Writes UIApplicationSupportsMultipleScenes and a scene configuration into the Mac slice’s own Info.plist; getWindowManager() reads that key back out of the bundle, so without it windows are reported unsupported and constructing one throws. Off by default: multi-window support relayouts the app into a resizable window, a change an app that never asked for windows has no reason to take on.

macNative.notarize

boolean

false

(none)

macNative.notarize.appleId

string

(none)

(none)

macNative.notarize.keychainProfile

string

(none)

(none)

macNative.notarize.password

secret

(none)

(none)

macNative.notarize.teamId

string

(none)

(none)

macNative.provisioningProfile.*

string

(none)

(properties file only)

Per-profile provisioning data for a native macOS build, keyed by profile name.

macNative.provisioningProfile.appStore

string

(none)

(none)

Mac Native builds only. Provisioning profile name for App Store distribution — used only when macNative.signing.style=manual.

macNative.provisioningProfile.developerID

string

(none)

(none)

Mac Native builds only. Provisioning profile name for Developer ID distribution — used only when macNative.signing.style=manual.

macNative.signing.style

string

automatic

(none)

Mac Native builds only. automatic (default) lets Xcode pick the signing certificate; manual forces the certificate identity hints below to be respected verbatim.

macNative.signingIdentity.appStore

string

Apple Distribution

(none)

Mac Native builds only. Signing certificate identity for the App Store channel. Default Apple Distribution.

macNative.signingIdentity.developerID

string

Developer ID Application

(none)

Mac Native builds only. Signing certificate identity for the Developer ID channel. Default Developer ID Application.

macNative.teamId

string

(none)

(none)

Mac Native builds only. Apple Developer Team ID (alphanumeric). Falls back to ios.release.teamId → ios.teamId → ios.debug.teamId since most apps share a single Apple Developer Team for iOS and Mac.

macos.add_libs

list (; delimited)

(set by the build)

@Mac(addLibs)

macOS builds. Frameworks to link in addition to the ones the build detects for itself, separated by a semicolon, a comma or a colon — for example Speech.framework;CoreMIDI.framework. ios.add_libs is read when this is unset, so a project migrated from the Mac Catalyst build keeps linking what its native sources need.

macos.appCategory

string

(set by the build)

@Mac(appCategory)

macOS builds. LSApplicationCategoryType in the generated Info.plist. Default public.app-category.utilities. See Apple’s category list.

macos.arch

string

(set by the build)

@Mac(arch)

macOS builds. The architectures to compile, as an ARCHS value. Default arm64 x86_64, which is what a Mac application is expected to be: a single-architecture build is the kind of thing nobody notices until an Intel user reports it.

macos.bundleId

string

(set by the build)

@Mac(bundleId)

macOS builds. Used only when macos.deriveBundleId=false. Default: <packageName>.mac.

macos.bundleVersion

string

(set by the build)

@Mac(bundleVersion)

macOS builds. CFBundleVersion in the Info.plist. ios.bundleVersion is read when this is unset, and the project’s version when neither is set.

macos.configuration

string

(set by the build)

@Mac(configuration)

macOS builds. The Xcode configuration to archive, as passed to xcodebuild -configuration. Default Release.

macos.copyright

string

(set by the build)

@Mac(copyright)

macOS builds. NSHumanReadableCopyright in the Info.plist. Defaults to Copyright (c) <year> <vendor>.

macos.crypto.gcm

boolean

(set by the build)

@Mac(cryptoGcm)

macOS builds. Whether AES-GCM is compiled into the bundled crypto library. On by default wherever the crypto API is on, matching what an iOS build of the same application gets; set false to leave it out and keep the symbol set smaller. ios.crypto.gcm is read when this is unset.

macos.deriveBundleId

boolean

(set by the build)

@Mac(deriveBundleId)

macOS builds. false (default) gives the app its own bundle identifier, <packageName>.mac, because a macOS app and an iOS app are separate products in App Store Connect. true reuses the iOS identifier. On the legacy Mac Catalyst target this maps instead to Xcode’s DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER, which appends .maccatalyst.

macos.distribution

string

(set by the build)

@Mac(distribution)

macOS builds. Every macos. hint below is also accepted spelled macNative., which is what the legacy Mac Catalyst target reads, so an existing Catalyst project keeps building unchanged. developerID (default), appStore, or both. Selects the signing certificate, the entitlements and the default packaging. both is genuinely two builds: the channels differ in the certificate and in the entitlements the signature carries — the App Store one has to be sandboxed — so one binary can’t be relabelled into the other channel afterwards. It produces <App>-appstore.app and <App>-developerid.app, each with its own container.

macos.entitlements.allowJit

boolean

(set by the build)

@Mac(entitlementsAllowJit)

macOS builds. true enables com.apple.security.cs.allow-jit for hardened runtime. ParparVM is AOT-compiled so this is false by default; flip when bundling a JIT-using cn1lib.

macos.entitlements.appSandbox

boolean

(set by the build)

@Mac(entitlementsAppSandbox)

macOS builds. true enables com.apple.security.app-sandbox. Default is true for the appStore channel, false for developerID. The App Store channel is always sandboxed whatever this says — the Mac App Store requires it, and a package built without the sandbox gets rejected at submission rather than at build time. The refusal is reported in the build log.

macos.entitlements.extra

string

(set by the build)

@Mac(entitlementsExtra)

macOS builds. Free-form XML inserted verbatim inside the <dict>…​</dict> of the generated entitlements plist. Use for entitlements Codename One doesn’t expose individually.

macos.entitlements.files.downloads

boolean

(set by the build)

@Mac(entitlementsFilesDownloads)

macOS builds. true adds com.apple.security.files.downloads.read-write, which is access to the Downloads folder without a panel. Default false, and separate from macos.entitlements.files.userSelected above because it’s a wider grant than picking a file.

macos.entitlements.files.userSelected

readwrite, readonly, none

(set by the build)

@Mac(entitlementsFilesUserSelected)

macOS builds. readwrite (default), readonly, or none. Sets the matching com.apple.security.files.user-selected.* entitlement — the files the user picks in an open or save panel, and nothing else.

macos.entitlements.hardenedRuntime

boolean

(set by the build)

@Mac(entitlementsHardenedRuntime)

macOS builds. true writes com.apple.security.cs.allow-jit and com.apple.security.cs.allow-unsigned-executable-memory into the entitlements as explicit denials; false leaves them out. It doesn’t switch the hardened runtime on or off — that’s macos.hardenedRuntime above. Default is true for developerID, false for appStore.

macos.entitlements.network.client

boolean

(set by the build)

@Mac(entitlementsNetworkClient)

macOS builds. Toggles com.apple.security.network.client. Default true.

macos.entitlements.network.server

boolean

(set by the build)

@Mac(entitlementsNetworkServer)

macOS builds. Toggles com.apple.security.network.server. Default false.

macos.fixedWindowSize

string

(set by the build)

@Mac(fixedWindowSize)

macOS builds. Opt-in. Format <width>x<height> — for example 1024x685. When set, the window’s minimum and maximum size are pinned to the requested size so every launch produces a byte-identical window. Default unset, in which case the window is resizable. The CI screenshot pipeline turns this on to keep the strict-pixel golden comparison stable; production apps should leave it off.

macos.hardenedRuntime

boolean

(set by the build)

@Mac(hardenedRuntime)

macOS builds. Sets Xcode’s ENABLE_HARDENED_RUNTIME. Default true, because notarization requires it. This is the build setting; the entitlement hint below is a different thing despite the similar name.

macos.loadsExternalCode

boolean

(set by the build)

@Mac(loadsExternalCode)

macOS builds. true grants the hardened-runtime exception for loading unsigned libraries. A Codename One application doesn’t load code that way, but a cn1lib shipping a dylib needs this, or the load is refused at runtime with nothing in the application’s own logs.

macos.minDeploymentTarget

string

(set by the build)

@Mac(minDeploymentTarget)

macOS builds. Minimum macOS version (MACOSX_DEPLOYMENT_TARGET). Default 11.0 on the native macOS build, which is the floor for a universal Apple silicon binary. The legacy Mac Catalyst target defaults to 10.15.

macos.packaging

string

(set by the build)

@Mac(packaging)

macOS builds. app, dmg, pkg or both. Unset, each channel takes its own default — pkg for appStore, because productbuild’s output is what you upload, and dmg for developerID. Set explicitly, the value applies to every channel. A cloud build always ships a file, so app there means the bundle zipped with ditto rather than the raw .app directory.

macos.pgo

boolean

(set by the build)

@Mac(pgo)

macOS cloud builds only, Pro plan and above. Profile-guided optimization: an instrumented application runs unattended on the build host for pgo.trainingSeconds, and the profile it records drives the optimizer for the binary that ships. Needs the optimized Release configuration. See Profile-guided optimization in the developer guide.

macos.plistInject

string

(set by the build)

@Mac(plistInject)

macOS builds. Raw XML members added to the generated Info.plist, the same form ios.plistInject takes — for example <key>NSAppTransportSecurity</key><dict/>. A key that the build also generates is replaced by the injected one, and the build log names it. ios.plistInject is read when this is unset, so a project migrated from the Mac Catalyst build keeps its injections.

macos.provisioningProfile.appStore

string

(set by the build)

@Mac(provisioningProfileAppStore)

macOS builds. Provisioning profile name for App Store distribution — used only when macNative.signing.style=manual.

macos.provisioningProfile.developerID

string

(set by the build)

@Mac(provisioningProfileDeveloperID)

macOS builds. Provisioning profile name for Developer ID distribution — used only when macNative.signing.style=manual.

macos.signing.style

string

(set by the build)

@Mac(signingStyle)

macOS builds. manual (default) signs with the certificate identity hints below, verbatim. automatic lets Xcode resolve the certificate from the team and provisioning profile instead. Manual is the default because a build server has an installed certificate and no Xcode account session, and automatic signing there stops to ask you to sign in; use automatic when building on your own machine.

macos.signingIdentity.appStore

string

(set by the build)

@Mac(signingIdentityAppStore)

macOS builds. Signing certificate identity for the App Store channel. Default Apple Distribution. Unlike the Developer ID channel, this one rejects none. An unsigned application still gets packaged into a signed .pkg, so the build reports success and App Store Connect rejects the upload hours later for an application with no signature and none of the sandbox entitlements it has to carry. The build fails immediately instead, naming this hint. Build only the developerID channel to get an unsigned application. An empty value reads as unset and takes the default, which is why the Developer ID channel spells the escape hatch none rather than "".

macos.signingIdentity.developerID

string

(set by the build)

@Mac(signingIdentityDeveloperID)

macOS builds. Signing certificate identity for the Developer ID channel. Default Developer ID Application. Set it to none to build unsigned.

macos.signingIdentity.installer

string

(set by the build)

@Mac(signingIdentityInstaller)

macOS builds. The certificate productbuild signs a .pkg with — 3rd Party Mac Developer Installer for the App Store, Developer ID Installer for direct distribution. This is a different certificate from macos.signingIdentity.appStore, which signs the application, so it has a hint of its own rather than being derived from that one. Required whenever a package is produced, which includes the App Store default: the build fails with an explanatory error rather than writing an unsigned package, because App Store Connect refuses one and Gatekeeper won’t accept it as Developer ID distribution however well the enclosed application is signed.

macos.signingIdentity.installer.appStore

string

(set by the build)

@Mac(signingIdentityInstallerAppStore)

macOS builds. The installer certificate for the App Store channel specifically, when macos.distribution=both produces a package on each side. They’re different certificates, so one shared value signs both packages with the same one and leaves one of them unusable. Unset, the shared macos.signingIdentity.installer applies.

macos.signingIdentity.installer.developerID

string

(set by the build)

@Mac(signingIdentityInstallerDeveloperID)

macOS builds. The installer certificate for the Developer ID channel specifically. Unset, the shared macos.signingIdentity.installer applies.

macos.sourceOnly

boolean

(set by the build)

@Mac(sourceOnly)

macOS builds. true stops after generating the Xcode project, which is what the mac-source target delivers. Set by that target rather than by hand.

macos.teamId

string

(set by the build)

@Mac(teamId)

macOS builds. Apple Developer Team ID (alphanumeric). Falls back to ios.release.teamId → ios.teamId → ios.debug.teamId since most apps share a single Apple Developer Team for iOS and Mac.

macos.themeMode

string

(set by the build)

@Mac(themeMode)

macOS builds. Which native theme the application installs: modern (equivalently liquid or material) or ios7 (equivalently flat). Defaults to modern, which is where this target parts company with iOS — iOS keeps the legacy theme by default so that applications already shipped, and their screenshot baselines, keep rendering as before. There is no such history here, and the legacy theme defines no dark styles at all, so an application on it renders light however it asks for dark. The cross-platform nativeTheme hint is honoured when this is unset, with legacy mapping to ios7.

macos.urlSchemes

string

(set by the build)

@Mac(urlSchemes)

macOS builds. Custom URL schemes to register, comma separated. ios.urlSchemes and then ios.urlScheme are read when this is unset, so a project migrated from the Mac Catalyst build keeps its deep links.

tvNative.bundleId

string

(none)

(none)

Bundle identifier of the tvOS app. Defaults to <packageName>.tvos.

tvNative.displayName

string

(none)

(none)

The tvOS app name shown on Apple TV. Defaults to the app’s display name.

tvNative.enabled

boolean

false

(none)

true/false (defaults to false). Adds an Apple TV (tvOS) application target to the iOS build. The tvOS app is a separate appletvos target built from the same Java/Kotlin sources through ParparVM (UIKit + Metal). Enabling it doesn’t change the iOS app. Also turned on implicitly by codename1.tvMain.

tvNative.mainClass

string

(none)

(none)

tvNative.minDeploymentTarget

version

13.0

(none)

TVOS_DEPLOYMENT_TARGET for the tvOS target. Defaults to 13.0.

tvNative.teamId

string

(none)

(none)

Apple Developer Team ID used to sign the tvOS target. Falls back to the iOS team id (ios.release.teamId / ios.teamId / ios.debug.teamId).

watchNative.enabled

boolean

false

(none)

watchNative.health

string

(none)

(none)

watchNative.health.workoutProcessing

boolean

false

(none)

watchNative.mainClass

string

(none)

(none)

watchNative.surfaces.deploymentTarget

string

10.0

(none)

Deployment target of the WidgetKit extension that carries the watch complication. This is the WATCH APP’s floor rather than the extension’s own: WidgetKit reaches back to watchOS 9, but the extension is embedded in the watch app, so advertising a version the app itself refuses to install on claims support the user never gets.

win.desktop-vm

string

(none)

(none)

The JVM that should be bundled in the Windows desktop build. Windows desktop builds only. Supported values: zulu8, zuluFx8, zulu8-32bit, zuluFx8-32bit, zulu11, zuluFx11, zulu11-32bit, zuluFx11-32bit

win.installDirName

string

(none)

(none)

Windows desktop builds only. Overrides the default installation folder name suggested by the installer (under Program Files). Defaults to the application’s main class name for backward compatibility. Use this build hint to set a user-friendly installation folder name (for example, win.installDirName=My Application). The application ID used by Windows for upgrade detection is unaffected, so existing installations continue to upgrade.

win.shortcutName

string

(none)

(none)

Windows desktop builds only. Overrides the name used for the Start Menu shortcut, the Desktop shortcut and (when win.launchOnStart=true) the autostart shortcut. Defaults to the application’s main class name for backward compatibility. Use this build hint to set a user-friendly shortcut label (for example, win.shortcutName=My Application).

win.vm32bit

boolean

(none)

(none)

true/false (defaults to false). Forces windows desktop builds to use the Win32 JVM instead of the 64 bit VM making them compatible with older Windows Machines. This is off by default at the moment because of a bug in JDK 8 update 112 that might cause this to fail for some cases

windows.arch

string

(none)

(none)

Native Windows port only (the windows-native build target — not the JVM win.* desktop hints above). Target CPU architecture for the standalone .exe: x64 (the default) or arm64. Accepts the usual synonyms (x86_64/amd64, aarch64). clang-cl cross-compiles to the chosen architecture from either host. See the Working with the native Windows port chapter.

windows.calendar.restrictedCapability

boolean

false

(none)

windows.debug

boolean

false

(none)

Native Windows port only. true/false (defaults to false). When false the .exe is built optimized and stripped — no PDB, dead-stripped unreferenced code (/OPT:REF) and folded identical functions (/OPT:ICF) — which is the shipping default. Set true to keep debug symbols (a .pdb next to the exe, via RelWithDebInfo / clang-cl /Zi + linker /DEBUG) so a native crash address can be symbolized during development. Optimizations stay on in both cases.

windows.extensions

string

(none)

(none)

Historical build hint for the discontinued UWP target. It’s retained here only for legacy reference and isn’t used by current supported build targets.

windows.msix

boolean

false

(none)

windows.msix.identityName

string

(none)

(none)

windows.msix.password

secret

(none)

(none)

windows.msix.pfx

string

(none)

(none)

windows.msix.publisher

string

(none)

(none)

windows.msix.version

string

(none)

(none)

windows.nativeVerify

string

(none)

(none)

nativeVerify for the native Windows translation alone.

windows.sdkRoot

string

(none)

(none)

Native Windows port only; used when building on a non-Windows host (for example a Linux build server). Path to a Windows SDK laid out by xwin splat (a directory containing crt/include and sdk/include/um), used to cross-compile the .exe with clang-cl + lld-link instead of a Visual Studio environment. If unset, the CN1_XWIN_SYSROOT environment variable is used. Ignored on Windows hosts, which build through Visual Studio. The same SDK serves both windows.arch targets (its x86_64 / aarch64 lib subdirs).

windows.signing

boolean

true

(none)

Native Windows port only. true/false (default true). Set false to force an unsigned build even when a certificate is available.

windows.signing.digest

string

sha256

(none)

Native Windows port only. Signature digest algorithm. Default sha256.

windows.signing.name

string

(none)

(none)

windows.signing.password

secret

(none)

(none)

windows.signing.pkcs12

string

(none)

(none)

windows.signing.timestampUrl

string

http://timestamp.digicert.com

(none)

Native Windows port only. RFC 3161 timestamp server used when signing, so the signature stays valid after the certificate expires. Default http://timestamp.digicert.com; set empty to disable timestamping.

windows.signing.url

string

(none)

(none)