English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french

简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE คนไทย Français русский

回答

收藏

Telegram 小程序 | TypeScript @telegram-apps/bridge | 方法

开源社区 开源社区 7551 人阅读 | 0 人回复 | 2025-02-22

本文涵盖与 apps communication 方法相关的主题。
, g/ p9 ~$ [0 [- E2 i
$ V6 R# ]6 m9 ], W" X4 ^8 V
" G9 B7 U( O' o4 O
调用方法

要调用 Telegram 迷你应用程序的方法,开发人员应使用 postEvent 函数:

  1. import { postEvent } from '@telegram-apps/bridge';
    + [$ L& T$ b. @0 c! {) ?
  2. 8 v! `9 R: W) |% T  G+ M8 I
  3. postEvent('web_app_setup_back_button', { is_visible: true });
复制代码

该功能会根据当前 环境自动确定发送事件的正确方式。 它能识别 Telegram 应用程序类型并选择合适的流程。

request

当开发人员需要调用 Telegram 小应用程序方法和 接收特定事件时,应使用 request 函数。

例如,调用web_app_request_viewport 方法并捕捉 viewport_changed 事件以获取实际视口数据:

  1. import { request } from '@telegram-apps/bridge';
    9 q6 c. w- [+ Y0 F
  2. 4 n2 d. H+ O+ \- _, q, F
  3. const viewport = await request(
    1 d: f" `& }# T% D0 ]; f
  4.   'web_app_request_viewport',0 [/ g/ I- a9 O  t1 x. |
  5.   'viewport_changed',
    4 s3 m/ y( I# N
  6. );1 X; M5 \3 J: _+ T3 M% w0 K' b# `; g

  7. - H  V( _8 I0 ^
  8. console.log(viewport);
    $ u$ D- V- _8 n" X( f8 j, C( m
  9. // Output:
    ) J  R6 F" d2 v( y& m+ x% j
  10. // {
    3 F1 j4 P; H  Q0 m9 I
  11. //   is_state_stable: true,
    ( D5 A; T' F& I( O& r
  12. //   is_expanded: false,
    & v# E; m$ V: Q! B
  13. //   height: 320# p6 ^6 g/ i( Y+ t( _: t
  14. // };
复制代码
, O$ n9 T  b2 [

如果 Telegram 小应用程序方法接受参数,则应在第三个参数的 params 属性 中传递这些参数:

  1. const buttonId = await request('web_app_open_popup', 'popup_closed', {1 {5 @! A# p; n7 `
  2.   params: {
    : b8 s8 s3 ]- g% y: p+ l- z" ~
  3.     title: 'Caution',0 a* n% \0 t5 v6 Y% w* r
  4.     message: 'Should we delete your account?',' D& P- x$ `, I! c3 h  |
  5.     buttons: [7 E: {% s$ a  ^8 [, V! h. @
  6.       { id: 'yes', type: 'ok' },
    * K, i( E( I, K: _
  7.       { id: 'no', type: 'cancel' },
    $ e6 v/ e( G0 @; {' P$ @0 [
  8.     ]," E% r( k# \/ X" z5 g. n! ?2 h
  9.   },
    ; W  m5 H* i7 Z* U) y; b
  10. });
复制代码
7 {# P8 h$ @2 n7 }/ m

它还可以同时跟踪多个事件:

  1. const result = await request(. o* t0 K- z" i& v7 V$ E
  2.   'web_app_open_scan_qr_popup',
    3 M4 |) Z- g/ I% I& z  j+ G4 p7 s1 F
  3.   ['qr_text_received', 'scan_qr_popup_closed'],! t4 {* A) e& X: B. s+ J9 O( O
  4. );
    ) f8 V  Q; j1 l# |
  5. 9 z. U( a& ^2 U# J" g& ~* ^
  6. // The result will either be the qr_text_received & q: _1 s; Z2 c0 Z' v( i+ Y$ y! B/ n# E
  7. // or scan_qr_popup_closed event payload.
复制代码

该函数允许传递其他选项,如 postEvent、abortSignal、timeout、 和 capture。


: t/ V  D) Q) ]7 g* x' PpostEvent

postEvent 选项允许开发人员覆盖用于调用 Telegram 迷你应用程序 方法的方法。

  1. request('web_app_request_viewport', 'viewport_changed', {+ K) `# j# U) f% W0 r) ~
  2.   postEvent() {9 P1 E1 v" C2 t; M  @0 x
  3.     console.log('Hey, I am not going to do anything');
      N: R- L1 Q) F' G0 b& O* n) |
  4.   },8 H9 _: Q3 P3 X. _- o. i+ f- u+ \
  5. });
复制代码
abortSignal

要从外部终止返回的承诺,需要使用 abortSignal 选项。

  1. const controller = new AbortController();
    3 s! V7 w1 R, r7 J4 u
  2. - C9 a' u/ ]+ a0 s; M
  3. request('web_app_request_viewport', 'viewport_changed', {
    4 X& R7 w  P- ?
  4.   abortSignal: controller.signal,, |3 ]" V+ @, f9 g0 M* D
  5. });! X' j! ^/ X) R  b9 l* P: [
  6. : Y# x6 a. v6 Y) K
  7. setTimeout(() => {$ y2 U, \& v, u2 m; I) n4 O
  8.   controller.abort(new Error('Not going to wait anymore'));# K; C# U& [+ a+ \& l
  9. }, 500);
复制代码
timeout

timeout 选项为请求指定一个超时时间。

  1. import { request } from '@telegram-apps/bridge';
    * Q! H& w# L7 p' U! g
  2. + \$ L' k! c* }) }6 J$ j
  3. try {
    - ~9 ]  a- p+ w, k
  4.   await request(/ r* s; N  l/ X8 t$ U
  5.     'web_app_invoke_custom_method',
    * {" c. V) h# d
  6.     'custom_method_invoked',
    . z$ P2 G% k; [) b  N4 C
  7.     {
    1 ]2 W5 D/ {2 `" |( F5 Z$ @- @
  8.       timeout: 5000,
    : J* U* m( J+ K  {% `
  9.       params: {
    4 J" l. G) B7 E0 s) I- u; m$ L2 l
  10.         req_id: '1',
    1 f) S  q! H  v5 J) K+ W: r* ^
  11.         method: 'deleteStorageValues',+ s) g  x0 S4 _0 }5 ?2 n
  12.         params: { keys: ['a'] },9 r$ C. ^, x- X) n1 Y
  13.       },4 `+ s. q, N' o, @
  14.     },+ D! F1 q& D7 ^* [7 D
  15.   );. U, @6 x8 o. P" l( b. N; s! {$ r
  16. } catch (e) {* X( A( s& e1 {8 c+ p
  17.   console.error(e); // TypedError with e.type === 'ERR_TIMED_OUT'
    . d% g, o! v; f2 W- z
  18. }
复制代码
capture

capture 属性是一个允许开发人员确定是否应捕获 Mini Apps 事件并从 request 函数返回的函数:

  1. const slug = 'jjKSJnm1k23lodd';8 v' W* i, C* U: L# g
  2. $ J% b: {+ A- z5 }
  3. request('web_app_open_invoice', 'invoice_closed', {" n/ I8 v! E1 e* J: m
  4.   params: { slug },
    , p; D  x  S- v# o. o: U
  5.   capture(data) {" A  _6 r2 `4 B0 e' g
  6.     return slug === data.slug;& _. K! B% b, o! X% D" v
  7.   },
    ) Q8 o. \0 q$ t2 Q% V! j
  8. });
复制代码

默认情况下,request 函数会捕获具有所需名称的第一个事件。 在这种情况下,只有当事件具有预期的标签时,该函数才会捕获事件,特定于 [color=var(--vp-c-brand-1)]invoice_closed 事件。

当传递一个事件数组时,capture 函数将收到一个对象,其中包含 event: EventName 和 payload?: EventPayload 属性的对象。

& @( X. A( ^* Y1 z
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则