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.

Replies

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 :(

Thanks for posting this question rmendes22.

This VOIP Pushkit Anomaly deserves an official answer from Apple.

Our company had to shelf development of our App (3 years worth of development) as it used the VOIP push kit occasionally under special circumstances to reliably wake up the App in the background .... without it, our app's behaviour is unpredictable and unusable.

Any updates on this would be great.

Thanks a ton guys!





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 
Hi
seems like same thing happen facebook messenger as i forced killed the app (background app refreshed is off and push notifications not allowed) - sent messages from web , turned off the the wifi and opened the app and i could see the latest messages synced in the background, don't really know what magic fb do here , Anyone figured this out ?
Any updates on this? We're also having trouble since Callkit was forced on Pushkit.

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>⏎