代码之家  ›  专栏  ›  技术社区  ›  TheSoftwareJedi jac

如何使用iOS Chrome在iOS上的“打开”功能,在安全网站后面使用PDF,或使用大数据URL?

  •  3
  • TheSoftwareJedi jac  · 技术社区  · 7 年前

    我在一个网站上工作,它提供pdf文件(动态生成)供用户查看和下载。用户需要保存这些文件,签名(使用任何第三方pdf应用程序),然后上传。 对于这个特殊的问题,我们关注的是将pdf从ios上的chrome交付给第三方pdf应用程序。

    在不安全的公共网站上,从公共链接(如 this IRS form 工作正常。你可以看,然后 按右下角的“打开…” 然后选择另一个应用程序。另一个应用程序将收到pdf的url并将其打开。

    然而,在一个安全的网站上,移交并不正确。在按下pdf右下角的“open in…”并选择第三方pdf应用程序后,另一个应用程序将收到url,但不会收到维护会话状态所需的cookies。因此,当它下载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 Chrome在iOS上的“打开”功能,在安全网站后面使用PDF,或使用大数据URL?

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   Capricorn    7 年前

    问题的根源似乎是在chrome for ios中实现的行为。有个问题在 https://bugs.chromium.org/p/chromium/issues/detail?id=831678 正在处理丢失的cookies。

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

    使用这些临时url在chrome中打开pdf。按“open in…”按钮将该临时url传递给第三方应用程序。出于安全原因,您应该根据调用的时间或次数停用临时url。还可以实现临时url仅对该确切ip地址有效的限制。