VoIP push does not deliver on a certain iOS device

324 Views Asked by At

We are developing a voip calling app. We are using CallKit and PushKit frameworks. A user recently reported that his iPhone is not receiving CallKit push anymore, but few days ago that was working. Please note mutable push is working on his device. We have collected device's console logs and learned that device did not receive voip push payload.

No firewalls installed and no recent change history of network settings.

Environments info:

Device Model: iPhone Xs
iOS version: 15.6.1
Network Connectivity: Wifi

This is how we registered PushKit

    private func registerForVoIPPushes() {
        self.voipRegistry = PKPushRegistry(queue: pushRegistryQueue)
        self.voipRegistry.delegate = self
        self.voipRegistry.desiredPushTypes = [.voIP]
    }

We conforms the PKPushRegistryDelegate this way

extension AppDelegate: PKPushRegistryDelegate {
    func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
        let deviceToken = pushCredentials.token.map { String(format: "%02x", $0) }.joined()        
        updateVoIPToken(deviceToken)
    }
    
    func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
        DDLogDebug("Incoming call voip push: \(payload.dictionaryPayload)")
        handleIncomingCall(payload: payload.dictionaryPayload)
        completion()
    }
    
    func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
        DDLogDebug("didInvalidatePushTokenFor type: \(type)")
    }
}

This is how server sends voip push payload

path = '/3/device/{0}'.format({deviceToken}})

request_headers = {
    'apns-expiration': '0',
    'apns-priority': '10',
    'apns-topic': 'com.companyname.app.voip',
    'apns-push-type':'voip',
    'authorization': 'bearer {auth-token}'
}

# Open a connection the APNS server
conn = HTTP20Connection('api.push.apple.com:443')
conn.request(
    'POST', 
    path, 
    payload, 
    headers=request_headers
)
resp = conn.get_response()
print(resp.status)
print(resp.read())

The output http status code shows 200 but push actually not delivered. Same codebase is woking fine with other devices.

I appreciate any helps and suggestions.

Thanks.

1

There are 1 best solutions below

2
Ayan Sarkar On
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
    NSLog("pushRegistry:didUpdatePushCredentials:forType:")
    let deviceToken = credentials.token.map { String(format: "%02.2hhx", $0) }.joined()
    print("\(#function) token is: \(deviceToken)")
}