Angular2 PWA / Safari无法在新窗口中打开链接

时间:2018-09-19 14:50:52

标签: javascript angular safari mobile-safari progressive-web-apps

我正在开发一个Web应用程序,将其添加到HomeScreen后将作为一个独立应用程序使用,这意味着没有可用的浏览器用户界面。

有一次我需要打开一个文件,仅在单击链接后才会生成该URL。这是模板:

<a class="mobile-target"
   (click)="download($event, doc)"
   [id]="doc.dokumentGuid"
   [title]="doc.name"><span>{{dokumentMime(doc)}}</span></a>

以下是处理组件中点击的方法:

download($event, dokument: Dokument) {
    $event.preventDefault();

    this.downloading = true;
    dokument.isNew = false;

    if (isMobile()) {
        const anchor = this.document.getElementById(dokument.dokumentGuid);
        this.kundeService
            .getDokumentDownloadUrl(dokument.dokumentGuid)
            .pipe(
                tap(url => this.setAndClick(anchor, url)),
                finalize(() => (this.downloading = false))
            )
            .subscribe();
    } else {
        this.kundeService
            .getDokumentData(dokument.dokumentGuid)
            .pipe(
                tap(blob => saveBlobAs(blob, dokument.name)),
                finalize(() => (this.downloading = false))
            )
            .subscribe();
    }
}

setAndClick(anchor, url) {

    anchor.setAttribute('href', url);
    anchor.setAttribute('target', '_blank');

    // see: https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/compatibility/dn905219(v=vs.85)
    const event =
        typeof (<any>window).Event === 'function'
            ? new MouseEvent('click', {
                  view: window,
                  bubbles: true,
                  cancelable: true
              })
            : document
                  .createEvent('MouseEvents')
                  .initMouseEvent(
                      'click',
                      true,
                      true,
                      window,
                      0,
                      0,
                      0,
                      0,
                      0,
                      false,
                      false,
                      false,
                      false,
                      0,
                      null
                  );

    anchor.dispatchEvent(event);
}

某些版本的iOS确实会打开一个Safari应用程序,并在其中打开一个新窗口。 iPhone 7S上的最新iOS12(我不知道为什么iPhone 6可以使用),将在同一 standalone 窗口中打开链接,因此无法返回到该页面单击链接(因为在独立模式下没有UI)。

为什么Safari有时会忽略target = _blank而不会打开新的Safari窗口?

1 个答案:

答案 0 :(得分:1)

我无法说出在浏览器行为方面,为什么iPhone6和iPhone7之间会有区别。但是在我的测试中清楚地发现,在独立模式下,指向同一主机的所有链接也都在同一窗口中打开。链接是使用javascript生成还是硬编码链接都没有关系。帮助我的是引入了一个用于下载的子域(“ download.yourDomain ....”)。 重要的是下载链接的范围。 在您的PWA中,html标头中的基本href定义了范围。

有关范围主题,请参见https://developer.mozilla.org/en-US/docs/Web/Manifest

就我所知,Apple忽略了清单和范围。