本文涵盖与 apps communication 方法相关的主题。) V) y5 b7 l, T" Y, ?
2 \6 L7 g0 l7 v
5 ?2 _( Q* y8 e$ c7 Z* H( T* P6 S调用方法要调用 Telegram 迷你应用程序的方法,开发人员应使用 postEvent 函数: - import { postEvent } from '@telegram-apps/bridge';
& Y: H: g* s+ u. i, Z6 S" ^- P - : L8 P7 Y$ X0 i
- 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';
+ G8 ~4 f- E( n3 d
: ~% u8 t q' Y5 x; [- const viewport = await request(. ?+ h7 X! a2 _# \: \" O2 }) U
- 'web_app_request_viewport',
/ \1 H; O H2 p0 y3 z - 'viewport_changed',! ?' q6 d" E. u, L9 m* |
- );
9 s% e5 Q7 Y3 ~
- a8 l8 A% D& A8 R, l2 K) x4 t- console.log(viewport);: \( A* [# R( W* l; W; [
- // Output:9 [! A8 T" v) j" Q4 T1 d
- // {
. p4 B+ l4 S! P I - // is_state_stable: true,
/ u7 f3 V( D2 K5 L - // is_expanded: false,
# u8 p; A$ b' M1 N - // height: 320- h$ |' R- M1 h" i& B* {
- // };
复制代码 5 B9 T- E* F7 N$ \& K
如果 Telegram 小应用程序方法接受参数,则应在第三个参数的 params 属性 中传递这些参数: - const buttonId = await request('web_app_open_popup', 'popup_closed', {
( _& G# ]6 G9 I, U; } - params: {
% Q) K* u, J# e8 n2 X - title: 'Caution',
: R" ?% N2 I8 F1 U7 T - message: 'Should we delete your account?',6 M5 y* ^. v, e
- buttons: [6 W9 I" n! ]( t% q
- { id: 'yes', type: 'ok' },$ s# G: F9 G" X0 C, b) s
- { id: 'no', type: 'cancel' },! s' F& c$ ^3 G- [3 ]: w/ }) `7 |* |
- ],7 ?5 q; [- |& @9 r) j+ U1 B
- },
; V0 o( V6 x7 V( c - });
复制代码 ( v6 B7 v( q; ]# `
它还可以同时跟踪多个事件: - const result = await request(
8 q5 Q; o; V# ]7 w3 U - 'web_app_open_scan_qr_popup',
- A# j1 @: O7 P+ |8 O - ['qr_text_received', 'scan_qr_popup_closed'],; J2 A( X0 p' M0 Z
- );
& R8 w A) B' f: W - / x6 T5 \7 K; K6 @ i2 _6 S8 \
- // The result will either be the qr_text_received & T6 s5 R- P, d" k. M
- // or scan_qr_popup_closed event payload.
复制代码该函数允许传递其他选项,如 postEvent、abortSignal、timeout、 和 capture。
I t7 b* d3 xpostEventpostEvent 选项允许开发人员覆盖用于调用 Telegram 迷你应用程序 方法的方法。 - request('web_app_request_viewport', 'viewport_changed', {( z6 y2 B6 F k% r# D
- postEvent() {' w* }: b# \/ ~
- console.log('Hey, I am not going to do anything');
2 ]& m$ j! d' F g! N - },
+ y5 [9 a8 B* H - });
复制代码 abortSignal要从外部终止返回的承诺,需要使用 abortSignal 选项。 - const controller = new AbortController();
* c/ Z% p- _7 w/ h7 ^
8 b% i1 I9 p$ V- a& N' W1 n& I! @4 A( G- request('web_app_request_viewport', 'viewport_changed', {. a7 D) y [( U; Y5 E: m5 k
- abortSignal: controller.signal,
. o- i" p( W" H1 u! P - });
9 l( r5 d. n6 N
; X z7 O) z/ p! P Z- setTimeout(() => {
! j3 h, d3 u5 G1 U; I2 I! P! z - controller.abort(new Error('Not going to wait anymore'));
]9 p) \8 i; }4 h* t* e: I - }, 500);
复制代码 timeouttimeout 选项为请求指定一个超时时间。 - import { request } from '@telegram-apps/bridge';
/ x& t5 @$ a+ I4 K - : p/ x) A' B; v0 r( A$ Z
- try {
f/ B5 w. n: c: y: B+ Y0 N - await request(+ Q0 f0 D9 Y: R/ @
- 'web_app_invoke_custom_method',3 s# O+ I& d: v7 ]" E' z* N
- 'custom_method_invoked',
8 w4 c o9 }7 B) m- b - {
, `: r. n+ z2 E3 N/ t8 `( { - timeout: 5000,/ z T; Y- i$ B' r, p* ?
- params: {( E. R) H3 @2 ]8 |! a. y: ]
- req_id: '1',$ Y" N" Q }/ ]5 K! H
- method: 'deleteStorageValues',
# V4 }) v+ I/ _, K+ a) ~9 F - params: { keys: ['a'] },
' t. e U4 `( z' ` - },
5 x/ L# k: b7 B0 ^- X - },
& C7 c L6 L3 P8 P - );
; z K0 S7 D+ X8 w* Y4 e - } catch (e) {
; S/ ]# ]+ Z" I: H) f - console.error(e); // TypedError with e.type === 'ERR_TIMED_OUT'
! d, e, ~, D4 G; X2 b) ~ - }
复制代码 capturecapture 属性是一个允许开发人员确定是否应捕获 Mini Apps 事件并从 request 函数返回的函数: - const slug = 'jjKSJnm1k23lodd';
9 N# ^: Q4 E* s( g - 8 o2 o5 Y \! I8 G# ~! h9 ~
- request('web_app_open_invoice', 'invoice_closed', {# T( p& Z& c0 `4 x, L8 F
- params: { slug },
" q- |! g! I+ h' h. O' T - capture(data) {, s# ]1 V2 L+ E- p1 W
- return slug === data.slug;4 E/ i7 B8 H5 `7 J) l3 p
- },
5 e+ \% o* K( E0 ?0 }5 P/ a7 Z - });
复制代码默认情况下,request 函数会捕获具有所需名称的第一个事件。 在这种情况下,只有当事件具有预期的标签时,该函数才会捕获事件,特定于 [color=var(--vp-c-brand-1)]invoice_closed 事件。 当传递一个事件数组时,capture 函数将收到一个对象,其中包含 event: EventName 和 payload?: EventPayload 属性的对象。 " U- A/ b; M9 l; X
|