You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:如何向多个收件人单独发iMessage且不创建群聊?

如何避免iMessage自动创建群聊,实现向多收件人单独发送消息

想要给多个收件人发送同一条消息,但使用iMessage时会自动创建包含所有收件人的群聊。如何避免这种情况,实现向每位用户单独发送消息,同时无需为每个用户单独弹出发送界面?

完整可直接复制使用的Swift代码

import SwiftUI
import MessageUI

struct SendMessageView: View {
    @State private var isShowingMessages = false
    @State private var recipients = ["<手机号1>", "<手机号2>"]
    @State private var message = "你好"

    var body: some View {
        Button(action: {
            self.isShowingMessages.toggle()
        }) {
            Text("打开消息界面")
        }
        .sheet(isPresented: self.$isShowingMessages) {
            MessageUIView(recipients: $recipients, body: $message, completion: handleCompletion(_:))
        }
    }

    func handleCompletion(_ result: MessageComposeResult) {
        switch result {
        case .cancelled:
            // 处理取消发送的逻辑
            break
        case .sent:
            // 处理发送成功的逻辑
            break
        case .failed:
            // 处理发送失败的逻辑
            break
        @unknown default:
            // 处理未知状态的逻辑
            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

        // 配置消息界面字段
        composeVC.recipients = self.recipients ?? []
        composeVC.body = body ?? ""

        // 模态弹出消息界面
        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 {
    // 用于在消息操作完成后关闭界面
    @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)
        }
    }
}

关键调整说明

上述默认代码仍会创建群聊,若要实现单独给每个收件人发消息,需要修改消息发送逻辑:

  • 遍历recipients数组,逐个传入单个收件人到composeVC.recipients
  • 可添加延迟处理,避免多个消息界面同时弹出导致冲突

内容的提问来源于stack exchange,提问作者Ahmed Zaidan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:22:44