Angular2 PWA / Safari не может открыть ссылку в новом окне - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю над веб-приложением, которое при добавлении в 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и новое окно в нем.Последняя версия iOS12 на iPhone 7S (и я понятия не имею, почему iPhone 6 с ней согласен) откроет ссылку в том же автономном окне, что сделает невозможным возврат на страницу, гдебыла нажата ссылка (поскольку в автономном режиме пользовательский интерфейс отсутствует).

Почему Safari иногда игнорирует target = _blank и не открывает новое окно Safari?

1 Ответ

0 голосов
/ 24 сентября 2018

Не могу сказать, почему между iPhone6 ​​и iPhone7 есть разница в контексте поведения браузера.Но в моих тестах было ясно, что все ссылки на один и тот же хост в автономном режиме также открываются в одном и том же окне.Неважно, была ли ссылка сгенерирована с помощью JavaScript или жестко закодированной ссылки.Что помогло мне, так это ввести поддомен для загрузки («download.yourDomain ....»).Это объем ссылки для скачивания, который имеет значение.В вашем PWA базовый href в заголовке html определяет область действия.

Для темы Scope см. Здесь https://developer.mozilla.org/en-US/docs/Web/Manifest

Насколько я могу судить, Apple игнорирует манифест и область действия.

...