Sitemap
Flutter Taipei

Flutter 每月新資訊摘要、相關技術文章分享、活動紀錄。定期於台北舉辦 Flutter 相關技術活動,相關資訊:https://linktr.ee/flutter.taipei

Follow publication

Flutter Web for Telegram Mini App (TMA)

--

Flutter is everywhere.

在現今的通訊軟體中,Telegram 是一個主流且熱門的選項,它的特點很多人都清楚,就是高度的保密性。在應用的聊天場景裡,它提供了一種創新的方式,讓開發者可以透過 Web Mini App 擴展聊天機器人的功能,實現與用戶更深層的互動體驗。本文旨在完整介紹如何設置並開發 Telegram Mini App,包括初始配置、功能開發到最後的部署及偵錯。通過結合 Flutter 技術,開發者能夠快速建立豐富多彩的 Mini App,不只是簡單的網頁而已,提升項目的可用性與靈活性。無論是新手還是有經驗的開發者,相信本指南都能提供有效的參考與實踐方向,為您的應用開發注入更多可能性。

Telegram Mini App Setting

Initial Setting

首先開啟 BotFather 聊天室,它是機器人的總管,所有相關操作都需要跟他互動

使用 /newbot 建立機器人,給予名稱,必須是 bot 結尾。輸入後就會得到一個機器人,並給予一個 API token

使用 /newapp 新建 Web mini app,包含一些基本資訊,例如:名稱、描述、圖檔(640x360)

設置先前部署好的 Flutter Web Url,小應用會開啟這個網頁。最後得到一個 Telegram 的 app link,以此範例就是 t.me/jassgirl_bot/jessica

Menu Setting

使用 /mybots 查看擁有的機器人,點擊 Bot SettingsMenu Button,設置選單按鈕的名稱還有 Web 網址

之後針對選單也可以隨意更新,跟 BotFather 的互動上都很直覺和簡單。

Flutter Development

使用 telegram_web_app 套件進行 Telegram SDK 開發。

專案設置,在 index.html 加上 js 初始化。

...
<script src="<https://telegram.org/js/telegram-web-app.js>" defer=""></script>
...

開發上很簡單,透過 TelegramWebApp.instance 進行所有 Telegram 上的互動。

TelegramWebApp.instance.initData;

開啟小應用後就會顯示我們所設置的 Flutter Web 網頁,可以從中取得一些 Telegram 用戶的基本資料,例如:idfirstnamelastnameusernamelanguageCode 等等。

另外可以經由套件執行一些 Telegram 操作。

// Get user data
TelegramWebApp.instance.initData.user
TelegramWebApp.instance.initDataUnsafe.user

// Open external link
TelegramWebApp.instance.openLink('<https://google.com>')

// Open telegram link
TelegramWebApp.instance.openTelegramLink('<https://t.me/username>');

// Show alert dialog
TelegramWebApp.instance.showAlert('Alert message');

// Show confirm dialog
TelegramWebApp.instance.showConfirm('Confirm');

// Expand bottom sheet
TelegramWebApp.instance.expand();

// Close bottom sheet
TelegramWebApp.instance.close();

針對關閉 Mini App 的操作,通常會使用 close(),但在雙平台的行為上有點不同。Android可以正常關閉,但是 iOS 需要經由 SystemNavigator 執行底層的關閉方式。

// Android
TelegramWebApp.instance.close();

// iOS
await SystemNavigator.pop();

Demo

其他操作

分享給好友

分享頻道資訊給 Telegram 好友,透過內建分享列表,並附上自定義資訊。

範例:https://t.me/<BOT_NAME>?xxx=zzz

await TelegramWebApp.instance.openTelegramLink(
'<https://t.me/share/url?url=$link>',
);

Direct Link 開啟 Mini App

在聊天室中可以透過按鈕或是連結訊息,直接開啟 Mini App 並跳轉到指定頁面,甚至也可以直接運行某個功能,讓整體的操作體驗更絲滑。

官網在文件上有提出連結範例:

