这里的解决方案都很好,但值得考虑实现UIActivityItemSource 协议和LinkPresentation 框架。
我的解决方案实现了以下目标:
- 应用程序图标和标题显示在
UIActivityViewController 的顶部
- AirDrop 直接链接到 App Store
ActivityType
- 消息和电子邮件的自定义文本,包括在需要时添加指向 Google Play 应用程序链接的机会
- 电子邮件主题
- 不使用
LPMetaDataProvider 获取请求(如此WWDC 2019 262 视频中所述)加载速度如此之快
0。初始化UIActivityViewController:
将项目设置为self:
let activityVC = UIActivityViewController(activityItems: [self], applicationActivities: nil)
排除某些不适用的ActivityTypes:
activityVC.excludedActivityTypes = [.addToReadingList, .assignToContact, .markupAsPDF, .openInIBooks, .saveToCameraRoll]
对于 iPad,设置 popoverPresentationController.sourceView 或 .barButtonItem(在 iPhone 上被忽略):
activityVC.popoverPresentationController?.sourceView = myButton
展示它:
present(activityVC, animated: true, completion: nil)
1。实现所需的UIActivityItemSource 方法
https://developer.apple.com/documentation/uikit/uiactivityitemsource
您必须根据文档实现占位符方法:
占位符对象不必包含任何真实数据,但应尽可能接近您打算提供的实际数据对象。
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return ""
}
以及实际数据,返回指向 AirDrop 应用的链接和其他所有内容的文本:
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
if activityType == .airDrop {
return URL(string: "APP_STORE_URL")!
}
return "Check out the APP_NAME on the App Store: APP_STORE_URL or on the Google Play Store: PLAY_STORE_URL"
}
2。实现主题方法
来自文档:
对于支持主题字段的活动,返回项目的主题。
func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
return "EMAIL_SUBJECT" // e.g. App name
}
3。实现LPLinkMetaData方法
来自文档:
返回元数据以显示在共享表的预览标题中。
@available(iOS 13.0, *)
func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
let metadata = LPLinkMetadata()
metadata.title = "APP_NAME"
return metadata
}