Flutter调用Twilio WhatsApp API遇主机查找失败问题求助
Flutter调用Twilio WhatsApp API崩溃,提示"No address associated with hostname"
问题分析
你遇到的"Failed host lookup: 'api.twilio.com'"属于DNS解析失败,本质是设备无法找到Twilio API服务器的IP地址;同时try-catch无法捕获错误是因为异步IO异常的处理方式不对。另外代码里还有一个潜在问题:Twilio WhatsApp的From号码需要加上whatsapp:前缀,否则API会返回格式错误。
解决方案
1. 修复平台网络权限
Android:在
android/app/src/main/AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" />Android 9及以上默认支持HTTPS请求,无需额外配置明文访问权限。
iOS:默认配置下HTTPS请求已被允许,若设备存在网络限制,可在
Info.plist中确认ATS设置(不建议禁用ATS,Twilio API支持HTTPS):<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
2. 正确捕获异步异常
将整个异步调用逻辑包裹在try块中,确保捕获所有IO异常:
Future<void> sendWhatsAppMessage( String recipientWhatsAppNumber, String message) async { const twilioAccountSid = ''; const twilioAuthToken = ''; // 修复From号码格式,添加whatsapp:前缀 const twilioNumber = 'whatsapp:+15066160178'; try { final basicAuth = 'Basic ${base64Encode(utf8.encode('$twilioAccountSid:$twilioAuthToken'))}'; final Uri uri = Uri.parse( 'https://api.twilio.com/2010-04-01/Accounts/$twilioAccountSid/Messages.json'); final Map<String, String> body = { 'To': 'whatsapp:$recipientWhatsAppNumber', 'From': twilioNumber, 'Body': message, }; final response = await http.post( uri, headers: <String, String>{ 'authorization': basicAuth, 'content-type': 'application/x-www-form-urlencoded', }, body: body, ); if (response.statusCode == 200) { print('WhatsApp message sent successfully.'); } else { print( 'Failed to send message. Status code: ${response.statusCode}, Response: ${response.body}'); } } catch (e, stackTrace) { print('Error sending message: $e'); print('Stack trace: $stackTrace'); } }
3. 验证网络连通性
- 在设备浏览器中直接访问
https://api.twilio.com,确认能正常加载页面 - 若设备使用代理网络,需确保代理可解析api.twilio.com域名
4. 检查Twilio配置
- 确认账号已开通WhatsApp服务,
From号码为Twilio分配的沙箱号码或已验证的发送号码 - 确保
recipientWhatsAppNumber格式正确,需包含国家代码(如+8613xxxxxxxxx)
额外提示
若仍有未捕获的异常,可配置全局异常处理器捕获未处理的异步错误:
void main() { FlutterError.onError = (details) { FlutterError.presentError(details); }; runZonedGuarded(() { runApp(MyApp()); }, (error, stackTrace) { print('Uncaught error: $error'); print('Stack trace: $stackTrace'); }); }
内容的提问来源于stack exchange,提问作者Yoav
相关产品推荐
相关产品推荐

