iOS系统分享有关的框架是Social.framework
分享我们可以用
SLComposeViewController
或者是UIActivityViewController
来做,个人比较推荐后面一种,毕竟前面的用起来不太方便.系统分享比三方分享来的说会方便不少,省去了各个平台注册的麻烦,不过可能有些客制化的需求无法完成就是.系统分享出去是什么样的那就是别人hostApp的Extension(Action Extension/Share Extension)控制的.
SLComposeViewController
iOS 6 - iOS 11(Account是iOS 11移除的)使用的"系统分享"方式
说到SLComposeViewController.framework(系统分享)框架.就得提一下Accounts.framework(账号管理).
大概是到了iOS11就不支持这种分享方式了(以下是内置(设置里头有的)一些无需安装App的分享渠道)
使用方式
/// forServiceType:分享的渠道.就那么几种,点进去就可以看到
if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeSinaWeibo) {
let compressVc = SLComposeViewController(forServiceType: SLServiceTypeSinaWeibo)
compressVc?.add(UIImage(named: "dog"))
compressVc?.add(URL(string: "https://www.baidu.com"))
compressVc?.setInitialText("text content")
compressVc?.completionHandler = { (result) in
if result == .done {
print("Done")
} else {
print("Cancel")
}
}
self.present(compressVc!, animated: true, completion: nil)
} else {
/// 未登录或者是版本在iOS 11及以上时,isAvailable(forServiceType: )直接返回的是false.其实也没啥问题,毕竟iOS系统已经移除了
}
就比如把forServiceType参数改成"com.tencent.xin.sharetimeline".在安装了微信的情况下会弹出下面的弹窗.(这里刚装,懒得登录了)
UIActivityViewController
iOS 6.0以上系统分享支持的方式.有些App需要设置"LSApplicationQueriesSchemes"(微信就是这样)
使用方式
let activityItems = [UIImage(named: "dog")! ,"share content" ,URL(string: "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1589732350259&di=360bf42e8587c0be55537501130d2c0f&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fw%3D580%2Fsign%3D1975e289cc1b9d168ac79a69c3dfb4eb%2F8462c01373f08202351ce16949fbfbedaa641b86.jpg")!] as [Any]
let shareVc = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
shareVc.completionWithItemsHandler = { (activityType: UIActivity.ActivityType?, completed: Bool, returnedItems: [Any]?, activityError: Error?) -> Void in
if activityError != nil {// 这种情况我目前没有碰到过
print("分享错误")
} else if activityType == nil || completed == false {
print("分享取消")
} else {
print("分享成功")
}
}
self.present(shareVc, animated: true, completion: nil)
这里Handler回调里面的
activityType
其实就SLComposeViewController里面的ServiceType
…
系统分享的坑.
与全屏滑动返回框架FDFullscreenPopGesture
可能会有冲突
当支持分享到短信的时候,在iOS 13以下分享到短信是全屏的(iOS 13改成了另外一个样式).然后这个库会导致右上角的取消按钮消失.
解决方案
方案一:
分享禁止分享到短信
/// 设置禁止分享的渠道(如果想禁止某个特定的App,可以分享之后看这个App的activityType是啥,然后在数组里头加)
shareVc.excludedActivityTypes = [.message]
方案二:
在下面的方法内判断是否是系统短信Vc.是的话return
- (void)fd_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
if ([self isKindOfClass:NSClassFromString(@"MFMessageComposeViewController")]) {
[self fd_pushViewController:viewController animated:animated];
return;
}
// code...
}