Я создаю приложение 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.
Может кто-нибудь помочь мне понять, что может быть причиной этой ошибки, а как мне это разобрать? Это единственная вещь в настройке, которая, как вы можете видеть, не работает в данный момент на обеих платформах симулятора.