SwiftUI Integration

Adding to a Navigation Hierarchy

When integrating in a SwiftUI view hierarchy, ensure that the UIViewController that is returned by the UIViewControllerRepresentable makeUIViewController(context:) method is a UINavigationController containing the desired SDK UIViewController (for example, the Messaging UIViewController).

Also, ensure that the SwiftUI View conforming to UIViewControllerRepresentable is not contained within a NavigationView.

In addition, depending on the surrounding view hierarchy, SwiftUI may not honor an edgesIgnoringSafeArea(_:) request. This can happen, for example, if the view is inside a container that respects the screen's safe area (which is the case of the SDK views). In that case you may need to apply edgesIgnoringSafeArea(_:) to the container instead.

Following the above guidance will avoid issues such as navigation bar titles and buttons not appearing as expected, as well as unexpected behavior with SDK views frame on UI state changing (i.e. keyboard display, full screen style presentation).

The code below demonstrates how to display the Messaging UIViewController from a SwiftUI View.

struct ContentView: View {
  var body: some View {      // Do not wrap the below view in a NavigationView      MessagingView()          .edgesIgnoringSafeArea([.bottom, .top])  }}
struct MessagingView: UIViewControllerRepresentable {
  func makeUIViewController(context: Context) -> UIViewController {
      var viewController = UIViewController()      let engines = [ChatEngine.engine()]      let configs = [ChatConfiguration()]
      do {          viewController = try Messaging.instance.buildUI(engines: engines,                                                          configs: configs)      } catch {          print("Error creating view controller: \(error)")      }
      // Return a UINavigationController containing our UIViewController      return UINavigationController(rootViewController: viewController)  }