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! 👌
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.
PushNotifications listeners should fire after accepting/declining permissions.
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));
});
npm --version output: 6.13.0
node --version output: v12.9.1
pod --version output (iOS issues only): 1.8.4
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?
@bryplano Yes, you are correct. I added
print()to debug what was going on inPushNotifications.swiftand 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 inPushNotifications.swiftand 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!
Most helpful comment
Had this exact problem, even after reinstalling packages. Writing to the file solved it. Thanks!