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

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

回答

收藏

Telegram 小程序 | TypeScript @telegram-apps/sdk @1.x | 方法与事件

开源社区 开源社区 10374 人阅读 | 0 人回复 | 2025-02-23

方法与事件

本节 SDK 涵盖与 apps communication 相关的主题。

调用方法

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

  1. import { postEvent } from '@telegram-apps/sdk';
    7 G* U8 M/ B  W7 ]; @
  2. : J6 Y8 }8 b0 j% A& P1 X
  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/sdk';
    # E$ j) t9 w4 F5 \* F  H

  2. ) l1 k& c6 e, \# }3 V0 z
  3. const viewport = await request({; C; D9 X& g! U6 `  B3 _5 ]
  4.   method: 'web_app_request_viewport',7 Y4 B/ N' S2 L
  5.   event: 'viewport_changed'; u; R! f: s0 e' \
  6. });
    ; C1 [. _7 {2 t" V7 h) Y

  7. ) ~1 \) m! ~5 P9 w" y
  8. console.log(viewport);! W' |% n% p9 S8 m! G
  9. // Output:
    $ u, I! ?# l2 [' {
  10. // {
    * l1 |  p' x. u4 o
  11. //   is_state_stable: true,
    - h3 b. T; Z2 Q& ^; g6 P" q8 Z
  12. //   is_expanded: false,: r+ C& N# O# N  s0 I
  13. //   height: 3203 N$ ]! L# G9 r( h
  14. // };
复制代码

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

" e( ~9 w8 M/ Q( |- e2 a% D
  1. import { request } from '@telegram-apps/sdk';
    : H9 e; k0 q) H. ?9 U

  2. . g( Q& l" ^9 V' s- {! Q4 q
  3. const buttonId = await request({
    8 X! }9 u* @) h
  4.   method: 'web_app_open_popup',
    ) I. I! E( j: a
  5.   event: 'popup_closed',
    - O0 v3 e( A/ Z0 |( v
  6.   params: {" f1 g/ n7 V! |# J" O% F; P: N. u
  7.     title: 'Caution',2 Y- g8 a& W" V$ {
  8.     message: 'Should we delete you account?',
    : R- x5 h5 t+ r" X& s  [
  9.     buttons: [
      h$ h0 P# D. N3 {9 e- D. F5 T
  10.       { id: 'yes', type: 'ok' },
    / m' _: F  T$ d3 k- P8 l5 b
  11.       { id: 'no', type: 'cancel' },
    - j# J* A5 F+ W3 y: o4 v5 I) P" |
  12.     ],
    8 Q+ y7 ^% `# u5 y/ Y' }
  13.   },( h5 J$ D- u; T8 E% b5 E
  14. });
复制代码

此外,您还可以同时跟踪多个事件:

