如何修改Flutter的url_launcher代码实现Telegram/Viber消息发送?
实现Telegram和Viber消息发送的Flutter代码修改方案
注:原WhatsApp代码中使用
Uri.parse(message)进行消息编码存在隐患,建议替换为Uri.encodeComponent(message),确保消息中的特殊字符(如空格、&)能被正确编码,避免URL解析错误。
基于你现有的WhatsApp发送逻辑,以下是适配Telegram和Viber的代码实现,保持一致的结构与错误处理逻辑:
Telegram消息发送实现
Telegram的URL协议规则:
- 移动端优先使用
tg://send协议直接唤起APP,参数需传入带国际区号前缀的手机号(如+8613xxxxxxxxx)和编码后的消息内容 - 若APP未安装,自动 fallback 到网页版链接
代码实现
void sendCodeByTelegram({ required String phone, // 必须包含国际区号,例如"+8613800138000" required String message, }) async { String url() { final encodedMessage = Uri.encodeComponent(message); // 检查是否能唤起Telegram APP if (await canLaunchUrl(Uri.parse('tg://send'))) { return "tg://send?phone=$phone&text=$encodedMessage"; } else { // 跳转网页版 return "https://t.me/+$phone?text=$encodedMessage"; } } final launchUri = Uri.parse(url()); if (await canLaunchUrl(launchUri)) { await launchUrl(launchUri); } else { throw '无法启动Telegram:${url()}'; } }
注意事项
- 手机号必须带国际区号前缀,否则Telegram无法定位目标联系人
- 网页版需用户登录Telegram账号才能发送消息
Viber消息发送实现
Viber的URL协议规则:
- 移动端使用
viber://chat协议唤起APP,参数要求与Telegram一致(带国际区号的手机号) - 未安装APP时跳转Viber网页版链接
代码实现
void sendCodeByViber({ required String phone, // 必须包含国际区号,例如"+8613800138000" required String message, }) async { String url() { final encodedMessage = Uri.encodeComponent(message); // 检查是否能唤起Viber APP if (await canLaunchUrl(Uri.parse('viber://chat'))) { return "viber://chat?number=$phone&text=$encodedMessage"; } else { // 跳转网页版 return "https://viber.click/$phone?text=$encodedMessage"; } } final launchUri = Uri.parse(url()); if (await canLaunchUrl(launchUri)) { await launchUrl(launchUri); } else { throw '无法启动Viber:${url()}'; } }
注意事项
- Viber对手机号格式要求严格,必须包含国际区号
- 部分地区可能无法访问Viber网页版,需确保用户网络环境支持
通用消息发送函数(可选)
如果需要统一处理WhatsApp、Telegram、Viber三个平台,可以封装成通用函数:
import 'dart:io'; import 'package:url_launcher/url_launcher.dart'; enum MessagingApp { whatsapp, telegram, viber } void sendCodeByMessagingApp({ required MessagingApp app, required String phone, // 统一使用带国际区号的String类型 required String message, }) async { final encodedMessage = Uri.encodeComponent(message); late String url; switch (app) { case MessagingApp.whatsapp: if (Platform.isAndroid) { url = "whatsapp://send?phone=$phone&text=$encodedMessage"; } else { url = "https://wa.me/$phone?text=$encodedMessage"; } break; case MessagingApp.telegram: if (await canLaunchUrl(Uri.parse('tg://send'))) { url = "tg://send?phone=$phone&text=$encodedMessage"; } else { url = "https://t.me/+$phone?text=$encodedMessage"; } break; case MessagingApp.viber: if (await canLaunchUrl(Uri.parse('viber://chat'))) { url = "viber://chat?number=$phone&text=$encodedMessage"; } else { url = "https://viber.click/$phone?text=$encodedMessage"; } break; } final launchUri = Uri.parse(url); if (await canLaunchUrl(launchUri)) { await launchUrl(launchUri); } else { throw '无法启动${app.name}:$url'; } }
使用示例
// 发送验证码到Telegram sendCodeByMessagingApp( app: MessagingApp.telegram, phone: "+8613800138000", message: "你的验证码是:123456" );
内容的提问来源于stack exchange,提问作者Osama Mohammed
相关产品推荐
相关产品推荐

