如何单独向收件人发送消息?

问题描述 投票:0回答:1

我想向许多收件人发送一条消息,但这样做时 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)
        }
    }
}
swift swiftui message imessage
1个回答
0
投票

这是需要用户确认的方法

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
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.