Hello everyone,
Our team is currently developing a PTT (Push-to-Talk) application using the officially recommended PushToTalk framework. During development, we've encountered a point of confusion regarding the application's behavior after being force-quit by the user.
Based on our understanding of the PushToTalk framework documentation (https://developer.apple.com/documentation/pushtotalk/creating-a-push-to-talk-app/) and the PTChannelManager session restoration mechanism, when a user manually kills the app from the background (App Switcher), the current PTT session (the system session managed by PTChannelManager) should terminate. Subsequent pushtotalk type pushes sent via APNS, without an active session, appear to be silently discarded by the system and cannot wake the app for processing (similar to what Kevin Elliott DTS mentioned in https://developer.apple.com/forums/thread/760506 Point D). This seems to prevent reliable PTT message reception in our app after a user force quits.
However, we've observed that some popular PTT applications on the market (e.g., TenTen) appear to successfully receive and play PTT voice messages from friends even after the user has performed a force-quit action. This behavior seems inconsistent with our test results and understanding based on the standard framework, posing a challenge for us in providing similar reliability using standard methods.
This naturally leads us to wonder how this capability is achieved. We've reviewed developer forums and are aware of the historical existence of a PTT-specific com.apple.developer.pushkit.unrestricted-voip entitlement, which allowed PushKit usage for PTT without CallKit binding. While Apple DTS engineers have repeatedly stated this entitlement is being deprecated and urged migration to the PushToTalk framework (e.g., https://developer.apple.com/forums/thread/763289), we are curious if the observed "wake-after-force-quit" capability might be related to some apps potentially still utilizing this outgoing special entitlement. Alternatively, is there perhaps a mechanism within the standard PushToTalk framework that allows wake-up after force quit that we haven't fully grasped?
Therefore, we'd like to ask fellow developers for clarification and discussion:
-
When using the standard PushToTalk framework, have others confirmed that the app indeed cannot be woken up by pushtotalk pushes after being force-quit by the user? Is this the expected behavior?
-
Has anyone successfully achieved a TenTen-like experience (reliable PTT reception after force quit) using only the standard PushToTalk framework? If so, could you share key implementation insights or areas to focus on? (e.g., Is it related to specific usage patterns of the restorationDelegate?)
-
How do you view this potential discrepancy between standard framework capabilities and the behavior exhibited by some apps? What considerations does this bring to development planning and user experience design (especially when users might have expectations set by the "always-on" behavior of other apps)?
-
Are there any best practices or specific techniques when using PTChannelManager session management and restoration that maximize PTT message reliability (especially after the app is terminated by the system in the background), while still adhering to the framework's design principles (like user awareness of the session via UI)? [For instance, another developer raised challenges related to PTT framework restrictions here: https://developer.apple.com/forums/thread/773981]
We hope this discussion can help clarify our understanding of the framework and gather community best practices for building reliable PTT functionality while adhering to Apple's guidelines.
Thanks for any insights or shared experiences!
- com.apple.developer.pushkit.unrestricted-voip has been functionally disabled since the iOS 15 SDK.
Yes, that's correct. Many apps does still include to either support older systems or because they simply have not removed it, but it has no effect whatsoever.
- com.apple.developer.pushkit.unrestricted-voip.ptt is deprecated, no longer granted through standard requests, and developers are strongly urged to migrate to the PushToTalk framework.
Also correct, though "strongly" understates the warning level. It's only visible in development builds, but the system actually posts periodic alert dialogs warning that this entitlement will be disabled "soon" when an app relies on this entitlement. The behavior is not subtle and exists to ensure that every PTT developer knows that this entitlement should no longer be relied on.
- Using the PushToTalk framework correctly involves the PTChannelManager and typically results in a system UI indicator (like the blue status bar item) when a session is active.
Yes, that's correct.
Reordering things a bit, let me actually start here:
We are genuinely trying to understand the landscape and build compliant, reliable apps using the recommended frameworks. The apparent discrepancy exemplified by Ten Ten makes it difficult to reconcile the official guidance with real-world observations.
I understand that there is sometimes a feeling among outside developers that some developers are given "special" treatment. While I can't say that this is true for everything Apple does, I can say that this is NOT true of the PTT entitlement. This entitlement was only ever granted to Push To Talk apps and the we stopped granting the entitlement shortly after the PushToTalk framework shipped in iOS 16.
I'm not going to comment on our interactions with any specific developer or app, but I will try to answer your questions in general terms.
- How was it possible for this app to obtain both of these highly restricted entitlements, particularly the .ptt variant, at a time when Apple was guiding developers away from them and towards the PushToTalk framework?
Your assumption here is that entitlement grants happens at or near the time an app ships, but that assumption is generally incorrect. Most developer request the entitlements they need when they begin development, particularly for a situation like this where the entitlement is essential to the apps basic functionality. PTT apps in particular tend to be complex apps to implement and often take several years to develop. That means a PTT app that shipped in 2022 (iOS 16) would have started development in 2020 (or earlier), which is when they would have been granted the entitlement.
- How are these entitlements, especially the supposedly disabled general unrestricted-voip, seemingly still functioning within this specific app, allowing it to bypass standard PushToTalk UI conventions?
As I described above, the PTT entitlement does still function in iOS 18. We have provided PTT apps with a generous time frame to transition to the PushToTalk framework and those apps are now being actively warned that the should not continue to rely on it.
- Is there an uncommunicated policy, an exception process, or a specific partnership arrangement that allows certain applications to receive and utilize these deprecated/restricted entitlements, while others are directed strictly to the standard frameworks?
No, nothing like this exists for the PTT entitlement.
__
Kevin Elliott
DTS Engineer, CoreOS/Hardware