本文涵盖与 apps communication 方法相关的主题。- n8 g; m" a( F
6 R' n$ k) G2 R! ^; h
* e# U/ H+ w/ B# s2 N M调用方法要调用 Telegram 迷你应用程序的方法,开发人员应使用 postEvent 函数: - import { postEvent } from '@telegram-apps/bridge';
/ V2 J9 s/ B, c3 E, Y; \ - ( x/ |) O o8 @5 V5 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';
: I4 D: E. D. M0 j. ]7 U - $ B" m( L' f7 Q' \
- const viewport = await request(
" ]) l9 F6 B$ D7 Q4 a3 {6 G - 'web_app_request_viewport',
5 I9 n( `# a# S7 X {2 n& w - 'viewport_changed',
* a. ?% S. b) ~5 f1 l - );
% @8 {4 g1 |& i# n - 3 U5 l/ T5 Z- G4 ?' t
- console.log(viewport);
/ B! f. I( L( R p9 k c% ] - // Output:
# P; u& D6 K9 D - // {! d# p1 ^' R2 }0 k+ ^
- // is_state_stable: true,# t# Y4 X; q" p+ t, W# k0 y
- // is_expanded: false,0 E! s0 U8 w/ |1 r4 b! H
- // height: 320: H* W4 z9 m% v$ Y2 `8 N
- // };
复制代码
& Z9 Q' o! ~! c* k如果 Telegram 小应用程序方法接受参数,则应在第三个参数的 params 属性 中传递这些参数: - const buttonId = await request('web_app_open_popup', 'popup_closed', {8 N) B) U7 e8 H2 O [* L
- params: {) b4 ]5 t. o7 b* O
- title: 'Caution', x3 i* W0 l0 O' N2 j
- message: 'Should we delete your account?',+ u( P+ r& B( o
- buttons: [" u4 Z5 q$ R/ j+ s6 _0 {* ]2 A
- { id: 'yes', type: 'ok' },
; J% S w- `1 `& Y. O! L1 a1 @" c - { id: 'no', type: 'cancel' },
0 O2 U9 S5 G ]; e7 W - ],
# r2 |( h0 G c, @; H3 K4 v - },
9 y2 M' }+ A1 N - });
复制代码 + C( @9 e3 T* F. }, M9 @, |
它还可以同时跟踪多个事件: - const result = await request(
" S2 t: u0 c3 j9 o* d - 'web_app_open_scan_qr_popup',
( i: E+ e: I* u' ~0 D+ S# g - ['qr_text_received', 'scan_qr_popup_closed'],
- S* M/ ~$ H. n+ G+ `+ Y+ G6 p - );
3 i3 f6 P* X( u2 B6 N! x. u. \$ Z
. [# M+ g7 D+ x5 s- // The result will either be the qr_text_received
) [" J" W" s8 L4 T( X6 G+ s4 Y& Q- K - // or scan_qr_popup_closed event payload.
复制代码该函数允许传递其他选项,如 postEvent、abortSignal、timeout、 和 capture。 - L& P3 m# Y) ^4 Q2 I" r6 m# \% Z* y
postEventpostEvent 选项允许开发人员覆盖用于调用 Telegram 迷你应用程序 方法的方法。 - request('web_app_request_viewport', 'viewport_changed', {
) U7 b# Z+ R& Y - postEvent() {2 }( p# S3 g1 m8 a9 k. ]9 t
- console.log('Hey, I am not going to do anything');
( \9 w$ m- s3 P) z: p- z: B - },
! U2 s1 d- @( y4 V6 V; N - });
复制代码 abortSignal要从外部终止返回的承诺,需要使用 abortSignal 选项。 - const controller = new AbortController();: f: `, _! ]+ |# q$ E
! u m! F" {9 N- _- request('web_app_request_viewport', 'viewport_changed', {3 S0 _ Y' T8 n( g, k
- abortSignal: controller.signal,
$ G+ ?1 b; D! U4 q7 e - });8 v; U. L0 H7 q3 u) r3 @
: n3 Z( W$ W P2 S3 v- setTimeout(() => {
! {4 p2 T" K: i& ` - controller.abort(new Error('Not going to wait anymore'));
7 E( O' @0 y% R$ p- b6 J6 p- V - }, 500);
复制代码 timeouttimeout 选项为请求指定一个超时时间。 - import { request } from '@telegram-apps/bridge';1 o4 |" A3 Y" l2 w
- 5 w% ?( k2 T5 R& N9 J
- try {' n: k/ q" d \1 S
- await request(/ N* m* F4 Q9 ]
- 'web_app_invoke_custom_method',
( s$ _# i5 a% C( [+ w" t5 p - 'custom_method_invoked',
' C" }- x# [, P1 `0 n4 B2 a* k - {: W' |! v$ }$ q# X% y7 o; _' O
- timeout: 5000,* \/ u+ S+ P6 {
- params: {1 y: A4 @6 |! v( B* P
- req_id: '1',3 f- ^2 ~6 G; y( t# u& B& }
- method: 'deleteStorageValues',
0 ~! i' l5 |0 b+ O( L) ~/ \. O - params: { keys: ['a'] },
$ @; ^- c* N- v2 s. Q0 F/ }$ `' | - },' E% Y# H- {8 B1 }$ O3 O0 e
- },
8 m( j' f% _# z; R# z7 E7 J" Q/ f - );% n0 o. |' v! m, n% Q- A
- } catch (e) {7 k9 J7 P2 d$ q& ?3 Q
- console.error(e); // TypedError with e.type === 'ERR_TIMED_OUT'$ N, |4 t9 t! s1 m0 Q9 v" `
- }
复制代码 capturecapture 属性是一个允许开发人员确定是否应捕获 Mini Apps 事件并从 request 函数返回的函数: - const slug = 'jjKSJnm1k23lodd';& n' ]! n, [0 e2 Q
- ; f1 q7 \ H! y: N5 X# H) u7 U0 N9 B
- request('web_app_open_invoice', 'invoice_closed', {
# M/ R8 I3 I' ?' C: N2 C6 }' E3 c - params: { slug },
' D- V: \ K8 g% ~! @. I& D - capture(data) {5 R& C+ ?* N6 @
- return slug === data.slug;
. h/ X; I# o; L7 s) b - },
6 ?$ i, w2 o4 _6 F! G G, { - });
复制代码默认情况下,request 函数会捕获具有所需名称的第一个事件。 在这种情况下,只有当事件具有预期的标签时,该函数才会捕获事件,特定于 [color=var(--vp-c-brand-1)]invoice_closed 事件。 当传递一个事件数组时,capture 函数将收到一个对象,其中包含 event: EventName 和 payload?: EventPayload 属性的对象。
! \$ G) R$ @+ G/ Y1 u1 P |