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

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

回答

收藏

Telegram 小程序 | TypeScript @telegram-apps/bridge | 调用自定义方法

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

自定义方法是指可与 web_app_invoke_custom_method 迷你应用程序 方法一起使用的方法。

invokeCustomMethod 函数通过重复使用 request 函数,简化了此类方法的使用。

下面是一个不使用该函数的示例:

  1. const reqId = 'ABC';
    # J8 F7 s8 h/ W2 ?' W

  2.   R6 e0 z" e7 e
  3. request('web_app_invoke_custom_method', 'custom_method_invoked', {
    0 w2 L/ \( y# T4 B% u
  4.   params: {
    , D! X! T" X6 Z( O1 y1 x( F
  5.     req_id: reqId,
    # D- z+ ]% `% I
  6.     method: 'deleteStorageValues',
    & R1 J1 h8 ?: T  C1 P: u! y
  7.     params: { keys: ['a'] },
    ! Z) v1 s( }. u
  8.   },
      X- ^4 s9 G" \, H+ S
  9.   capture(data) {
    / H  T7 ]$ c, M: U- ^
  10.     return data.req_id === reqId;/ l- J! t8 P5 S5 G- n; i+ y: c
  11.   }
    & ~0 y! x# q; J4 ^: E& ]
  12. });
    9 n! h/ B0 y( j: p
复制代码

现在,使用 invokeCustomMethod 函数重新编写:


( G+ J& a; s' H; T0 l* K4 z
  1. import { invokeCustomMethod } from '@telegram-apps/bridge';& N- z3 E% r& K7 K- q4 E- y6 q
  2. 4 E& ^( a( `, W% Q
  3. invokeCustomMethod('deleteStorageValues', { keys: ['a'] }, 'ABC');
复制代码

在内部,它只是封装了与方法相关的特定逻辑,因此开发人员不应该 。

与request函数不同,invokeCustomMethod函数会解析结果,并检查 是否包含error属性。 如果是,函数会抛出相应的错误;否则,返回 result 属性。

检查方法支持

postEvent 函数不会检查当前 Telegram 应用程序是否支持指定的方法。 为此,需要使用 supports 函数。

7 @; ^6 ]/ i% T

它接受 Mini Apps 方法名称和当前平台版本:

  1. import { supports } from '@telegram-apps/bridge';
    6 H$ d1 R5 C8 b
  2. / g% ~5 @2 A/ R9 P" t( I' U. u- D
  3. supports('web_app_trigger_haptic_feedback', '6.0'); // false
    : u1 m! M' x4 N# p" Y
  4. supports('web_app_trigger_haptic_feedback', '6.1'); // true
复制代码

  N. o9 b0 Y! A5 v2 X8 L% J" }

supports 函数还可以检查方法参数中的特定参数是否受 支持:

  1. import { supports } from '@telegram-apps/bridge';  n& _; @2 |2 u/ O+ H
  2. 5 [6 o' p5 n) L% d$ z5 S3 d
  3. supports('web_app_open_link', 'try_instant_view', '6.0'); // false( ?7 R3 A9 o) p; t+ _  i
  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/bridge';9 z4 g9 v6 [6 N9 Q1 ?$ r) Z/ g* e
  2. - D3 C4 a9 @7 y( v! A; N
  3. const postEvent = createPostEvent('6.5');# W5 M  i2 e% g+ O/ d0 k

  4. " ~; n: T5 F- |
  5. // Will work fine.
    : _; J) t; X5 u: h
  6. postEvent('web_app_read_text_from_clipboard');
    3 H/ i& Z# n+ w: q) z! b
  7. 0 Z5 ^7 f' _# H! M* w+ _5 r% b
  8. // Will throw an error, this method is not supported 1 b8 H  U4 j; s7 Q1 x2 O
  9. // in Mini Apps version 6.5.- A! G8 l9 L) g6 R. \2 i; C
  10. postEvent('web_app_request_phone');
复制代码

. l* A1 S/ b6 i& D) W% P& T

作为第二个可选参数,函数接受一个回调,如果方法或 参数不支持,则调用该回调。

  1. createPostEvent('6.0', (data) => {
    + @) m$ F2 b! P+ m9 T
  2.   if ('param' in data) {
    3 a* S% c6 o2 i7 H. q/ N
  3.     console.warn(3 k* X  Q  V. m0 {
  4.       'Oops, the parameter', data.param,
    3 S& a/ t7 e9 E& Q! f6 L/ x
  5.       'in method', data.method,
    ! z0 o7 r$ h4 Q0 |" C8 P2 Q
  6.       'is not supported',
    & \4 }& j) ?, D& y1 c
  7.     );
    * s% r' x' M( `4 s$ b, t9 X2 D
  8.   } else {
    4 T. f1 p" J7 G3 t1 Q
  9.     console.warn('Oops, method', data.method, 'is not supported');+ Y+ m/ D  o0 `9 C% h7 s
  10.   }& H, a! S2 e# [1 n  P/ U
  11. });
复制代码

% s3 J, M. K" ]. v( b/ |9 ?! {8 }

若要记录警告而不是抛出错误,可以传递 'non-strict' 值:

  1. createPostEvent('6.0', 'non-strict');
    , N6 q) N3 a7 C' P! z3 `: o2 Y# @; D
复制代码
+ B+ p9 i- ?& }& A5 a

- U" l6 ?& S- s9 |( @) ]* x0 q: u6 G8 J  s9 @4 r
) [5 }+ ?4 v) D) i' w
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则