Flutter Firebase Auth with Apple 不会注销



我为Flutter集成了一个Apple登录
在我必须从Stores((页面注销之前,一切都很好

应用程序登录页(主页(显示了一系列使用不同应用程序登录的按钮:

  • 谷歌
  • 匿名者
  • 苹果
  • 电子邮件&密码

他们都可以通过使用注销按钮注销,但苹果除外。这是我的代码
main.dart

class Main extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<User>.value(
value: AuthService().user,
child: MaterialApp(
home: Wrapper(),
routes: {
"/stores": (_) => Stores()
},
));
}
}

包装镖

class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
if (user == null) {
return Home(); <-- Landing page before login
} else {
return Stores(); <-- Landing page after login, where the logout button is
}
}
}

主页.dart

class _HomeState extends State<Home> {
final AuthService _auth = AuthService();
bool loading = false;
final welcomeText = 'Welcome';
final subtitle = 'Make grocery chores easier';
final anonymousButtonText = 'Skip';
@override
Widget build(BuildContext context) {
return Stack(children: [
AuthLayout(),
Scaffold(
backgroundColor: Colors.transparent,
appBar: AppBar(
title: Center(child: Text(welcomeText)),
backgroundColor: Colors.transparent,
),
body: SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget> [
// Sign In with Apple
Padding(
padding: EdgeInsets.all(8.0),
child: FutureBuilder<Object>(
future: _auth.appleSignInAvailable,
builder: (context, snapshot) {
if (snapshot.data == true) {
return AppleSignInButton(
onPressed: () async {
FirebaseUser user =
await _auth.appleSignIn();
if (user != null) {
Navigator.pushReplacementNamed(context, "/stores");
}
},
);
} else {
return Container();
}
})) ....

AuthService.dart

class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
final GoogleSignIn _googleSignIn = new GoogleSignIn();
// Create user object based on FirebaseUser
User _userFromFirebaseUser(FirebaseUser user) {
return user != null ? User(uid: user.uid) : null;
}
// Auth change user stream
Stream<User> get user {
return _auth.onAuthStateChanged.map(
_userFromFirebaseUser);
}
// SignIn with Google
Future signInGoogle() async {
GoogleSignInAccount googleSignInAccount = await _googleSignIn.signIn();
GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;
AuthCredential credential = GoogleAuthProvider.getCredential(
idToken: googleSignInAuthentication.idToken,
accessToken: googleSignInAuthentication.accessToken);
try {
AuthResult result = (await _auth.signInWithCredential(credential));
FirebaseUser user = result.user;
return _userFromFirebaseUser(user);
} catch (e) {
print(e.toString());
return null;
}
}
// SignIn with Apple
// Determine if Apple Signin is available on device
Future<bool> get appleSignInAvailable => AppleSignIn.isAvailable();
Future appleSignIn() async {
try {
final AuthorizationResult appleResult =
await AppleSignIn.performRequests([
AppleIdRequest(requestedScopes: [Scope.email, Scope.fullName])
]);
if (appleResult.error != null) {
// handle error from Apple
}
final AuthCredential credential = OAuthProvider(providerId: 'apple.com')
.getCredential(
accessToken: String.fromCharCodes(
appleResult.credential.authorizationCode),
idToken:
String.fromCharCodes(appleResult.credential.identityToken));
AuthResult result = (await _auth.signInWithCredential(credential));
FirebaseUser user = result.user;
return user;

} catch (error) {
print(error);
return null;
}
}
// SignOut
Future signOut() async {
try {
return await _auth.signOut(); <-- Should I do something different here for Apple?
} catch (e) {
print(e.toString());
return null;
}
}
}

所有其他应用程序都正确注销,但苹果没有。既然它在使用/路线,我应该在路标上做一些不同的事情吗?

非常感谢您的帮助
非常感谢Joe

await _firebaseAuth.signOut();

使用以上代码进行注销并检查firebase IOS配置

应该没问题,请确保您已经遵循了此处描述的步骤:

https://firebase.google.com/docs/auth/ios/apple

这意味着您的应用程序需要满足以下要求才能使apple登录正常工作:

  • 成为苹果开发者计划的成员
  • 在证书、标识符和;苹果开发者网站的个人资料页面
  • 启用苹果作为firebase上的登录提供商

最新更新