Introduction to native plug-ins on iOS
Introduces native plug-ins for iOS and their structure.
Read time 2 minutesLast updated 4 days ago
An introduction to native plug-ins for iOS and their structure.
Native plug-in components
A native plug-in consists of precompiled binaries. For Apple platforms, you can use the following file types:
- Source files: For example, ,
.m,.mm,.c, or.cpp.swift - Static libraries and frameworks: For example, ,
.a, or.framework..xcframework
Native plug-ins allow you to perform tasks that aren't possible with C# alone. For example, you can use them to perform the following actions:
- Invoke native Apple system framework APIs.
- Integrate third-party SDKs and libraries intended for use on the target platform.
- Access platform features that aren't exposed through a Unity API.
- Hook into the application lifecycle, the rendering pipeline, or low-level native APIs, to manage features like background modes or push notifications.
A basic native plug-in contains the following:
- Native plug-in files: The native source code or binary files.
- C# API layer: Provides the calls that connect your managed C# scripts to the native code, acting as a bridge to access the functionality of the plug-in.
The following diagram shows how these components work together:

Diagram showing the structure of a native plug-in for iOS
Development considerations for native iOS plug-ins
When developing a native plug-in, you must account for multiple variations and factors to ensure broad compatibility. For example, consider the following:
-
Project type: The generated Xcode project can be Objective-C or Swift.
-
Platforms: Your plug-in might need to support iOS, tvOS, and visionOS platforms.
-
SDK and architecture: It's recommended to provide binaries for both device (Arm) and simulator (Intel or Arm) SDKs.
-
In-Editor fallback: Provide a fallback or simulated functionality for when your code runs in the Unity Editor.
-
Unity versioning: Aim to create a single plug-in that can be installed across multiple versions of Unity.
-
Initialization timing: The initialization timing of theand its global variables depends on whether you export a Swift or Objective-C Xcode project.
UnityFramework.framework- Swift projects: The framework initializes before the main function executes.
- Objective-C projects: The framework initializes after the main function executes.
-
Unity as a Library: To ensure your integration works correctly with different build types, support both standard Unity builds and Unity as a Library integrations. In a standard build, theis part of the generated Xcode project. In a Unity as a Library integration,
UnityFramework.frameworkis embedded directly into a host application.UnityFramework.framework