简介
分享是APP中常见的一个需求。以前印象中是通过调用友盟分享,微信分享等第三方API完成的。本次项目中,发现同事用了UIActivityViewController来做分享功能,简单省事,效果也不错。
分享界面
- 分享界面做得简洁,感觉还比较好。
- 分享内容就一行,文本优先于URL,优先于图标。
- 整个是从下到上的弹窗sheet,可滑动,效果不错。
- 分享的APP可以左滑,手机上装了就显示,不装就不显示。主流的都有,比如微信,QQ,微博什么的。
- 系统操作也比较丰富,不想要的还可以设置为不显示。
- 点击APP图标,就会关闭这个sheet,跳转到对应的APP,会离开当前应用。
- 整体感觉还是不错的,
简单实用
import UIKit
class ViewController: UIViewController {
@IBAction func shareButtonTapped(_ sender: Any) {
let imageToShare = UIImage(named: "example-image")
let textToShare = "这是要分享的文本内容"
let activityItems = [imageToShare!, textToShare]
let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
// 设置排除的活动类型(可选)
activityViewController.excludedActivityTypes = [.addToReadingList, .assignToContact, .copyToPasteboard]
// 设置完成回调(可选)
activityViewController.completionWithItemsHandler = { activity, success, items, error in
if success {
print("Shared successfully")
} else {
print("Sharing was cancelled")
}
}
// 显示UIActivityViewController
self.present(activityViewController, animated: true, completion: nil)
}
}
分享内容
public init(activityItems: [Any], applicationActivities: [UIActivity]?)
- 是一个数组,类型是Any
- 最常见的事URL,注意不是String,是URL类型;其次是文本;再次是图片;
- 是一个数组,可以一次分享很多内容。不过在弹窗sheet中,只显示一行;分享到三方的APP中,只显示2行;所以分享内容最好是一个或者两个,再多也没意义
回调函数
public typealias CompletionWithItemsHandler = (UIActivity.ActivityType?, Bool, [Any]?, (any Error)?) -> Void
- 第1个参数,表示操作类型:分享?复制剪贴板?分享到微信?加入阅读列表?
- 第2个参数表示分享动作的结果,是完成了还是取消了
- 第3个参数是对应的数据,有的有,有的没有
- 第4个参数是错误信息
- 用户操作完成后的后续动作,可以在这个回调函数中定义。
分享类型
extension UIActivity.ActivityType {
@available(iOS 6.0, *)
public static let postToFacebook: UIActivity.ActivityType
@available(iOS 6.0, *)
public static let postToTwitter: UIActivity.ActivityType
@available(iOS 6.0, *)
public static let postToWeibo: UIActivity.ActivityType
@available(iOS 6.0, *)
public static let message: UIActivity.ActivityType
@available(iOS 6.0, *)
public static let mail: UIActivity.ActivityType
@available(iOS 6.0, *)
public static let print: UIActivity.ActivityType
@available(iOS 6.0, *)
public static let copyToPasteboard: UIActivity.ActivityType
@available(iOS 6.0, *)
public static let assignToContact: UIActivity.ActivityType
@available(iOS 6.0, *)
public static let saveToCameraRoll: UIActivity.ActivityType
@available(iOS 7.0, *)
public static let addToReadingList: UIActivity.ActivityType
@available(iOS 7.0, *)
public static let postToFlickr: UIActivity.ActivityType
@available(iOS 7.0, *)
public static let postToVimeo: UIActivity.ActivityType
@available(iOS 7.0, *)
public static let postToTencentWeibo: UIActivity.ActivityType
@available(iOS 7.0, *)
public static let airDrop: UIActivity.ActivityType
@available(iOS 9.0, *)
public static let openInIBooks: UIActivity.ActivityType
@available(iOS 11.0, *)
public static let markupAsPDF: UIActivity.ActivityType
@available(iOS 15.4, *)
public static let sharePlay: UIActivity.ActivityType
@available(iOS 16.0, *)
public static let collaborationInviteWithLink: UIActivity.ActivityType
@available(iOS 16.0, *)
public static let collaborationCopyLink: UIActivity.ActivityType
@available(iOS 16.4, *)
public static let addToHomeScreen: UIActivity.ActivityType
}
- 当做一个参考的表格,只需要关心自己需要的业务
- 这个列表也是默认支持的操作类型
小结
- 这是一个应用操作弹窗sheet,所以名字是UIActivityViewController,而不仅仅只是分享。
- 只是分享用得比较多,所以可以当做是分享弹窗来用。
- 整体效果还可以,80%情况下用用就可以了。
- 界面简洁,用起来简单,这是最大优势,比友盟分享,微信分享等三方API方便多了。