firebase-authentication - 在 iOS 13 上首次登录后,firebase signInWithRedirect 无法正常工作,在 iOS11 和 Android 上工作正常
问题描述
环境
- 操作系统版本:ios 13.1.2
- Firebase SDK 版本:7.0.0
Firebase 产品:身份验证
Cordova 和 cordova 插件版本:
- 9.0.0 (cordova-lib@9.0.1)
- 科尔多瓦插件浏览器选项卡 0.2.0 “科尔多瓦插件浏览器选项卡”
- cordova-plugin-customurlscheme 4.4.0 “自定义 URL 方案”
- cordova-plugin-inappbrowser 3.1.0 “InAppBrowser”
- 科尔多瓦插件白名单 1.3.4 “白名单”
- 科尔多瓦支持谷歌服务 1.3.1 “科尔多瓦支持谷歌服务”
- cordova-universal-links-plugin 1.2.1 “通用链接插件”
- 安装平台:ios 5.0.1
问题
我有一个基于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 商店推出,因此非常感谢任何帮助。如果您需要更多信息,请告诉我。
解决方案
我有同样的问题。我解决了将我的 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 )
推荐阅读
- javascript - 如何在intellij中提供“忽略的承诺”警告,但仅限于特定功能?
- google-colaboratory - 错误:目录“。” 不可安装。未找到“setup.py”和“pyproject.toml”
- c# - 如何在 C# .NetFramework 4.0 中执行异步和等待(如在 .NetFramework 5.0 中)?
- node.js - 在 Heroku 中部署 MERN 堆栈应用程序时的问题
- angular - 角度路由:为子 :ID 路径添加前缀
- python - 无法正确导入kivy
- vhdl - 如何减少 Modelsim 中的 WLF 文件大小?
- python - 从两个矩阵的比较中创建新矩阵
- jquery - 仅当内部最后一个 li 具有 .active 时才添加下一个按钮新类
- javascript - 如何将星级值保存到本地存储以及页面重新加载时如何显示?