javascript - 如何在 iOS 上将 iOS Chrome 的 "Open in"功能与 protected 网站后面的 PDF 或大数据 URL 一起使用?

标签 javascript ios ajax pdf chrome-ios

我在一个网站上工作,该网站提供 PDF 文件(即时生成)供用户查看和下载。用户需要保存这些,签署它们(使用任何第 3 方 PDF 应用程序),然后上传它们。 对于这个特定问题,我们专注于将 PDF 从 iOS 上的 Chrome 传递到第 3 方 PDF 应用程序。

在不安全的公共(public)网站上,通过公共(public)链接查看 PDF,例如 this IRS form工作正常。您可以查看它,然后按右下角的“打开方式...” 并选择另一个应用程序。另一个应用程序将收到 PDF 的 URL 并正常打开它。

但是,在安全网站上,交接不会正确发生。按 PDF 右下角的“打开方式...”并选择第 3 方 PDF 应用程序后,其他应用程序将收到 URL,但不会收到维持 session 状态所需的 cookie。因此,当它下载 PDF 时,它会获得网站的登录页面。不同的应用程序对此有不同的处理方式,但例如,Google Drive 会将登录页面保存为损坏的 PDF 文件。 请注意,这在 Safari 中运行良好,问题出在 iOS Chrome 上。

我尝试做的是让 iOS 上的 Chrome 浏览器将 PDF 作为 blob 加载,然后创建一个数据 url 并使用它显示 PDF:

<a id="myLink">Click here to test PDF data url</a>
<script>
    $('#myLink').click(function() {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', '/f1099msc.pdf');
        xhr.responseType = 'arraybuffer';
        xhr.onload = function(e) {
            if (this.status == 200) {
                var blob = new Blob([this.response], { type: 'application/pdf' });
                var reader = new FileReader();
                reader.onloadend = function() {
                    window.open(reader.result);
                };
                reader.readAsDataURL(blob);
            }
        };
        xhr.send();
        return false;
    });
</script>

这种方法工作正常并成功显示 PDF。但是,按右下角的“打开方式...”将 PDF 移交给另一个应用程序不起作用。按下它没有反应。我认为这是因为数据 url 很大,并且不支持移交给另一个应用程序。

有什么想法吗?如何在 iOS 上使用 iOS Chrome 的“打开方式”功能将 PDF 隐藏在安全网站或大数据 URL 中?

Here is an example page that will load a PDF as a data url. 它只能在 Chrome iOS 上显示 PDF。其他浏览器不喜欢这种方法。

最佳答案

问题的根源似乎是 iOS 版 Chrome 中的实现行为。在 https://bugs.chromium.org/p/chromium/issues/detail?id=831678 提出了一个问题解决丢失的 cookie。

作为一种替代方法,可以生成一个临时 URL,其中包含所有必要的身份验证详细信息,并且不依赖于随请求一起发送的 cookie。

使用这些临时 URL 在 Chrome 中打开 PDF。按“打开方式...”按钮将该临时 URL 传递给第三方应用程序。出于安全原因,您应该停用基于时间或调用次数的临时 URL。还可以实现限制,即临时 URL 仅对那个确切的 IP 地址有效。

关于javascript - 如何在 iOS 上将 iOS Chrome 的 "Open in"功能与 protected 网站后面的 PDF 或大数据 URL 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50681521/

相关文章:

iphone - 如何将操作符符号 '+,-,/,*,mod' 等添加到制作计算器的标签中?

ios - 应用内购买收据验证矛盾

jquery - 如何使用 Ajax 提交 Flask-WTF 表单

javascript - 通过 JQuery AJAX 上传图片

javascript - Bacon.js:错误时重做ajax请求

javascript - 使用 java 或 javascript 将 base64 png 字符串转换为 base64 jpg

YYYY-MM-DD 的 JavaScript 正则表达式,带有可选的月份和日期

javascript - 用于社交共享的 Vue 应用程序元标记

ios - 当媒体片段数量较少时,AVPlayer 是否播放视频 block

javascript - 如何确保 jQuery ajax 调用不发送文件的本地副本?