0
votes

Environment

  • Operating System version: ios 13.1.2
  • Firebase SDK version: 7.0.0
  • Firebase Product: auth

    Cordova and cordova plugin versions:

    • 9.0.0 ([email protected])
    • cordova-plugin-browsertab 0.2.0 "cordova-plugin-browsertab"
    • cordova-plugin-customurlscheme 4.4.0 "Custom URL scheme"
    • cordova-plugin-inappbrowser 3.1.0 "InAppBrowser"
    • cordova-plugin-whitelist 1.3.4 "Whitelist"
    • cordova-support-google-services 1.3.1 "cordova-support-google-services"
    • cordova-universal-links-plugin 1.2.1 "Universal Links Plugin"
    • Installed platforms: ios 5.0.1

Problem

I have a cordova based app using firebasejs 7.0.0 for authentication with Google,Twitter, Facebook and email/password. The app is configured exactly as described here and includes the following firebase libraries:

<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>

Authentication is working fine on ios11 and Android but on ios 13.1.2 social media signIn works the first time only. After the user has signed out, all subsequent signIns don't seem to affect the authentication state and therefore onAuthStateChanged is not triggered.

Steps 1. Install application using xcode 2. first signin with either Google,Facebook or Twitter works fine (always) 3. Tap on signOut button --> firebase.auth().signOut() 4. Sign in again (subsequent signins always fail)

Working scenario (ios 11, Android, Web browser) onAuthStateChanged is triggered on step2 (first signin), step3 (signout) and step4 (signin again). See log below.

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

Not Working scenario (ios 13) onAuthStateChanged is triggered on step2 (first signin), step3 (signout) but it is not triggered when user tries to signin again eventhough signInWithRedirect is succesfull. See log below.

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)

This issue only occurs with social media signin, signInWithEmailAndPassword works fine on all ios and android versions.

Relevant Code:

This is the function called when the user tap on one of the 3 button (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);
            }
        );
    },

This onAuthStateChanged observer:

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
            }
        });

We have already rolled out our app to Android play store but this issue is currently blocking roll out on Apple store so any help is deeply appreciated. Please let me know if you need more info.

1

1 Answers

0
votes

I had the same problem. I solved the problem updating my pods FirebaseUI to the latest version:

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

And also the next pod:

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

to a version 6.0 or higher because: FirebaseUI (~> 8.0) was resolved to 8.0.1, which depends on FirebaseUI/Database (= 8.0.1) was resolved to 8.0.1, which depends on Firebase/Database (~> 6.0)