Flutter应用在iOS平台上的Firebase电话身份验证上崩溃 [英] Flutter app crashes on firebase phone auth in iOS platform

查看:126
本文介绍了Flutter应用在iOS平台上的Firebase电话身份验证上崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在我的项目中实现了Firebase Phone auth,

I have implemented Firebase Phone auth in my project,

在android方面,一切正常,但在iOS方面,当我尝试从一端发送验证码时,应用崩溃并失去了连接.

On android side everything works fine, but for iOS side, when i try to send verification code from my end, app crashes and lost connection.

我已经在下面提交了我的代码.

I have submitted my code below.

main.dart

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        home: new MyHomePage(),
        routes: <String, WidgetBuilder> {
          '/homepage': (BuildContext context) => MyApp(),
          '/landingpage': (BuildContext context) => MyHomePage()
        }
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String phoneNo;
  String smsCode;
  String verificationId;

  Future<void> verifyPhone() async {
    print("main");
    final PhoneCodeAutoRetrievalTimeout autoRetrieve = (String verId) {
      print("varification id");
      this.verificationId = verId;
    };

    final PhoneCodeSent smsCodeSent = (String verId, [int forceCodeResend]) {
      print("send code dilog");
      this.verificationId = verId;
      smsCodeDialog(context).then((value) {
        print('Signed in');
      });
    };

    final PhoneVerificationCompleted verifiedSuccess = (AuthCredential user){
      print('Phone Verification Completed');
    };

    final PhoneVerificationFailed veriFailed = (AuthException exception) {
      print('${exception.message}');
    };

    await FirebaseAuth.instance.verifyPhoneNumber(

        phoneNumber: "+919700000000",
        codeAutoRetrievalTimeout: autoRetrieve,
        codeSent: smsCodeSent,
        timeout: const Duration(seconds: 5),
        verificationCompleted: verifiedSuccess,
        verificationFailed: veriFailed);
  }

  Future<bool> smsCodeDialog(BuildContext context) {
    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return new AlertDialog(
            title: Text('Enter sms Code'),
            content: TextField(
              onChanged: (value) {
                this.smsCode = value;
              },
            ),
            contentPadding: EdgeInsets.all(10.0),
            actions: <Widget>[
              new FlatButton(
                child: Text('Done'),
                onPressed: () {
                  FirebaseAuth.instance.currentUser().then((user) {
                    if (user != null) {
                      Navigator.of(context).pop();
                      Navigator.of(context).pushReplacementNamed('/homepage');
                    } else {
                      Navigator.of(context).pop();
                      signIn();
                    }
                  });
                },
              )
            ],
          );
        });
  }

  signIn(){
    final AuthCredential credential = PhoneAuthProvider.getCredential(
        verificationId: verificationId,
        smsCode: smsCode);

    FirebaseAuth.instance.signInWithCredential(credential).then((user){
      Navigator.of(context).pushReplacementNamed('/homepage');
    }).catchError((e){
      print('Auth Credential Error : $e');
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('PhoneAuth'),
      ),
      body: new Center(
        child: Container(
            padding: EdgeInsets.all(25.0),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                TextField(
                  decoration: InputDecoration(hintText: 'Enter Phone number'),
                  onChanged: (value) {
                    this.phoneNo = value;
                  },
                ),
                SizedBox(height: 10.0),
                RaisedButton(
                    onPressed: verifyPhone,
                    child: Text('Verify'),
                    textColor: Colors.white,
                    elevation: 7.0,
                    color: Colors.blue)
              ],
            )),
      ),
    );
  }
}

提交按钮时出现错误

Launching lib/main.dart on Dhruvin’s iPhone in debug mode...
Automatically signing iOS for device deployment using specified development team in Xcode project: ******
Running Xcode build...
Xcode build done.                                           99.4s
Installing and launching...
Syncing files to device Dhruvin’s iPhone...
Lost connection to device.

但是,我无法看到堆栈跟踪信息或由于调试器失去了应用程序的连接而登录.

However i am not able to see stacktrace or log as app lost connection from debugger.

推荐答案

i解决了该问题, 非常感谢@DevarshRanpura对我的帮助,

i Solved the Problem, thank you so much @DevarshRanpura for Helping me,

1)替换

signIn(){
    final AuthCredential credential = PhoneAuthProvider.getCredential(
        verificationId: verificationId,
        smsCode: smsCode);

    FirebaseAuth.instance.signInWithCredential(credential).then((user){
      Navigator.of(context).pushReplacementNamed('/homepage');
    }).catchError((e){
      print('Auth Credential Error : $e');
    });
  }

对此

signIn() async {
    final AuthCredential credential = PhoneAuthProvider.getCredential(
      verificationId: verificationId,
      smsCode: smsCode,
    );
    final AuthResult authResult = await _auth.signInWithCredential(credential);
    final FirebaseUser user = authResult.user;
    print('User Id : ' + user.uid);
  }

还在您的飞镖文件上定义_auth

also Define _auth on your dart file

final FirebaseAuth _auth = FirebaseAuth.instance;

2)在您的项目中添加反向客户端ID

2) adding reverse client id in to your project

  • 在xcode中打开您的项目
  • 双击您的项目名称
  • 转到信息"标签
  • 在"URL类型"->"URL方案"中添加反向客户端ID

这篇关于Flutter应用在iOS平台上的Firebase电话身份验证上崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