Плагин flutter_facebook_login не позволяет войти в систему на симуляторе iOS (с использованием Android Studio) - PullRequest
0 голосов
/ 10 февраля 2020

Я создаю приложение Flutter с Android Studio (Time Tracker, следуя курсу Udemy), и я нахожусь на этапе, когда я создал страницу входа, которая позволяет мне входить, используя либо Google, Facebook, электронная почта или «анонимность». Я использую версию 2.0.1 плагина flutter_facebook_login, поскольку последняя версия, версия 3.0.0, генерирует много ошибок, связанных с Cocoapods. Версия 2.0.1 устраняет все эти ошибки.

Я выполняю всю аутентификацию с использованием пакета Firebase_auth от Flutter, чтобы можно было генерировать уникальный идентификатор пользователя, чтобы контролировать то, что видит каждый пользователь. Процесс входа разделен на две разные страницы. Есть страница «auth.dart», которая выполняет всю работу по авторизации, с Firebase, Google и Facebook et c. Это выглядит так:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter_facebook_login/flutter_facebook_login.dart';
import 'package:google_sign_in/google_sign_in.dart';

class User {
  User({@required this.uid});
  final String uid;
}

abstract class AuthBase {
  Stream<User> get onAuthStateChanged;
  Future<User> currentUser();
  Future<User> signInAnonymously();
  Future<User> signInWithGoogle();
  Future<User> signInWithFacebook();
  Future<void> signOut();
}

class Auth implements AuthBase {
  final _firebaseAuth = FirebaseAuth.instance;

  User _userFromFirebase(FirebaseUser user) {
    if (user == null) {
      return null;
    }
    return User(uid: user.uid);
  }

  @override
  Stream<User> get onAuthStateChanged {
    return _firebaseAuth.onAuthStateChanged.map(_userFromFirebase);
  }

  @override
  Future<User> currentUser() async {
    final user = await _firebaseAuth.currentUser();
    return _userFromFirebase(user);
  }

  @override
  Future<User> signInAnonymously() async {
    final authResult = await _firebaseAuth.signInAnonymously();
    return _userFromFirebase(authResult.user);
  }

  @override
  Future<User> signInWithGoogle() async {
    final googleSignIn = GoogleSignIn();
    final googleAccount = await googleSignIn.signIn();
    if (googleAccount != null) {
      final googleAuth = await googleAccount.authentication;
      if (googleAuth.accessToken != null && googleAuth.idToken != null) {
        final authResult = await _firebaseAuth.signInWithCredential(
          GoogleAuthProvider.getCredential(
            idToken: googleAuth.idToken,
            accessToken: googleAuth.accessToken,
          ),
        );
        return _userFromFirebase(authResult.user);
      } else {
        throw PlatformException(
          code: 'ERROR_MISSING_GOOGLE_AUTH_TOKEN',
          message: 'Missing Google Auth Token',
        );
      }
    } else {
      throw PlatformException(
        code: 'ERROR_ABORTED_BY_USER',
        message: 'Sign in aborted by user',
      );
    }
  }

  @override
  Future<User> signInWithFacebook() async {
    final facebookLogin = FacebookLogin();
    final result = await facebookLogin.logInWithReadPermissions(
      ['public_profile'],
    );
    if (result.accessToken != null) {
      final authResult = await _firebaseAuth
          .signInWithCredential(FacebookAuthProvider.getCredential(
        accessToken: result.accessToken.token,
      ));
      return _userFromFirebase(authResult.user);
    } else {
      throw PlatformException(
        code: 'ERROR_ABORTED_BY_USER',
        message: 'Sign in aborted by user',
      );
    }
  }

  @override
  Future<void> signOut() async {
    final googleSignIn = GoogleSignIn();
    await googleSignIn.signOut();
    final facebookLogin = FacebookLogin();
    await facebookLogin.logOut();
    await _firebaseAuth.signOut();
  }
}

Затем страница входа со всеми кнопками и взаимодействиями с Google и Facebook и т. Д. c. выглядит следующим образом:

import 'package:flutter/material.dart';
import 'package:time_tracker_flutter_course/app/sign_in/sign_in_button.dart';
import 'package:time_tracker_flutter_course/app/sign_in/social_sign_in_button.dart';
import 'package:time_tracker_flutter_course/services/auth.dart';

class SignInPage extends StatelessWidget {
  SignInPage({@required this.auth});
  final AuthBase auth;

  Future<void> _signInAnonymously() async {
    try {
      await auth.signInAnonymously();
    } catch (e) {
      print(e.toString());
    }
  }

  Future<void> _signInWithGoogle() async {
    try {
      await auth.signInWithGoogle();
    } catch (e) {
      print(e.toString());
    }
  }

