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.
4 Réponses :
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)
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.
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() }
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:
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
)
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.
"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.
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
).)
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.)
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))
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.
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?