2 votes

Le code d'authentification du téléphone de Flutter Firebase ne s'envoie pas par SMS

J'essaie d'activer l'authentification téléphonique Firebase dans mon projet Flutter afin qu'il envoie un SMS avec un code d'authentification au numéro saisi.

-Téléchargez la clé d'authentification APNs dans les paramètres du projet Firebase sous "Cloud Messaging".

-J'ai aussi ajouté :

io.flutter.embedded_views_preview
<string>NO</string>

au fichier info.plist

J'ai ensuite activé les modes Background -> Remote Notifications et Push Notifications dans le projet Xcode et implémenté ces deux fonctions dans le fichier AppDelegate.swift :

override func application(_ application: UIApplication, 
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
{
    // Pass device token to auth
        Auth.auth().setAPNSToken(deviceToken, type: 
AuthAPNSTokenType.prod)

    // Further handling of the device token if needed by the app
    // ...
  }

  override func application(_ application: UIApplication,
      didReceiveRemoteNotification notification: [AnyHashable : 
Any],
      fetchCompletionHandler completionHandler: @escaping 
(UIBackgroundFetchResult) -> Void) {
    if Auth.auth().canHandleNotification(notification) {
        completionHandler(UIBackgroundFetchResult.noData)
      return
    }
    // This notification is not auth related, developer should 
handle it.
  }

C'est le code qui gère l'ensemble du processus d'authentification du téléphone dans l'écran de connexion.

Future<void> verifyPhone() async {
final PhoneCodeAutoRetrievalTimeout autoRetrieve = (String verID) {
  this.verificationID = verID;
};

final PhoneCodeSent smsCodeSent = (String verID, [int 
forceCodeResend]) {

  this.verificationID = verID;
  smsCodeDialog(context).then((value) {
  });
};

final PhoneVerificationCompleted verificationSuccess =
    (AuthCredential credential) {
};

final PhoneVerificationFailed verificationFailed =
    (AuthException exception) {
  print("verification failed this bullshit");
  if (exception.message.contains('not authorized'))
    print(
        'Something weird has gone really wrong, please do not try 
later');
  else if (exception.message.contains('Network'))
    print('Please check your internet connection and try again');
  else if (exception.message.contains("credential is invalid"))
    print("credential is invalid you jerk");
  else
    print('Something has gone horribly wrong, please try later or 
never -> ${exception.message}');
};

await _auth.verifyPhoneNumber(
    phoneNumber: "+" + dialingCode + this.phoneNo,
    timeout: const Duration(seconds: 5),
    verificationCompleted: verificationSuccess,
    verificationFailed: verificationFailed,
    codeSent: smsCodeSent,
    codeAutoRetrievalTimeout: autoRetrieve);
}

  signIn() async {
    final AuthCredential credential = 
PhoneAuthProvider.getCredential(
      verificationId: verificationID,
      smsCode: smsCode,
    );
    final FirebaseUser user = await 
_auth.signInWithCredential(credential);
    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);

    Navigator.pushReplacementNamed(context, "root");
  }

Lorsque je saisis mon numéro de téléphone et que j'appuie sur "envoyer un SMS" sur un iPhone X physique, je m'attends à recevoir un SMS contenant la clé d'authentification, mais je reçois plutôt ces erreurs :

The UIApplicationDelegate must handle remote notification for phone 
number authentication to work.

If app delegate swizzling is disabled, remote notifications received 
by UIApplicationDelegate need to be forwarded to FIRAuth s 
canHandleNotificaton: method.

0voto

Enzo Lizama Points 680

Vous utilisez probablement une version de firebase_auth qui viennent avec cette question, vous pouvez vérifier les informations à ce sujet dans cette problème de flottement

La solution pour moi a été d'ajouter ce fork de firebase_auth :

firebase_auth:
git:
  url: https://github.com/collinjackson/plugins.git
  ref: 441417c2fed0ff26bf84a49ab2c5ffd2aa5487de
  path: packages/firebase_auth

Ou bien vous devrez probablement mettre à jour votre firebase_auth à la version 0.11.1+8 pour avoir la solution.

J'espère que cela pourra vous aider.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X