我想向许多收件人发送一条消息,但这样做时 iMessage 会创建与所有收件人的群聊。如何避免这种情况并将消息单独发送给每个用户而不进行群聊?我也不想向每个用户展示该表。
完全正常工作,复制可粘贴代码:
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)
}
}
}
这是需要用户确认的方法
import SwiftUI
import MessageUI
class MessagesViewController: UIViewController, MFMessageComposeViewControllerDelegate {
var delegate: MessagessViewDelegate?
var recipients: [String]?
var body: String?
var currentIndex = 0
var isShowingMessages: Binding<Bool>?
override func viewDidLoad() {
super.viewDidLoad()
}
func displayMessageInterface() {
if let recipient = recipients?[currentIndex] {
let composeVC = MFMessageComposeViewController()
composeVC.messageComposeDelegate = self
composeVC.recipients = [recipient]
composeVC.body = body ?? ""
if MFMessageComposeViewController.canSendText() {
self.present(composeVC, animated: true, completion: nil)
} else {
self.delegate?.messageCompletion(result: MessageComposeResult.failed)
}
} else {
self.delegate?.messageCompletion(result: MessageComposeResult.sent)
}
}
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
controller.dismiss(animated: true) {
if self.currentIndex + 1 < self.recipients!.count {
self.currentIndex += 1
self.displayMessageInterface()
} else {
self.delegate?.messageCompletion(result: result)
self.isShowingMessages?.wrappedValue = false
}
}
}
}
protocol MessagessViewDelegate {
func messageCompletion (result: MessageComposeResult)
}
struct MessageUIView: UIViewControllerRepresentable {
@Environment(\.presentationMode) var presentationMode
@Binding var recipients: [String]
@Binding var body: String
var completion: ((_ result: MessageComposeResult) -> Void)
var isShowingMessages: Binding<Bool>
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.isShowingMessages = isShowingMessages
uiViewController.displayMessageInterface()
}
class Coordinator: NSObject, UINavigationControllerDelegate, MessagessViewDelegate {
var parent: MessageUIView
init(_ controller: MessageUIView) {
self.parent = controller
}
func messageCompletion(result: MessageComposeResult) {
if result == .sent && parent.recipients.count > 1 {
} else {
self.parent.presentationMode.wrappedValue.dismiss()
self.parent.completion(result)
}
}
}
}
struct ContentView: 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(_:), isShowingMessages: $isShowingMessages)
}
}
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
}
}
}