On iOS [27.x (build)], LiveCommunicationKit shows Handle.value on every system surface and ignores Handle.displayName. That forces a choice that CallKit doesn't:
- Put a stable account id in
value(as WWDC26 session 226 recommends, so Recents redial can identify the person), and the raw id appears on the incoming call screen, the banner and in Recents. - Put the person's name in
valueso the UI reads correctly, and a redial from Recents hands back only the name, which can't reliably identify anyone.
Minimal reproduction
let configuration = ConversationManager.Configuration(
ringtoneName: nil,
iconTemplateImageData: nil,
maximumConversationGroups: 1,
maximumConversationsPerConversationGroup: 1,
includesConversationInRecents: true,
supportsVideo: false,
supportedHandleTypes: [.generic, .phoneNumber, .emailAddress]
)
let manager = ConversationManager(configuration: configuration)
let remote = Handle(type: .generic, value: "u-1234", displayName: "Jane Appleseed")
try await manager.reportNewIncomingConversation(
uuid: UUID(),
update: Conversation.Update(members: [remote], capabilities: [])
)
Expected: the incoming call UI and the Recents row show "Jane Appleseed". Session 226 says displayName is "what the system shows when it can't match the handle to a contact". Tapping the Recents row delivers an INStartCallIntent whose contact personHandle.value is u-1234.
Actual: the full-screen ring, the foreground banner and the Recents row all show u-1234. Tapping the row does deliver INStartCallIntent with personHandle.value == "u-1234", so redial works, but the user never sees the name.
What we tried, all with the same result (the value is shown):
Handle.Kindset to.generic,.phoneNumberor.emailAddress, with every kind listed insupportedHandleTypesConversation.Update(localMember:)set to the local user's handleactiveRemoteMembersset to the remote handle, andlocalMemberplusactiveRemoteMemberstogether- Donating an
INInteraction(anINStartCallIntentwhoseINPersonhaspersonHandleset to the id,displayNameset to the name andcustomIdentifierset to the id) when the conversation ends. The donation succeeds, but the Recents row and the redial payload don't change.
CallKit comparison, same device: CXCallUpdate.remoteHandle = CXHandle(type: .generic, value: "u-1234") with localizedCallerName = "Jane Appleseed" shows the name on the ring and in Recents. A redial from Recents delivers personHandle.value == "u-1234". That's the behaviour we expected from LiveCommunicationKit.
Questions:
- Is
Handle.displayNamemeant to be shown when the handle doesn't match a contact? If so, is there a configuration step we're missing? - If this is a bug, is there a supported way with LiveCommunicationKit to show a name while keeping a stable identifier for Recents redial?
Filed as FB24933340. Device: iPhone 15 pro, iOS [27.0.1].