1
votes

raison: "Tuer l'application parce qu'elle n'a jamais posté d'appel entrant dans le système après avoir reçu un rappel push PushKit VoIP."

Je cherche des solutions mais je n'ai encore rien trouvé. Mon application ne reçoit que des push VoIP et après iOS 13, je ne peux plus recevoir de push lorsque l'application est en arrière-plan. J'ai regardé d'autres questions mais je n'ai pas pu résoudre mon problème avec les solutions proposées. Il y a quelqu'un qui peut m'aider?

Sur iOS 13.0 et versions ultérieures, les appels Voice over IP entrants doivent être signalés lorsqu'ils sont reçus et avant que la méthode didReceiceIncomingPush () ne termine l'exécution, à l'aide du framework CallKit, ou le système mettra fin à votre application.

L'omission répétée de signaler les appels peut empêcher votre application de recevoir d'autres notifications d'appels entrants.

Fondamentalement, vous ne pouvez plus utiliser les push VoIP pour la messagerie non VoIP, et vous devrez utiliser des notifications push régulières pour celles-ci.

J'ai lu cette annonce mais dans mon application pour des types particuliers de push VoIP, je ne peux pas utiliser la fonction reportNewIncomingCall() car elle nécessite des paramètres tels que: uuid, handle, hasVideo ecc. Et ces paramètres ne sont pas présents dans la charge utile.


5 commentaires

Vous devez obtenir ces (les paramètres requis) dans le push void appelant.


Je ne suis pas sûr que ce soit la solution, les push VoIP avec ces paramètres ne sont pas également reçus lorsque l'application est en mode arrière-plan


Étant donné que les appels doivent être signalés et que ces champs sont obligatoires pour signaler l'appel, vous devrez modifier la charge utile pour le push.


Le push voip indique-t-il un appel entrant? Si tel est le cas, le. Vous devez signaler cet appel entrant via CallKit. Si ce n'est pas le cas, vous devez utiliser le système de notification push normal.


J'utilise à la fois des appels push entrants et push, également de type voip, qui sont des push normaux. Dans les deux cas, aucun d'eux n'arrive en mode backgorund. Le seul moyen est de gérer ceux qui n'affectent pas l'appel comme des poussées normales?


4 Réponses :


3
votes

Depuis iOS 13, vous ne pouvez utiliser que les push VoIP pour signaler les appels entrants. Pour les push qui ne sont pas des appels entrants, vous devez utiliser d'autres alternatives (jetez un œil à cette réponse ici).

L'omission répétée de signaler les appels peut empêcher votre application de recevoir d'autres notifications d'appels entrants.

D'après mes tests, il semblait bloquer toutes les poussées VoIP après avoir omis de signaler seulement 2 ou 3 fois, et il resterait bloqué pendant environ 24h.

car il nécessite des paramètres tels que: uuid, handle, hasVideo ecc. Et ces paramètres ne sont pas présents dans la charge utile

Si vous recevez un push VoIP pour un nouvel appel entrant, mais que vous n'avez toujours pas les informations requises que vous avez énumérées ci-dessus, vous pouvez initialiser l'appel avec des valeurs "factices" et les mettre à jour plus tard. Par exemple, définir le remoteHandle sur CXHandle(type: .generic, value: "Connecting...") et le mettre à jour ultérieurement avec la valeur correcte:

cxCallUpdate.remoteHandle = CXHandle(type: .emailAddress, value: "email@mail.com")
cxProvider.reportCall(with: callUid, updated: cxCallUpdate)


2 commentaires

Pensez-vous que cette solution est également pour les push VoIP qui ne sont pas des push call mais uniquement des push avec une charge utile personnalisée?


Vous ne pouvez pas utiliser les push VoIP pour autre chose que signaler un appel entrant. Il n'y a aucun moyen de le faire.



0
votes

Ce n'est pas un problème de charge utile. Vous pouvez créer votre propre charge utile. Il vous suffit d'appeler la fonction ci-dessous dans ce rappel.

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void)

Sinon, Apple bloque les notifications push pendant un certain temps.

