UIActivityController 原生分享


 @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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容