即使针对iOS,

时间:2018-10-25 16:14:25

标签: firebase react-native authentication react-redux react-native-firebase

我目前正在开发一个移动应用程序,其中Firebase用于Android和iOS的OTP服务。还必须提到我正在使用带有Redux的react native。

问题背景

我正在将react-native-firebase库用于firebase函数。如文档所述,对于Android,我们可以使用OnAuthStateChanged来标识已使用Google服务登录的用户。但是对于iOS,这是不可能的。

问题

但是对我来说,每当我使用手机OTP登录时,即使使用iOS设备,它也会自动登录。所以这是一个问题。

我做什么

下面是我使用电话登录的代码部分。

firebase.auth().signInWithPhoneNumber(phoneNumber).then(confirmResult =>{
    firebase.auth().onAuthStateChanged((user) => {
          if (user) {
                console.log('Auto signed in')
              })
        }
   })
}).catch(error => {console.log(error)})

因此,使用console.log,我检查了它是否确实适用于iOS。当我输入电话号码并输入时,我会在调试器控制台中自动以Auto Signed in消息登录。因此,这实际上适用于iOS。还必须提到上面的代码部分是在redux动作内部。如果验证了用户,则所有调度(Redux重击)都会发生。

然后,我需要验证此方法仅在收到OTP时有效。但是,即使我输入了随机电话号码(当前手机不使用该电话号码),用户登录也没有收到OTP。

实际问题

即使用户未收到OTP SMS,此OnAuthStateChange也会触发。这是一个很大的问题。我在这里做什么错了?如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我在onAuthStageChanged函数中遇到了类似的问题。但是我猜想是因为您从onAuthStageChanged内部调用signInWithPhoneNumber

只要您成功使用给定的电话号码登录,就会调用onAuthStageChanged功能。但是坦率地说,我对如何在if(user)内执行此执行没有很好的解释。无论如何,我认为由于您已经登录了以前尝试检查该应用程序的尝试。

因此,即使没有成功登录用户,登录成功功能也会因onAuthStageChanged函数调用而启动。您可以使用以下代码段进行检查。 (我对thunk btw不太熟悉)

export const sampleFunc = () =>{
    firebase.auth().onAuthStateChanged((user) => {
          if (user) {
            console.log('User signed in with just action call')
          })
        }
    })
     return(dispatch)=>{
       // Required dispatches.
    }
}

因此从您的类中调用上述函数,即使未更改任何身份验证阶段,您也将在控制台中看到User signed in with just action call

因此,我要做的就是从类中的ComponentDidMount调用onAuthStateChanged函数。因此很明显,在安装组件时,用户未签名。然后,从if(user)内部调用成功登录后所需的操作,以保存数据并移至主屏幕。

现在,当您收到消息时,

iOS

onAuthStateChanged不会像Firebase所说的那样被触发。因此,iOS应该遵循基本的OTP输入屏幕并从那里进行验证。

Android

使用Google Play服务,它将自动识别传入的消息,并将执行必要的任务以触发onAuthStateChanged功能。然后,因为ComponentDidMount已经初始化了onAuthStateChanged,它将被触发并自动登录用户。