provider.reportNewIncomingCall(with: uuid, update: update) { error in
completion() }


0 commentaires

0
votes

Si vous implémentez l'appel entrant comme une autre fonction et l'appelez comme ci-dessous. Ça ne marchera pas

let parts = pushCredentials.token.map { String(format: "%02.2hhx", $0) }

let token = parts.joined()
print("did update push credentials with token: \(token)") }

Essayez plutôt de suivre:

curl -v -d '{"callerID": "test@test.com", "uuid":"YourUDIDorEmptyField", "hasVideo": false}' --http2 --cert yourvoipcertificatepemfile_Here.pem:pemfilePassword_Here https://api.development.push.apple.com/3/device/yourDeviceTokenID_generated_with_update_push_credentials_with_token_Here

Cela a implémenté la demande d'appel de publication du fournisseur d'appel dans le pushRegistry:didReceiveIncomingPushWith payload with completion handler fonction de pushRegistry:didReceiveIncomingPushWith payload with completion handler . Cela a fonctionné pour moi.

Essayez la requête VOIP avec la commande de terminal:

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {

            print("didReceiveIncomingPushWith payload")

            if let callerID = payload.dictionaryPayload["callerID"] as? String,
                let hasVideo = payload.dictionaryPayload["hasVideo"] as? Bool{
                let update = CXCallUpdate()
                 update.remoteHandle = CXHandle(type: .generic, value: callerID)
                 update.hasVideo = hasVideo


                 let bgTaskID = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
                self.provider?.reportNewIncomingCall(with: UUID(), update: update, completion: { (_) in
                    completion()
                })
                UIApplication.shared.endBackgroundTask(bgTaskID)
            }
        completion()
    }

Remplacer:

  1. test@test.com avec les détails relatifs sur CXHandle.HandleType S'il s'agit de votre nom d'appelant ( .generic ) ou de votre adresse e-mail ( .emailAddress ) ou de votre numéro de téléphone ( .phoneNumber )

  2. YourUDIDorEmptyField avec votre UUID ou vous pouvez le garder vide comme lorsque reportNewIncomingCall(with: UUID(), update: callUpdate) a initialisé l' UUID() dans le code lui-même.

  3. "hasVideo" : false ici false est un Boolean (true/false) qui gère évidemment l'état de l'appel Audio / Video sur l'écran d'appel entrant et vous pouvez l'utiliser pour identifier l'appel exactement de quel type il est en l'implémentant.

  4. yourvoipcertificatepemfile_Here le nom de votre fichier .pem que vous avez exporté depuis le certificat voip ( voipcertificate.cer pas directement mais après avoir généré à partir du compte développeur et installé sur votre machine. Ensuite, dans votre keychain -> mycertificates exportez- le sous forme de fichier .pem avec un Mot de passe ( pemfilePassword_Here ).)

  5. pemfilePassword_Here votre mot de passe que vous avez donné lorsque vous exportez un fichier .pem à partir de votre certificat VoIP installé. (reportez-vous au 4e point.)

  6. yourDeviceTokenID_generated_with_update_push_credentials_with_token_Here doit être remplacé par le token généré en suivant la méthode Delegate de PKPushRegistryDelegate . Voir ci-dessous.

    func pushRegistry(_ registry: PKPushRegistry,didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {

    func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
        yourIncomingCallFunction()
    }
    

Si vous avez des inquiétudes, faites-le moi savoir. J'ai essayé et testé cela sur l'application au premier plan, en arrière-plan, lockScreen et même après la suppression de l'application des applications récentes. (iOS 13.4.1 et Xcode version 11.4 (11E146))


0 commentaires

0
votes

iOS met fin à l'application même si ce n'est pas pour iOS 13. Apple, dit lui-même, il se terminerait si l'application est développée iOS 13 et plus tard, mais termine toujours l'application après l'échec de la notification. J'ai parlé avec le support des développeurs Apple, ils ont dit que seul iOS 13 ferait cela, mais j'ai toujours une erreur.


0 commentaires