Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

didReceiveRemoteNotification not called in iOS 13.3 when app is in background

I am banging my head. I am implementing push notification. Everything is working fine (push is received, badge is updated) but under iOS 13.3 the method application(_:didReceiveRemoteNotification:fetchCompletionHandler:) is not called when the app is in the background. If the app is in the foreground or using an iOS 12 device the method is called. I register for push notification in the following way:

[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        });
    }
}];

The payload is set to the following

{"aps": {
    "badge": 10,
    "alert": "test",
    "content-available": 1
}}

I tried adding "Remote notifications" and "Background processing" as app capabilities in all variations (only "Remote notifications"/"Background processing", without any of those capabilities, enabling both) without any change. I set the delegate for the UNUserNotificationCenter but again without success. I set the headers accordingly:

curl -v \
 -H 'apns-priority: 4' \
 -H 'apns-topic: xx.xxxxx.xxxx' \
 -H 'apns-push-type: alert' \
 -H 'Content-Type: application/json; charset=utf-8' \
 -d '{"aps": {"badge": 10,"alert": "test", "content-available":1}}' \
 --http2 \
 --cert pushcert.pem \
 https://api.sandbox.push.apple.com/3/device/1234567890

From the docs it states that this method is called even when the app is in background:

Use this method to process incoming remote notifications for your app. Unlike the application:didReceiveRemoteNotification: method, which is called only when your app is running in the foreground, the system calls this method when your app is running in the foreground or background.

What am I missing here for iOS 13?

like image 977
MartinW1985 Avatar asked Jan 23 '20 10:01

MartinW1985


4 Answers

Have you set

"content-available": 1

in you backend APS payload?

Also need to make sure you have enabled background mode in your iOS App's info.plist file

<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
    <string>remote-notification</string>
</array>
like image 130
Zhang Zhan Avatar answered Nov 16 '22 21:11

Zhang Zhan


This delegate method : -

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{

is getting invoked when we click on notification for iOS 13 and app is in background.

like image 6
user13150044 Avatar answered Nov 16 '22 23:11

user13150044


I spend a support ticket to get an answer to this problem.

It turns out that the documentation is not 100% "valid" for iOS 13 on this topic. The device decides whether to wake up or not. Although the documentation states a little different.

Apple's preferred way of implementation as a notification extension. After that, you have to adapt the payload to include "mutable-content".

I asked the support afterward if I should file a radar and they replied with "yes".

like image 4
MartinW1985 Avatar answered Nov 16 '22 23:11

MartinW1985


Need activated "BackGround fetch" go to File Project - signIn capabilities - BackgroundModes - and check Background fetch and Remote notifications as well

remember in didFinishAlunchWithOptions

    Messaging.messaging().delegate = self
    UNUserNotificationCenter.current().delegate = self

with that I have a response in method - didReceive response - in background but only if tap the notification.

I found this info... but i dont know if is real

"If this is a new system behavior from iOS, then it's unlikely that FCM will be able to provide a workaround. A few things to note:

Apple's docs mention that silent notifications will be throttled by the system to conserve power. In the past, we've seen that testing silent notifications with your device plugged in to a power source will reduce throttling. In older iOS versions, Apple's docs have mentioned that force-quitting an application will prevent wakeups from silent notifications entirely. I'm not sure if this is still the case."

I Still looking around for the notifications in background for update badge icon in the app, at the momen I receive the notification.

like image 1
Yan Cervantes Avatar answered Nov 16 '22 21:11

Yan Cervantes