你写了个小工具,用户复制了一段文字想直接发到微信或钉钉,结果点完‘分享’没反应——不是按钮坏了,是分享功能压根没接上。
先搞清‘分享’到底在干啥
所谓文本分享,本质就是把一段字符串,丢给系统级的分享服务。Windows 上走 Clipboard API 或 ShellExecute;macOS 走 NSPasteboard;Android 是 Intent;iOS 是 UIActivityViewController。跨平台框架(比如 Electron、Flutter)得靠桥接层兜底。
Web 端最常用的三招
网页里想让用户一点就复制+唤起分享面板,别硬写原生弹窗,直接用浏览器原生能力:
navigator.clipboard.writeText('你好,这是要分享的内容').then(() => {
console.log('已复制');
if (navigator.share) {
navigator.share({
title: '分享标题',
text: '你好,这是要分享的内容'
});
}
});注意:navigator.share 只在 HTTPS 环境和移动浏览器(Chrome/Edge/Safari iOS 16.4+)生效,桌面端多数不支持,得降级到复制+提示“请粘贴到聊天窗口”。
Electron 桌面应用怎么破
Electron 里不能直接调 navigator.share,但可以借主进程调系统接口:
// 渲染进程
window.api.shareText('订单号:20240517-8891');
// 主进程(main.js)
ipcMain.handle('shareText', async (e, text) => {
await clipboard.writeText(text);
// Windows 下可额外调用 shell.openExternal('ms-chat:?body=' + encodeURIComponent(text))
});如果想更进一步——比如点击后自动打开微信客户端并填好内容,就得走 deep link。微信 PC 版支持 weixin://send?text=xxx(需安装并注册协议),但实际成功率不高,稳妥做法还是复制后引导用户手动粘贴。
移动端绕不开的权限和兼容坑
Android 13+ 要求显式声明 android.permission.POST_NOTIFICATIONS 才能弹分享面板;iOS 上若 App 没启用 Background Modes,分享回调可能丢失。实测发现:华为手机对 navigator.share 支持率偏低,vivo 和 OPPO 倒是挺稳。遇到不支持的,就 fallback 到 document.execCommand('copy')(虽然已被弃用,但老机型还得靠它)。
最后提醒一句:别在分享前加一堆埋点逻辑卡住主线程。用户点一下就想发出去,等半秒都嫌慢——把日志打到异步队列里,分享动作本身必须快。