A New Collection of Thoughtful Learning Apps — Now Available on iOS & Android

Image
I’m excited to share a set of mobile apps I’ve recently completed and published on both the Google Play Store and the Apple App Store. These apps are designed with a simple goal in mind: to make meaningful, structured content more accessible, whether you’re studying theology or improving your English vocabulary. 📱 Now Available on Both Platforms All apps are live and available for download: Google Play Developer Page: https://play.google.com/store/apps/dev?id=5835943159853189043 Apple App Store Developer Page: https://apps.apple.com/ca/developer/q-z-l-corp/id1888794100 📖 Theology & Confession Study Apps For those interested in Reformed theology and classical Christian teachings, I’ve developed a series of apps that present foundational texts in a clean, focused reading format: The Belgic Confession Canons of Dort Heidelberg Catechism Westminster Shorter Catechism Each app is designed to provide a distraction-free experience, making it easier to read, reflect, and revisit these im...

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

2026 Begins: Choosing to Stay on the Path as a Blogger

Health Checks and Scaling Strategies for Next.js in Kubernetes