macos - 是否有独立于平台的方法来打开 Outlook 插件中的链接?
问题描述
我有一个用 Angular 框架编写的 Outlook-addin,它通过 office-js 与 Outlook 通信。
我的目标是实现一项服务,可以在任何可以使用 Outlook 的主流平台中打开任何类型的 URL/链接,具体来说:在 Google Chrome、Safari、Firefox、Opera、Internet Explorer、MacOS 桌面 Outlook - 旧版本和新版本中或者大多数 Windows 桌面 Outlook 版本(2016、2019、O365)。但不幸的是,我找不到适用于所有平台的方法,我想避免以依赖于平台的方式实现它。
我遇到的第一个问题是,当我尝试通过简单的 js 函数打开链接时window.open(url)
,使用 Internet Explorer 作为引擎的 Outlook 版本无法打开包含字符 # 的 URL。那是因为 IE 似乎无法读取这个字符,并且它通过 # 字符将 URL 减半,并完全删除了 # 后面的部分。
window.open(
"https://en.wikipedia.org/wiki/County_Antrim#/media/File:Ballycastle_Harbour_-_geograph.org.uk_-_468327.jpg",
"_blank"
);
例如,如果我尝试在使用 Internet Explorer 作为引擎的 Windows Outlook 2019 上打开上面的 URL,那么最后的 url 将如下所示:
对于一个解决方案,我实现了一种解决方法,该解决方法通过 typescript 附带的内置函数对 URL 进行编码,该函数允许 IE 能够打开链接。通过简单地将编码的 URL 传递给window.open()
是行不通的,因为它将 URL 与我的插件的主机连接起来,这会导致无效的链接。
window.open(
encodeURIComponent(
"https://en.wikipedia.org/wiki/County_Antrim#/media/File:Ballycastle_Harbour_-_geograph.org.uk_-_468327.jpg"
),
"_blank"
);
我的插件的主机 + 编码的 URL:
所以我不得不用一个简单的html代码手动重定向,如下所示:
重定向.html:
<html>
<head>
<script type="text/javascript">
window.onload = function (event) {
var regex = /\?url=(.*)/ig;
var match = regex.exec(location.search);
if (match && match[1] && match[1] !== "") {
location.href = decodeURIComponent(match[1]);
}
else {
document.body.innerHTML = "Redirect failed!";
}
};
</script>
</head>
</html>
打字稿代码:
url = "https://en.wikipedia.org/wiki/County_Antrim#/media/File:Ballycastle_Harbour_-_geograph.org.uk_-_468327.jpg"
window.open("./redirect.html?url=" + encodeURIComponent(url), "_blank");
不幸的是,这种方法在 MacOS 的桌面外观中也存在一些缺陷。重定向使链接在 Outlook 应用程序的简单 Web 查看器中打开,而不是在 Safari 中打开,因为默认浏览器在系统首选项和 Outlook 浏览器首选项中都设置为 Safari。尽管它可以打开这个webviewer中的链接,但我不能使用它,因为我要导航到的一些网页不支持被webviewer打开。
我怀疑这种行为是由 url 的相对性引起的(“./redirect ...”)。因此,我尝试通过以这种方式将插件的主机动态添加甚至硬编码到 URL 的开头来构建 URL:
`${window.location.origin + window.location.pathname}/redirect.html?url=` + encodeURIComponent(url);
但是这样做的结果没有区别,所以我猜测引用插件本身的主机不会改变 URL 的质量或状态,这意味着它仍然作为相对链接进行管理。
由于我有机会从另一台服务器托管 redirect.html,我尝试从另一台主机引用 redirect.html 文件,这样即使 MacOS Outlook 也能完美运行,这证明了我对相关链接管理错误的怀疑。
我也尝试过使用 office-js 提供的名为 openBrowserWindow 的函数,方法如下:
Office.context.ui.openBrowserWindow(url);
但这也是一个死胡同,因为它既不能处理 IE 中的 # 字符,也不能在我需要使用的所有平台中得到支持。
我尝试的最后一个解决方法是完全重新设计服务,而不是使用 js 或 ts 函数打开链接,我尝试将 url 绑定到<a></a>
元素的 href 属性,但是应用程序要求排除了这种方法,因为有一些预计将通过双击打开的链接,据我所知,这不能通过使用<a>
标签来完成,至少不是以“hacky”方式。
我真的很想知道,是什么让链接在 MacOS Outlook 应用程序的 webviewer 中打开,而不是在系统的默认浏览器中打开?这是我缺少的设置,还是有办法强制使用 safari?
解决方案
您是否尝试过简单地做:
if (Office.context.ui.openBrowserWindow) {
Office.context.ui.openBrowserWindow("https://google.com");
} else
{
window.open("https://google.com");
}
由于 OWA 选择性地不支持 openBrowserWindow,因此 window.open 将自动接管。
推荐阅读
- audio - wav_pcm 的 FFmpeg 奇怪的编解码器 ID
- php - 从插入到数据库中排除经过验证的数组对象
- cmd - CMD“重命名”命令
- unicode - 获取分为 unicode 范围的 json 格式的 google 字体列表
- javascript - Jest 中可以有更多抽象的单元测试用例吗?
- python - 静态和媒体文件未在生产中加载
- java - Activity has leaked window 原来是加了logcat错误
- python - 我该如何解决 AttributeError 'NoneType' 对象没有属性 'write'
- javascript - Win 10 localhost NodeJS v14 Mongoose 3.8.16 无法连接到 MongoDB 4.4
- python - 向所有 iOS 设备发送推送通知