系统分享和三方分享的对比
系统 | 三方 | |
---|---|---|
集成 | 直接调用无需集成 | 各种SDK/framework |
UI | 可定制有限 | SDK提供UI各种定制 |
文件大小 | 无占用 系统集成 | 根据业务看集成SDK数量 |
UIActivityViewController 实现之旅
首先我们来看看 UIActivityViewController 都给我们提供了哪些东西
image.png调用系统分享其实很简单:
init
方法传入两个参数
activityItems
你要分享的内容
-
UIActivityItemProvider
提供了分享媒体的继承对象,可通过继承实现实际用户点击的内容 -
UIActivityItemSource
也是UIActivityItemProvider
遵循的协议,可以自定义
image.png
UIActivity
提供了可定制的按钮
如果想要activity生效 一定要实现 canperform
和 perform
方法
下面举例实现一个图片保存的代码:
class TestCopyImageActivity: UIActivity {
var shareImage:UIImage?
override class var activityCategory: UIActivity.Category {
return .action
}
override var activityType: UIActivity.ActivityType? {
return .saveToCameraRoll
}
override var activityTitle: String? {
return LocalizedString("存儲圖像")
}
//
//分享框的图片
override var activityImage: UIImage? {
return R.image.app_logo()!
}
//是否显示分享按钮,这里一般根据用户是否授权,或分享内容是否正确等来决定是否要隐藏分享按钮
override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
for item in activityItems {
if item is UIImage {
return true
}
if item is String {
return true
}
if item is URL {
return true
}
}
return false
}
//解析分享数据时调用,可以进行一定的处理
override func prepare(withActivityItems activityItems: [Any]) {
print("prepareWithActivityItems")
}
//执行分享行为
//这里根据自己的应用做相应的处理
//例如你可以分享到另外的app例如微信分享,也可以保存数据到照片或其他地方,甚至分享到网络
override func perform() {
//具体的执行代码这边先省略
//......
UIImageWriteToSavedPhotosAlbum(self.shareImage!, nil, nil, nil)
activityDidFinish(true)
}
//分享时调用
override var activityViewController: UIViewController? {
return nil
}
}
过滤系统的activity方法
vc.excludedActivityTypes = [.print, .addToReadingList, .assignToContact, .mail, .message, .openInIBooks]
note: ios13上 保存图片会有个bug 通过present出来的页面再present UIActivityController,分享图片之后,依赖系统api会发现当前这个VC也被dismiss掉,查了一些文档,看起来是个系统bug,trick了一下 继承
UIActivityController
重写dismiss方法
func close(animated: Bool) {
super.dismiss(animated: animated, completion: nil)
}
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
if #available(iOS 13.0, *) {
completion?() //iOS13 会dismiss掉parentVC 这里糙处理一下
} else {
super.dismiss(animated: flag, completion: completion)
}
}
调用的地方
let vc = XDArtActivityViewController.init(activityItems: shareItems, applicationActivities: [act1, act2])
vc.excludedActivityTypes = [.print, .addToReadingList, .assignToContact, .mail, .message, .openInIBooks]
let handler : UIActivityViewController.CompletionWithItemsHandler = {(activityType: UIActivity.ActivityType?, completed:Bool, returnedItems: [Any]?, activityError: Error?) in
if !completed {
vc.close(animated: true)
}
finishCallback?()
}
网友评论