选项卡应用的应用缓存
应用缓存允许将一些资源和资产保留在内存中,以便在解除冻结应用时使用,从而缩短 Teams 中应用的后续启动时间。
以下各项支持应用缓存:
范围 | 桌面 | iOS | Android |
---|---|---|---|
支持 仅在公共开发人员预览版中可用 |
支持 | 支持 | |
个人 | ✔️ 缓存生存期:30 分钟 | ✔️ | ❌ |
聊天 | ✔️ 缓存生存期:30 分钟 | ✔️ | ❌ |
频道 | ✔️ 缓存生存期:30 分钟 | ✔️ | ❌ |
“会议”选项卡 | ✔️ 缓存生存期:30 分钟 | ✔️ | ❌ |
会议侧面板或会议内应用 | ✔️ 缓存生存期:20 分钟 | ❌ | ❌ |
启用应用缓存
若要启用应用缓存,请执行以下步骤:
调用
teamsCore.registerBeforeUnloadHandler
和teamsCore.registerOnLoadHandler
API。使用
contentUrl
并entityId
传递到加载处理程序,以路由到应用中的正确页面,并调用notifySuccess
或notifyFailure
通知 Teams 客户端应用初始化流已完成。- contentUrl:添加内容页 URL。
- entityId:添加唯一标识符。
释放资源并执行处理程序中
beforeUnload
所需的任何清理,然后调用readyToUnload
回调以通知 Teams 客户端应用卸载流已完成。
下面是想要选择加入应用缓存的应用的首次启动的流程图, (在首次启动应用时注册 load
或 beforeUnload
) :
下面是启动缓存应用的流程图:
选择加入应用缓存时,当用户导航到窗口中应用的不同实例时,将重复使用用于托管嵌入应用的 Web 视图。 当用户离开应用时,用于托管应用的 Web 视图处于隐藏状态,并在用户返回应用时显示。
注意
如果未启用应用缓存,则每次用户启动应用时都会重新创建 Web 视图。
应用无法缓存或从缓存中删除应用的原因有多种,其中一些原因 (此处的数字可能会) 更改:
- 如果系统内存负载较高,则会从缓存中删除该应用。
- 如果缓存的应用数超过最大缓存大小,则会从缓存中删除最早的缓存应用。
- 如果 Teams 在发送通知后 30 秒内未收到
readyToUnload
来自应用的信号,则不会缓存该beforeUnload
应用。 - 如果系统内存小于 4 GB,或者 Windows 上的可用内存小于 1 GB 或 Mac 上的 512 MB,则禁用应用缓存。
- 侧面板是会议中应用缓存的唯一受支持的 frameContext。
- 受邀用户计数超过 20 的会议不支持应用缓存。
- 如果应用无法加载,则不会缓存该应用。
- 在 iOS 上,当 Teams 应用终止时,将从缓存中删除该应用。
代码示例
以下代码片段是 和 teamsCore.registerBeforeUnloadHandler
API 的示例teamsCore.registerOnLoadHandler
:
microsoftTeams.teamsCore.registerOnLoadHandler((data) => {
console.log("got load from TEAMS", data.contentUrl, data.entityId);
// use contentUrl to route to correct page
// invoke notifySuccess when ready
app.notifySuccess();
});
microsoftTeams.teamsCore.registerBeforeUnloadHandler((readyToUnload) => {
// dispose resources and then invoke readyToUnload
readyToUnload();
return true;
});
最佳做法
建议实现 Web 存储或服务辅助角色功能,将数据或 Web 视图本地存储在 iOS 和 Android 中。 这有助于在后续启动中更快地加载应用。
限制
下面是应用缓存的限制:
使用客户端路由进行页面导航的单页应用可以从应用缓存中受益。 建议在应用启动的所有上下文中使用相同的域。
应用需要在加载处理程序中重新注册 、
focusEnter
等事件themeChange
。 Teams 客户端在缓存后不会向应用发送任何通知。 如果你的应用即使在缓存时也需要通知,则缓存可能不是正确的解决方案。仅 Teams 桌面客户端支持应用缓存。 在 Teams Web 客户端中,即使应用注册了加载处理程序,序列完成后也会从缓存
unload
中删除该应用。load
在启动序列中尽早注册 和beforeUnload
处理程序。 如果用户在离开应用之前 Teams 客户端未看到这些注册,则不会缓存该应用。Teams 客户端仅在完成应用序列后
unload
调用loadHandler
。 例如,如果用户启动应用的选项卡 A,然后启动同一应用的选项卡 B,则在选项卡 A 调用readyToUnload
回调之前,选项卡 B 不会获取加载信号。应用按窗口缓存。 应用缓存发生在每个应用 (而不是在同一窗口中) 每个选项卡。
在 TeamsJS v1.x) 上下文中,会议阶段或对话 (称为任务模块,因为可以在选项卡顶部打开,并且不能使用同一 Web 视图来呈现选项卡和对话框中的内容。
如果应用不需要应用缓存,但需要时间安全地保存状态,则仅
beforeUnload
注册处理程序 (因为离开应用可能会导致应用内容突然从文档对象模型 (DOM) ) 中删除。 如果应用尚未注册load
事件,则流完成后,该应用将从 DOMunload
中删除。按照本部分中的准则将应用载入 Teams 会议中的应用缓存。 对于仅在会议中的应用缓存支持,请注册
load
或beforeUnload
处理程序(如果上下文为sidePanel
)。当缓存 (使用最少的计算或网络资源并将 SDK 请求) 最小化时,应用应进入睡眠状态。 缓存应用时,允许所有寄存器处理程序和以下 SDK 请求:
initialize
notifyappLoaded
notifySuccess
notifyFailure
notifyExpectedFailure
getContext
getAuthToken
readyToUnload
getConfig/getSettings
新的 Teams 客户端不支持应用缓存。
疑难解答
未缓存应用? 为什么在后续导航上不调用负载处理程序?
验证是否满足系统和可用内存约束。
减少缓存时的内存占用量。
beforeUnload
使用 处理程序释放资源,例如,释放引用并删除缓存时可能不需要的事件侦听器。
代码示例
示例名称 | Description | Node.js |
---|---|---|
应用缓存 | 用于在会议端面板中显示应用缓存工作原理的示例应用。 | View |