如何让OfficeRuntime.Storage在Mac实现跨Office应用插件数据共享?
跨Excel/Word插件数据共享的Mac兼容性问题及解决方案
问题概述
开发的Office插件通过OfficeRuntime.Storage结合Shared Runtime实现Excel与Word间的数据共享,Windows平台运行正常,但Mac平台无法实现跨应用数据共享。
已完成的配置与验证
- API调用:使用
OfficeRuntime.storage.setItem(key, value)和OfficeRuntime.storage.getItem(key)进行存储读写 - Shared Runtime配置:Excel和Word的清单Host节点均已启用长生命周期Runtime:
<!-- Excel 配置 --> <Host xsi:type="Workbook"> <Runtimes> <Runtime resid="Taskpane.Url" lifetime="long" /> </Runtimes> </Host><!-- Word 配置 --> <Host xsi:type="Document"> <Runtimes> <Runtime resid="Taskpane.Url" lifetime="long" /> </Runtimes> </Host> - 通用行为(Windows/Mac一致):
- 同一应用内的插件可正常读写存储值
- 关闭插件仅隐藏任务窗格,重新打开后状态恢复(符合Shared Runtime预期)
- 存储值写入
localStorage,键名格式如_OfficeRuntime_Storage_myKey
平台差异现象
- Windows:Word插件可读取Excel写入的存储值,反之亦然
- Mac:跨应用完全无法读取对方的存储内容,且无法看到对方插件的
localStorage条目(已在十余台符合版本要求的Mac设备验证,均存在该问题)
疑问点
清单中两个Host节点均配置了以下Action,是否会影响跨应用共享?
<Action xsi:type="ShowTaskpane"> <TaskpaneId>Office.AutoShowTaskpaneWithDocument</TaskpaneId> <SourceLocation resid="Taskpane.Url" /> </Action>
解决方案建议
1. 调整TaskpaneId配置
当前使用的Office.AutoShowTaskpaneWithDocument是系统默认任务窗格ID,Mac平台对该ID的共享上下文存在隔离限制。建议改为自定义唯一ID,且两个Host节点保持一致:
<Action xsi:type="ShowTaskpane"> <TaskpaneId>MyCrossAppTaskpane</TaskpaneId> <SourceLocation resid="Taskpane.Url" /> </Action>
2. 替换为RoamingSettings实现用户级跨应用共享
如果共享数据是用户级别的,使用Office.context.roamingSettings(存储于用户Office账户),支持跨平台、跨应用读取:
- 写入数据:
Office.context.roamingSettings.set("myKey", "myValue"); Office.context.roamingSettings.saveAsync(function(result) { if (result.status === Office.AsyncResultStatus.Succeeded) { // 保存成功 } }); - 读取数据:
const value = Office.context.roamingSettings.get("myKey");
3. 采用后端服务器作为中间存储(通用跨平台方案)
由于OfficeRuntime.Storage在Mac上的跨应用隔离是平台级限制,可通过自定义后端服务实现数据共享:
- 插件通过HTTP请求向服务器写入/读取数据
- 使用用户ID、设备ID等标识作为存储上下文的区分依据
- 该方案完全不受Office平台限制,兼容所有操作系统
4. 确认Mac Office版本与系统权限
- 确保Mac Office版本≥16.57(Shared Runtime跨应用共享需此版本支持)
- 检查系统权限:打开Mac「系统偏好设置」→「安全性与隐私」→「隐私」→「文件与文件夹」,确认Office应用拥有相关访问权限
内容的提问来源于stack exchange,提问作者Andrew Hall
相关产品推荐
相关产品推荐

