import LinkPresentation
class AdvancedActivityItemSource: NSObject, UIActivityItemSource {
struct ShareContent {
let title: String
let subtitle: String
let previewImage: UIImage?
let shareText: String
let shareURL: URL?
let appIcon: UIImage?
}
let content: ShareContent
init(content: ShareContent) {
self.content = content
super.init()
}
// MARK: - UIActivityItemSource
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return content.shareText
}
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
// 根据不同分享类型返回不同内容
if let activityType = activityType {
// switch activityType {
// case .mail:
// return """
// \(content.title)
//
// \(content.subtitle)
//
// \(content.shareText)
//
// \(content.shareURL?.absoluteString ?? "")
// """
//
// case .message :
// return "\(content.title)\n\n\(content.shareText)\n\(content.shareURL?.absoluteString ?? "")"
//
// default:
// return "\(content.title)\n\(content.shareURL?.absoluteString ?? "")"
// }
return "\(content.title)\n\(content.shareURL?.absoluteString ?? "")"
}
return content.shareText
}
func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
return content.title
}
func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivity.ActivityType?, suggestedSize size: CGSize) -> UIImage? {
return content.previewImage
}
// iOS 13+ 使用 LinkPresentation 显示富预览
func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
let metadata = LPLinkMetadata()
// 设置标题
metadata.title = content.title
// 设置 URL(会影响副标题显示)
// if let url = content.shareURL {
// metadata.originalURL = url
// metadata.url = url
// } else {
// metadata.originalURL = URL(string: "yourapp.com")
// }
// 设置图标/预览图
if let image = content.previewImage ?? content.appIcon {
let imageProvider = NSItemProvider(object: image)
metadata.imageProvider = imageProvider
metadata.iconProvider = imageProvider
}
// 可以设置副标题(通过设置 provider)
let subtitleProvider = NSItemProvider(object: content.subtitle as NSString)
metadata.iconProvider = subtitleProvider // 或者设置 iconProvider
return metadata
}
}
调用:
// 创建分享内容
let shareContent = AdvancedActivityItemSource.ShareContent(
title: "XXXX",
subtitle: "",
previewImage: UIImage(named: "appIcon_1"),
shareText: "",
shareURL: URL(string: "https://1111"),
appIcon: UIImage(named: "appIcon_1")
)
let advancedItem = AdvancedActivityItemSource(content: shareContent)
// 显示分享菜单
let activityVC = UIActivityViewController(
activityItems: [advancedItem, self.img ],
applicationActivities: nil
)
// 设置回调
activityVC.completionWithItemsHandler = { activityType, completed, returnedItems, error in
if completed {
print("分享成功:\(activityType?.rawValue ?? "")")
self.endEditing(true)
} else {
self.endEditing(true)
print("分享取消")
}
}
// iPad 适配
// if let popoverController = activityVC.popoverPresentationController {
// popoverController.sourceView = self.view
// popoverController.sourceRect = CGRect(x: self.view.bounds.midX,
// y: self.view.bounds.midY,
// width: 0, height: 0)
// popoverController.permittedArrowDirections = []
// }
// 显示分享菜单
kTopVC.present(activityVC, animated: true)
self.endEditing(true)