With FirebaseAppDelegateProxyEnabled = false, phone authentication hangs and then crashes
dlcole opened this issue · 1 comments
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:
- Welcome screen presented, with "Sign in with phone" button as only visible option - tap button
- Enter phone number screen presented - enter number and tap Verify
- Verifying you’re not a robot… screen appears briefly
- 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
- When I attempt to display the error message with an alert, the still app crashes, even within a try/catch block
- 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?
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).
