@IBAction func share(_ sender: Any) {
let textToShare = "yourShareString";
let imageToShare = UIImage.init(named: "yourImageName")
let urlToShare = URL.init(string: "yourShareLink")
let activityItems = [imageToShare!,urlToShare!,textToShare] as [Any];
let activity: UIActivityViewController = UIActivityViewController.init(activityItems: activityItems, applicationActivities: nil)
self.present(activity, animated: true, completion: nil)
}
看到這里,大家可能想說,so easy 誰都會嘛。你如果直接這樣分享到facebook 或者 twitter的時候你會發(fā)現(xiàn)結果是這樣的:

Paste_Image.png
細心點的同學就會發(fā)現(xiàn),where is my share link?
我想說的,我也不知道哪兒去了,不過你可以在textToShare后面拼接上要分享的鏈接,如圖:

Paste_Image.png
但是看起來都長到一塊兒去了,別急,慢慢來。微信的分享很與眾不同,假如你只想分享一條文字,或者一條文字和圖片到微信:
@IBAction func share(_ sender: Any) {
let textToShare = "yourShareString";
let imageToShare = UIImage.init(named: "yourImageName")
let activityItems = [imageToShare,textToShare] as [Any];
let activity: UIActivityViewController = UIActivityViewController.init(activityItems: activityItems, applicationActivities: nil)
self.present(activity, animated: true, completion: nil)
}
貌似是不行的,它會變成這樣:

Paste_Image.png
因為微信的分享都是需要URL的,而且你還不能把URL的string寫成"":
let urlToShare = URL.init(string: "")
它會報found nil的錯誤:
fatal error: unexpectedly found nil while unwrapping an Optional value
這個是比較坑爹的,加上正確格式的url之后就是正常的啦:

Paste_Image.png
細心的同學又會發(fā)現(xiàn)text后面拼接的url在微信里面展示出來了,這該怎么辦呢,看到這里,僅僅使用那些上面的字符串拼接的方式不行了,得使用UIActivityItemProvider了
@IBAction func share(_ sender: Any) {
let textToShare = "yourShareString";
let imageToShare = UIImage.init(named: "yourImageName")
let itemProvider = customItemProvider.init(placeholderItem: "")
let activity: UIActivityViewController = UIActivityViewController.init(activityItems: [imageToShare!,textToShare,itemProvider], applicationActivities: nil)
self.present(activity, animated: true, completion: nil)
}
class customItemProvider: UIActivityItemProvider {
override init(placeholderItem: Any) {
super.init(placeholderItem: placeholderItem)
}
override func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return ""
}
override func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
if activityType == .postToFacebook || activityType == .postToTwitter {
return "https://baidu.com"
} else {
return URL.init(string: "https://baidu.com")//wechat need a URL
}
}
}
r結果如下:

Paste_Image.png

Paste_Image.png
總之,微信分享比較特殊,它只能只有一張圖片,或者一定要給一個有效的URL(不是string),而且給了URL沒有給圖片的時候它會自己生成一個灰色的??icon,UED同學可就不樂意了。于是乎比較規(guī)范的方式是定義三個不同的itemProvider,如下:
class ImageItemProvider: UIActivityItemProvider {
override init(placeholderItem: Any) {
super.init(placeholderItem: placeholderItem)
}
override func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
if activityType == .postToFacebook || activityType == .postToTwitter {
return nil//臉書和推特不需要圖片的時候返回nil就沒有圖片了
} else {
return UIImage.init(named: "yourImageName")//覺得微信自己生成的圖片太丑的時候可以返回一個,即時返回nil,它也會自動生成??圖片
}
}
}
class UrlItemProvider: UIActivityItemProvider {
override init(placeholderItem: Any) {
super.init(placeholderItem: placeholderItem)
}
override func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
if activityType == .postToFacebook || activityType == .postToTwitter {
return "https://baidu.com"
} else {
return URL.init(string: "https://baidu.com")//wechat need a URL
}
}
}
class TitleItemProvider: UIActivityItemProvider {
override init(placeholderItem: Any) {
super.init(placeholderItem: placeholderItem)
}
override func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
if activityType == .postToFacebook || activityType == .postToTwitter {
return "faceBook or twitter"
} else {
return "wechat"
}
}
}
j:

Paste_Image.png

Paste_Image.png
twitter has no icon and wechat has