Array.reverse-bug i iOS, macOS og React Native herjer internett

Vi har undersøkt hvilke konsekvenser dette får og hva man kan gjøre for å fikse dette inntil Apple kommer med en løsning i iOS 12.1

Array.reverse-bug i iOS, macOS og React Native herjer internett
Henrik B. Gundersen
Henrik B. Gundersen
Webutvikler

Publisert 26. sep. 2018 kl. 23:59

Lurer du på noe som er omtalt i denne artikkelen?

Ask Henrik

Javascript-funksjonen Array.prototype.reverse() brukes for å snu et array på hodet. For eksempel blir [1, 2, 3] til [3, 2, 1]. Når man bruker denne funksjonen på nettsider og i apper forventer man (som med all annen Javascript-kode) at koden blir tilbakestilt til original stand etter at man har lastet inn siden på nytt. Dette er altså ikke tilfellet lenger etter at iOS 12 entret scenen.

Sammen med iOS 12 snek det seg også inn en bug som gjør at det muterte arrayet forblir mutert etter at man laster inn siden på nytt. Dette ble først omtalt som en feil i iOS 12s Safari, men viser seg å gjelde alt av iOS 12 relatert som bruker WebKit-motoren for å rendre Javascript (se hvem som er rammet lenger ned i artikkelen).

Trolig har denne feilen oppstått i et forsøk på frigi ressurser i telefonene som benytter iOS 12. Ved å mellomlagre eller cache resultatet av det muterte arrayet ville ikke telefonen ha behov før å gjøre samme operasjon mer enn en gang. At dette ville få uante konsekvenser er nok noe Apple ikke tok med i beregningen.

Disse er rammet av feilen:

  • Alle nettlesere til iOS (Safari, Chrome)
  • Hybrid apper som bruker Apple WebView
  • iOS apper laget i React Native
  • Safari på MacOS Mojave

Feilen kan fikses midlertidig av utviklere

Selv om denne feilen ligger i selve Apples webrammeverk finnes det enkle grep utviklere kan gjøre for å fikse feilen. Dette gjøres med et såkalt polyfill-bibliotek.

De siste dagene har det dukket opp fler slike polyfill-løsninger på NPM og Github som lar utviklerne oppnå det samme resultatet som Array.prototype.reverse() uten bruk av den "skadde" koden. Selv om dette er en fin måte å komme seg rundt problemet på inntil en offisiell feilretting er ute, anbefales det ikke å ha dette som en permanent løsning.

Ingenting brukeren kan gjøre

Selv om feiler allerede er rapportert fikset av WebKit er det ingen ting brukeren kan gjøre annet enn å vente på iOS 12.1 eller at plattformen de bruker oppdaterer med en polyfill-fiks.