I want to send a single message to many recipients, but in doing so iMessage creates a group chat with all of the recipients. How can I avoid this and send the message to each user individually without making a group chat? I also don't want to present the sheet for every user.
Fully working, copy pasteable code:
import SwiftUI
import MessageUI
struct SendMessageView: View {
@State private var isShowingMessages = false
@State private var recipients = ["<phone number 1>", "<phone number 2>"]
@State private var message = "Hello"
var body: some View {
Button(action: {
self.isShowingMessages.toggle()
}) {
Text("Show Messages")
}
.sheet(isPresented: self.$isShowingMessages) {
MessageUIView(recipients: $recipients, body: $message, completion: handleCompletion(_:))
}
}
func handleCompletion(_ result: MessageComposeResult) {
switch result {
case .cancelled:
// DO SOMETHING
break
case .sent:
// DO SOMETHING
break
case .failed:
// DO SOMETHING
break
@unknown default:
// DO SOMETHING
break
}
}
}
protocol MessagessViewDelegate {
func messageCompletion (result: MessageComposeResult)
}
class MessagesViewController: UIViewController, MFMessageComposeViewControllerDelegate {
var delegate: MessagessViewDelegate?
var recipients: [String]?
var body: String?
override func viewDidLoad() {
super.viewDidLoad()
}
func displayMessageInterface() {
let composeVC = MFMessageComposeViewController()
composeVC.messageComposeDelegate = self
// Configure the fields of the interface.
composeVC.recipients = self.recipients ?? []
composeVC.body = body ?? ""
// Present the view controller modally.
if MFMessageComposeViewController.canSendText() {
self.present(composeVC, animated: true, completion: nil)
} else {
self.delegate?.messageCompletion(result: MessageComposeResult.failed)
}
}
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
controller.dismiss(animated: true)
self.delegate?.messageCompletion(result: result)
}
}
struct MessageUIView: UIViewControllerRepresentable {
// To be able to dismiss itself after successfully finishing with the MessagesUI
@Environment(\.presentationMode) var presentationMode
@Binding var recipients: [String]
@Binding var body: String
var completion: ((_ result: MessageComposeResult) -> Void)
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIViewController(context: Context) -> MessagesViewController {
let controller = MessagesViewController()
controller.delegate = context.coordinator
controller.recipients = recipients
controller.body = body
return controller
}
func updateUIViewController(_ uiViewController: MessagesViewController, context: Context) {
uiViewController.recipients = recipients
uiViewController.displayMessageInterface()
}
class Coordinator: NSObject, UINavigationControllerDelegate, MessagessViewDelegate {
var parent: MessageUIView
init(_ controller: MessageUIView) {
self.parent = controller
}
func messageCompletion(result: MessageComposeResult) {
self.parent.presentationMode.wrappedValue.dismiss()
self.parent.completion(result)
}
}
}
This is a method that requires user confirmation