选项卡应用的应用缓存

应用缓存允许将一些资源和资产保留在内存中,以便在解除冻结应用时使用,从而缩短 Teams 中应用的后续启动时间。

以下各项支持应用缓存:

范围   桌面 iOS Android
  支持
仅在公共开发人员预览版中可用
支持 支持
个人 ✔️ 缓存生存期:30 分钟 ✔️
聊天 ✔️ 缓存生存期:30 分钟 ✔️
频道 ✔️ 缓存生存期:30 分钟 ✔️
“会议”选项卡 ✔️ 缓存生存期:30 分钟 ✔️
会议侧面板或会议内应用 ✔️ 缓存生存期:20 分钟

启用应用缓存

若要启用应用缓存,请执行以下步骤:

  1. 调用 teamsCore.registerBeforeUnloadHandlerteamsCore.registerOnLoadHandler API。

  2. 使用 contentUrlentityId 传递到加载处理程序,以路由到应用中的正确页面,并调用 notifySuccessnotifyFailure 通知 Teams 客户端应用初始化流已完成。

  3. 释放资源并执行处理程序中 beforeUnload 所需的任何清理,然后调用 readyToUnload 回调以通知 Teams 客户端应用卸载流已完成。

下面是想要选择加入应用缓存的应用的首次启动的流程图, (在首次启动应用时注册 loadbeforeUnload) :

屏幕截图显示会议侧面板中首次启动应用的流程。

下面是启动缓存应用的流程图:

屏幕截图显示会议侧面板中应用的缓存启动流。

选择加入应用缓存时,当用户导航到窗口中应用的不同实例时,将重复使用用于托管嵌入应用的 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 事件,则流完成后,该应用将从 DOM unload 中删除。

  • 按照本部分中的准则将应用载入 Teams 会议中的应用缓存。 对于仅在会议中的应用缓存支持,请注册 loadbeforeUnload 处理程序(如果上下文为 sidePanel)。

  • 当缓存 (使用最少的计算或网络资源并将 SDK 请求) 最小化时,应用应进入睡眠状态。 缓存应用时,允许所有寄存器处理程序和以下 SDK 请求:

    • initialize
    • notifyappLoaded
    • notifySuccess
    • notifyFailure
    • notifyExpectedFailure
    • getContext
    • getAuthToken
    • readyToUnload
    • getConfig/getSettings
  • 新的 Teams 客户端不支持应用缓存。

疑难解答

未缓存应用? 为什么在后续导航上不调用负载处理程序?

  • 验证是否满足系统和可用内存约束。

  • 减少缓存时的内存占用量。 beforeUnload使用 处理程序释放资源,例如,释放引用并删除缓存时可能不需要的事件侦听器。

代码示例

示例名称 Description Node.js
应用缓存 用于在会议端面板中显示应用缓存工作原理的示例应用。 View

另请参阅