Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
Tags
(2 edits) (+1)

As far as I can tell, indexedDB as well as localStorage are not supported on safari and by extension mobile. I believe Safari in general will only keep a file stored on the browser I think for up to a week. In regards to mobile, there are more problems. While you can make WebGL run smoothly on mobile, when it comes to saving at least on iOS, other browsers are actually built on top of Safari so they have the same saving issue. From what I can tell the browser will keep the file where you store it as long as you don't close out the entire app. You can close/switch tabs, but once you actually close the browser app you lose the data. 

This has been a big headache for my project, I'm using version 2022.1.23f1 if you care to compare. I actually don't own a mac and thus cannot inspect the page on iOS, but I have a crappy little mac mini showing up this Monday 10/9/23 so hopefully I can get to the bottom of this.

(3 edits)

Thanks for your details notes, what you described matches what I've been experiencing too, and it's reassuring to know it wasn't something specific to my code/project. I'm currently using Unity 2021.3.16f1 and just published my game here https://paulz.itch.io/roundy-round.

It's definitely confusing/misleading that all iOS browsers are essentially Safari under the hood because they are required to use Apple's WebKit framework. I even tried disabling "Prevent Cross-Site Tracking" and "Block All Cookies" in iOS Safari settings but it made no difference (Godot web publishing has some notes about IndexedDB). I don't have an Android mobile device to compare. Interestingly even when I updated Chrome (on Windows) recently I noticed my game's IndexedDB persisted data seemed to get deleted.

I even considered using PlayFab or some server-based storage solution, but if you want to use "anonymous login" for convenience so your players don't need to create or remember an account name/password, I don't see how that's possible because you'd still need to persist a GUID in the browser somehow, without using IndexedDB I guess.

(1 edit) (+1)

After a bit more research I have an answer. Basically, on itch and iOS, you cannot save to the browser and have it extend beyond the current session. The iframe and the page itself are two different domains, so its a CORS problem. The solution would be a server that users make an account/sign into, which is not ideal for quicker/more arcadey titles. For websites other than itch, there is hope for webgl games saving on iOS. If you own the page itself as well as the webgl, you can communicate from the iframe to the page to post data, this method uses window.postMessage which you can read up on here: https://www.teamsimmer.com/2023/05/02/how-do-i-use-the-postmessage-method-with-c...

So other than itch decided to give us access to our pages JS, we're out of luck. I also considered using cookies but we're limited to 4096ish bytes and I don't even know if we can do that from the iframe. Honestly I saw that the size was that small and figured it wasn't worth it.

I guess the best solution would be to throw your game up on a little site so you can handle saving to browser, then include a link to that page on the itch and hope mobile players find it? Or make a real iOS build and put it on the appstore. Neither solution works well for quicker/shorter titles.

Just before posting I found this post (https://itch.io/t/635029/enable-a-way-for-browser-games-to-access-the-username-o...) where someone asked Leafo the founder of itch if he would consider adding support for window.postMessage, it looks like a no but he was open to extending the current JS API. Maybe with our powers combined we can summon him here and get a mobile specific JS way to read/write to indexedDB/localStorage.

(+1)

In my workaround I split my savefile into several cookies. This allows you to bypass the memory limit.
But of course that's not a nice solution either.

Ah nice, any idea if that works for iOS/iFrames?

Never tried.
 If you get it to work with one cookie it's maybe worth a try.

---snip---

        ms = new MemoryStream();

        xmls.Serialize(ms, gd);

        var helpcvalue = Encrypt(Encoding.UTF8.GetString(ms.ToArray()));

        ms.Close();

        try

        {

            int helpcvallength = helpcvalue.Length;

            int helpcvalAnzahl = (helpcvallength / 4000);

            string[] helpcvalsplit = new string[helpcvallength];

            setCookie(gd.GameName + "A", (helpcvalAnzahl + 1).ToString(), 500);

            for (int i = 0; i < helpcvalAnzahl; i++)

            {

                helpcvalsplit[i] = helpcvalue.Substring(i * 4000, 4000);

                setCookie(gd.GameName + i.ToString(), helpcvalsplit[i], 500);

            }

            helpcvalsplit[helpcvalAnzahl] = helpcvalue[(helpcvalAnzahl * 4000)..];

            setCookie(gd.GameName + helpcvalAnzahl.ToString(), helpcvalsplit[helpcvalAnzahl], 500);

            RetVal = "Cookie OK: " + gd.LastSaveTime;

        }

        catch (Exception)

        {

---snap---

(2 edits)

Yep, I've come to the same conclusion. It doesn't seem possible to persist data on itch on iOS or Safari due to the iframe restriction. When I uploaded the same exact build of my game to my own site for testing, the data does persist (using IndexedDB storage).

I briefly tried experimenting with some Unity javascript plugin code to read & write cookies (and also tried window.localStorage instead) but neither one seemed to behave any different and also didn't persist data.

IF @Leafo can offer any help or insights here that would be amazing!