Capacitor: bug: PushNotifications registration & registrationError listeners not fired

Created on 13 Dec 2019  ·  8Comments  ·  Source: ionic-team/capacitor

Bug Report

Capacitor Version

npx cap doctor output:

Installed Dependencies:
@capacitor/cli 1.4.0
@capacitor/core 1.4.0
@capacitor/ios 1.4.0
@capacitor/android 1.4.0
[success] Android looking great! 👌
Found 0 Capacitor plugins for ios:
success] iOS looking great! 👌

Affected Platform(s)

  • [x] iOS
  • [ ] Android
  • [ ] Electron
  • [ ] Web

Current Behavior

First I remove the app and on start up, the "permission alert" appears asking for notification permissions. Whether I accept or decline, no listener is fired on my real iOS device (iPhone Xs 13.1.3). However, when testing using the iOS Simulator, the registrationError listener is indeed fired.

When I click on the "permission alert", this is printed in the console:

APP ACTIVE
⚡️ TO JS {"isActive":true}
⚡️ [log] - onAppStateChange {"isActive":true}

So for some reason, this listener is fired instead.

Expected Behavior

PushNotifications listeners should fire after accepting/declining permissions.

Sample Code or Sample Application Repo

I am using Ionic + Vue.js.

    PushNotifications.register();

    PushNotifications.addListener('registration', token => {
      console.log('Push registration success, token: ' + token.value);
    });

    PushNotifications.addListener('registrationError', error => {
      console.log('Error on registration: ' + JSON.stringify(error));
    });

    PushNotifications.addListener('pushNotificationReceived', notification => {
      console.log('Push received: ' + JSON.stringify(notification));
    });

    PushNotifications.addListener('pushNotificationActionPerformed', notification => {
      console.log('Push action performed: ' + JSON.stringify(notification));
    });

Other Technical Details

npm --version output: 6.13.0

node --version output: v12.9.1

pod --version output (iOS issues only): 1.8.4

Most helpful comment

@bryplano Yes, you are correct. I added print() to debug what was going on in PushNotifications.swift and suddenly it worked. Does Xcode cache certain files on build? Anyway, it works now. Thanks.

Had this exact problem, even after reinstalling packages. Writing to the file solved it. Thanks!

All 8 comments

I just realized that it was this part of the guide that created the error. It seems to work if I skip the step below.

If you would like to recieve the firebase FCM token from iOS instead of the raw APNS token, you will need to also change your AppDelegate.didRegisterForRemoteNotificationsWithDeviceToken code to look like this:

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().apnsToken = deviceToken
        InstanceID.instanceID().instanceID { (result, error) in
            if let error = error {
                NotificationCenter.default.post(name: Notification.Name(CAPNotifications.DidFailToRegisterForRemoteNotificationsWithError.name()), object: error)
            } else if let result = result {
                NotificationCenter.default.post(name: Notification.Name(CAPNotifications.DidRegisterForRemoteNotificationsWithDeviceToken.name()), object: result.token)
            }
        }
    }

However, I am interested in the FCM token rather than the APNS token.

I would wager it is related to this PR (the doc update came out in 1.4.0 and there was a small code change or two around the push code on iOS): https://github.com/ionic-team/capacitor/pull/2078

@bryplano Yes, you are correct. I added print() to debug what was going on in PushNotifications.swift and suddenly it worked. Does Xcode cache certain files on build? Anyway, it works now. Thanks.

As soon as I run PushNotifications.register(); the app registers the FCM Token. Shouldn't this only happen when the user presses "Allow"? How do I know if the user allowed/declined the permission?

Shouldn't this line of code fire an event so we know what the user choice was?

https://github.com/ionic-team/capacitor/blob/master/ios/Capacitor/Capacitor/CAPUNUserNotificationCenterDelegate.swift#L28

@bryplano Yes, you are correct. I added print() to debug what was going on in PushNotifications.swift and suddenly it worked. Does Xcode cache certain files on build? Anyway, it works now. Thanks.

Had this exact problem, even after reinstalling packages. Writing to the file solved it. Thanks!

@bryplano Yes, you are correct. I added print() to debug what was going on in PushNotifications.swift and suddenly it worked. Does Xcode cache certain files on build? Anyway, it works now. Thanks.

Had this exact problem, even after reinstalling packages. Writing to the file solved it. Thanks!

Same here. Added print() in PushNotifications.swift and it works

Can someone post what their PushNotifications.swift file looks like with the print statements? Thanks!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

nicobytes picture nicobytes  ·  3Comments

MatanYadaev picture MatanYadaev  ·  3Comments

Hansel03 picture Hansel03  ·  3Comments

stripathix picture stripathix  ·  3Comments

moberwasserlechner picture moberwasserlechner  ·  3Comments