Swift中如何通过UIActivityViewController检测消息是否发送成功?
UIActivityViewController消息发送状态检测方案
首先明确:系统提供的UIActivityViewController没有能力返回分享消息的实际发送结果,只能检测用户的操作状态,具体说明如下:
- 你当前代码中用到的
completionWithItemsHandler回调里的success参数,仅代表用户是否完成了分享操作流程:- 返回
true:用户选中了分享渠道,且点击了渠道内的确认/发送按钮,没有中途取消分享 - 返回
false:用户主动取消了分享,或者出现系统层面的分享错误
- 返回
- 注意:这个
success状态完全不代表消息已经成功送达接收方,甚至不代表渠道已经把消息发出去,比如用户没有蜂窝网络发短信、分享的内容被渠道拦截,这些场景下success还是会返回true,这类状态系统不会透传给你的App
可行的实现方案
方案1:接受系统能力限制,用现有逻辑判断用户操作状态
如果你的需求只要判断用户是否主动点击了发送,不需要确认消息真的发出去,你现有的代码已经可以满足需求,不需要额外修改。
方案2:针对特定分享渠道单独集成SDK,获取更准确的发送状态
如果你必须要拿到尽可能准确的发送结果,建议放弃通用的UIActivityViewController,针对你需要的分享渠道单独集成对应能力:
- 发短信:用
MessageUI框架的MFMessageComposeViewController,可以拿到短信是否成功提交到运营商的状态 - 发邮件:用
MessageUI框架的MFMailComposeViewController,可以拿到邮件是否成功提交到发件邮箱服务器的状态 - 第三方社交平台分享:去对应平台的开放平台下载官方SDK集成,SDK会返回平台侧的发送结果
举个使用MFMessageComposeViewController实现短信发送状态检测的示例代码:
import UIKit import MessageUI class ViewController: UIViewController, MFMessageComposeViewControllerDelegate { func sendTextMessage() { guard MFMessageComposeViewController.canSendText() else { print("设备不支持短信功能") return } let messageVC = MFMessageComposeViewController() messageVC.body = "待发送的短信内容" messageVC.recipients = ["接收方手机号"] messageVC.messageComposeDelegate = self present(messageVC, animated: true) } func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) { switch result { case .sent: print("短信已成功提交到运营商") case .cancelled: print("用户取消了短信发送") case .failed: print("短信提交失败") @unknown default: print("未知状态") } controller.dismiss(animated: true) } }
额外说明:即使你用了对应渠道的SDK,也无法100%确认接收方已经收到或者查看了消息,这类数据属于渠道App的隐私数据,不会对外暴露。
内容的提问来源于stack exchange,提问作者Muhammad Faizan Naeem
相关产品推荐
相关产品推荐

