NativeScript / firebase

Modular Firebase 🔥 implementation for NativeScript. Supports both iOS & Android platforms for all Firebase services.
https://docs.nativescript.org/plugins/firebase-core.html
Apache License 2.0
56 stars 50 forks source link

With FirebaseAppDelegateProxyEnabled = false, phone authentication hangs and then crashes #231

Closed dlcole closed 1 year ago

dlcole commented 1 year ago

This is related to the fix proposed in issue 221 regarding 'No APNS token specified error...

    <key>FirebaseAppDelegateProxyEnabled</key>
    <false/>

Adding the above lines to info.plist is sufficient to bypass the APNS error on iOS devices, but not iOS emulators.

BUT, this changes causes a hang in the login process. In particular,

let idp = await firebase().ui().show({ providers: [new PhoneProvider()] });

yields this sequence:

  1. Welcome screen presented, with "Sign in with phone" button as only visible option - tap button
  2. Enter phone number screen presented - enter number and tap Verify
  3. Verifying you’re not a robot… screen appears briefly
  4. about:blank screen appears, empty screen with Done (upper-left) and refresh (upper-right) as only options, and tapping Done cancels the login with an error, The interaction was cancelled by the user, and crashes
  5. When I attempt to display the error message with an alert, the still app crashes, even within a try/catch block
  6. When I attempt to log in again, ui().show crashes with the error message, Error: Cannot read properties of undefined (reading 'presentViewControllerAnimatedCompletion')

Might some type of Firebase AppDelegate be required for phone authentication?

image

dlcole commented 1 year ago

I have found through my investigation that is sufficient to call getAPNSToken() prior to calling getToken() to avoid the dreaded error message

Error: The operation couldn’t be completed. No APNS token specified before fetching FCM Token

Doing so also avoids their hang/crash problem documented in this issue, so I will close it. You'll still want to catch the error, as it will be thrown on iOS emulators. My code, in app-root.js, looks like this:

 try {
    const authStatus = await firebase().messaging().requestPermission({ ios: { alert: true, }, });
    const enabled = authStatus === AuthorizationStatus.AUTHORIZED || authStatus === AuthorizationStatus.PROVISIONAL;
    if (enabled) {
      await firebase().messaging().registerDeviceForRemoteMessages();
      firebase().messaging().showNotificationsWhenInForeground = false;

      const aPNSToken = firebase().messaging().getAPNSToken(); 
      const token = await firebase().messaging().getToken();
      global.deviceToken = token;
      // code to handle token... 

      firebase().messaging().onToken((token) => {
      // code to handle token
      });

       ...

 } catch (e) {
    console.warn("app-root error: " + e);
  }

I have removed the lines from info.plist suggested by [issue 221](https://github.com/NativeScript/firebase/issues/221).