接收
MiniProgramSDKHandshakeState 的处理函数。
注册期间会在本函数返回前同步调用一次:connecting 表示初始握手仍在进行,ready 表示成功,
failed.error 是原始
HbMiniProgramSDKError。
从默认 SDK 状态 store 移除当前 handler 的 unsubscribe。调用一次或多次都返回 void 且
不会抛错;取消后不再接收未来迁移,但不会撤销已经同步回放的当前状态。
订阅是纯本地同步操作,不发送 bridge 请求、不等待握手,也无需在
package.json#heybox.permissions 中声明权限或保留可信用户手势。根包导入时握手已经自动启动;
本 API 用于观察状态,不用于主动发起或重试握手。
handler 会在加入订阅集合后、unsubscribe 返回前立即同步收到当前冻结状态:
connecting:先立即收到 connecting,随后至多再收到一次 ready 或 failed;ready 或 failed:立即收到该终态,之后不会再迁移;状态只允许 connecting -> ready 或 connecting -> failed,终态不回退。failed.error 是握手失败
和同步环境读取使用的同一个原始错误实例,可按稳定的 code 分支处理。ready 只表示初始握手
已成功;后续 unload 不会把状态改回 failed,因此它不是 Runtime 持续存活探针。
SDK 会逐个捕获 handler 的同步异常:初次即时回放或终态通知中抛错,都不会从本函数传播、改变 状态、阻断握手 Promise 或阻止其他订阅者收到通知。handler 返回值会被忽略,Promise 也不会被 等待;异步 handler 应在自身内部捕获 rejected Promise,避免未处理拒绝。
每个 handler 以 Set 语义保存;同一函数引用重复订阅只有一个未来通知注册,但每次调用本函数仍会
同步回放当前状态,任一 unsubscribe 都会移除该注册。应在页面、组件或业务模块销毁时调用
unsubscribe。SDK 内部销毁会清空全部状态订阅;若销毁发生在握手落定前,会先发布携带
SDK_DESTROYED 的 failed,再清空订阅。此后重复调用已经返回的 unsubscribe 仍是安全空操作。
unload 发生在握手前时则以 RUNTIME_UNAVAILABLE 落为 failed;发生在 ready 后不会产生
第二次状态通知。
与 getHandshakeState() 相比,本 API 适合让 UI 自动跟随 唯一一次迁移,且即时回放意味着通常不需要先额外读取一次状态。 on('ready') 则是不可重放、可能因 Host 重复事件再次触发的边沿通知, 不应用于驱动晚挂载按钮的可用状态。
SDK 会在发布 ready 状态前缓存环境快照,因此可以在 ready handler 中立即调用
environment.getInfoSync()。在 failed handler 中调用该
API 会抛出同一个 state.error;一般异步读取可使用
environment.getInfo() 自动等待。
import hbSDK from '@heybox/hb-sdk'
const stop = hbSDK.onHandshakeStateChange(state => {
switch (state.status) {
case 'connecting':
submitButton.disabled = true
statusText.textContent = '正在连接'
break
case 'ready':
submitButton.disabled = false
statusText.textContent = hbSDK.environment.getInfoSync().runtime.mode
break
case 'failed':
submitButton.disabled = true
statusText.textContent = `连接失败:${state.error.code}`
break
}
})
// 页面或组件真正销毁时执行;重复取消也安全。
window.addEventListener('unload', () => {
stop()
stop()
}, { once: true })
ready handler 中同步读取环境。
订阅默认 SDK 实例的握手状态,并立即接收当前状态。