Native Mobile

Last modified: February 11, 2025

Introduction

With Mendix you can build fully native mobile apps. Native mobile apps do not render inside a web view. Instead, they use native UI elements. This enables fast performance, smooth animations, like swipe gestures, and improved access to all native device capabilities.

You build Mendix native mobile apps the same way you build web apps. You can use familiar elements such as pages, widgets, nanoflows, JavaScript actions, and microflows to put together your app. However, there are some differences between building native apps and web apps. For example, the set of available widgets (and their properties) is slightly different. In addition, native styling is based on JavaScript instead of SASS/CSS.

Styling

Native mobile apps’ theming and styling is based on JavaScript. For more information on styling, see Native Styling.

Using Device Capabilities

Native mobile apps have full access to all of the device’s capabilities. Many capabilities are supported in through standard components. For other capabilities, you can implement a native module.

Distribution

Native mobile apps must be distribute via AppStores. Updates can be distributed with Over-the-Air Updates.

Limitations

Bitcode Deprecation

The React Native version used in Studio Pro versions 10.11-10.16 includes Bitcode, which is not longer supported by Xcode 16 and above. This means that native mobile iOS applications created by customers cannot be submitted to the App Store.

To address the issue, there are one of three things you can do:

  • Use a newer version of Studio Pro (10.18+)
  • Use the workaround below
  • Downgrade Xcode to version 15.4 (although it does not work on latest MacOS version)

Workaround

Apply the following changes to the native mobile project in “ios/Podfile” file in the “post_install” block (For more information, see Asset validation failed, NSLocalizedRecoverySuggestion=Invalid Executable):

bitcode_strip_path = `xcrun --find bitcode_strip`.chop!
   def strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
     framework_path = File.join(Dir.pwd, framework_relative_path)
     command = "#{bitcode_strip_path} #{framework_path} -r -o #{framework_path}"
     puts "Stripping bitcode: #{command}"
     system(command)
   end
   framework_paths = [
     "Pods/LogRocket/LogRocket.xcframework/ios-arm64/LogRocket.framework/LogRocket",
     "Pods/hermes-engine/destroot/Library/Frameworks/macosx/hermes.framework/hermes",
     "Pods/hermes-engine/destroot/Library/Frameworks/macosx/hermes.framework/Versions/Current/hermes",
     "Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework/ios-arm64/hermes.framework/hermes",
     "Pods/hermes-engine/destroot/Library/Frameworks/universal/hermes.xcframework/ios-arm64_x86_64-maccatalyst/hermes.framework/hermes"
   ]
   framework_paths.each do |framework_relative_path|
     strip_bitcode_from_framework(bitcode_strip_path, framework_relative_path)
   end