Firebase 电话身份验证在 APK 发布模式下不起作用 [英] Firebase Phone Auth not working in APK Release mode
问题描述
我阅读了以下两个问题,但这些问题都不能解决我的问题:
这两个问题中提到的解决方案表明,我需要从 Play 控制台复制 SHA-1 并将其放置在 Firebase 控制台 SHA-1 中以用于我的应用.问题是 我的应用程序不在 Play 商店中,我只是对其进行了签名并构建了 apk
,就像我们通常为 apk.relase 所做的那样.我还将 firebase_auth
和 firebase_core
依赖项更新到最新版本.
以下是我的电话验证代码:
<预><代码>验证完成(){返回(AuthCredential 凭据)异步 {等待 _auth.signInWithCredential(credential).then((AuthResult value) {if (value.user != null) {Navigator.pop(上下文);导航器.push(语境,新的 MaterialPageRoute(构建器:(上下文)=>添加联系人(用户:value.user,)));}});};}验证失败() {返回(AuthException 异常){Toast.show('验证失败:${exception.code}', context,backgroundColor: Colors.red,持续时间:3,背景半径:5,重力:Toast.BOTTOM);};}代码发送() {返回(字符串验证ID,[int forceResendingToken]){显示对话框(上下文:上下文,屏障可关闭:假,建设者:(上下文){返回警报对话框(形状:RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),标题:文本('输入 6 位代码'),内容:列(mainAxisSize: MainAxisSize.min,孩子们:<小部件>[文本域(样式:文本样式(fontSize: MediaQuery.of(context).size.height * 0.025),控制器:_controllerCode,键盘类型:TextInputType.number,最大长度:6,cursorColor: Colors.black,装饰:输入装饰(错误文本:validateCode(_controllerCode.text),提示文本: '输入代码',enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(12.0)),聚焦边界:大纲输入边界(borderRadius: BorderRadius.circular(12.0)),错误边界:大纲输入边界(borderRadius: BorderRadius.circular(12.0),borderSide: BorderSide(颜色: Colors.red)),focusErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(12.0),borderSide: BorderSide(颜色: Colors.red)),),),大小盒(高度:MediaQuery.of(context).size.height * 0.01,),排(mainAxisSize: MainAxisSize.min,孩子们:<小部件>[图标(Icons.info,颜色:Colors.red,大小:MediaQuery.of(context).size.height * 0.03,),大小盒(宽度:MediaQuery.of(context).size.width * 0.02,),文本('等待自动检测!',样式:文本样式(fontFamily: 'Sogoe',颜色:Colors.red,字体大小:MediaQuery.of(context).size.height * 0.017),),],),大小盒(高度:MediaQuery.of(context).size.height * 0.01,),容器(高度:MediaQuery.of(context).size.height * 0.06,宽度:MediaQuery.of(context).size.width,孩子:FlatButton(填充:EdgeInsets.对称(水平:MediaQuery.of(context).size.width * .05),形状:RoundedRectangleBorder(borderRadius: BorderRadius.circular(5)),孩子:文本(确认",),textColor: Colors.white,颜色:Colors.lightBlue,onPressed: () 异步 {设置状态((){_controllerCode.text.isEmpty?代码验证 = 真:代码验证=假;});_auth.currentUser().then((用户){如果(用户!= null){Navigator.pop(上下文);导航器.push(语境,材质页面路由(构建器:(上下文)=>添加联系人(用户:用户,)));} 别的 {_验证码();}});_controllerCode.clear();},),)],),);});_verificationId = 验证ID;};}代码自动检索超时(){返回(字符串验证ID){_verificationId = 验证ID;};}未来<void>_verifyPhoneNumber(String phone) async {_auth.verifyPhoneNumber(电话号码:电话,超时:const 持续时间(秒:60),验证完成:验证完成(),验证失败:验证失败(),代码发送:代码发送(),codeAutoRetrievalTimeout: codeAutoRetrievalTimeout(),);}未来<void>_verifyCode() 异步 {最终 AuthCredential 凭证 = PhoneAuthProvider.getCredential(验证 ID:_verificationId,短信代码:_controllerCode.text);最终 FirebaseUser 用户 =(await _auth.signInWithCredential(credential)).user;最终 FirebaseUser currentUser = await _auth.currentUser();断言(user.uid == currentUser.uid);如果(用户!= null){Navigator.pop(上下文);导航器.push(语境,材质页面路由(构建器:(上下文)=>添加联系人(用户:用户,)));}}找到解决方案
是的,我添加了 SHA-1 密钥,但我开始知道用于调试和发布模式的 SHA-1 是分开的,这 答案是解决方案
I read following two questions but none of these are solution to my problem:
Solution mentioned in both of these questions says that I need to copy SHA-1 from Play console and place it in Firebase console SHA-1 for my app. Problem is My app is not on play store, I just signed it and build the apks
as we normally do for apk.relase. And I also updated firebase_auth
and firebase_core
dependencies to latest version.
Below is my code for phone auth:
verificationCompleted() {
return (AuthCredential credential) async {
await _auth.signInWithCredential(credential).then((AuthResult value) {
if (value.user != null) {
Navigator.pop(context);
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => AddContacts(
user: value.user,
)));
}
});
};
}
verificationFailed() {
return (AuthException exception) {
Toast.show('Verification Failed: ${exception.code}', context,
backgroundColor: Colors.red,
duration: 3,
backgroundRadius: 5,
gravity: Toast.BOTTOM);
};
}
codeSent() {
return (String verificationID, [int forceResendingToken]) {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12)),
title: Text('Enter 6-Digit Code'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
TextField(
style: TextStyle(
fontSize: MediaQuery.of(context).size.height * 0.025),
controller: _controllerCode,
keyboardType: TextInputType.number,
maxLength: 6,
cursorColor: Colors.black,
decoration: InputDecoration(
errorText: validateCode(_controllerCode.text),
hintText: 'Enter Code',
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12.0)),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12.0)),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12.0),
borderSide: BorderSide(color: Colors.red)),
focusedErrorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12.0),
borderSide: BorderSide(color: Colors.red)),
),
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.01,
),
Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
Icons.info,
color: Colors.red,
size: MediaQuery.of(context).size.height * 0.03,
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.02,
),
Text(
'Wait for Automatic Detection!',
style: TextStyle(
fontFamily: 'Sogoe',
color: Colors.red,
fontSize:
MediaQuery.of(context).size.height * 0.017),
),
],
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.01,
),
Container(
height: MediaQuery.of(context).size.height * 0.06,
width: MediaQuery.of(context).size.width,
child: FlatButton(
padding: EdgeInsets.symmetric(
horizontal: MediaQuery.of(context).size.width * .05),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5)),
child: Text(
"Confirm",
),
textColor: Colors.white,
color: Colors.lightBlue,
onPressed: () async {
setState(() {
_controllerCode.text.isEmpty
? codeValidate = true
: codeValidate = false;
});
_auth.currentUser().then((user) {
if (user != null) {
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AddContacts(
user: user,
)));
} else {
_verifyCode();
}
});
_controllerCode.clear();
},
),
)
],
),
);
});
_verificationId = verificationID;
};
}
codeAutoRetrievalTimeout() {
return (String verificationID) {
_verificationId = verificationID;
};
}
Future<void> _verifyPhoneNumber(String phone) async {
_auth.verifyPhoneNumber(
phoneNumber: phone,
timeout: const Duration(seconds: 60),
verificationCompleted: verificationCompleted(),
verificationFailed: verificationFailed(),
codeSent: codeSent(),
codeAutoRetrievalTimeout: codeAutoRetrievalTimeout(),
);
}
Future<void> _verifyCode() async {
final AuthCredential credential = PhoneAuthProvider.getCredential(
verificationId: _verificationId, smsCode: _controllerCode.text);
final FirebaseUser user =
(await _auth.signInWithCredential(credential)).user;
final FirebaseUser currentUser = await _auth.currentUser();
assert(user.uid == currentUser.uid);
if (user != null) {
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AddContacts(
user: user,
)));
}
}
Found the solution
Yes I added SHA-1 Key but I came to know that SHA-1 for debug and release mode are separate and this answer is solution
这篇关于Firebase 电话身份验证在 APK 发布模式下不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!