Android Back Button on a Progressive Web Application closes de App

前端 未结 4 534
栀梦
栀梦 2020-12-07 19:27

Can a \"pure\" HTML5/Javascript (progressive) web application intercept the mobile device back button in order to avoid the App to exit?

This question is similar to

4条回答
  •  执念已碎
    2020-12-07 19:42

    @alecdwm, that is pure genius!

    Not only does it work on Android (in Chrome and the Samsung browser), it also works in desktop web browsers. I tested it on Chrome, Firefox and Edge on Windows, and it's likely the results would be the same on Mac. I didn't test IE because eew. Even if you're mostly designing for iOS devices that have no back button, it's still a good idea to ensure that Android (and Windows Mobile... awww... poor Windows Mobile) back buttons are handled so that the PWA feels much more like a native app.

    Attaching an event listener to the load event didn't work for me, so I just cheated and added it to an existing window.onload init function I already had anyhow.

    Keep in mind that it might frustrate users who would actually want to really Go Back to whatever web page they were looking at before navigating to your PWA while browsing it as a standard web page. In that case, you can add a counter and if the user hits back twice, you can actually allow the "normal" back event to happen (or allow the app to close).

    Chrome on Android also (for some reason) added an extra empty history state, so it took one additional Back to actually go back. If anyone has any insight on that, I'd be curious to know the reason.

    Here's my anti-frustration code:

    var backPresses = 0;
    var isAndroid = navigator.userAgent.toLowerCase().indexOf("android") > -1;
    var maxBackPresses = 2;
    function handleBackButton(init) {
        if (init !== true)
            backPresses++;
        if ((!isAndroid && backPresses >= maxBackPresses) ||
        (isAndroid && backPresses >= maxBackPresses - 1)) {
            window.history.back();
        else
            window.history.pushState({}, '');
    }
    function setupWindowHistoryTricks() {
        handleBackButton(true);
        window.addEventListener('popstate', handleBackButton);
    }
    

提交回复
热议问题