Implement iOS 13 updates
https://onesignal.com/blog/ios-13-introduces-4-breaking-changes-to-notifications/ https://aws.amazon.com/blogs/messaging-and-targeting/sending-push-notifications-to-ios-13-devices-with-amazon-sns/
In order to send VOIP push notifications we need to set $this->headers[self::HEADER_APNS_PUSH_TYPE] = 'voip';
I've tried adding that on Request.php but it also needs to be set
$this->headers[self::HEADERS_APNS_TOPIC] == bundleId."voip"
When I'm doing the auth I know I'm sending that header but I can't retrieve it from Request.php (I don't know how, I've tried multiple stuff).. so what I did waws, a sort of a hack, sending a customValue (from my app) on the payload, and updating Request.php with the following code
// new header required to support iOS 13
$this->headers[self::HEADER_APNS_PUSH_TYPE] = 'alert';
$payload = $notification->getPayload();
try {
$apnsTopic = $payload->getCustomValue(self::HEADER_APNS_TOPIC);
} catch (InvalidPayloadException $e) {
}
if ($notification->getPayload()->isContentAvailable()) {
$this->headers[self::HEADER_APNS_PUSH_TYPE] = 'background';
}
if (isset($apnsTopic) && !empty($apnsTopic)) {
$this->headers[self::HEADER_APNS_TOPIC] = $apnsTopic;
$this->headers[self::HEADER_APNS_PUSH_TYPE] = 'voip';
}
But I know this is not ideal, and we might just recover that value (appBundleId) from the headers and then we might add a validation if strpos($appBundleId, 'voip') then we can set $this->headers[self::HEADER_APNS_PUSH_TYPE] = 'voip'
I would like to work in a patch, but I'm trying to understand the codebase and why that header is "lost" after the authentication :/
But can we check if HEADER_APNS_TOPIC exists, then add HEADER_APNS_PUSH_TYPE=void?
if ($notification->getPayload()->isContentAvailable()) {
$this->headers[self::HEADER_APNS_PUSH_TYPE] = 'background';
} elseif (isset($this->headers[self::HEADER_APNS_TOPIC]))
$this->headers[self::HEADER_APNS_PUSH_TYPE] = 'voip';
}
@edamov I'll try this today and I'll let you know if it works. Thanks!
Hmm I think I misunderstood you, how come I can have $this->headers[self::HEADER_APNS_TOPIC] with the value of the bundleId."voip" ? automatically, as this is being sent when we authenticate against apple api?
Seems now I understand what do you mean :smiley:
Request class is not accessible. We need to improve Request class with the code I wrote above.
Will it make sense? Can you create PR?
Ok I will create the PR with this code, although I will create a branch with the modifications I need to make it work on my project, then after when everything is upstream I'll point to that branch.
Thanks!
I made a PR: https://github.com/edamov/pushok/pull/91 that will solve the voip part.
Thanks!
I just found there are much more push types like mdm, fileprovider, complication.
It is very good that it is possible now to set them
I tried to send voip push notifications, but apparently this package doesn't automatically add a .voip suffix to the bundle id.
voip ... If you set this push type, the apns-topic header field must use your app’s bundle ID with .voip appended to the end.
https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns/
Apparently, we can close this issue along with this one https://github.com/edamov/pushok/issues/97