English | 中文
Fcitx5 iOS
Fcitx5 input method framework ported to iOS ≥ 16.3.
Currently developer beta. Please download IPA and install with SideStore.
Note: Without developer account, App Group can't be used, so please
- grant full access to keyboards;
- click
Sync configafter making changes to configuration or data.
Build for simulator
This project is NOT managed by Xcode, but Xcode is needed for iOS SDK.Below assumes Apple Silicon.
For Intel, replace all SIMULATORARM64 with SIMULATOR64.
Install dependencies
brew install cmake ninja gettext pkg-config
./scripts/install-deps.sh SIMULATORARM64
Apply patches
./scripts/patch.sh
Build with CMake
cmake -B build/SIMULATORARM64 -G Ninja -DCMAKE_BUILD_TYPE=Debug -DPLATFORM=SIMULATORARM64
cmake --build build/SIMULATORARM64 && ./scripts/code-sign.sh SIMULATORARM64
You can also use Cmd+Shift+B in VSCode to execute a task.
Play with simulator
xcrun simctl list devices
xcrun simctl boot UUID
open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app
xcrun simctl install booted build/SIMULATORARM64/src/Fcitx5.app
After the first time you execute xcrun simctl install,
you need to add Fcitx5 in Settings -> General -> Keyboard -> Keyboards -> Add New Keyboard.
- Simulator is not emulator (virtual machine). Simulator file system is mapped from host filesystem. A process in simulator is a process in macOS.
- App and input method (custom keyboard extension) are different programs. They share a directory (via App Group) in ~/Library/Developer/CoreSimulator/Devices/UUID/data/Containers/Shared/AppGroup.
Test
E2E test
npm i -g appium
appium driver install xcuitest
pip install -r appium/requirements.txt
pytest appium
Use /Applications/Xcode.app/Contents/Applications/Accessibility Inspector.app to check identifier of UI elements.
Build for iOS device
Generate an unsigned IPA and install it with SideStore.Below assumes you've already done with simulator.
./scripts/install-deps.sh OS64
cmake -B build/OS64 -G Ninja -DCMAKE_BUILD_TYPE=Release -DPLATFORM=OS64
cmake --build build/OS64
cd build/OS64/src && rm -rf Payload Fcitx5.ipa && mkdir Payload
cp -r Fcitx5.app Payload && zip -r Fcitx5.ipa Payload
Real device debug
OOM
There is a 77 MB memory limit for keyboard extension. When memory approaches the limit, you will see in Console.app likeReceived memory warning. for the process.
Later if memory exceeds the limit, you will see
memorystatus: keyboard [14871] exceeded mem limit: ActiveHard 77 MB (fatal)
memorystatus: killing process 14871 [keyboard] in high band FOREGROUND (100) - memorystatus_available_pages: 121469
keyboard[14871] Corpse allowed 1 of 5
1817600.392 memorystatus: killing_specific_process pid 14871 [keyboard] (per-process-limit 100 16s rf:-) 78848KB - memorystatus_available_pages: 121472
See Keyboard extension memory profiling for a repeatable investigation procedure and the September 2026 Chinese keyboard investigation for a worked example.
Memory monitor
Use/Applications/Xcode.app/Contents/Applications/Instruments.app's Activity Monitor. If Instruments cannot see a connected phone, follow the real-device Instruments setup and DDI troubleshooting procedure.
Crash
Crash reports are available inSettings -> Privacy & Security -> Analytics & Improvements -> Analytics Data.
Send them to mac and open with Console.app.