2 F( v% {5 B% ?( [
  1. import { request } from '@telegram-apps/sdk';! G+ p- o: {+ z2 E2 ^( {4 T% Z+ B

  2. + `( V' J9 r8 F2 i6 o+ r# X
  3. const result = await request({
      H- c! R/ K% n: f# N8 H
  4.   method: 'web_app_open_scan_qr_popup',' Z7 J  c5 J$ r" W9 V
  5.   event: ['qr_text_received', 'scan_qr_popup_closed'],* J- [  }. H6 s0 m& G# u" H' l
  6. });( w1 u$ V# s  r6 @8 ?/ {

  7. ' T5 h: R7 Z! i% K# x
  8. // result will either be qr_text_received or
    2 p/ @* m  V! Y( X
  9. // scan_qr_popup_closed events payload.
复制代码

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


9 w! m3 s: U" B- t5 ?7 z3 H- |postEvent

我们使用 postEvent 选项重写方法,该方法用于调用 Telegram 迷你应用程序 方法。

  1. import { request, createPostEvent } from '@telegram-apps/sdk';- I+ ]/ o& f% s7 Q0 I

  2. ; u( t+ n0 y0 {  w2 r
  3. request({
    ; l7 k3 j: ~# [  O5 R
  4.   method: 'web_app_request_viewport',
    6 Q5 o. [7 |8 e
  5.   event: 'viewport_changed',
    ! @* v. M# V2 z# I. j
  6.   postEvent: createPostEvent('6.5'),
    % C" x4 S) F' _7 z4 P
  7. });
复制代码
timeout

timeout 选项负责分配请求超时。 如果超时,则会出现错误。

  1. import { request, isTimeoutError } from '@telegram-apps/sdk';# ^* R' X  }/ y5 a1 p, ~

  2. ' l: R. \( S5 V3 }
  3. try {" {% w$ J( |2 j" a2 K, \1 [* d; F
  4.   await request({
    : e- H/ F6 v+ v! r% N
  5.     method: 'web_app_invoke_custom_method',7 A8 X9 ^+ l4 A, _6 O1 u: m
  6.     event: 'custom_method_invoked',
    / u( i1 h' |7 C5 j  K1 ~6 l
  7.     timeout: 5000,4 f0 r: z. h  ^2 C9 Z# A, I
  8.     params: {% t& P3 u; }. U. P8 p8 S$ l. n$ E( J
  9.       req_id: '1',
    % z& z# G9 Y& W+ q$ W$ J
  10.       method: 'deleteStorageValues',
    % j/ l9 x& A" J3 {
  11.       params: { keys: ['a'] },6 j9 Q9 {$ J5 Q
  12.     },1 h$ z1 \  F1 K/ N( H$ I" l
  13.   });/ N9 W) q. V7 `
  14. } catch (e) {4 J0 @* D! b3 j4 U  Q
  15.   console.error(isTimeoutError(e) ? 'Timeout error' : 'Some different error', e);9 @' l* U) G% n7 N, @
  16. }
复制代码
capture

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

  1. const slug = 'jjKSJnm1k23lodd';
    3 B( G; P& a2 U- z) ?
  2. ; }5 z9 Q# z- `' B' f1 {5 n
  3. request({
    / C& B9 q' k) E
  4.   method: 'web_app_open_invoice',3 \+ k4 U  `' P/ R8 Y
  5.   event: 'invoice_closed',4 t4 N" s: E" p: l
  6.   params: { slug },
    ( u5 v. ~% J3 U. f8 G3 p# K( [
  7.   capture(data) {
    3 H4 t& B& J. f* {* M: `! l2 w5 \' q
  8.     return slug === data.slug;
    " r- c: p8 D: u- M( O
  9.   },
    ' \' R4 ?: g( h  I1 J5 e9 h
  10. });
复制代码
默认情况下,request 函数会捕获带有所需名称的第一个事件。 在 的情况下,request 函数只有在事件具有预期的标签时才会捕获事件。8 u- e* H* L, S; M" s8 \) _9 L1 j; Z
调用自定义方法

自定义方法是 Telegram 迷你应用程序 web_app_invoke_custom_method 方法可以使用的方法。 invokeCustomMethod 函数简化了此类方法的使用,并重复使用了 request 函数。

以下是不使用该函数的代码示例:

  1. import { request } from '@telegram-apps/sdk';
    ( e4 b$ b: c1 n! i$ S  y; B( L/ |
  2. 0 Y3 `5 s0 T" j5 F, n
  3. const reqId = 'ABC';
    5 ]( r! o& w3 e. G
  4. % D- }' S% J# {/ R0 o
  5. request({# m3 B$ b1 w7 }! L- u2 E  X8 k' a' }
  6.   method: 'web_app_invoke_custom_method',: X. S  o* T! P$ I) R
  7.   event: 'custom_method_invoked',8 n! z; f& `8 u# |
  8.   params: {9 H2 y1 v/ f$ ^; j' E) ?
  9.     req_id: reqId,4 q8 u1 R5 Y5 M
  10.     method: 'deleteStorageValues',7 I. R8 u4 q+ X* {0 q3 J
  11.     params: { keys: ['a'] },
    - Y0 A8 f$ z4 A+ ?5 V
  12.   },( Q# i9 y( |' ~' j# V; g
  13.   capture(data) {/ d# j! U3 F! v
  14.     return data.req_id === reqId;" ?' d- L$ e' Y" n# g: S$ c
  15.   }8 f' t" L+ n! N' z9 B6 `+ Q9 z3 X
  16. });
复制代码
这样,我们就可以使用 invokeCustomMethod 函数重写它了:1 r6 L3 m# l  K

9 [) O0 \, b: k) l
  1. import { invokeCustomMethod } from '@telegram-apps/sdk';4 a8 G# O" `$ d) \% ?5 k
  2. 3 J% c0 `  K) U' b1 h% V; Z/ |, j: J
  3. invokeCustomMethod('deleteStorageValues', { keys: ['a'] }, 'ABC');
复制代码
invokeCustomMethod('deleteStorageValues', { keys: ['a'] }, 'ABC');3 i9 ?: \8 k' m* \. l9 z; ?

与request函数相反,invokeCustomMethod函数解析结果,并 检查是否包含error属性。 如果出现这种情况,函数将抛出相应的 错误。 否则,将返回 result 属性。

事件监听on 和 off

要开始处理事件,开发人员可以使用 on 和 off 函数。 下面是 on 函数的基本用法

  1. import { on } from '@telegram-apps/sdk';
    : G2 G! K1 Y& M
  2. ' {9 m1 m( q' q5 f- Z, [
  3. // Start listening to "viewport_changed" event. Returned value4 V  f* |/ S  G
  4. // is a function, which removes this event listener.1 [8 {+ ]: L; [* s" i
  5. const removeListener = on('viewport_changed', payload => {
    & H" v, u/ u- [' U$ i9 B0 n
  6.   console.log('Viewport changed:', payload);
    % ]  R( ~* D; }6 P( j5 D/ X" w
  7. });
    $ X; S/ V# v, }4 `3 b
  8. 5 |, C- g- y+ t7 e& t3 z
  9. // Remove this event listener.
    3 d# k) ^, G5 i/ @. j% m( j
  10. removeListener();
复制代码

要停止监听事件,开发人员也可以使用 off 函数:


% f0 ~. l, m  w+ K2 Z
  1. import { on, off, type MiniAppsEventListener } from '@telegram-apps/sdk';
    7 }% g" b3 X, ?) n# k* P$ ~  K' T
  2. . R( b9 p$ ^8 ?& j) S2 g- [  Q% Z$ q  k
  3. const listener: MiniAppsEventListener<'viewport_changed'> = payload => {2 @4 k3 p3 T1 U3 Z
  4.   console.log('Viewport changed:', payload);+ J( H+ H8 ?5 l$ W8 [8 t9 _4 x
  5. };3 g/ Q9 ]# K, m* P. n+ x5 `, C6 S
  6. - B0 }& q* ?! c  n- x1 G- B
  7. // Start listening to event.
    ) k  W9 t0 a: o
  8. on('viewport_changed', listener);8 R' O) a# H' G+ d$ x' ]! q( y

  9. . E) e" g. z" a3 @8 f% x
  10. // Remove event listener.- g/ L$ F7 Q) @3 p
  11. off('viewport_changed', listener);
复制代码

要只调用监听器一次,请使用第三个布尔参数。


3 h0 ?* J- X; j  ], W2 |
  1. import { on } from '@telegram-apps/sdk';' s/ B6 E  N7 S
  2. / \4 B/ y8 V. G' y1 o
  3. // Will be automatically removed after the first listener execution.0 C7 \+ ]2 ]' V1 G# V
  4. on('viewport_changed', (payload) => {/ F* @% T9 t6 a6 r
  5.   console.log('Viewport changed:', payload);
    & g# H" ^) ~  m
  6. }, true);
复制代码
subscribe 和 unsubscribe

要监听从本地 Telegram 应用程序发送的所有事件,开发人员应使用 subscribe 和 unsubscribe:

  1. import {+ v; m2 T3 F. A$ n0 K: C& B' Z
  2.   subscribe,4 b2 T0 [5 g8 g7 r/ J( S% d
  3.   unsubscribe,
    9 X: R8 t" h# |7 }5 I* r
  4.   type MiniAppsGlobalEventListener,
    - d2 M9 I# Q7 s  f2 S: `1 Y
  5. } from '@telegram-apps/sdk';
    6 o; z* R; j5 P- |" @

  6. ) f) c5 Z  V- [& ~
  7. const listener: MiniAppsSubscribeListener = (event) => {4 j$ i9 U& f( Z2 {& i" ~
  8.   console.log('Received event', event);- T0 x+ O4 ~- d& X1 c# m
  9. };9 \5 ?5 Z  h' v

  10. $ q& D7 c% c, `# J
  11. // Listen to all events.: c5 e0 T; D2 F4 Z
  12. subscribe(listener);* F% B8 R  x" N- L9 H7 t

  13. ; K2 r! a+ ~( J: o5 b2 [) G
  14. // Remove this listener.
    3 g! |+ M4 ^% ~1 j0 j% L) s
  15. unsubscribe(listener);
复制代码
监听器接受一个包含 namepayload 属性的对象,这些属性是迷你应用程序 事件名称和有效载荷。
+ N5 d, O) \1 w& {( A2 w检查方法支持

postEvent 函数本身未检查当前本地 Telegram 应用程序是否支持指定方法。 为此,开发人员可以使用 supports 函数,该函数接受 Mini Apps 方法名称和当前平台版本:

  1. import { supports } from '@telegram-apps/sdk';" @$ ^$ m" ^$ R! _  e+ s% z
  2. 7 j0 [2 Y  @6 n7 O( k+ H2 w
  3. supports('web_app_trigger_haptic_feedback', '6.0'); // false2 A$ P, B* X  v; {! q. ]6 T
  4. supports('web_app_trigger_haptic_feedback', '6.1'); // true
复制代码

supports 函数还允许检查方法参数中的指定参数是否受 支持:


; [2 l& m, J# E: L% d
  1. import { supports } from '@telegram-apps/sdk';
    8 l2 d3 I% S4 P  v
  2. / p0 r" I' g$ _& X
  3. supports('web_app_open_link', 'try_instant_view', '6.0'); // false
    ) Q( g5 J. n* ^- o
  4. supports('web_app_open_link', 'try_instant_view', '6.7'); // true
复制代码

TIP

建议在调用 Mini Apps 方法之前使用该函数,以防止应用程序出现 停顿和其他意外行为。

创建更安全的 postEvent

该软件包包含一个名为 createPostEvent 的函数,它将当前 Mini Apps 版本作为输入。 它返回 postEvent 函数,内部检查是否支持指定的 方法和参数。 如果不是,函数将出错。

  1. import { createPostEvent } from '@telegram-apps/sdk';
    9 ]* ^4 M" {9 A' D1 Z7 H

  2. " e' x6 U7 z9 Y* ~( z: X  j3 I
  3. const postEvent = createPostEvent('6.5');5 W! d- m; O8 s' D9 Q# o- Z) l

  4. 1 Q! k3 Q! z; @! D
  5. // Will work fine.% V( T5 U0 s& Q6 N$ b9 V9 s2 A
  6. postEvent('web_app_read_text_from_clipboard');
    8 V! s- ~1 j2 p/ |  V
  7. & f* R! o. Q( p8 `  m
  8. // Will throw an error., F) h5 {4 H1 B% T7 s* C- |9 f
  9. postEvent('web_app_request_phone');
复制代码
强烈建议使用此 postEvent 生成器,以确保方法调用按照 的预期运行。
4 L( s- [  ]$ ~8 w$ B" i调试

软件包支持启用调试模式,从而记录与事件 处理相关的信息。 要更改调试模式,请使用setDebug函数:

  1. import { setDebug } from '@telegram-apps/sdk';1 H  j* t! U/ l8 r
  2. $ O: |0 L) U5 i
  3. setDebug(true);
复制代码
目标源

如果软件包在浏览器环境(iframe)中使用,则软件包会使用 函数 window.parent.postMessage 。 此功能需要指定目标来源,以确保 事件只发送到受信任的父 iframe。 默认情况下,软件包 使用 https://web.telegram.org 作为原点。 开发人员应使用 setTargetOrigin 函数将事件传输到其他来源:

  1. import { setTargetOrigin } from '@telegram-apps/sdk';9 c. ?# ]$ |- v( l7 O9 b6 V- X$ S

  2. ( Q, U1 o1 F( \9 z9 @
  3. setTargetOrigin('https://myendpoint.org');
复制代码


3 H' s1 o1 {1 q! }; H

WARNING

强烈建议不要长期覆盖此值,否则可能导致安全问题。 只有当您知道自己在做什么时,才能指定该值。

' B4 v" _$ i, ^0 Q1 f
% [% h; x) R  ?+ X# D' m
( D- l# T3 b) {' t1 f

2 t9 F0 b- h6 Q. S% @# @8 G
4 w5 J1 b, d& L' E1 j6 W% J8 }) C
" ]$ S" d) V$ g' \: ?) e
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则