hello,
Flutter iOS: USSD code with * and # not launching in phone dialer (works on Android)
flutter ios ussd url-launcher tel-uri PROBLEM
My Flutter app executes USSD codes for mobile money recharges. It worked correctly on iOS before 2026, but after updating the app, USSD codes no longer execute on iPhone.
Key observation: After testing, I found:
A regular phone number like 0123456789 → opens dialer correctly ✅
USSD with * removed → opens dialer ✅
USSD with # removed → opens dialer ✅
Full USSD like *140*1*70000000# → nothing happens ❌
This is not a code change on my side — the same code worked before. The issue appears only on iOS (iPhone 7, 10, 12 tested). Android works fine.
MY CURRENT CODE
static Future\ ussd(String ussdCode) async {
if (kIsAppleOS) {
final Uri uri = Uri(
scheme: 'tel',
path: ussdCode, // e.g. \*140\*1\*70000000#
);
await launchUrl(uri);
} else {
await DirectCallPlus.makeCall(ussdCode);
}
}
ENVIRONMENT
Flutter 3.x · url_launcher: ^6.1.7 · direct_call_plus: ^1.0.4 · iOS 15, 16, 17 · Devices: iPhone 7, 10, 12
WHAT I TRIED
Encoding # as %23 → still blocked
mode: LaunchMode.externalApplication → no difference
Uri.parse(‘tel:*140%231’) instead of Uri() → still blocked
Package ussd_launcher: ^1.5.0 → Android only, no iOS support
QUESTION
Is there any way to execute a USSD code automatically on iOS in 2025/2026 from a Flutter app? Or is this fully blocked by Apple? If so, what is the best UX fallback strategy to guide the user to dial manually?