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

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

回答

收藏

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

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

本文涵盖与 apps communication 方法相关的主题。1 `& D1 Q0 E0 D0 @

1 G! w! D7 X2 o  X! G* u
8 R" U# J4 q- }2 U; q  n9 P/ h0 y
调用方法

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

  1. import { postEvent } from '@telegram-apps/bridge';6 M; l6 V2 q+ X% r% q9 }8 ^
  2. 9 Z+ y* h6 T, |8 o
  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';, b6 M; |" n1 W8 @, {

  2. 5 d: u1 T8 f; S6 s
  3. const viewport = await request(
    8 s' W. [! w: M# k4 E) p$ h' e
  4.   'web_app_request_viewport',1 y; n" N" D% ~! a6 d
  5.   'viewport_changed',. K1 x# a' l" Y( _
  6. );
    1 f. X3 c5 R/ h- `5 D

  7. 4 t" I/ W* J6 W  p' z
  8. console.log(viewport);& L0 u4 |2 Z% I  u& q
  9. // Output:
    0 ?$ P& t6 {" H  v
  10. // {
    # T4 V0 b2 J  w
  11. //   is_state_stable: true,; U9 V5 N+ z5 w; `
  12. //   is_expanded: false,
    6 p) G# M7 g4 g- x
  13. //   height: 320
    2 e) ^+ c* J! c. C2 [
  14. // };
复制代码

" a. e! o3 l: Z& N  O

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

  1. const buttonId = await request('web_app_open_popup', 'popup_closed', {: i9 @* Z) k0 F/ z
  2.   params: {6 P1 x9 S  _, K) q; d# h- M
  3.     title: 'Caution',
    . X5 s7 [6 Q( ~6 b3 ~4 e. o
  4.     message: 'Should we delete your account?',6 q% b4 }" h; }) `$ `
  5.     buttons: [
    / s# q0 P( U9 x
  6.       { id: 'yes', type: 'ok' },
    % c9 U/ P9 q. W5 Z+ s/ {
  7.       { id: 'no', type: 'cancel' },' z( @: D9 P5 w+ b4 z
  8.     ],
    + K2 U7 s( d% Q1 ^( _2 Y
  9.   },
    7 H5 H1 w9 E! V6 c
  10. });
复制代码
) s9 u& j3 p( O% v' W- @" e

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

  1. const result = await request(: i! R. _  k3 l6 d( P" l- X
  2.   'web_app_open_scan_qr_popup',# q. l3 g) N- P9 z$ `& d
  3.   ['qr_text_received', 'scan_qr_popup_closed'],
    . h  v0 S/ F* }, ]2 ?
  4. );$ ~( T6 }' z' O6 ]3 Y2 m
  5. 0 R! `9 E) Y% @- k* c; ]/ ]3 h
  6. // The result will either be the qr_text_received
    * F; L4 H) u1 _
  7. // or scan_qr_popup_closed event payload.
复制代码

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


2 c: z8 m* m0 i9 n' G$ mpostEvent

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

  1. request('web_app_request_viewport', 'viewport_changed', {
    ( P0 [; h# p3 K# Y! \3 w3 L
  2.   postEvent() {& Y, t) E7 z  [6 W% S5 D! j
  3.     console.log('Hey, I am not going to do anything');/ Z2 Y, z$ `; i3 S6 u
  4.   },8 T4 f8 l: {- _8 W
  5. });
复制代码
abortSignal

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

  1. const controller = new AbortController();4 B% _( E1 C) F6 G+ n" x

  2. ( @/ n: D/ W3 i7 `. T
  3. request('web_app_request_viewport', 'viewport_changed', {( G! @" l6 v3 y" [& j
  4.   abortSignal: controller.signal,
    7 p( P! k" i/ x3 t
  5. });
    3 l  Z- |. q/ \  M0 ~6 w

  6. / S4 l2 r+ p: V" B' w& E6 Q
  7. setTimeout(() => {5 t# f8 n& B/ |  B7 B- ]& G
  8.   controller.abort(new Error('Not going to wait anymore'));# q9 J# f7 T1 Q; O# N5 ]
  9. }, 500);
复制代码
timeout

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

  1. import { request } from '@telegram-apps/bridge';
    $ d' m2 j$ v. Q% t5 [

  2. 7 ?: v7 v, R+ j
  3. try {
    + Q  N: n3 a. F) J2 A. }% Z
  4.   await request(
    ; w: k, ]+ Y5 D. Q
  5.     'web_app_invoke_custom_method',4 `: L8 `  {$ U( k; g. V$ ?7 v" F' e
  6.     'custom_method_invoked',
    & N% W* ]+ ^/ e$ y% g% A: V
  7.     {3 g% c! S  M3 `' U0 L& S
  8.       timeout: 5000,
    # ?; O7 V5 K1 u* O
  9.       params: {2 T* s7 k; C: K/ x
  10.         req_id: '1',) Y7 y" @6 t0 \1 W+ \! `2 }
  11.         method: 'deleteStorageValues',. y4 X, B# N3 }& I
  12.         params: { keys: ['a'] },
    / \3 I/ f9 X6 j% J5 Y+ |
  13.       },( @4 x7 H  Y$ k, }( \0 C2 K1 Z; k1 z
  14.     },# V' y' [0 W6 Q: B( w, V0 d
  15.   );
    ! b1 P' T' ]' ]8 @& z7 ~
  16. } catch (e) {/ B! J1 p! m$ I7 ~( _
  17.   console.error(e); // TypedError with e.type === 'ERR_TIMED_OUT'
    , K9 e  Q8 ]+ Q6 a6 \; x# M
  18. }
复制代码
capture

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

  1. const slug = 'jjKSJnm1k23lodd';  m5 v  y+ j( v, r8 w; e

  2. : I$ y1 Y9 Y- `# T# R) ~! A
  3. request('web_app_open_invoice', 'invoice_closed', {' f, t$ b& I# q. q/ R0 z
  4.   params: { slug },9 g0 x/ ]% E; t2 j" ?$ ?
  5.   capture(data) {
    8 L  S! d2 s; c0 S5 R7 S: e
  6.     return slug === data.slug;
    + `! m; {: h, R2 [( u6 \
  7.   },
    ( ^5 }5 A9 G3 V3 t+ `8 I
  8. });
复制代码

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

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

7 S5 o( ]+ N0 E/ F) z$ R
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则