方法与事件 本节 SDK 涵盖与 apps communication 相关的主题。 调用方法要调用 Telegram 小应用程序的方法,开发人员应使用 postEvent 函数: - import { postEvent } from '@telegram-apps/sdk';
7 G* U8 M/ B W7 ]; @ - : J6 Y8 }8 b0 j% A& P1 X
- postEvent('web_app_setup_back_button', { is_visible: true });
复制代码 该功能会根据当前 环境功能自动找到发送该事件的正确方法。 为提高准确性,它可确定当前的 Telegram 应用类型,并 选择适当的流量。request如果需要调用某些 Telegram 小应用程序方法 并接收指定事件,则应使用 request 函数。 例如,开发人员希望 调用 web_app_request_viewport 方法并捕获 viewport_changed 事件,以接收实际的视口数据。 - import { request } from '@telegram-apps/sdk';
# E$ j) t9 w4 F5 \* F H
) l1 k& c6 e, \# }3 V0 z- const viewport = await request({; C; D9 X& g! U6 ` B3 _5 ]
- method: 'web_app_request_viewport',7 Y4 B/ N' S2 L
- event: 'viewport_changed'; u; R! f: s0 e' \
- });
; C1 [. _7 {2 t" V7 h) Y
) ~1 \) m! ~5 P9 w" y- console.log(viewport);! W' |% n% p9 S8 m! G
- // Output:
$ u, I! ?# l2 [' { - // {
* l1 | p' x. u4 o - // is_state_stable: true,
- h3 b. T; Z2 Q& ^; g6 P" q8 Z - // is_expanded: false,: r+ C& N# O# N s0 I
- // height: 3203 N$ ]! L# G9 r( h
- // };
复制代码如果 Telegram 小应用程序方法接受参数,则应在第三个参数的 params 属性中传递这些参数: " e( ~9 w8 M/ Q( |- e2 a% D
- import { request } from '@telegram-apps/sdk';
: H9 e; k0 q) H. ?9 U
. g( Q& l" ^9 V' s- {! Q4 q- const buttonId = await request({
8 X! }9 u* @) h - method: 'web_app_open_popup',
) I. I! E( j: a - event: 'popup_closed',
- O0 v3 e( A/ Z0 |( v - params: {" f1 g/ n7 V! |# J" O% F; P: N. u
- title: 'Caution',2 Y- g8 a& W" V$ {
- message: 'Should we delete you account?',
: R- x5 h5 t+ r" X& s [ - buttons: [
h$ h0 P# D. N3 {9 e- D. F5 T - { id: 'yes', type: 'ok' },
/ m' _: F T$ d3 k- P8 l5 b - { id: 'no', type: 'cancel' },
- j# J* A5 F+ W3 y: o4 v5 I) P" | - ],
8 Q+ y7 ^% `# u5 y/ Y' } - },( h5 J$ D- u; T8 E% b5 E
- });
复制代码此外,您还可以同时跟踪多个事件: 2 F( v% {5 B% ?( [
- import { request } from '@telegram-apps/sdk';! G+ p- o: {+ z2 E2 ^( {4 T% Z+ B
+ `( V' J9 r8 F2 i6 o+ r# X- const result = await request({
H- c! R/ K% n: f# N8 H - method: 'web_app_open_scan_qr_popup',' Z7 J c5 J$ r" W9 V
- event: ['qr_text_received', 'scan_qr_popup_closed'],* J- [ }. H6 s0 m& G# u" H' l
- });( w1 u$ V# s r6 @8 ?/ {
' T5 h: R7 Z! i% K# x- // result will either be qr_text_received or
2 p/ @* m V! Y( X - // scan_qr_popup_closed events payload.
复制代码该函数允许传递其他选项,如 postEvent、timeout 和 capture。
9 w! m3 s: U" B- t5 ?7 z3 H- |postEvent我们使用 postEvent 选项重写方法,该方法用于调用 Telegram 迷你应用程序 方法。 - import { request, createPostEvent } from '@telegram-apps/sdk';- I+ ]/ o& f% s7 Q0 I
; u( t+ n0 y0 { w2 r- request({
; l7 k3 j: ~# [ O5 R - method: 'web_app_request_viewport',
6 Q5 o. [7 |8 e - event: 'viewport_changed',
! @* v. M# V2 z# I. j - postEvent: createPostEvent('6.5'),
% C" x4 S) F' _7 z4 P - });
复制代码 timeouttimeout 选项负责分配请求超时。 如果超时,则会出现错误。 - import { request, isTimeoutError } from '@telegram-apps/sdk';# ^* R' X }/ y5 a1 p, ~
' l: R. \( S5 V3 }- try {" {% w$ J( |2 j" a2 K, \1 [* d; F
- await request({
: e- H/ F6 v+ v! r% N - method: 'web_app_invoke_custom_method',7 A8 X9 ^+ l4 A, _6 O1 u: m
- event: 'custom_method_invoked',
/ u( i1 h' |7 C5 j K1 ~6 l - timeout: 5000,4 f0 r: z. h ^2 C9 Z# A, I
- params: {% t& P3 u; }. U. P8 p8 S$ l. n$ E( J
- req_id: '1',
% z& z# G9 Y& W+ q$ W$ J - method: 'deleteStorageValues',
% j/ l9 x& A" J3 { - params: { keys: ['a'] },6 j9 Q9 {$ J5 Q
- },1 h$ z1 \ F1 K/ N( H$ I" l
- });/ N9 W) q. V7 `
- } catch (e) {4 J0 @* D! b3 j4 U Q
- console.error(isTimeoutError(e) ? 'Timeout error' : 'Some different error', e);9 @' l* U) G% n7 N, @
- }
复制代码 capturecapture 属性是一个函数,允许开发人员确定是否应捕获 Mini Apps 事件并从 request 函数中返回: - const slug = 'jjKSJnm1k23lodd';
3 B( G; P& a2 U- z) ? - ; }5 z9 Q# z- `' B' f1 {5 n
- request({
/ C& B9 q' k) E - method: 'web_app_open_invoice',3 \+ k4 U `' P/ R8 Y
- event: 'invoice_closed',4 t4 N" s: E" p: l
- params: { slug },
( u5 v. ~% J3 U. f8 G3 p# K( [ - capture(data) {
3 H4 t& B& J. f* {* M: `! l2 w5 \' q - return slug === data.slug;
" r- c: p8 D: u- M( O - },
' \' R4 ?: g( h I1 J5 e9 h - });
复制代码 默认情况下,request 函数会捕获带有所需名称的第一个事件。 在 的情况下,request 函数只有在事件具有预期的标签时才会捕获事件。8 u- e* H* L, S; M" s8 \) _9 L1 j; Z
调用自定义方法自定义方法是 Telegram 迷你应用程序 web_app_invoke_custom_method 方法可以使用的方法。 invokeCustomMethod 函数简化了此类方法的使用,并重复使用了 request 函数。 以下是不使用该函数的代码示例: - import { request } from '@telegram-apps/sdk';
( e4 b$ b: c1 n! i$ S y; B( L/ | - 0 Y3 `5 s0 T" j5 F, n
- const reqId = 'ABC';
5 ]( r! o& w3 e. G - % D- }' S% J# {/ R0 o
- request({# m3 B$ b1 w7 }! L- u2 E X8 k' a' }
- method: 'web_app_invoke_custom_method',: X. S o* T! P$ I) R
- event: 'custom_method_invoked',8 n! z; f& `8 u# |
- params: {9 H2 y1 v/ f$ ^; j' E) ?
- req_id: reqId,4 q8 u1 R5 Y5 M
- method: 'deleteStorageValues',7 I. R8 u4 q+ X* {0 q3 J
- params: { keys: ['a'] },
- Y0 A8 f$ z4 A+ ?5 V - },( Q# i9 y( |' ~' j# V; g
- capture(data) {/ d# j! U3 F! v
- return data.req_id === reqId;" ?' d- L$ e' Y" n# g: S$ c
- }8 f' t" L+ n! N' z9 B6 `+ Q9 z3 X
- });
复制代码 这样,我们就可以使用 invokeCustomMethod 函数重写它了:1 r6 L3 m# l K
9 [) O0 \, b: k) l- import { invokeCustomMethod } from '@telegram-apps/sdk';4 a8 G# O" `$ d) \% ?5 k
- 3 J% c0 ` K) U' b1 h% V; Z/ |, j: J
- 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 函数的基本用法 - import { on } from '@telegram-apps/sdk';
: G2 G! K1 Y& M - ' {9 m1 m( q' q5 f- Z, [
- // Start listening to "viewport_changed" event. Returned value4 V f* |/ S G
- // is a function, which removes this event listener.1 [8 {+ ]: L; [* s" i
- const removeListener = on('viewport_changed', payload => {
& H" v, u/ u- [' U$ i9 B0 n - console.log('Viewport changed:', payload);
% ] R( ~* D; }6 P( j5 D/ X" w - });
$ X; S/ V# v, }4 `3 b - 5 |, C- g- y+ t7 e& t3 z
- // Remove this event listener.
3 d# k) ^, G5 i/ @. j% m( j - removeListener();
复制代码要停止监听事件,开发人员也可以使用 off 函数:
% f0 ~. l, m w+ K2 Z- import { on, off, type MiniAppsEventListener } from '@telegram-apps/sdk';
7 }% g" b3 X, ?) n# k* P$ ~ K' T - . R( b9 p$ ^8 ?& j) S2 g- [ Q% Z$ q k
- const listener: MiniAppsEventListener<'viewport_changed'> = payload => {2 @4 k3 p3 T1 U3 Z
- console.log('Viewport changed:', payload);+ J( H+ H8 ?5 l$ W8 [8 t9 _4 x
- };3 g/ Q9 ]# K, m* P. n+ x5 `, C6 S
- - B0 }& q* ?! c n- x1 G- B
- // Start listening to event.
) k W9 t0 a: o - on('viewport_changed', listener);8 R' O) a# H' G+ d$ x' ]! q( y
. E) e" g. z" a3 @8 f% x- // Remove event listener.- g/ L$ F7 Q) @3 p
- off('viewport_changed', listener);
复制代码要只调用监听器一次,请使用第三个布尔参数。
3 h0 ?* J- X; j ], W2 |- import { on } from '@telegram-apps/sdk';' s/ B6 E N7 S
- / \4 B/ y8 V. G' y1 o
- // Will be automatically removed after the first listener execution.0 C7 \+ ]2 ]' V1 G# V
- on('viewport_changed', (payload) => {/ F* @% T9 t6 a6 r
- console.log('Viewport changed:', payload);
& g# H" ^) ~ m - }, true);
复制代码 subscribe 和 unsubscribe要监听从本地 Telegram 应用程序发送的所有事件,开发人员应使用 subscribe 和 unsubscribe: - import {+ v; m2 T3 F. A$ n0 K: C& B' Z
- subscribe,4 b2 T0 [5 g8 g7 r/ J( S% d
- unsubscribe,
9 X: R8 t" h# |7 }5 I* r - type MiniAppsGlobalEventListener,
- d2 M9 I# Q7 s f2 S: `1 Y - } from '@telegram-apps/sdk';
6 o; z* R; j5 P- |" @
) f) c5 Z V- [& ~- const listener: MiniAppsSubscribeListener = (event) => {4 j$ i9 U& f( Z2 {& i" ~
- console.log('Received event', event);- T0 x+ O4 ~- d& X1 c# m
- };9 \5 ?5 Z h' v
$ q& D7 c% c, `# J- // Listen to all events.: c5 e0 T; D2 F4 Z
- subscribe(listener);* F% B8 R x" N- L9 H7 t
; K2 r! a+ ~( J: o5 b2 [) G- // Remove this listener.
3 g! |+ M4 ^% ~1 j0 j% L) s - unsubscribe(listener);
复制代码 监听器接受一个包含 name 和 payload 属性的对象,这些属性是迷你应用程序 事件名称和有效载荷。
+ N5 d, O) \1 w& {( A2 w检查方法支持postEvent 函数本身未检查当前本地 Telegram 应用程序是否支持指定方法。 为此,开发人员可以使用 supports 函数,该函数接受 Mini Apps 方法名称和当前平台版本: - import { supports } from '@telegram-apps/sdk';" @$ ^$ m" ^$ R! _ e+ s% z
- 7 j0 [2 Y @6 n7 O( k+ H2 w
- supports('web_app_trigger_haptic_feedback', '6.0'); // false2 A$ P, B* X v; {! q. ]6 T
- supports('web_app_trigger_haptic_feedback', '6.1'); // true
复制代码supports 函数还允许检查方法参数中的指定参数是否受 支持:
; [2 l& m, J# E: L% d- import { supports } from '@telegram-apps/sdk';
8 l2 d3 I% S4 P v - / p0 r" I' g$ _& X
- supports('web_app_open_link', 'try_instant_view', '6.0'); // false
) Q( g5 J. n* ^- o - supports('web_app_open_link', 'try_instant_view', '6.7'); // true
复制代码TIP 建议在调用 Mini Apps 方法之前使用该函数,以防止应用程序出现 停顿和其他意外行为。 创建更安全的 postEvent该软件包包含一个名为 createPostEvent 的函数,它将当前 Mini Apps 版本作为输入。 它返回 postEvent 函数,内部检查是否支持指定的 方法和参数。 如果不是,函数将出错。 - import { createPostEvent } from '@telegram-apps/sdk';
9 ]* ^4 M" {9 A' D1 Z7 H
" e' x6 U7 z9 Y* ~( z: X j3 I- const postEvent = createPostEvent('6.5');5 W! d- m; O8 s' D9 Q# o- Z) l
1 Q! k3 Q! z; @! D- // Will work fine.% V( T5 U0 s& Q6 N$ b9 V9 s2 A
- postEvent('web_app_read_text_from_clipboard');
8 V! s- ~1 j2 p/ | V - & f* R! o. Q( p8 ` m
- // Will throw an error., F) h5 {4 H1 B% T7 s* C- |9 f
- postEvent('web_app_request_phone');
复制代码 强烈建议使用此 postEvent 生成器,以确保方法调用按照 的预期运行。
4 L( s- [ ]$ ~8 w$ B" i调试软件包支持启用调试模式,从而记录与事件 处理相关的信息。 要更改调试模式,请使用setDebug函数: - import { setDebug } from '@telegram-apps/sdk';1 H j* t! U/ l8 r
- $ O: |0 L) U5 i
- setDebug(true);
复制代码 目标源如果软件包在浏览器环境(iframe)中使用,则软件包会使用 函数 window.parent.postMessage 。 此功能需要指定目标来源,以确保 事件只发送到受信任的父 iframe。 默认情况下,软件包 使用 https://web.telegram.org 作为原点。 开发人员应使用 setTargetOrigin 函数将事件传输到其他来源: - import { setTargetOrigin } from '@telegram-apps/sdk';9 c. ?# ]$ |- v( l7 O9 b6 V- X$ S
( Q, U1 o1 F( \9 z9 @- 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 |