Platform: React Native
SDK Version: react-native-purchases 8.11.6, react-native-purchases-ui 8.11.6
Issue: Bold font weight not applying on Android V2 Paywalls (works perfectly on iOS)
Problem Description
I have successfully configured custom fonts ("Nunito Sans") for V2 Paywalls and they work perfectly on iOS, but on Android the bold weight is not being applied - all text appears as regular weight even when elements are configured as bold in the RevenueCat dashboard.
What Works ✅
- Custom font "Nunito Sans" loads correctly on Android (showing custom font instead of system font)
- All font weights work perfectly on iOS
- Regular font weight displays correctly on Android
What Doesn't Work ❌
- Bold font weight on Android (appears as regular weight)
- Text configured as bold in dashboard renders as regular on Android only
Technical Configuration
Environment
- React Native: 0.76.9 (bare workflow, NOT Expo)
- RevenueCat SDK: react-native-purchases 8.11.6
- RevenueCat UI: react-native-purchases-ui 8.11.6
- Android Target SDK: 34
- Android Min SDK: 24
Android Font Setup:
android/app/src/main/assets/fonts/
├── NunitoSans-Regular.ttf
├── NunitoSans-Bold.ttf
├── NunitoSans-BoldItalic.ttf
├── NunitoSans-Italic.ttf
└── ... (other weights)
android/app/src/main/res/font/
├── nunitosans_regular.ttf (copied from assets)
├── nunitosans_bold.ttf (copied from assets)
└── nunito_sans.xml
XML Font Family (nunito_sans.xml):
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
android:fontStyle="normal"
android:fontWeight="400"
android:font="@font/nunitosans_regular" />
<font
android:fontStyle="normal"
android:fontWeight="700"
android:font="@font/nunitosans_bold" />
</font-family>
iOS Configuration (Working):
<!-- Info.plist -->
<key>UIAppFonts</key>
<array>
<string>NunitoSans-Regular.ttf</string>
<string>NunitoSans-Bold.ttf</string>
<string>NunitoSans-BoldItalic.ttf</string>
<string>NunitoSans-Italic.ttf</string>
<!-- ... other weights -->
</array>
RevenueCat Dashboard Configuration:
- Using "Map font family automatically"
- "Nunito Sans" detected and showing in dropdown
- Elements configured with Bold styling in paywall designer
- No specific font mapping (letting RevenueCat auto-detect)
Font Asset Management:
- Fonts managed with `react-native-asset` (version 2.1.1) in bare React Native workflow
- Original fonts in `assets/fonts/` directory
- Copied to Android `res/font/` for XML family definition
- **Note:** This is a bare React Native project, NOT using Expo managed workflow
What I've Tried
1. ✅ **Tested multiple fontWeight values** in XML (400, 500, 600, 700, 800, 900)
2. ✅ **Tried different naming conventions** (nunitosans_*.ttf, nunito_sans_*.ttf)
3. ✅ **Verified Android naming conventions** - no uppercase/special characters in res/font
4. ✅ **Tested both approaches** - res/font XML method and direct assets/fonts method
5. ✅ **Dashboard mapping tests** - tried both auto-detection and manual mapping
Logs/Evidence
- adb logcat shows no font-related errors during paywall display
- Regular "Nunito Sans" font loads successfully (confirmed visually - differs from system font)
- Bold elements in RevenueCat dashboard display correctly on iOS simulator but not Android emulator
- Font family "Nunito Sans" appears correctly in RevenueCat dashboard font dropdown
Code Implementation
Paywall Presentation:
const paywallResult: PAYWALL_RESULT = await RevenueCatUI.presentPaywall({
...(offering ? {offering} : {}),
});
Questions
1. Are there known limitations with font weights in Android V2 Paywalls?
2. Does RevenueCat have specific requirements for fontWeight mapping on Android beyond standard XML?
3. Are there any bare React Native-specific considerations for custom fonts in V2 Paywalls beyond the standard native configuration?
4. Any recommended debugging steps to trace font weight resolution in RevenueCat SDK?
5. Does using `react-native-asset` for font management affect how RevenueCat detects or applies font weights on Android?
Test Environment
- Android Emulator: Pixel 4 API 32
- iOS Simulator: Various devices (all working correctly)
Any insights would be greatly appreciated! The setup works perfectly on iOS, so I suspect this might be an Android-specific limitation or configuration requirement in the RevenueCat V2 Paywall rendering system.