需要跟 BotFather 設置你的機器人跟 Mini App,連結會使用到他們。點擊之後即可開啟選單應用

<https://t.me/><bot-username>/<app-name>

// Example
<https://t.me/crush_on_jessica_bot/miniapp>

在連結上可以放置自定義資訊,方便我們在開啟 Mini App 後可以辨識來源與意圖。

<https://t.me/><bot-username>/<app-name>?startapp=<data>

Mini App 端可以透過 SDK 的 initDataUnsafe 取得 WebAppInitData 物件。其中的 start_param 欄位就是我們先前放置的資料,可以進一步解析後最後續處理。

final directLinkData =
TelegramWebApp.instance.initDataUnsafe?.start_param ?? '';

經過測試驗證,initDataUnsafe 物件的資料確實不完全穩定。如果在應用開啟之後馬上要存取,可以在前面等待 1 秒,確保載入 Telegram 資訊完整。

開啟指定聊天室

<https://t.me/><bot-username>/

// Example
<https://t.me/crush_on_jessica_bot/>

開啟 Star 商品購買

透過 openInvoice() 打開指定的 Invoice 購買連結。可以透過 Telegram API 的 createInvoiceLink 創建屬於自己的購買連結。

TelegramWebApp.instance.openInvoice(
r'<https://t.me/$61T-akbE6UVYAQAAqs9lejAKWw4>',
)

創建 Invoice URL 範例:

curl --location '<https://api.telegram.org/bot<token>/createInvoiceLink>' \\
--form 'title="test"' \\
--form 'description="test"' \\
--form 'payload="{\\"test\\":\\"test\\"}"' \\
--form 'provider_token=""' \\
--form 'currency="XTR"' \\
--form 'prices="[{\\"amount\\": 1, \\"label\\": \\"測試\\"}]"'

參考:https://www.postman.com/satellite-administrator-38214876/telegram-api/collection/qejha5x/telegram-bot-api

Deploy Flutter Web

將 Web 部署到雲端,輕鬆快速的選擇就是 Firebase Hosting 服務對於開發者來說很友善。

快速教學步驟:

  1. firebase init → Firebase 初始化設定
  2. flutter build web → Flutter Web 建置
  3. firebase deploy → Flutter Web 部署到 Firebase

拿到部署後的對外網址,例如:https://jessica-a31ab.web.app

此網址就是我們跟 BotFather 對話時要跟他說的,也就是 TMA 開啟的網址。

當然,這裡不局限於你將專案部署到哪個平台,選擇自己熟悉喜歡的即可。

Debugging Tool

macOS 上連接手機查看 Mini App 的相關運行狀況

Safari 前置設定

  • 開啟 Safari 瀏覽器
  • 開啟設定進階
  • 選取底部的「為 Web 開發人員顯示功能」選項

偵錯步驟

  • 透過 USB 將 iOS 裝置連接到 Mac
  • 在 iOS Telegram 開啟 Mini App
  • 在 macOS 上的 Safari 中打開”開發”分頁
  • 選擇已連線的 iPhone,並點選運行中的 Mini App

問題與阻礙

問題 1

無法播放音檔。在一般瀏覽器上運行都沒問題,但是在 TMA 上就無法正常運作,需要開啟外部瀏覽器執行播放。

如果使用 Audio 播放套件,audioplayersassets_audio_player 都無法正常運作,需要直接透過 JS 處理。

問題 2

無法下載檔案。在一般瀏覽器上運行都沒問題,但是在 TMA 上就無法正常運作,需要開啟外部瀏覽器後執行下載。

--

--

Flutter Taipei
Flutter Taipei

Flutter 每月新資訊摘要、相關技術文章分享、活動紀錄。定期於台北舉辦 Flutter 相關技術活動,相關資訊:https://linktr.ee/flutter.taipei

Yii Chen
Yii Chen

Believe what you believe | Organizer FlutterTaipei | Author, Speaker | wanna make Flutter strong in Chinese community. https://linktr.ee/yiichenhi

No responses yet