本文涵盖与 apps communication 方法相关的主题。0 S: c) l2 I/ y
" G% w n+ `6 I
, a" f) O" @" b! L5 t调用方法要调用 Telegram 迷你应用程序的方法,开发人员应使用 postEvent 函数: - import { postEvent } from '@telegram-apps/bridge';
, T! H o4 c' K9 y0 U - & `3 X/ a' S4 Y9 U
- 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';. v, Y' M4 J! e1 c% a0 O
- _( @1 F0 }+ W: s9 n, w- const viewport = await request(
1 Z6 K& e+ H$ d( J6 m& ^8 ]; F - 'web_app_request_viewport',
' a8 f9 L8 Q- j! B, \* C - 'viewport_changed',5 X1 M( X5 K+ H: u+ ^8 w0 `
- );/ _0 M' `# u2 ? n8 O% G
) Q) x4 n h" L% H4 x. X- console.log(viewport); T* m5 M4 Q& g- v' V) |) c
- // Output:6 m0 g t D7 Z# |' c
- // {
/ d* i6 {4 z+ A2 m6 p4 F - // is_state_stable: true,2 W5 t5 T% R: I* m
- // is_expanded: false,
# D6 R1 j2 N% q: A* h6 s3 [( r - // height: 320
7 A% O0 X5 h! z9 r - // };
复制代码
* y- n/ \/ X% `( Q& A( ]7 s如果 Telegram 小应用程序方法接受参数,则应在第三个参数的 params 属性 中传递这些参数: - const buttonId = await request('web_app_open_popup', 'popup_closed', {
) e5 f: V1 `3 B0 U! r! R - params: {
! L0 g8 \9 Y2 B d - title: 'Caution',: r5 j) `$ [% k2 W
- message: 'Should we delete your account?',
8 Y, ~8 ^9 ~7 Z: F - buttons: [3 t( P. {! r: L) n
- { id: 'yes', type: 'ok' },
' r7 V; g! m! V" q, n - { id: 'no', type: 'cancel' },4 Z# Z, U- |/ {
- ],
4 L) y0 N! N5 o; {. s; _ - },
1 ^0 ~$ |" p" d# L) B4 ~7 S, t3 p - });
复制代码
) O g/ v( ]; Y4 `) m' ^它还可以同时跟踪多个事件: - const result = await request(
& F5 ^% a# G( x/ m0 b6 j! I - 'web_app_open_scan_qr_popup',' p7 y; X( s4 r& u% m7 O
- ['qr_text_received', 'scan_qr_popup_closed'],, a7 r9 t; C9 J5 s. i: b0 v
- );
' c1 W/ P) s# V. |/ v
! g; C. @- h/ I, q4 H- // The result will either be the qr_text_received
. h @ _2 ^( z$ K" X. {, L - // or scan_qr_popup_closed event payload.
复制代码该函数允许传递其他选项,如 postEvent、abortSignal、timeout、 和 capture。
# J9 C G, t/ `" x) K. b+ ipostEventpostEvent 选项允许开发人员覆盖用于调用 Telegram 迷你应用程序 方法的方法。 - request('web_app_request_viewport', 'viewport_changed', {
# ^2 K! ], P4 s$ r) l - postEvent() {3 y' S) v! s6 w' V6 f0 k3 ^6 _
- console.log('Hey, I am not going to do anything');0 N, E3 t, ~: ?. M$ a$ K
- },. e- U" V2 {6 \ ^. a' N3 ~% Z
- });
复制代码 abortSignal要从外部终止返回的承诺,需要使用 abortSignal 选项。 - const controller = new AbortController();
; ]9 s' A8 {) C& x" q2 \
2 w( T0 A' T- x- request('web_app_request_viewport', 'viewport_changed', {8 x. ?+ k7 d& s/ N" Z; u
- abortSignal: controller.signal,
. s! k! u+ b W+ Z - });
! b7 a5 k* {3 ?( p! q0 L& s
; ~1 X x8 ~* v' y- setTimeout(() => {
9 w2 ?$ i+ l* t3 N8 i8 k1 U - controller.abort(new Error('Not going to wait anymore'));
. m2 A! J$ \- b1 [2 Y1 r& A - }, 500);
复制代码 timeouttimeout 选项为请求指定一个超时时间。 - import { request } from '@telegram-apps/bridge';
) I" `& u* ~$ M$ ?
9 a: ]5 K& _4 m0 i# E- try {
( {' o u. y t+ F. M - await request(
+ t- p$ q+ x& n' L8 k: B) z) g1 l( ?, y - 'web_app_invoke_custom_method',
, ]& d$ E6 P5 i! |3 N - 'custom_method_invoked',
! O' A# W& L" L4 V' B5 R - {+ l( V q& |; W- J H" i
- timeout: 5000,! M4 i. f' x% s$ d
- params: {: \8 ]' K. p/ n1 ?1 M1 v/ g5 a' x
- req_id: '1',' C& a* i% s. p" }5 j8 B3 E! u1 V5 D
- method: 'deleteStorageValues',8 y# Z; N, P$ z# S7 h
- params: { keys: ['a'] },
! M* c' F8 n+ Z. k: d5 |- l4 J - },
% r9 K0 C B8 W) \' Z9 \; I( ^ - },
" X& S; A5 v3 k6 {2 G - );
, J. {# F( j* f+ t( }, |; M5 n! q; `- J - } catch (e) {* e+ C$ k# E( L! z" S5 S
- console.error(e); // TypedError with e.type === 'ERR_TIMED_OUT'
6 S# c% Q5 J& U2 Z7 T; R7 Y- j7 ? - }
复制代码 capturecapture 属性是一个允许开发人员确定是否应捕获 Mini Apps 事件并从 request 函数返回的函数: - const slug = 'jjKSJnm1k23lodd';
! p8 b/ Q" W3 L( a" N- L - 4 U- f5 h( x1 o. j/ n- _
- request('web_app_open_invoice', 'invoice_closed', {
( y! n; u. Z; @) P - params: { slug },
% Q$ h+ J! ^, D0 N. X% z/ I( \* _ - capture(data) {6 h J1 n& P9 R5 p n
- return slug === data.slug;
* |& M0 q2 f ]8 w) C - },0 X8 J! F/ W$ z/ c' W) x$ |
- });
复制代码默认情况下,request 函数会捕获具有所需名称的第一个事件。 在这种情况下,只有当事件具有预期的标签时,该函数才会捕获事件,特定于 [color=var(--vp-c-brand-1)]invoice_closed 事件。 当传递一个事件数组时,capture 函数将收到一个对象,其中包含 event: EventName 和 payload?: EventPayload 属性的对象。 6 h7 r i0 ^0 o O3 r6 ?$ M
|