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:

  • BOOL

  • NSNumber *


✅ 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-tts has known iOS issues, especially with newer React Native versions

  • If you see BOOL unsupported, it’s a native bug, not your JS

  • Always 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

Popular posts from this blog

fixed: embedded-redis: Unable to run on macOS Sonoma

Copying MDC Context Map in Web Clients: A Comprehensive Guide

Reset user password for your own Ghost blog