WhatsApp and VoIP push notifications on iOS 13

Hi,


Since version 2.20.31, released a few days ago, WhatsApp is being built with the iOS 13 SDK, and as such it should have to comply to the new VoIP push notification rules, where an incoming call must be reported to CallKit otherwise the app will be terminated.


However we can easily observe from console logs that they are sending VoIP push notifications to awake the app when sending messages from the web client, and that those push notifications not only do not show any native CallKit UI but also keep the app awake long enough to sync with the web client:


default 17:09:44.127516+0000 apsd : Received message for enabled topic 'net.whatsapp.WhatsApp.voip' onInterface: NonCellular with payload '{
c = 1;
id = 3EB0128F27BBDC904743;
t = 1583860183;
}' with priority 10 for device token: NO
default 17:09:44.146511+0000 SpringBoard Received trusted open application request for "net.whatsapp.WhatsApp" from :343>.
default 17:09:44.515731+0000 callservicesd Call source registered with configuration

The logs also mention some type of call source reported but I could not find any related API.


From my experience with VoIP pushes, if we don't report the incoming call the app is instantly killed:


error  18:56:19.949023+0000  callservicesd  Killing VoIP app com.xxxxxx.xxxxxx because it failed to post an incoming call in time.


So, how are they doing this? Is there a specific API to report the incoming call as being handled in-app and not requiring the native call UI to be shown? Or are they using some kind of private entitlement that whitelists the app so it doesn't get killed?


I'm asking because my app, while fully supporting regular content pushes, we had to drop a web client -like functionality because we could no longer send VoIP pushes to wake the app and reconnect the web socket, and we very much would like to know how we can reactivate it.


Thanks in advance for any help.

yeah .i noticed this also before 3 month ago and i did't find any reason for that , I also check some of other messaging app like telegram ,there all moved to use VOIP push notification for only incoming call ,So Why whatsapp is the only one have that exception for use VOIP notification for other functionalities and the app not killed !!!!!!!!!!!!!

I hope some of developers or support give us some explanation about this .
Thanks in advance
Any update on this? I have facing the same issue :(

I'd like to add my voice.

Our softphone app uses a two-step incoming call process like many others. We send a push to the client, it posts a "registration" to our core which releases the actual call.

On IOS this new developer-hostile requirements means that we are forced to post a "call" to callkit immediately we receive the push. Now we face two difficult problems:
  1. User answers too fast, there is no actual call

  2. Caller hangs up quickly - we have this stale call ringing and no communication path to our phone - we have to send another push but it can't be a voip push...

The flow is terrible. Previously the push just woke up the app and it registers. It signals callkit as soon as it gets the actual call. This is the flow we use on another mobile phone platform and it works smoothly for us and the user.

It is highly annoying and frustrating to discover that a competitor has been given a free pass around this hostile change.


Hi All,

Our app also mainly based on VOIP notifications, any update for this issue is very helpful for us. How we can get permission like WhatsApp and Telegram to run our apps.

Thank you
Hi, Any Update?  I have facing the same issue 

The solution:


There is no solution.

WhatsApp use a restrict entitlement called com.apple.developer.pushkit.unrestricted-voip, that allow to no report an incoming call (see WhatsApp entitlement code below).

The Apple support told:
That entitlement isn't being granted any more.

I guess that entitlement was granted just to give more time to big companies to adjust their code._

I have stuck on that by one week, and I didn't find official information nowhere.
Maybe this reply can help other developers to don't waste time.

WhatsApp latest entitlements file:

Code Block  <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict>    <key>com.apple.developer.icloud-container-identifiers</key>    <array>        <string>57T9237FN3.net.whatsapp.WhatsApp</string>    </array>    <key>com.apple.developer.pushkit.unrestricted-voip</key>    <true/>    <key>com.apple.developer.ubiquity-container-identifiers</key>    <array>        <string>57T9237FN3.net.whatsapp.WhatsApp</string>    </array>    <key>application-identifier</key>    <string>UKFA9XBX6K.net.whatsapp.WhatsApp</string>    <key>com.apple.developer.carplay-messaging</key>    <true/>    <key>aps-environment</key>    <string>production</string>    <key>com.apple.developer.icloud-container-environment</key>    <string>Production</string>    <key>com.apple.developer.associated-domains</key>    <array>        <string>applinks:api.whatsapp.com</string>        <string>applinks:v.whatsapp.com</string>        <string>applinks:chat.whatsapp.com</string>        <string>applinks:wa.me</string>    </array>    <key>com.apple.developer.siri</key>    <true/>    <key>com.apple.developer.team-identifier</key>    <string>57T9237FN3</string>    <key>com.apple.developer.icloud-services</key>    <array>        <string>CloudDocuments</string>        <string>CloudKit</string>    </array>    <key>com.apple.security.application-groups</key>    <array>        <string>group.net.whatsapp.WhatsApp.shared</string>        <string>group.com.facebook.family</string>        <string>group.net.whatsapp.WhatsApp.private</string>        <string>group.net.whatsapp.WhatsAppSMB.shared</string>        <string>group.net.whatsapp.family</string>    </array></dict></plist>

I also found that Life 360 uses voip pushkit with no callkit call. You can easily see it on the device console.

iPhone callservicesd(ApplePushService)[127] <Notice>: <APSConnection: 0x125f9f9a0> making delegate (<CSDVoIPApplicationController: 0x125e69ed0>) calls to deliver message 3910829434 { aps = {
"content-available" = 1;
};
e = 60;
t = srt;
} for topic com.life360.safetymap.voip

This is not fair for smaller developers and we need to pressure Apple for equal treatment.

China App WeChat:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.pushkit.unrestricted-voip-regulatory</key>
<true/>
<key>application-identifier</key>
<string>532LCLCWL8.com.tencent.xin</string>
<key>com.apple.developer.networking.HotspotHelper</key>
<true/>
<key>aps-environment</key>
<string>production</string>
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:help.wechat.com</string>
<string>applinks:wxaurl.cn</string>
<string>applinks:wxmpurl.cn</string>
</array>
<key>com.apple.developer.networking.wifi-info</key>
<true/>
<key>com.apple.developer.siri</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>88L2Q4487U</string>
<key>com.apple.developer.healthkit</key>
<true/>
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>packet-tunnel-provider</string>
<string>app-proxy-provider</string>
<string>content-filter-provider</string>
</array>
<key>com.apple.developer.networking.HotspotConfiguration</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tencent.xin</string>
</array>
</dict>
</plist>
WhatsApp and VoIP push notifications on iOS 13
 
 
Q