# 飞书 webview 打开/下载文件铁律（2026-09-10）

## 症状
工作台 AI 助手生成的拜访卡/HTML 文件，点「👁 打开」没反应（用户反馈"已生成的拜访卡都无法打开"）。

## 根因
`👁 打开`用 `apiFetch(...).then(function(blob){ window.open(URL.createObjectURL(blob), '_blank'); })` ——
`window.open` 在**异步 promise 回调里调用**，被浏览器/飞书 webview 的弹窗拦截器静默拦截，点开无任何反应。

## 修复
不用 `window.open`，改成**全屏覆盖预览**：
```javascript
var overlay = document.createElement('div');
overlay.style.cssText = 'position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999;background:#fff;display:flex;flex-direction:column';
overlay.innerHTML = '<div>📄标题 + 📎下载 + ✕关闭</div>' + '<iframe src="'+blobUrl+'" style="flex:1;width:100%;border:0"></iframe>';
document.body.appendChild(overlay);
```
iframe 同页面内嵌，飞书 webview 不拦截。

## 教训
- 凡是"异步回调里打开新窗口/触发下载"，用**当前页面内的覆盖层 + iframe**，不要依赖 window.open（只有同步用户手势里 window.open 才可靠，异步必被拦）。
- 「📎 下载」用 `a.download` 在飞书 webview 也可能失效，兜底放"复制内容"或全屏预览里的下载链接。
