首页 > 解决方案 > 在 iOS 13 上首次登录后,firebase signInWithRedirect 无法正常工作,在 iOS11 和 Android 上工作正常

问题描述

环境

问题

我有一个基于cordova 的应用程序,使用firebasejs 7.0.0 对Google、Twitter、Facebook 和电子邮件/密码进行身份验证。该应用程序完全按照此处所述进行配置,并包括以下 Firebase 库:

<script src="https://www.gstatic.com/firebasejs/7.0.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.0.0/firebase-auth.js"></script>
 <script src="https://www.gstatic.com/firebasejs/7.0.0/firebase-firestore.js"></script>

身份验证在 ios11 和 Android 上运行良好,但在 ios 13.1.2 社交媒体登录仅在第一次运行。用户退出后,所有后续登录似乎都不会影响身份验证状态,因此不会触发 onAuthStateChanged。

步骤 1. 使用 xcode 安装应用程序 2. 第一次使用 Google、Facebook 或 Twitter 登录可以正常工作(总是) 3. 点击 signOut 按钮 --> firebase.auth().signOut() 4. 再次登录(后续登录总是失败)

工作场景(ios 11、Android、Web 浏览器) onAuthStateChanged 在 step2(首次登录)、step3(注销)和 step4(再次登录)上触发。请参阅下面的日志。

2019-10-03 14:24:35.411857+0200 iDefender[2266:878508] ### firebase onAuthStateChanged...user not defined
2019-10-03 14:25:55.163343+0200 iDefender[2266:878508] ### firebase signInWithRedirectSuccess (google provider)
2019-10-03 14:25:55.165606+0200 iDefender[2266:878508] ### firebase onAuthStateChanged...user defined
2019-10-03 14:26:03.918928+0200 iDefender[2266:878508] ### firebase signOut ok
2019-10-03 14:26:03.919381+0200 iDefender[2266:878508] ### firebase onAuthStateChanged...user not defined
2019-10-03 14:26:26.242756+0200 iDefender[2266:878508] ### firebase signInWithRedirectSuccess (google provider)
2019-10-03 14:26:26.251543+0200 iDefender[2266:878508] ### firebase onAuthStateChanged...user defined

不工作场景(ios 13) onAuthStateChanged 在第 2 步(首次登录)、第 3 步(退出)时触发,但即使 signInWithRedirect 成功,当用户尝试再次登录时也不会触发。请参阅下面的日志。

2019-10-03 14:19:49.271246+0200 iDefender[517:193350] ### firebase onAuthStateChanged...user not defined
2019-10-03 14:21:20.965735+0200 iDefender[517:193350] ### firebase signInWithRedirectSuccess (google provider)
2019-10-03 14:21:20.966756+0200 iDefender[517:193350] ### firebase onAuthStateChanged...user defined
2019-10-03 14:21:45.389967+0200 iDefender[517:193350] ### firebase signOut ok
2019-10-03 14:21:45.390223+0200 iDefender[517:193350] ### firebase onAuthStateChanged...user not defined
2019-10-03 14:22:05.897410+0200 iDefender[517:193350] ### firebase signInWithRedirectSuccess (google provider)

此问题仅在社交媒体登录时发生,signInWithEmailAndPassword 在所有 ios 和 android 版本上都可以正常工作。

相关代码:

这是当用户点击 3 个按钮之一时调用的函数(Signi with FB、Google、Twitter)

firebaseSignInStart: function(providerName, email,password)
    {
        var provider;
        var me=this;

        if(firebase == undefined)
        {
            console.log("### firebase is not defined");
            return;
        }

        me.getApplication().getController("Control").tabShowGroup([]);

        this.getApplication().fireEvent('ev_firebase_progress');


        firebase.auth().languageCode =  Ux.locale.Manager.getLanguage();

        if(providerName == 'custom' )
        {

            firebase.auth().signInWithEmailAndPassword(email, password).then(
                function signInWithEmailAndPasswordSuccess (result)
                {
                    //console.log(result);
                    //me.signedIn(result.user,result.credential.accessToken);
                },
                function signInWithEmailAndPasswordFailed(error)
                {
                    if (error.code == "auth/user-not-found")
                    {
                        me.registerWithEmailPassword(email, password);
                    }
                    else {
                        me.signedOut(error);
                    }
                }
            );

            return;
        }

        if(providerName == 'google')
            provider = new firebase.auth.GoogleAuthProvider();
        else if (providerName == 'facebook')
            provider = new firebase.auth.FacebookAuthProvider();
        else if (providerName == 'twitter')
            provider = new firebase.auth.TwitterAuthProvider();

        provider.setCustomParameters({
          prompt: 'select_account'
        });

        firebase.auth().signInWithRedirect(provider).then(
            function signInWithRedirectSuccess()
            {
                console.log("### firebase signInWithRedirectSuccess ("+providerName+" provider)");
            },
            function signInWithRedirectFailed(error)
            {
                console.log("### firebase signInWithRedirectFailed ("+providerName+" provider)");
                me.signedOut(error);
            }
        );
    },

这个 onAuthStateChanged 观察者:

firebase.auth().onAuthStateChanged(function(user)
        {
            if (user)
            {
                console.log("### firebase onAuthStateChanged...user defined");

                //firebase.auth().currentUser.getIdToken(true ).then(function(idToken) {   // parametro true forceRefresh
                user.getIdToken(true ).then(function(idToken) {   // parametro true forceRefresh
                    if(user.emailVerified == true)
                    {
                        me.signedIn(user,idToken);
                    }
                    else  
                    {
                        user.sendEmailVerification().then(
                            function() {
                              console.log("Email verification request sent");
                            },
                            function(error) {
                              // An error happened.
                            }
                        );
                        var errorMessage = '<div align="center">'+Ux.locale.Manager.get('tabs.signin.email_verification')+'</div>';
                        Ext.toast( iDefender.utils.Functions.makeInfoToast( errorMessage ) );


                        firebase.auth().signOut(); // Force signout because email is not verified yet
                    }

                }, function(error) {
                    me.signedOut(error);
                });

            }
            else
            {
                console.log("### firebase onAuthStateChanged...user not defined");
                me.signedOut();     // Simply not signedin
            }
        });

我们已经将我们的应用程序推出到 Android Play 商店,但这个问题目前阻止在 Apple 商店推出,因此非常感谢任何帮助。如果您需要更多信息,请告诉我。

标签: firebase-authentication

解决方案


我有同样的问题。我解决了将我的 pod FirebaseUI 更新到最新版本的问题:

pod 'FirebaseUI/Facebook', '~> 8.0'
pod 'FirebaseUI/Auth', '~> 8.0'
pod 'FirebaseUI/Email', '~> 8.0'

还有下一个吊舱:

pod 'Firebase/Database', '~> 6.0'

到 6.0 或更高版本,因为: FirebaseUI (~> 8.0) 已解析为 8.0.1,这取决于 FirebaseUI/Database (= 8.0.1) 已解析为 8.0.1,这取决于 Firebase/Database (~> 6.0 )


推荐阅读