本文涵盖与 apps communication 方法相关的主题。 h2 x( K9 B1 c
4 k3 X# d- y' n, R$ k% \
$ I* ?$ n1 a) C) l; d- K调用方法要调用 Telegram 迷你应用程序的方法,开发人员应使用 postEvent 函数: - import { postEvent } from '@telegram-apps/bridge';3 t b6 x4 y! U" K; I$ K$ |' U
, a0 h( J1 v x" \' ?1 G- b2 D9 ?: H- postEvent('web_app_setup_back_button', { is_visible: true });
复制代码该功能会根据当前 环境自动确定发送事件的正确方式。 它能识别 Telegram 应用程序类型并选择合适的流程。 request当开发人员需要调用 Telegram 小应用程序方法和 接收特定事件时,应使用 request 函数。 例如,调用web_app_request_viewport 方法并捕捉 viewport_changed 事件以获取实际视口数据: - import { request } from '@telegram-apps/bridge';
( ?" @( [" W6 M' Y( ^# L! b
: d1 E3 l$ a8 c9 s) M; P- const viewport = await request(
+ b6 T1 \$ v- V. J* E; { - 'web_app_request_viewport',
; Y7 `% k/ k8 t) q: F+ A7 }2 K - 'viewport_changed',
! Z1 f( [, @, z6 D6 K _ - );
1 d# A! Y5 M( W) }1 o4 {) y7 | - ( X* ^( O! [8 Z, d, z% }* a
- console.log(viewport);- d# T$ @/ Q p3 h1 s4 ~! }
- // Output:
9 u/ S' k$ Y) m% n, A6 Y - // {9 h% m3 S1 `7 D: b ]' s
- // is_state_stable: true,& V, T" R" E2 {$ i2 D. }3 O
- // is_expanded: false,2 a4 c' r* M) A2 v, Y# r/ s1 B
- // height: 320* v9 r2 ~0 R8 d. ~
- // };
复制代码 t! {1 p! O2 ~, R7 ~
如果 Telegram 小应用程序方法接受参数,则应在第三个参数的 params 属性 中传递这些参数: - const buttonId = await request('web_app_open_popup', 'popup_closed', {
" t' }. K8 g$ I" M) g% p) x - params: {
/ R, j$ _( c/ K. ` - title: 'Caution',
" U4 f' q/ L7 N0 N. ] - message: 'Should we delete your account?',& j- r7 j2 k8 ]! ~
- buttons: [! n/ r% A- X6 A- }% y7 Y; x; P
- { id: 'yes', type: 'ok' },, S( `6 Q$ p/ X# ^# h/ Y: p
- { id: 'no', type: 'cancel' },1 c. r$ P1 O7 G6 q
- ],
" w# s. J7 x3 m4 @; g - },- N; U+ ?& w1 j# u' V# k
- });
复制代码
; I) P$ u4 f8 E' x. M) I! i它还可以同时跟踪多个事件: - const result = await request(3 P0 y! {6 o) R+ `! h& p
- 'web_app_open_scan_qr_popup',
: K: d: w5 H& S - ['qr_text_received', 'scan_qr_popup_closed'],$ x" Y! u' @5 q0 M
- );3 o, j# x/ q a7 ^0 U* Z
- 7 G& D n0 T' k% U/ e% ]
- // The result will either be the qr_text_received 0 ^8 I7 l1 [5 ?9 t a1 K% G2 |
- // or scan_qr_popup_closed event payload.
复制代码该函数允许传递其他选项,如 postEvent、abortSignal、timeout、 和 capture。
& F; v6 p2 n, u& n zpostEventpostEvent 选项允许开发人员覆盖用于调用 Telegram 迷你应用程序 方法的方法。 - request('web_app_request_viewport', 'viewport_changed', {' G6 f9 u' p4 a' |& M$ T. ]) k" U" w
- postEvent() {
- t: n- o+ g, Y2 r - console.log('Hey, I am not going to do anything');- Z; H' x. L2 s; }9 \* |
- },0 j; Z0 X0 Y! Z3 M5 a$ P
- });
复制代码 abortSignal要从外部终止返回的承诺,需要使用 abortSignal 选项。 - const controller = new AbortController();
; l2 \% H; I; m* C
( ]0 _( |% O. j Y- request('web_app_request_viewport', 'viewport_changed', {
7 ^1 ^* b: x/ l/ J; L2 l4 b - abortSignal: controller.signal,
: C- S' P9 j. e+ \/ l+ p) {2 t - });
5 S2 ], j! i0 A. e - ! x( U" V A0 i$ [) n: w4 g
- setTimeout(() => {+ L3 C& M0 k8 q
- controller.abort(new Error('Not going to wait anymore'));
% U9 X$ j" {, {5 y - }, 500);
复制代码 timeouttimeout 选项为请求指定一个超时时间。 - import { request } from '@telegram-apps/bridge';
o" D) D4 i. T* ^ - ' m% T0 t V+ h; Z
- try {4 ~3 Y* e% j& W4 u/ O9 x
- await request(
9 k& ?3 a4 U0 O$ e9 W M - 'web_app_invoke_custom_method',
- y) Q! k/ @8 c. X& n% W - 'custom_method_invoked',
% v( V5 ^! g+ m) p% v - {
$ }5 ]: |1 z4 L# r6 i. e - timeout: 5000,5 o# N) m5 ^, f3 [ A+ a' {1 ^
- params: {6 l4 e, |) R7 `! M( A- j
- req_id: '1',
5 D7 m: g/ n) g* `/ c - method: 'deleteStorageValues',
, O4 S, i* S' q" k+ T" T0 n9 } - params: { keys: ['a'] },
$ y9 E. ]# B2 M( V: T. B2 J - },
* [$ c# p/ r" `5 m( t1 ^2 e' b - },
7 {$ @5 c+ w3 i/ v2 r# R( G - );
: q/ K" D4 T: x" P0 y4 ]4 K! R - } catch (e) { K" g$ e! H5 k5 x
- console.error(e); // TypedError with e.type === 'ERR_TIMED_OUT'
5 R1 W$ N* h2 P W3 F - }
复制代码 capturecapture 属性是一个允许开发人员确定是否应捕获 Mini Apps 事件并从 request 函数返回的函数: - const slug = 'jjKSJnm1k23lodd';
o# ]3 x! l7 V: ?. m/ p - # Q( _' s7 W# ~! {* W
- request('web_app_open_invoice', 'invoice_closed', {: n( `- b. W4 S4 a! }
- params: { slug },' Q% Z0 W4 v$ p; v7 w8 X/ x$ |- L
- capture(data) {
. L3 K$ Z9 {/ H; \ - return slug === data.slug;
6 a# @: f1 J k3 P+ M - },
& B6 M' ^, g( Z \ - });
复制代码默认情况下,request 函数会捕获具有所需名称的第一个事件。 在这种情况下,只有当事件具有预期的标签时,该函数才会捕获事件,特定于 [color=var(--vp-c-brand-1)]invoice_closed 事件。 当传递一个事件数组时,capture 函数将收到一个对象,其中包含 event: EventName 和 payload?: EventPayload 属性的对象。
' w }% F9 n2 [" I3 `. b: x" z: o1 c |