Estoy preparando un juego para publicar en Facebook Instant Games.
Mi juego usa Pixi.js y jQuery UI, y guarda algunas configuraciones de usuario como "tema de color" y "volumen de sonido" en window.localStorage:
Sin embargo, cuando intento acceder desde mi juego instantáneo, aparece el error:
DOMException: no se pudo leer la propiedad 'localStorage' de 'Window': acceso denegado para este documento.
Supongo que la causa principal es que los juegos instantáneos de Facebook se ejecutan en un iframe.
Sin embargo, ya publiqué mi juego en la plataforma Yandex Games y allí ofrecen un reemplazo para localStorage ejecutando el siguiente código:
ysdk.getStorage() .then(safeStorage => Object.defineProperty(window, 'localStorage', { get: () => safeStorage })) .then(() => { localStorage.setItem('key', 'safe storage is working'); console.log(localStorage.getItem('key')) }); Entonces, me pregunto si el mismo truco es posible usando FBInstant.player.setDataAsync() y FBInstant.player.getDataAsync() que se encuentran en Instant Games SDK .
Yo he tratado:
Object.defineProperty(window, 'localStorage', { get: () => { getItem: { FBInstant.player.getDataAsync() }, setItem: { FBInstant.player.setDataAsync() } } }));pero eso, por supuesto, no funciona ... Ni siquiera estoy seguro de cómo lidiar con las funciones asíncronas de Facebook aquí.
Tendrías que mantener la sintaxis.
Object.defineProperty(window, 'localStorage', { getItem: key => FBInstant.player.getDataAsync(...) , setItem: (key,str) => FBInstant.player.setDataAsync(...) })https://developers.facebook.com/docs/games/instant-games/sdk/fbinstant6.1/