React Native TTS iOS Fix: “Objective-C BOOL Unsupported” + tts-start Listener Not Working (2026 Guide)
React Native TTS on iOS — Fixing “Objective-C BOOL Unsupported” and Missing Event Listeners
Working with text-to-speech in React Native should be simple — until you hit iOS.
Recently, I ran into two frustrating issues using react-native-tts on iOS. After digging through GitHub issues and debugging native code, here are the root causes and fixes.
🧨 Issue 1: Objective-C type BOOL is unsupported
Error
TextToSpeech.setDefaultRate():
Error while converting JavaScript argument to Objective C type BOOL
or
convert javascript argument to object C type Bool
object C type bool is unsupported
🔍 Root Cause
This is not your code.
It’s caused by a type mismatch in the iOS native bridge, especially under the new React Native architecture (Fabric / TurboModules).
Some versions of react-native-tts incorrectly define Objective-C method parameters like:
(BOOL *)onWordBoundary // ❌ incorrect
React Native does NOT support BOOL * (pointer) — only:
BOOLNSNumber *
✅ Solution
Use a fixed fork of the library:
👉 @iternio/react-native-tts
npm install @iternio/react-native-tts
This fork patches the incorrect Objective-C type definitions and works correctly on iOS.
⚠️ Issue 2: Event Listener Warning
Warning
Sending `tts-start` with no listeners registered.
Even though you did register a listener:
Tts.addEventListener('tts-start', () => {
setIsSpeaking(true);
});
🔍 Root Cause
The native module is not fully initialized when the listener is registered.
So:
Native fires event ✅
JS listener is not ready ❌
✅ Solution (Critical Fix)
You MUST wait for initialization:
useEffect(() => {
const init = async () => {
await Tts.getInitStatus(); // 👈 CRITICAL
Tts.setDefaultRate(0.5);
Tts.setDefaultPitch(1.0);
const sub = Tts.addEventListener('tts-start', () => {
setIsSpeaking(true);
});
return () => sub.remove();
};
init();
}, []);
💡 Key Takeaways
react-native-ttshas known iOS issues, especially with newer React Native versionsIf you see
BOOL unsupported, it’s a native bug, not your JSAlways call:
await Tts.getInitStatus();
before using TTS or adding listeners
🚀 Final Recommendation
If you're building production apps:
✅ Use
@iternio/react-native-tts✅ Always wait for initialization
⚠️ Be cautious with iOS + new architecture
🧩 Bonus Tip
If you need full control and stability, consider writing a thin native bridge using iOS’s built-in:
AVSpeechSynthesizer
It’s more work upfront, but eliminates these issues entirely.
✍️ Closing
These issues are subtle but very common. Hopefully this saves you hours of debugging.
If you’ve hit similar problems, you’re definitely not alone.
Happy coding!
❤️ Support This Blog
If this post helped you, you can support my writing with a small donation. Thank you for reading.
Comments
Post a Comment