View in English

  • Apple Developer
    • Get Started

    Explore Get Started

    • Overview
    • Learn
    • Apple Developer Program

    Stay Updated

    • Latest News
    • Hello Developer
    • Platforms

    Explore Platforms

    • Apple Platforms
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    Featured

    • Design
    • Distribution
    • Games
    • Accessories
    • Web
    • Home
    • CarPlay
    • Technologies

    Explore Technologies

    • Overview
    • Xcode
    • Swift
    • SwiftUI

    Featured

    • Accessibility
    • App Intents
    • Apple Intelligence
    • Games
    • Machine Learning & AI
    • Security
    • Xcode Cloud
    • Community

    Explore Community

    • Overview
    • Meet with Apple events
    • Community-driven events
    • Developer Forums
    • Open Source

    Featured

    • WWDC
    • Swift Student Challenge
    • Developer Stories
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Centers
    • Documentation

    Explore Documentation

    • Documentation Library
    • Technology Overviews
    • Sample Code
    • Human Interface Guidelines
    • Videos

    Release Notes

    • Featured Updates
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • Downloads

    Explore Downloads

    • All Downloads
    • Operating Systems
    • Applications
    • Design Resources

    Featured

    • Xcode
    • TestFlight
    • Fonts
    • SF Symbols
    • Icon Composer
    • Support

    Explore Support

    • Overview
    • Help Guides
    • Developer Forums
    • Feedback Assistant
    • Contact Us

    Featured

    • Account Help
    • App Review Guidelines
    • App Store Connect Help
    • Upcoming Requirements
    • Agreements and Guidelines
    • System Status
  • Quick Links

    • Events
    • News
    • Forums
    • Sample Code
    • Videos
 

Videos

Abrir menú Cerrar menú
  • Colecciones
  • Todos los videos
  • Información

