跳到主要内容

建立连接

应用检测到 Provider 后,可以向 UKey Wallet 发起连接请求。用户确认后,应用会获得当前 Solana 账户公钥,并可继续请求签署消息发送交易

首次授权后,当前站点会被记录为已授权应用。后续访问时,应用可以尝试静默重连;用户也可以在钱包中撤销授权或主动断开连接。

连接

连接到 UKey Wallet 的建议最简单的方式是调用 window.$ukey.solana.connect()。不过,Provider 也暴露了 request JSON RPC 接口。

使用 connect 方法

const provider = getProvider(); // 这个辅助函数可参考“检测 Provider”一节
try {
const resp = await provider.connect();
console.log(resp.publicKey.toString());
// 返回值参考类似于:26qv4GCcx98RihuK3c4T6ozB3J7L6VwCuFVc7Ta2A3Uo
} catch (err) {
// 返回参考:{ code: 4001, message: 'User rejected the request.' }
}

用 request

const provider = getProvider(); // 这个辅助函数可参考“检测 Provider”一节
try {
const resp = await provider.request({ method: "connect" });
console.log(resp.publicKey.toString());
// 返回值参考类似于:26qv4GCcx98RihuK3c4T6ozB3J7L6VwCuFVc7Ta2A3Uo
} catch (err) {
// 返回参考:{ code: 4001, message: 'User rejected the request.' }
}

connect() 返回一个 Promise。用户同意时 Promise resolve,并返回 publicKey;用户拒绝或关闭弹窗时 Promise reject,常见错误码为 4001

连接成功后,Provider 也会触发 connect 事件。

provider.on("connect", () => console.log("连接流程已完成!"));

连接完成后,应用可以读取 provider.publicKeyprovider.isConnected,用于更新连接状态。

console.log(provider.publicKey.toString());
console.log(provider.isConnected);
// 布尔参考片段:true

自动重连

应用首次获得授权后,可以在后续访问或页面刷新时尝试自动连接。这个过程不会弹出确认窗口,适合页面初始化时恢复已连接状态。

实现方式是在 connect() 调用中传入 onlyIfTrusted

使用 connect 方法

provider.connect({ onlyIfTrusted: true });

用 request

window.$ukey.solana.request({
method: "connect",
requestParams: { onlyIfTrusted: true },
});

带有 onlyIfTrusted 时,UKey Wallet 只会在站点已获授权的情况下完成重连并触发 connect。如果未授权,会返回 4001 并保持断开状态,但不会打开弹窗。

下面是 React 中恢复连接状态的参考片段:

import { useEffect } from "react";

useEffect(() => {
// 如果已经授权就自动连上;没授权就保持静默。
provider.connect({ onlyIfTrusted: true })
.then(({ publicKey }) => {
// 在这里处理自动重连成功的情况
});
.catch(() => {
// 这里按普通失败分支处理即可
})
}, []);

如果用户在钱包设置中撤销站点授权,下次连接就需要重新弹出确认。应用应同时支持静默重连失败和手动连接两种状态。

断连

应用可以主动断开连接,用户也可能在钱包侧断开。收到断开事件后,请清理本地公钥和依赖账户的状态。

使用 disconnect 方法

provider.disconnect();

用 request

provider.request({ method: "disconnect" });

下面这段参考代码展示如何监听连接和断开事件:

import { useState, useEffect } from "react";

const [pubKey, setPubKey] = useState(null);

useEffect(() => {
// 用户连上后,把公钥先存起来
provider.on("connect", (publicKey) => {
setPubKey(publicKey);
});

// 用户断开连接后清空输入其公钥
provider.on("disconnect", () => {
setPubKey(null);
});
}, [provider]);

切换账户

用户可能在 UKey Wallet 中管理多个 Solana 账户。每次切换账户时,Provider 会触发 accountChanged

如果新账户已经授权当前站点,事件会带上新的 PublicKey,应用可以直接刷新账户状态:

provider.on("accountChanged", (publicKey) => {
if (publicKey) {
// 更新公钥后继续正常流程
console.log(`当前账户已切换为 ${publicKey.toBase58()}`);
}
});

如果事件没有携带公钥,说明当前站点未获得新账户授权。应用可以保持断开状态,也可以提示用户重新连接:

provider.on("accountChanged", (publicKey) => {
if (publicKey) {
// 更新公钥后继续正常流程
console.log(`当前账户已切换为 ${publicKey.toBase58()}`);
} else {
// 尝试重新向 UKey Wallet 发起连接
provider.connect().catch((error) => {
// 在这里处理连接失败
});
}
});