diff --git a/web/packages/demo/www/index.js b/web/packages/demo/www/index.js index 56a4fcbe3..00dc20f24 100644 --- a/web/packages/demo/www/index.js +++ b/web/packages/demo/www/index.js @@ -230,7 +230,9 @@ reloadSwf.addEventListener("click", () => { window.addEventListener("load", () => { if ( navigator.userAgent.match(/iPad/i) || - navigator.userAgent.match(/iPhone/i) + navigator.userAgent.match(/iPhone/i) || + (navigator.platform === "MacIntel" && + typeof navigator.standalone !== "undefined") ) { localFileInput.removeAttribute("accept"); } diff --git a/web/packages/extension/src/player.ts b/web/packages/extension/src/player.ts index 2ffe18f80..d9675b7bd 100644 --- a/web/packages/extension/src/player.ts +++ b/web/packages/extension/src/player.ts @@ -7,6 +7,16 @@ import type { URLLoadOptions, } from "ruffle-core"; +declare global { + interface Navigator { + /** + * iPadOS sends a User-Agent string that appears to be from macOS. + * navigator.standalone is not defined on macOS, so we use it for iPad detection. + */ + standalone?: boolean; + } +} + const api = PublicAPI.negotiate(window.RufflePlayer!, "local"); window.RufflePlayer = api; const ruffle = api.newest()!; @@ -216,7 +226,9 @@ reloadSwf.addEventListener("click", () => { window.addEventListener("load", () => { if ( navigator.userAgent.match(/iPad/i) || - navigator.userAgent.match(/iPhone/i) + navigator.userAgent.match(/iPhone/i) || + (navigator.platform === "MacIntel" && + typeof navigator.standalone !== "undefined") ) { localFileInput.removeAttribute("accept"); }