iOS系统分享

iOS系统分享有关的框架是Social.framework

分享我们可以用SLComposeViewController或者是UIActivityViewController来做,个人比较推荐后面一种,毕竟前面的用起来不太方便.系统分享比三方分享来的说会方便不少,省去了各个平台注册的麻烦,不过可能有些客制化的需求无法完成就是.系统分享出去是什么样的那就是别人hostApp的Extension(Action Extension/Share Extension)控制的.

SLComposeViewController

iOS 6 - iOS 11(Account是iOS 11移除的)使用的"系统分享"方式

说到SLComposeViewController.framework(系统分享)框架.就得提一下Accounts.framework(账号管理).
iOS系统分享_第1张图片
大概是到了iOS11就不支持这种分享方式了(以下是内置(设置里头有的)一些无需安装App的分享渠道)
iOS系统分享_第2张图片

使用方式

/// 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系统已经移除了
}

iOS系统分享_第3张图片

就比如把forServiceType参数改成"com.tencent.xin.sharetimeline".在安装了微信的情况下会弹出下面的弹窗.(这里刚装,懒得登录了)
iOS系统分享_第4张图片

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

iOS系统分享_第5张图片

iOS系统分享_第6张图片

系统分享的坑.

与全屏滑动返回框架FDFullscreenPopGesture可能会有冲突

当支持分享到短信的时候,在iOS 13以下分享到短信是全屏的(iOS 13改成了另外一个样式).然后这个库会导致右上角的取消按钮消失.

解决方案

方案一:

分享禁止分享到短信

/// 设置禁止分享的渠道(如果想禁止某个特定的App,可以分享之后看这个App的activityType是啥,然后在数组里头加)
shareVc.excludedActivityTypes = [.message]

iOS系统分享_第7张图片

方案二:

在下面的方法内判断是否是系统短信Vc.是的话return

- (void)fd_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if ([self isKindOfClass:NSClassFromString(@"MFMessageComposeViewController")]) {
        [self fd_pushViewController:viewController animated:animated];
        return;
    }
    // code...
}

你可能感兴趣的:(UIKit)