I'm developing a softphone in Swift using CallKit and PushKit. Before iOS 13, VoIP notifications were working perfectly. But after the iOS 13 update, my app isn't getting VoIP push notification when it's in background. In foreground didReceiveIncomingPushWith
is called, but in background it isn't called.
How can I fix this issue?
Code
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
print("\(#function)")
let voipPushResgistry = PKPushRegistry(queue: nil)
voipPushResgistry.delegate = self
voipPushResgistry.desiredPushTypes = [PKPushType.voIP]
return true
}
func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
print("\(#function) token invalidated")
}
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
let deviceToken = credentials.token.reduce("", {$0 + String(format: "%02X", $1) })
print("\(#function) token is: \(deviceToken)")
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
print("\(#function)")
print("It worked..")
if type == .voIP {
print("Uygulama aktif")
}
}
Thanks.
If you build the app with Xcode 11 (and iOS 13 SDK) PushKit won't work any longer if you fail to report to CallKit.
On iOS 13.0 and later, if you fail to report a call to CallKit, the
system will terminate your app. Repeatedly failing to report calls may
cause the system to stop delivering any more VoIP push notifications
to your app. If you want to initiate a VoIP call without using
CallKit, register for push notifications using the UserNotifications
framework instead of PushKit.
https://developer.apple.com/documentation/pushkit/pkpushregistrydelegate/2875784-pushregistry
You can no longer receive a VoIP notification and not report a new incoming call through CallKit, when compiling with iOS 13 SDK.
Check this other question, I've explained the options you can use for notifications that should not alert for new incoming calls.
Answer from @mudassirzulfiqar on Github (Thanks to him). I got voip push notification after uninstall and re-install my app. Now, I will call reportNewIncomingCall
in didReceiveIncomingPushWith
.
I have figured out the issue, as it is stated in the official forums by Apple that not calling completion will result ban your application after 3 to 5 attempts I guess. So I think when the app get banned in 2 to 3 attempts then it stops receiving voip.
Use case:
I reinstalled my application and put my application into the background and
didReceiveIncomingPushWith gets called. But because i'm not using completion closure on the right time, probably again Im not going to receive voip next time.
And this always work fine when app is in foreground.
The documentation says:
Typically, you keep the push registry object running for the duration of your app.
Try to declare voipPushResgistry
as a property of the AppDelegate
, instead of a variable of the application(didFinishLaunchingWithOptions)
function. Maybe it could help.