Skip to main content
Expo Modules API provides a modern, type-safe way to write native modules in Swift (iOS) and Kotlin (Android) with minimal boilerplate.

Overview

Expo modules offer several advantages:
  • Type safety: Automatic type conversions between JS and native
  • Modern syntax: Swift and Kotlin instead of Objective-C and Java
  • Auto-generated bindings: No manual bridge code
  • Shared module API: Similar API across iOS and Android
  • Built-in features: Events, views, lifecycle methods

Creating a Module

Project Structure

Initialize Module

Configuration

expo-module.config.json
package.json

iOS Module (Swift)

Basic Module

ios/MyModule.swift

Constants

Events

View Manager

ios/MyCustomView.swift

Lifecycle Methods

Android Module (Kotlin)

Basic Module

android/src/main/java/expo/modules/mymodule/MyModule.kt

Constants

Events

View Manager

android/src/main/java/expo/modules/mymodule/MyCustomView.kt
android/src/main/java/expo/modules/mymodule/MyModule.kt

Lifecycle Methods

JavaScript Interface

TypeScript Definitions

src/index.ts

React Component

src/MyCustomView.tsx

Type Conversions

Expo Modules API automatically converts types:
JavaScriptSwiftKotlin
stringStringString
numberInt, DoubleInt, Double
booleanBoolBoolean
Array[Any]List<Any>
Object[String: Any]Map<String, Any>
nullnilnull

Testing Native Modules

Swift Tests

ios/Tests/MyModuleTests.swift

Kotlin Tests

android/src/test/java/expo/modules/mymodule/MyModuleTest.kt

Best Practices

1. Error Handling

2. Thread Safety

3. Memory Management

Next Steps

Prebuild

Generate native projects

Build Properties

Configure native builds

Debugging

Debug native code

Creating Builds

Build with native modules