如何配置UIActivityViewController仅显示Facebook、Twitter和Instagram选项
配置UIActivityViewController仅显示指定社交平台的方案
我来帮你完成剩余的配置,实现只展示Facebook、Twitter和Instagram三个分享选项的需求。这里需要注意的是,Instagram没有官方提供的UIActivityType,我们需要通过它的分享扩展Bundle ID来识别,同时要确保你的分享内容符合各平台的要求(比如Instagram仅支持图片/视频分享,所以你的代码里包含图片是正确的)。
完整代码实现
import UIKit // 1. 准备分享内容并处理图片加载异常 let shareText = "Hello, world!" guard let image = UIImage(named: "TheImage") else { print("无法加载指定图片,请检查图片名称是否正确") return } // 2. 初始化UIActivityViewController let activityViewController = UIActivityViewController( activityItems: [shareText, image], applicationActivities: nil ) // 3. 定义我们需要保留的活动标识集合 let desiredActivityIdentifiers: Set<String> = [ UIActivityType.postToFacebook.rawValue, // Facebook官方活动类型 UIActivityType.postToTwitter.rawValue, // Twitter官方活动类型 "com.burbn.instagram.shareextension" // Instagram分享扩展的固定Bundle ID ] // 4. 精准过滤需排除的活动类型(分版本适配) if #available(iOS 13.0, *) { // iOS 13+ 可直接获取可用活动列表,精准排除不需要的选项 let excludedActivities = activityViewController.availableActivities.filter { activity in guard let activityID = activity.activityType?.rawValue else { // 排除无明确标识的自定义活动 return true } return !desiredActivityIdentifiers.contains(activityID) }.compactMap { $0.activityType } activityViewController.excludedActivityTypes = excludedActivities } else { // iOS 13以下版本,先排除所有系统默认活动,再依赖系统自动识别已安装的第三方分享选项 let allSystemActivities = UIActivityType.allCases.map { $0.rawValue } let excludedSystemActivities = allSystemActivities.filter { !desiredActivityIdentifiers.contains($0) }.compactMap { UIActivityType(rawValue: $0) } activityViewController.excludedActivityTypes = excludedSystemActivities } // 5. iPad适配(可选,若你的App支持iPad) if let popoverPresentationController = activityViewController.popoverPresentationController { popoverPresentationController.sourceView = self.view // 设置弹出的源视图 popoverPresentationController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0) popoverPresentationController.permittedArrowDirections = [] // 取消箭头显示 } // 6. 弹出分享界面 present(activityViewController, animated: true, completion: nil)
关键细节说明
- Instagram的特殊处理:Instagram的分享扩展Bundle ID是固定的
com.burbn.instagram.shareextension,通过这个标识我们可以精准保留该分享选项。 - 内容兼容性:Instagram仅接受图片或视频类内容,所以你的
activityItems里必须包含图片/视频,否则Instagram不会出现在分享列表中。 - 版本适配逻辑:iOS13及以上提供了
availableActivities属性,可以直接获取当前设备可用的分享活动,过滤更精准;iOS13以下则需要先排除所有系统默认活动,再依赖系统自动显示已安装的第三方分享选项。 - iPad适配要求:如果你的App支持iPad,必须设置
popoverPresentationController的源视图,否则分享界面无法正常弹出。
内容的提问来源于stack exchange,提问作者Reimond Hill
相关产品推荐
相关产品推荐

