一、起因
这两天有个小伙伴告诉了我一个app,发现里面不用微信的SDK也能实现分享到朋友圈的功能,简直飞天了。所以怀着好奇心,照着苹果官方文档和一些线上资料,去踩踩雷。
这个过程是痛苦的,因为你会发现苹果官方资料少的可怜,而线上的资料千篇一律。如果你够幸运,按照这些资料做出来了,恭喜你,如果出了问题,只能怪自己知识不够。
而我,明显感觉到了知识不够。
二、错误
系统自带的UIActivityViewController可以用来做一些分享,而网上的资料本身是没有什么问题的。主要的问题在于在iOS11和Xcode9后,你会发现一个问题,图片如果放到资源库的外面,直接读取的时候会出现各种加载不出来的问题,或者用git提交的时候,提交不上去。
:
所以解决问题的根本在于读取文件的方式,鉴于此,可以采用下面的代码来读取文件才更有保障。
三、正确的代码
@IBAction func showActivityVC(_ sender: UIButton) {
// let itemProvider = UIActivityItemProvider(placeholderItem: "hahahaha")
let fileManager = FileManager.default
var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last ?? ""
path = path + "/1.jpg"
let localImage = UIImage.init(named: "3.jpg")
if fileManager.fileExists(atPath: path) == false, let tempImg = localImage {
do {
let localUrl = NSURL.fileURL(withPath: path)
let data = UIImageJPEGRepresentation(tempImg, 1)
try data?.write(to: localUrl, options: .atomicWrite)
} catch {
}
}
let image1 = UIImage.init(named: "2.jpg") // 方式一:直接读取资源库中的
let image2 = UIImage.init(named: "1.jpeg")
let image3 = UIImage.init(contentsOfFile: path) // 方式二:读取本地沙盒中的
// 方式三:使用Bundle读取非资源库外的
let image4 = UIImage.init(contentsOfFile: Bundle.main.path(forResource: "3", ofType: "jpg", inDirectory: nil) ?? "")
let items = [image1!, image2!, image3!, image4!]
let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)
activityVC.completionWithItemsHandler = {
(activityType, status, item, error) -> Void in
if status {
self.showAlertWithStr(message: "success")
} else {
self.showAlertWithStr(message: error?.localizedDescription ?? "failed")
}
}
self.present(activityVC, animated: true, completion: nil)
}
修改后,一系列的效果如下:
然后,然后就完了!
四、分享链接
下面是链接分享的代码和截图:
let items:[Any] = ["My GitHub", URL(string: "https://github.com/zhoupengzu")!]
let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)
activityVC.completionWithItemsHandler = {
(activityType, status, item, error) -> Void in
if status {
self.showAlertWithStr(message: "success")
} else {
self.showAlertWithStr(message: error?.localizedDescription ?? "failed")
}
}
self.present(activityVC, animated: true, completion: nil)
四、总结
上面所说其实还只是一个皮毛,解决问题为主,如你所见,其实还可以分享到qq等其他平台,有兴趣可以自己深入研究,大致都差不多。