Окно связи не работает в браузере Facebook - PullRequest
0 голосов
/ 10 марта 2020

Я тестирую веб-приложение, требующее входа через всплывающее окно. Это работает следующим образом:

Пользователь нажимает кнопку входа в систему, которая вызывает window.open(loginUrl,...)

Пользователь проходит процесс входа в систему и нажимает кнопку с надписью «назад в приложение»

При этом будет выполнен следующий код:

//window should be closed by parent but some browsers won't do that...
setTimeout(() =>
{
    window.close()

}, 400)

//last resort: a redirect to the referring page
setTimeout(() =>
{
    //todo: display a new slide with a link to the referrer
    window.location = referrerUrl

}, 500)

if(window.opener)
{
    //pass the signin token to the parent window
    const data = JSON.stringify({ id: "loginSuccess", token: token })

    window.opener.postMessage(data, appUrl)

}else
{
    alert("Parent window closed!")
}

С другой стороны, сообщение получено по этому коду:

_addEventListener("message", function(event) 
{
    if(event.origin.startsWith('https://[...]') ) //this is where my app runs
    {
        var msg = [...] //just some json parsing 
        if(msg.id == "loginSuccess")
        {
            login(msg.token)
            popup.close()
        }
    }
}

Вызов функции _addEventListener и window.addEventListener, и document.addEventListener, поскольку я прочитал, что некоторые браузеры требуют последнего. Процедура работает безупречно на настольных и мобильных браузерах, таких как chrome, firefox и Safari.

Однако во внутреннем браузере Facebook (Android) всплывающее окно не закрывается, поэтому я добавил два обходных пути, используя setTimeout. Кроме того, окно даже не закроется, что делает первый обходной путь бесполезным. В конце концов вы будете перенаправлены на страницу, на которую вы ссылаетесь.

Видя, что window.close не работает даже при вызове из всплывающего окна, можно подумать, что проблема лежит там.

После перенаправления (через 100 мс после того, как всплывающее окно должно было закрыться), пользователь не заходит на страницу, что означает, что функция login(...) никогда не вызывалась.

Поэтому я пришел к выводу, что проблема должна быть ie в связи между двумя windows.

К сожалению, кажется, что нет простого способа отладки внутреннего браузера Facebook. Я ценю любые идеи о том, как решить эту проблему!

...