  Future<void> _signInWithFacebook() async {
    try {
      await auth.signInWithFacebook();
    } catch (e) {
      print(e.toString());
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Time Tracker'),
        elevation: 2.0,
      ),
      body: _buildContent(),
      backgroundColor: Colors.grey[200],
    );
  }

  Widget _buildContent() {
    return Padding(
      padding: EdgeInsets.all(16.0),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          Text(
            'Sign In',
            textAlign: TextAlign.center,
            style: TextStyle(
              fontSize: 32.0,
              fontWeight: FontWeight.w600,
            ),
          ),
          SizedBox(height: 48.0),
          SocialSignInButton(
            assetName: 'images/google-logo.png',
            text: 'Sign in with Google',
            textColor: Colors.black87,
            color: Colors.white,
            onPressed: _signInWithGoogle,
          ),
          SizedBox(height: 8.0),
          SocialSignInButton(
            assetName: 'images/facebook-logo.png',
            text: 'Sign in with Facebook',
            textColor: Colors.white,
            color: Color(0xFF334D92),
            onPressed: _signInWithFacebook,
          ),
          SizedBox(height: 8.0),
          SignInButton(
            text: 'Sign in with email',
            textColor: Colors.white,
            color: Colors.teal[700],
            onPressed: () {},
          ),
          SizedBox(height: 8.0),
          Text(
            'or',
            style: TextStyle(fontSize: 14.0, color: Colors.black87),
            textAlign: TextAlign.center,
          ),
          SizedBox(height: 8.0),
          SignInButton(
            text: 'Go anonymous',
            textColor: Colors.black,
            color: Colors.lime[300],
            onPressed: _signInAnonymously,
          ),
        ],
      ),
    );
  }
}

Весь этот код и методология отлично работает в большинстве случаев, включая:

  • Android симулятор с анонимным входом, Google AND Facebook
  • iOS симулятор с анонимным входом в систему и ТОЛЬКО для Google

Когда я пытаюсь войти в систему с помощью метода Facebook на симуляторе iOS в Android Studio, вот где я сталкиваюсь с проблемами , В консоли Android Studio ошибка «выплюнула»:

flutter: PlatformException(ERROR_ABORTED_BY_USER, Sign in aborted by user, null)

Из первого блока кода (код «auth.dart») вы увидите, что эта ошибка просто generi c, который я встроил - я вообще не указывал c.

Я не верю, что проблема связана с плагином flutter_facebook_login, поскольку он все еще работает для Android, если в плагине нет проблем, характерных только для iOS. Я думаю, что есть проблема с настройкой iOS для Facebook, хотя я следовал инструкциям к письму, в том числе с Xcode.

Может кто-нибудь помочь мне понять, что может быть причиной этой ошибки, а как мне это разобрать? Это единственная вещь в настройке, которая, как вы можете видеть, не работает в данный момент на обеих платформах симулятора.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

У меня была такая же проблема, я думаю, что это проблема Facebook API с бета-версией ios. Я нашел работу вокруг. Это всего лишь обходной путь, а не фактическое решение. Это работает для меня, и я надеюсь, что это поможет вам: -

Работа вокруг проверки, когда статус переходит к FacebookLoginStatus.cancelledByUser, затем использование ниже

 facebookLogin.loginBehavior = FacebookLoginBehavior.webViewOnly;

Это заставит флаттер открыться авторизация на Facebook в веб-браузере, после чего вы можете заставить его работать.

Ознакомьтесь с полным методом

 Future signInWithFaceBook() async{
   var facebookLogin = new FacebookLogin();
   var result = await facebookLogin.logInWithReadPermissions(['email', 'public_profile']);
   switch (result.status) {
     case FacebookLoginStatus.loggedIn:
       print(result.accessToken.token);
       // Add your route to home page here after sign In
       break;
     case FacebookLoginStatus.cancelledByUser:
    // In your case the program flow will go here as it as a bug with the api I suppose

       facebookLogin.loginBehavior = FacebookLoginBehavior.webViewOnly;
// Once the code comes here the above line will force flutter to open facebook auth in a webview
       result = await facebookLogin.logInWithReadPermissions(['email', 'public_profile']);

       if(result.status==FacebookLoginStatus.loggedIn){
         FirebaseUser user = (await _auth.signInWithCredential(FacebookAuthProvider.getCredential(accessToken: result.accessToken.token)
         )
         ).user;
         final FirebaseUser currentUser = await _auth.currentUser();
         assert(user.uid == currentUser.uid);
         // Add your home page here
       }
       print('CANCELED BY USER');
       break;
     case FacebookLoginStatus.error:
       print(result.errorMessage);
       break;
   }
 }
0 голосов
/ 15 апреля 2020

Обновите ваш код одной строкой кода из рисунка ниже. Это работает.

введите описание изображения здесь

...