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

Autoplay w Safari potrafi się wyłączyć w Low Power Mode. Poniżej sprawdzone podejście: playsinline, obsługa błędu play() i fallback.

Co naprawdę blokuje autoplay w Safari

Safari często pozwala na automatyczne odtwarzanie wyciszonych filmów, ale na iOS użytkownik lub system mogą to zablokować. W praktyce nie da się zagwarantować autoplay na iPhonie. Trzeba więc sprawdzać, czy wideo faktycznie ruszyło, a jeśli nie — pokazać przycisk „odtwórz” albo lekki, animowany podgląd. Dzięki temu doświadczenie zostaje spójne, nawet w trybie oszczędzania energii.

Sprawdzone podejście: progresywne ulepszanie

Najpierw wdroż standardowy <video>muted, playsinline, autoplay i lekkim preloadem. Potem spróbuj uruchomić odtwarzanie przez video.play(). Jeśli przeglądarka odrzuci obietnicę (np. w trybie niskiego zużycia energii), płynnie przełącz się na alternatywę — animowany obraz (GIF/WebP/APNG) albo wyraźny przycisk „Odtwórz”. To szanuje ustawienia użytkownika i nie rozwala projektu.

<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 autoplay, a gdy się nie uda — pokazujemy fallback lub przycisk „Odtwórz”. Użytkownik zawsze widzi ruch albo ma jasny wybór.
  • Zgodność ze standardami: muted, playsinline, autoplay i lekki preload to minimum, które działa możliwie szeroko.
  • Unikaj trików: <img> nie odtwarza MP4. Jeśli potrzebujesz ruchu, użyj animowanego GIF/WebP/APNG.

Opcjonalnie: osadzone odtwarzacze (YouTube/Vimeo)

Jeśli korzystasz z iFrame’ów, możesz żądać wyciszonego autoplay, ale system nadal może to zablokować. Dlatego zawsze miej pod ręką nakładkę z przyciskiem „Play” lub obraz podglądu.

<!-- 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>

Co zyskujesz

Dzięki temu podejściu utrzymujesz spójne doświadczenie na iOS i desktopie. Zachowujesz zamysł projektowy, a jednocześnie grasz zgodnie z zasadami przeglądarek i ograniczeniami oszczędzania energii. Efekt? Zaangażowanie nawet wtedy, gdy autoplay jest zablokowane.

Podsumowanie

Autoplay na urządzeniach Apple traktuj jako „miły bonus”, a nie wymóg. Użyj wyciszonego wideo, sprawdzaj wynik play() i w razie blokady pokaż animowany podgląd lub przycisk. To łączy wydajność, dostępność i spójność komunikacji.

Jeśli chcesz wesprzeć moją pracę

Jeśli chcesz wesprzeć nowe projekty lub po prostu podziękować, będzie mi miło. Wystarczy kliknąć PayPal.me — resztą zajmie się bezpiecznie system PayPal. Dzięki!