You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:36:19