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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:59:52