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

iOS13 Share Sheet:分享UIImage时如何设置预览缩略图?

解决iOS13+ Share Sheet显示图片缩略图而非应用图标的问题

这个问题我之前也碰到过,iOS13及以上版本的Share Sheet对预览内容的判定逻辑有变化,直接传递UIImage实例时,系统无法正确生成图片预览,就会 fallback显示应用图标。下面给你两种可行的解决方案:

方法一:用NSItemProvider包装图片数据

这种方法比较简洁,核心是把图片数据用NSItemProvider包装,明确告诉系统这是图片类型的内容,让它能正确生成预览:

首先需要导入MobileCoreServices框架(因为用到了图片类型的常量),然后修改你的代码:

import UIKit
import MobileCoreServices

// ... 你的视图控制器代码 ...

let image = UIImage(named: "test")!
// 将UIImage转为PNG数据(也可以用JPEG,根据需求调整)
guard let imageData = image.pngData() else {
    print("无法转换图片为数据")
    return
}
// 创建NSItemProvider,指定类型为PNG图片
let itemProvider = NSItemProvider(item: imageData as NSSecureCoding?, 
                                  typeIdentifier: kUTTypePNG as String)
// 初始化ActivityVC
let activityVC = UIActivityViewController(activityItems: [itemProvider], 
                                          applicationActivities: nil)
activityVC.popoverPresentationController?.sourceView = self.view
self.present(activityVC, animated: true, completion: nil)

方法二:自定义UIActivityItemSource实现更灵活的预览

如果需要自定义预览的标题、描述等额外信息,可以通过实现UIActivityItemSource协议来控制分享内容和预览:

先创建一个遵守协议的类:

import UIKit
import MobileCoreServices

class ImageActivityItemSource: NSObject, UIActivityItemSource {
    private let targetImage: UIImage
    
    init(image: UIImage) {
        self.targetImage = image
        super.init()
    }
    
    // 提供实际分享的内容(这里返回图片数据)
    func activityViewController(_ activityViewController: UIActivityViewController, 
                                itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        return targetImage.pngData()
    }
    
    // 配置预览的元数据,包括预览图和标题
    func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
        let metadata = LPLinkMetadata()
        metadata.title = "我的分享图片" // 自定义预览标题
        // 设置预览图片的提供者
        metadata.imageProvider = NSItemProvider(object: targetImage)
        return metadata
    }
    
    // 返回占位内容,系统会用这个来提前准备预览
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return targetImage
    }
}

然后在你的视图控制器里使用这个类:

let image = UIImage(named: "test")!
let itemSource = ImageActivityItemSource(image: image)
let activityVC = UIActivityViewController(activityItems: [itemSource], 
                                          applicationActivities: nil)
activityVC.popoverPresentationController?.sourceView = self.view
self.present(activityVC, animated: true, completion: nil)

这两种方法都能让Share Sheet的左上角正确显示你要分享的图片缩略图,和内置Mail应用的效果一致。如果只是需要简单的预览,方法一足够;如果需要自定义预览的更多细节,方法二更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:38:40