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

UIActivityViewController:如何识别选中选项并关联对应数据类型?

问题1:代码错误分析与修复

错误点:

  • 占位符返回类型而非实例:activityViewControllerPlaceholderItem返回的是NSAttributedString.self、URL.self这类类型对象,而非实际的NSAttributedString实例或URL实例,系统无法正确识别分享内容的类型占位。
  • 返回类型数组而非实际内容:itemForActivityType中返回的是类型数组(如[URL.self]),不是要分享的具体文件URL或富文本实例,导致系统 fallback 到多类型处理,附加了多余内容。
  • 默认分支返回冗余类型:默认分支返回包含多种类型的数组,会让未匹配的活动同时携带多种内容,不符合需求。

修复后的代码示例:

// 提前准备好要分享的内容实例
let sharedAttributedString = NSAttributedString(string: "目标分享富文本内容")
guard let sharedFileURL = URL(fileURLWithPath: "/path/to/your/temp/file") else {
    // 处理URL创建失败的情况
    return
}

public func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
    // 返回通用占位符,系统用它判断活动是否支持,实际内容由itemForActivityType提供
    return sharedAttributedString
}

public func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
    guard let activityType = activityType else {
        // 未指定类型时返回默认内容(可按需调整)
        return sharedAttributedString
    }
    
    switch activityType {
    case .airDrop, .copyToPasteboard:
        // 返回实际的文件URL实例
        return sharedFileURL
    case .mail, .message, .print:
        // 返回实际的富文本实例
        return sharedAttributedString
    default:
        // 处理无内置枚举的文件保存类活动(逻辑见问题2)
        let saveActivityIdentifiers = [
            "com.apple.DocumentManagerUICore.SaveToFiles", // 系统“保存到文件”
            "com.dropbox.Dropbox.save" // Dropbox保存示例
        ]
        if saveActivityIdentifiers.contains(activityType.rawValue) {
            return sharedFileURL
        }
        // 其他未匹配活动返回nil,不提供内容
        return nil
    }
}
问题2:识别无内置枚举的分享选项

解决方法:

  1. 系统内置“保存到文件”:对应的UIActivity.ActivityType rawValue为com.apple.DocumentManagerUICore.SaveToFiles,可直接通过rawValue判断。
  2. 第三方应用(如Dropbox):
    • 测试阶段打印activityType?.rawValue获取具体标识;
    • 查阅第三方应用官方文档,获取其分享扩展的activityType标识。
  3. 通用判断逻辑:
    • 文件保存类活动通常支持URL类型,可结合activityViewController(_:canPerformActivityType:withActivityItems:)判断该活动是否能处理URL;
    • 通过rawValue关键词匹配,比如包含“save”“file”“document”等关键词的活动,大概率是文件保存类。

通用判断代码示例:

func isFileSaveActivity(_ activityType: UIActivity.ActivityType) -> Bool {
    let saveKeywords = ["save", "file", "document"]
    let rawValue = activityType.rawValue.lowercased()
    return saveKeywords.contains { rawValue.contains($0) }
}

// 在itemForActivityType的default分支中使用:
default:
    if isFileSaveActivity(activityType) {
        return sharedFileURL
    }
    return nil
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:43:23