Más videos

  • Información
  • Resumen
  • Código
  • Crea experiencias de comunicación en tiempo real 

    LiveCommunicationKit transforma tus apps de comunicación en tiempo real en experiencias integradas. Te mostraremos cómo ofrecer una interfaz de usuario de conversación nativa y completa que sitúe tu app justo donde las personas la necesitan: desde una presentación en pantalla completa en la pantalla bloqueada hasta una multitarea fluida con Dynamic Island. Acompáñanos en este paso a paso sobre cómo integrar el framework para conversaciones entrantes, salientes y grupales.

    Capítulos

    • 0:01 - Introduction
    • 7:56 - Incoming conversations
    • 11:29 - Outgoing conversations
    • 13:18 - Groups

    Recursos

    • Initiating VoIP conversations with LiveCommunicationKit
    • Responding to VoIP Notifications from PushKit
    • LiveCommunicationKit
      • Video HD
      • Video SD

    Videos relacionados

    WWDC25

    • Conoce App Intents

    WWDC22

    • Enhance voice communication with Push to Talk
  • Buscar este video…
    • 6:41 - Set up a conversation manager

      // Set up a conversation manager
      
      import LiveCommunicationKit
      
      let configuration = ConversationManager.Configuration(
        ringtoneName: "SampleRingtone.caf",
        iconTemplateImageData: UIImage(named: "SampleIcon")?.pngData(),
        maximumConversationGroups: 1,
        maximumConversationsPerConversationGroup: 2,
        includesConversationInRecents: true,
        supportsVideo: true,
        supportedHandleTypes: [.phoneNumber, .emailAddress]
      )
      
      let manager = ConversationManager(configuration: configuration)
      manager.delegate = self
    • 9:22 - Report the incoming conversation to the system

      // Report the incoming conversation to the system
      
      import LiveCommunicationKit
      import PushKit
      
      final class SamplePushHandler: NSObject, PKPushRegistryDelegate {
        func pushRegistry(
          _ registry: PKPushRegistry,
          didReceiveIncomingVoIPPushWith payload: PKPushPayload,
          metadata: PKVoIPPushMetadata) async {
      
          guard let (handle, uuid) = parseConversationPayload(from: payload) else { return }
      
          let capabilities = [.video, .pausing, .merging]
          let update = Conversation.Update(members: [handle], capabilities: capabilities)
          try? await manager.reportNewIncomingConversation(uuid: uuid, update: update)
        }
      }
    • 9:57 - Implement the delegate

      // Implement the delegate
      
      import LiveCommunicationKit
      
      final class SampleDelegate: ConversationManagerDelegate {
        func conversationManager(
          _ manager: ConversationManager,
          perform action: ConversationAction
        ) {
          switch action {
          case let action as JoinConversationAction:
            handleJoinAction(action)
          default:
            action.fail()
          }
        }
      }
    • 10:13 - Fulfill the join action

      // Handle a failed connection
      
      extension SampleDelegate {
       func handleJoinAction(_ action: JoinConversationAction) {
          guard let conversation = manager.conversations.first(where: {$0.uuid == uuid })else {
            return action.fail()
          }
      
          manager.reportConversationEvent(.conversationStartedConnecting(.now), for: conversation)
      
          Task {
            do {
              try await setupMediaStream(with: action.conversationUUID)
              manager.reportConversationEvent(.conversationConnected(.now), for: conversation)
              action.fulfill(dateConnected: .now)
            } catch {
              action.fail()
            }
          }
        }
      }
    • 11:17 - Route end actions

      // Route end actions
      
      final class SampleDelegate: ConversationManagerDelegate {
        // …
        func conversationManager(
          _ manager: ConversationManager,
          perform action: ConversationAction
        ) {
          switch action {
          case let action as JoinConversationAction:
            handleJoinAction(action)
          case let action as EndConversationAction:
            handleEndAction(action)
          default:
            action.fail()
          }
        }
      }
    • 12:14 - Create a start action

      let startAction = StartConversationAction(
        conversationUUID: UUID(),
        handles: [Handle(type: .phoneNumber, value: "+1-650-555-0199", displayName: "Ryan Notch")],
        isVideo: false
      )
    • 12:23 - Perform the action

      try await manager.perform([startAction])
    • 12:29 - Route start actions

      // Route start actions
      
      final class SampleDelegate: ConversationManagerDelegate {
        // …
        func conversationManager(
          _ manager: ConversationManager,
          perform action: ConversationAction
        ) {
          switch action {
          case let action as JoinConversationAction:
            handleJoinAction(action)
          case let action as EndConversationAction:
            handleEndAction(action)
          case let action as StartConversationAction:
            handleStartAction(action)
          default:
            action.fail()
          }
        }
      }
    • 13:51 - Start group conversations

      // Start group conversations
      
      let adam = Handle(type: .emailAddress,
                        value: "adam.halwani@icloud.com",
                        displayName: "Adam Halwani")
      let david = Handle(type: .emailAddress,
                         value: "david@example.com",
                         displayName: "David Evans")
      let ryan = Handle(type: .phoneNumber,
                        value: "+16505550199",
                        displayName: "Ryan Notch")
      
      let startAction = StartConversationAction(
        conversationUUID: UUID(),
        handles: [david, ryan],
        isVideo: false
      )
      try await manager.perform([startAction])
    • 14:01 - Report group membership updates

      // Report group membership updates
      
      let update = Conversation.Update(
        localMember: adam,
        members: [david, ryan],
        activeRemoteMembers: [david, ryan],
        capabilities: [.merging, .pausing, .unmerging]
      )
      
      manager.reportConversationEvent(
        .conversationUpdated(update),
        for: conversation
      )
    • 15:26 - Route merge actions

      // Route merge actions
      
      final class SampleDelegate: ConversationManagerDelegate {
        func conversationManager(
          _ manager: ConversationManager,
          perform action: ConversationAction
        ) {
          switch action {
          case let action as JoinConversationAction:
            handleJoinAction(action)
          case let action as EndConversationAction:
            handleEndAction(action)
          case let action as StartConversationAction:
              handleStartAction(action)
          case let action as MergeConversationAction:
            handleMergeAction(action)
          default:
            action.fail()
          }
        }
      }
    • 15:33 - Handle the merge action

      // Handle the merge action
      
      extension SampleDelegate {
        func handleMergeAction(_ action: MergeConversationAction) {
          let sourceUUID = action.conversationUUID
          let targetUUID = action.conversationUUIDToMergeWith
          guard manager.conversations.contains(where: { $0.uuid == sourceUUID }),
                manager.conversations.contains(where: { $0.uuid == targetUUID }) else {
            return action.fail()
          }
      
          Task {
            do {
              let update = try await combineStreams(from: sourceUUID, into: targetUUID)
              manager.reportConversationEvent(.conversationUpdated(update), for: target)
              action.fulfill()
            } catch {
              action.fail()
            }
          }
        }
      }
    • 0:01 - Introduction
    • LiveCommunicationKit is the modern way to build live conversation experiences that integrate with the system. Conversations in LiveCommunicationKit are built upon fundamental elements, such as handles, display names, and capabilities, that configure the interface, as well as a single ConversationManager object to manage the full lifecycle.

    • 7:56 - Incoming conversations
    • Incoming conversations rely on the ConversationManager class where you configure properties like ringtones, group limits, and supported handles. Use PushKit to deliver an incoming conversation to a device, then report it to the ConversationManager.

    • 11:29 - Outgoing conversations
    • Start outgoing conversations initiated within the app by performing a StartConversationAction. This allows your app's ConversationManager delegate to handle the entire process, using the same unified action-handling logic for actions started by in-app or system UI.

    • 13:18 - Groups
    • Track the full list of invited members in addition to the currently active remote members so the interface stays perfectly in sync as people join or drop off. Advanced call management is handled through delegate actions and supports merging and unmerging calls as needed.

Developer Footer

  • Videos
  • WWDC26
  • Crea experiencias de comunicación en tiempo real 
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • Apple Intelligence
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Downloads
    • Sample Code
    • Videos
    Open Menu Close Menu
    • Help Guides & Articles
    • Contact Us
    • Forums
    • Feedback & Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • Mini Apps Partner Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Read the latest news.
    Get the Apple Developer app.
    Copyright © 2026 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines