3
votes

We currently have a solution to send the push notification from FCM to APNS and then to iOS. Due to the introduction of iOS13, the APNS now requires apns-push-type in any incoming payload that specifies whether it's an alert notification, background notification, or any other type. I am wondering how to add this information in the message sent to the FCM.

Currently we use pyFCM to send messages to FCM. And we follow this page as reference: https://firebase.google.com/docs/cloud-messaging/http-server-ref

from pyfcm import FCMNotification
push_service = FCMNotification(api_key="XXXX")
registration_id = '<Token>'
data_message = {
    "Score": "3*1",
    "DeviceId": "XXXXXX",
}

# Background notification
result = push_service.notify_single_device(registration_id=registration_id,
                                       content_available=True,
                                       data_message=data_message)

# Alert notification
result = push_service.notify_single_device(registration_id=registration_id,
                                       message_title='Sample title',
                                       message_body='Sample body',
                                       data_message=data_message,
                                       )

This works fine with existing iOS app. But for iOS 13, I cannot find any place to specify apns-push-type, or any equivalent field that FCM will translate to apns-push-type that would be sent to APNS.

I know iOS 13 is relatively new, so everyone is still working on adapting the existing solution to it. Hopefully someone can give me some insight how to put the apns-push-type into my existing solution. Thanks.

4

4 Answers

0
votes

Just add 'apns-push-type' = 'XXX' in the request header which you want to send to FCM

0
votes

you can add this option using 'extra_kwargs' of the Notification.

Add extra_kwargs={"apns_push_type":"background"} for background notification.

# Background notification 
result = push_service.notify_single_device(registration_id=registration_id,
                                           content_available=True,
                                           data_message=data_message,
                                           low_priority=True,
                                           extra_kwargs={"apns_push_type": "background"})

Also, mark the priority of background notification as low. This is done by sending low_priority as true.

For alert notifications, we are required to send the apns push-type as "alert"

 # Alert notification
result = push_service.notify_single_device(registration_id=registration_id,
                                   message_title='Sample title',
                                   message_body='Sample body',
                                   data_message=data_message,
                                   extra_kwargs={"apns_push_type": "alert"}
                                   )
0
votes

you can check if push notifications work json api post request to https://fcm.googleapis.com/fcm/send url. in configure header Content-Type : application/json and Authorization:key=<Your FCm server key>

then in request body add these

{ "to" : "device_token",
 "notification" : 
 { 
    "title": "message title!", 
     "body": "MESSAGE BODY",

 "token": "XXXXXXXXXX", 
 "id": 1959,
      "sound": "default"
                                      },

 "apns": {
    "headers": { 
      "apns-push-type": "alert"
    }

  }
}

then you can check if it works or not. my project was previously working before updating IOS 13. after update, notifications doesnt worked on background, adding

"apns": {
    "headers": { 
      "apns-push-type": "alert"
    }

  }

to project made receive notifications possible

0
votes

Our solution is to add it to the header upon request (This answer is on PHP code)

$headers = [
            'Authorization: key=' . $serverKey,
            'Content-Type: application/json',
            'apns-push-type: background'
          ];

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $fcmEndpoint); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, CURL_IPRESOLVE_V4); 
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payloads)); 
$result = json_decode(curl_exec($ch), true); curl_close($ch);