A standard view controller whose interface lets the user compose and send SMS or MMS messages.
Example:
import Foundation
import MessageUI
import SwiftUI
struct MessageView: UIViewControllerRepresentable {
typealias Completion = (_ messageSent: Bool) -> Void
static var canSendText: Bool { MFMessageComposeViewController.canSendText() }
let recipients: [String]?
let body: String?
let completion: Completion?
func makeUIViewController(context: Context) -> UIViewController {
guard Self.canSendText else {
let errorView = MessagesUnavailableView()
return UIHostingController(rootView: errorView)
}
let controller = MFMessageComposeViewController()
controller.messageComposeDelegate = context.coordinator
controller.recipients = recipients
controller.body = body
return controller
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
func makeCoordinator() -> Coordinator {
Coordinator(completion: self.completion)
}
class Coordinator: NSObject, MFMessageComposeViewControllerDelegate {
private let completion: Completion?
public init(completion: Completion?) {
self.completion = completion
}
public func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
controller.dismiss(animated: true, completion: nil)
completion?(result == .sent)
}
}
}
struct MessagesUnavailableView: View {
var body: some View {
VStack {
Image(systemName: "xmark.octagon")
.font(.system(size: 64))
.foregroundColor(.red)
Text("Messages is unavailable")
.font(.system(size: 24))
}
}
}
struct MyView: View {
@State private var showingMsg = false
var body: some View {
Button("Show Messages") {
self.showingMsg = true
}
.sheet(isPresented: self.$showingMsg) {
MessageView(recipients: ["recipients go here"],
body: "Message goes here") { messageSent in
print("MessageView with message sent? \(messageSent)")
}
}
}
}