Flutter и Firebase — вход в Apple не работает

#firebase #flutter #google-cloud-firestore #apple-sign-in

# #firebase #flutter #google-облако-firestore #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;
    }
  }
 

Ответ №1:

Если вы используете симулятор iOS 14, это может быть связано с проблемой, описанной здесь. Обходным решением было бы использовать реальное устройство для отладки или использовать симулятор iOS 13

Кроме того, смотрите Эту тему для справки

Ответ №2:

Я столкнулся с такой же проблемой в одном из моих проектов.Для решения проблемы необходимо добавить свой ключ sha в firebase и facebook.

Также вы можете попробовать приведенный ниже код,

 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();
    }
  }
}
 

Комментарии:

1. Спасибо за ваш ответ, но я уже добавил ключ sha в firebase

2. Можете ли вы показать ошибки, если они есть. Поставьте печать для проверки. Также, пожалуйста, убедитесь, что вы включили вход в Apple в разделе аутентификации firebase

3. Я обновил вопрос сообщением об ошибке, и да, я включил вход в Apple в firebase

4. Можете ли вы попробовать код, который я опубликовал прямо сейчас

5. Спасибо за код, но, к сожалению, при его использовании я получаю ошибки во всех моих файлах входа в систему, но я постараюсь посмотреть, смогу ли я адаптировать то, что вы отправили, к моему существующему коду