微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter 和 Firebase - Apple 登录无效

如何解决Flutter 和 Firebase - Apple 登录无效

我正在尝试使用以下代码设置 Apple 登录。点击按钮时什么也没有发生。

我收到以下错误

Tried calling: authorizationCode
Flutter: NoSuchMethodError: The getter 'authorizationCode' was called on null.
Receiver: null

我该如何解决这个问题?

Future<bool> get appleSignInAvailable => AppleSignIn.isAvailable();

  Future<User> appleSignIn() async {
    try {
      final AuthorizationResult appleResult =
          await AppleSignIn.performRequests([
        AppleIdRequest(requestedScopes: [Scope.email,Scope.fullName])
      ]);

      if (appleResult.error != null) {
        // handle errors from Apple
      }

      final AuthCredential credential =
          OAuthProvider('apple.com').credential(
        accesstoken:
            String.fromCharCodes(appleResult.credential.authorizationCode),idToken: String.fromCharCodes(appleResult.credential.identityToken),);

      UserCredential result =
          await Global.fbAuth.signInWithCredential(credential);
      User user = result.user;

      updateUserData(user);

      return user;
    } catch (error) {
      print(error);
      return null;
    }
  }

解决方法

如果您使用的是 iOS 14 模拟器,这可能是由于 issue reported here。解决方法是使用真实设备进行调试或使用 iOS 13 模拟器

此外,请参阅此 thread 以供参考

,

我在我的一个项目中遇到了同样的问题。你必须在 firebase 和 facebook 中添加你的 sha 密钥才能解决这个问题。

你也可以试试下面的代码,

import 'package:apple_sign_in/apple_sign_in.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/services.dart';

class AuthService {
  final _firebaseAuth = FirebaseAuth.instance;

  Future<User> signInWithApple({List<Scope> scopes = const []}) async {
    // 1. perform the sign-in request
    final result = await AppleSignIn.performRequests(
        [AppleIdRequest(requestedScopes: scopes)]);
    // 2. check the result
    switch (result.status) {
      case AuthorizationStatus.authorized:
        final appleIdCredential = result.credential;
        final oAuthProvider = OAuthProvider('apple.com');
        final credential = oAuthProvider.credential(
          idToken: String.fromCharCodes(appleIdCredential.identityToken),accessToken:
              String.fromCharCodes(appleIdCredential.authorizationCode),);
        final authResult = await _firebaseAuth.signInWithCredential(credential);
        final firebaseUser = authResult.user;
        if (scopes.contains(Scope.fullName)) {
          final displayName =
              '${appleIdCredential.fullName.givenName} ${appleIdCredential.fullName.familyName}';
          await firebaseUser.updateProfile(displayName: displayName);
        }
        return firebaseUser;
      case AuthorizationStatus.error:
        throw PlatformException(
          code: 'ERROR_AUTHORIZATION_DENIED',message: result.error.toString(),);

      case AuthorizationStatus.cancelled:
        throw PlatformException(
          code: 'ERROR_ABORTED_BY_USER',message: 'Sign in aborted by user',);
      default:
        throw UnimplementedError();
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。