建立连接
应用检测到 Provider 后,就可以请求连接到 OneKey。此连接请求将提示用户授权分享其公钥,表明他们愿意进一步交互。用户必须先批准连接请求,应用才能发出其他请求,如签署消息或发送交易。
首次建立权限后,Web 应用的域名将被加入白名单,以便将来的连接请求。连接建立后,可以从应用端和用户端终止连接。
连接
连接到 OneKey 的推荐且最简单的方式是调用 window.$onekey.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 ,当用户接受连接请求时解析,当用户拒绝请求或关闭弹窗时拒绝(await 时抛出)。有关 OneKey 可能发出的错误消息的详细信息,请参阅错误。
当用户接受连接请求时,Provider 也会发出 connect 事件。
provider.on("connect", () => console.log("已连接!"));Web 应用连接到 OneKey 后,将能够读取已连接账户的公钥并提示用户进行其他交易。它还暴露了一个便捷的 isConnected 布尔值。
console.log(provider.publicKey.toString());
console.log(provider.isConnected);
// true自动重连
Web 应用首次连接到 OneKey 后,它就成为已授权的应用。获得授权后,应用可以在后续访问或页面刷新时自动连接到 OneKey,而无需再次提示用户授权。这称为”自动重连”。
要实现这一点,应用应在 connect() 调用中传递 onlyIfTrusted 选项。
使用 connect 方法
provider.connect({ onlyIfTrusted: true });使用 request 方法
window.$onekey.solana.request({ method: "connect", params: { onlyIfTrusted: true }});如果存在此标志,OneKey 只会在应用已获授权时自动重连并发出 connect 事件。如果应用未获授权,OneKey 将抛出 4001 错误并保持断开连接状态,直到提示用户在没有 onlyIfTrusted 标志的情况下连接。无论哪种情况,OneKey 都不会打开弹窗,这使得在所有页面加载时使用都很方便。
以下是 React 应用如何自动重连到 OneKey 的示例。
import { useEffect } from "react";
useEffect(() => {
// 将自动连接到 OneKey,或不执行任何操作。
provider.connect({ onlyIfTrusted: true })
.then(({ publicKey }) => {
// 处理成功的自动重连
});
.catch(() => {
// 照常处理连接失败
})
}, []);有关实时演示,请参阅我们沙盒中的 handleConnect 部分。
如果钱包从已授权的应用断开连接,然后稍后尝试重新连接,OneKey 仍会自动重连。应用获得授权后,只有当用户在”已授权应用”设置中撤销该应用时,OneKey 才会再次要求用户批准连接请求。
断开连接
断开连接与连接的过程相同。但是,钱包也可以发起断开连接,而不是应用本身。
使用 disconnect 方法
provider.disconnect();使用 request 方法
provider.request({ method: "disconnect" });以下是 React 应用如何优雅地处理 disconnect 事件的示例。
import { useState, useEffect } from "react";
const [pubKey, setPubKey] = useState(null);
useEffect(() => {
// 用户连接后存储其公钥
provider.on("connect", (publicKey) => {
setPubKey(publicKey);
});
// 用户断开连接后清除其公钥
provider.on("disconnect", () => {
setPubKey(null);
});
}, [provider]);切换账户
OneKey 允许用户在单个扩展或移动应用中无缝管理多个账户(即密钥对 )。每当用户切换账户时,OneKey 都会发出 accountChanged 事件。
如果用户在已连接到应用时切换账户,且新账户已将该应用加入白名单,则用户将保持连接状态,OneKey 将传递新账户的 PublicKey :
provider.on('accountChanged', (publicKey) => {
if (publicKey) {
// 设置新公钥并照常继续
console.log(`已切换到账户 ${publicKey.toBase58()}`);
}
});如果 OneKey 没有传递新账户的公钥,应用可以不执行任何操作或尝试重新连接:
provider.on('accountChanged', (publicKey) => {
if (publicKey) {
// 设置新公钥并照常继续
console.log(`已切换到账户 ${publicKey.toBase58()}`);
} else {
// 尝试重新连接到 OneKey
provider.connect().catch((error) => {
// 处理连接失败
});
}
});