在iOS开发中实现原生分享功能,通常需要使用系统提供的UIActivityViewController框架,该框架能够调用系统内置的分享服务(如微信、微博、邮件、短信等)和更多选项(如复制、保存到相册等),以下是详细的实现步骤、关键代码及注意事项,帮助开发者快速集成原生分享功能。

基本实现步骤
准备分享数据
原生分享支持多种数据类型,包括文本、图片、URL、视频等,需要根据需求构建一个包含分享数据的数组,数据类型可以是String(文本)、UIImage(图片)、URL(链接)等。
let text = "这是一段分享文本"
let image = UIImage(named: "share_image")
let url = URL(string: "https://www.example.com")
var activityItems: [Any] = [text]
if let image = image { activityItems.append(image) }
if let url = url { activityItems.append(url) }
创建UIActivityViewController
使用准备好的数据数组初始化UIActivityViewController:
let activityVC = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
activityItems:分享数据数组。applicationActivities:自定义分享服务的数组(可选),若仅使用系统服务可传nil。
设置排除的分享类型(可选)
如果需要隐藏某些分享选项(如“拷贝”、“邮件”等),可以通过excludedActivityTypes属性指定:
activityVC.excludedActivityTypes = [UIActivity.ActivityType.airDrop, UIActivity.ActivityType.mail]
常见的排除类型包括:

.airDrop:隔空投送.mail:邮件.message:信息.copyToPasteboard:拷贝到剪贴板
显示分享界面
根据当前视图控制器环境选择弹出方式:
- iPad:需使用
popoverPresentationController指定弹出位置:if let popover = activityVC.popoverPresentationController { popover.sourceView = self.view popover.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0) popover.permittedArrowDirections = .any } present(activityVC, animated: true) - iPhone:直接模态弹出:
present(activityVC, animated: true)
处理分享结果
通过代理方法activityViewController(_:completedWithActivityTypes:)监听分享状态:
activityVC.completionWithItemsHandler = { (activityType, completed, returnedItems, error) in
if completed {
print("分享成功")
} else {
print("分享取消")
}
}
高级功能与注意事项
分享多张图片
若需分享多张图片,需将图片数组作为activityItems的元素:
let images = [UIImage(named: "img1"), UIImage(named: "img2")].compactMap { $0 }
activityItems = [images] // 注意:需将整个图片数组作为单个元素
自定义分享图标与标题
通过applicationActivities实现自定义分享服务,需继承UIActivity并重写以下方法:

class CustomActivity: UIActivity {
override var activityTitle: String? { return "自定义分享" }
override var activityImage: UIImage? { return UIImage(systemName: "star") }
override func perform() {
// 处理分享逻辑
activityDidFinish(true)
}
}
// 使用时传入
let activityVC = UIActivityViewController(activityItems: activityItems, applicationActivities: [CustomActivity()])
分享到微信等第三方应用
原生分享仅能调用系统已安装的分享服务,若需直接分享到特定应用(如微信),需通过URL Scheme或SDK实现,例如微信SDK需:
- 注册微信开发者账号并获取AppID。
- 配置URL Scheme(如
weixin://)。 - 使用微信SDK的
WXApi类处理分享逻辑。
权限处理
分享涉及敏感数据时需检查权限:
- 照片:需在
Info.plist中添加NSPhotoLibraryAddUsageDescription描述。 - 通讯录:若分享联系人信息,需请求
Contacts权限。
数据格式兼容性
确保分享数据符合目标应用的要求,
- 微信分享图片需为
PNG或JPEG格式,且大小不超过10MB。 - 部分应用不支持混合类型(如文本+图片+URL),需测试兼容性。
常见问题与解决方案
分享后无响应
原因:未正确处理completionWithItemsHandler或分享数据格式错误。
解决:检查数据类型是否被目标应用支持,并确保代理方法被调用。
自定义分享服务不显示
原因:excludedActivityTypes中包含了自定义服务,或未正确实现UIActivity的必要方法。
解决:移除排除类型,并检查activityTitle和activityImage是否正确返回。
相关问答FAQs
Q1: 为什么分享到微信时图片显示为空白?
A1: 可能原因包括:图片格式不支持(如HEIC)、图片过大或未通过微信SDK正确处理,建议将图片转换为JPEG格式,并使用微信官方SDK进行分享。
Q2: 如何实现分享后回调结果?
A2: 通过UIActivityViewController的completionWithItemsHandler回调,该方法会在分享完成(成功/失败/取消)时触发,
activityVC.completionWithItemsHandler = { activityType, completed, _, _ in
if completed { print("分享成功") }
else { print("用户取消") }
} 