Jak włączyć automatyczne odtwarzanie wideo w trybie niskiego zużycia energii w iOS i macOS
07 06.2023

Technologie, Wiedza i Proces, Web Development

Jak włączyć automatyczne odtwarzanie wideo w trybie niskiego zużycia energii w iOS i macOS

Jak obejść blokadę autoplay w Safari (iOS/macOS) w trybie oszczędzania energii? Poznaj atrybut playsinline, obsługę błędów video.play() i techniki fallback z animowanym WebP/GIF.

Rzeczywiste wyzwanie w Safari:

Safari w wielu przypadkach pozwala na automatyczne odtwarzanie wyciszonych filmów osadzonych w treści, jednak na urządzeniach z iOS użytkownik lub system mogą je zablokować. W praktyce oznacza to, że nie można zagwarantować automatycznego odtwarzania na iPhonie — należy więc wykrywać, czy odtwarzanie się rozpoczęło, a jeśli nie, wyświetlić subtelny komunikat „dotknij, aby odtworzyć” lub animowany obraz zastępczy. Dzięki temu doświadczenie użytkownika pozostaje spójne nawet w trybie oszczędzania energii.

Solidne rozwiązanie: progresywne ulepszanie

Najpierw zaimplementuj standardowy element <video> z atrybutami mutedplaysinlineautoplay i lekkim preloadem. Następnie spróbuj rozpocząć odtwarzanie za pomocą video.play(). Jeśli przeglądarka odrzuci obietnicę (np. w trybie niskiego zużycia energii), płynnie przełącz się na alternatywę — pokaż animowany obraz (GIF/WebP/APNG) lub widoczny przycisk „Odtwórz”. Takie podejście szanuje ustawienia użytkownika, a jednocześnie maksymalizuje zaangażowanie.

<div class="hero-video">
  <video id="heroVideo"
         preload="metadata"
         autoplay
         muted
         playsinline
         loop
         poster="https://site.com/video-poster.jpg"
         class="fullscreen-video">
    <source src="https://site.com/video.mp4" type="video/mp4">
    <!-- Optional: add WebM for broader support -->
    <source src="https://site.com/video.webm" type="video/webm">
  </video>

  <!-- Fallback shown if autoplay is blocked (e.g., iOS Low Power Mode) -->
  <img id="fallbackGif"
       src="https://site.com/video-fallback.gif"
       alt="Animated preview"
       style="display:none" />

  <button id="playButton"
          class="button button--primary"
          aria-controls="heroVideo"
          aria-label="Play video"
          hidden>Play</button>
</div>

<!-- Styles (example) -->
<style>
  .fullscreen-video { width: 100%; height: auto; }
  .button--primary { position:absolute; left: 1rem; bottom: 1rem; }
  @media (prefers-reduced-motion: reduce) {
    .hero-video video { display: none; }
    #fallbackGif { display: block !important; }
  }
</style>

<!-- Script -->
<script>
  (function () {
    var v = document.getElementById('heroVideo');
    var fallback = document.getElementById('fallbackGif');
    var btn = document.getElementById('playButton');

    function showFallback() {
      if (v) v.style.display = 'none';
      if (fallback) fallback.style.display = 'block';
      if (btn) btn.hidden = false;
    }

    function tryAutoplay() {
      if (!v || !v.play) return showFallback();
      v.muted = true; // important for mobile autoplay
      v.playsInline = true;
      var p = v.play();
      if (p && typeof p.then === 'function') {
        p.then(function () {
          // autoplay succeeded; keep video visible
        }).catch(function () {
          // autoplay blocked (e.g., iOS Low Power Mode)
          showFallback();
        });
      } else {
        // Older browsers
        showFallback();
      }
    }

    document.addEventListener('DOMContentLoaded', tryAutoplay);

    if (btn) {
      btn.addEventListener('click', function () {
        if (fallback) fallback.style.display = 'none';
        if (v) {
          v.style.display = '';
          v.play().catch(function(){ /* user can tap again if needed */ });
        }
        btn.hidden = true;
      });
    }
  })();
</script>

Dlaczego to działa (i czego unikać):

  • Progresywne ulepszanie: Najpierw próbujemy wyciszonego automatycznego odtwarzania wideo; gdy nie jest ono dozwolone, przełączamy się na animowany obraz lub wyraźny przycisk „Odtwórz”. Dzięki temu użytkownicy zawsze widzą ruch lub mogą uruchomić wideo jednym kliknięciem.
  • Zgodność ze standardami: Użycie atrybutów mutedplaysinlineautoplay oraz lekkiego preload zapewnia zgodność z polityką przeglądarek dotyczącą automatycznego odtwarzania.
  • Unikaj trików: Nie próbuj „odtwarzać” wideo przez element <img> wskazujący na plik MP4 — obrazy nie renderują wideo. Zamiast tego użyj prawdziwego obrazu animowanego (GIF/WebP/APNG) jako wizualnej alternatywy.

Opcjonalnie: osadzone odtwarzacze (YouTube/Vimeo)

Jeśli korzystasz z iFrame’ów, możesz żądać wyciszonego automatycznego odtwarzania, jednak użytkownik lub tryb systemowy nadal mogą je zablokować. Dlatego zawsze pozostaw nakładkę z przyciskiem „Play” lub obraz podglądu (poster).

<!-- Przykład Vimeo -->
<iframe
  src="https://player.vimeo.com/video/12345?background=1&autoplay=1&muted=1&loop=1&playsinline=1"
  allow="autoplay; fullscreen; picture-in-picture"
  loading="lazy"
  style="width:100%;aspect-ratio:16/9;border:0"></iframe>

Korzyści i wpływ:

Dzięki temu podejściu zapewniasz spójne i przyjazne doświadczenie użytkownika zarówno na iOS, jak i na komputerach stacjonarnych. Zachowujesz zamysł projektowy, jednocześnie przestrzegając zasad przeglądarek i ograniczeń związanych z oszczędzaniem energii. Efekt — wysoki poziom zaangażowania nawet wtedy, gdy automatyczne odtwarzanie jest zablokowane.

Podsumowanie:

Automatyczne odtwarzanie na urządzeniach Apple należy traktować jako funkcję „jeśli możliwe”, a nie wymóg. Twórz więc rozwiązania z wyciszonym, osadzonym wideo, wykrywaj niepowodzenia metody play() i w razie potrzeby przełączaj się na animowany podgląd lub jedno kliknięcie, by uruchomić odtwarzanie. Takie podejście łączy wydajność, dostępność i siłę przekazu marki.

Twoje wsparcie jest mile widziane

Jeśli chcesz wesprzeć nowe projekty lub podziękować za dotychczasową pracę, będzie to bardzo docenione. Aby przekazać darowiznę, kliknij PayPal.me — resztą zajmie się bezpiecznie system PayPal. Dziękuje za wsparcie!