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 value so 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.Kind set to .generic, .phoneNumber or .emailAddress, with every kind listed in supportedHandleTypes
Conversation.Update(localMember:) set to the local user's handle
activeRemoteMembers set to the remote handle, and localMember plus activeRemoteMembers together
Donating an INInteraction (an INStartCallIntent whose INPerson has personHandle set to the id, displayName set to the name and customIdentifier set 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.displayName meant 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].