Swift中如何将UIWebView内容分享至Facebook、Twitter等社交平台?
嘿,我完全懂你在新闻App里折腾UIWebView内容分享的烦恼——找了一圈资料没头绪确实头疼。其实有两种主流方案,从简单通用到定制化都有,咱们一步步来:
一、系统通用分享(推荐,无需额外SDK)
苹果自带的UIActivityViewController已经支持Facebook、Twitter、短信等几乎所有主流社交平台,不用单独集成SDK,代码量也少,适合大多数场景。
1. 先获取UIWebView里的文章信息
要分享的话,得先拿到文章的标题、链接、摘要这些信息。你可以在UIWebView的加载完成回调里,用JavaScript从网页里提取:
// 先在控制器里定义几个变量存文章信息 var currentArticleTitle = "今日新闻" var currentArticleURL = "" var currentArticleDesc = "" // UIWebViewDelegate方法,页面加载完成后调用 func webViewDidFinishLoad(_ webView: UIWebView) { // 获取网页标题 currentArticleTitle = webView.stringByEvaluatingJavaScript(from: "document.title") ?? "今日新闻" // 获取当前页面URL currentArticleURL = webView.request?.url?.absoluteString ?? "" // 获取网页描述(如果页面里有meta description标签的话) currentArticleDesc = webView.stringByEvaluatingJavaScript(from: "document.querySelector('meta[name=\"description\"]').content") ?? "" }
2. 实现分享按钮点击事件
给你的分享按钮加个点击事件,弹出系统分享面板:
@IBAction func shareButtonTapped(_ sender: UIButton) { // 准备要分享的内容数组 var shareItems: [Any] = [] // 添加文章标题 shareItems.append(currentArticleTitle) // 添加文章链接(转成URL对象) if let articleURL = URL(string: currentArticleURL) { shareItems.append(articleURL) } // 如果有摘要,也可以加进去 if !currentArticleDesc.isEmpty { shareItems.append(currentArticleDesc) } // 创建系统分享控制器 let activityVC = UIActivityViewController(activityItems: shareItems, applicationActivities: nil) // 可选:排除你不需要的分享选项,比如AirDrop、存到相册等 activityVC.excludedActivityTypes = [.airDrop, .assignToContact, .saveToCameraRoll] // iPad上需要设置popover的展示位置,不然会崩溃 if let popoverController = activityVC.popoverPresentationController { popoverController.sourceView = sender popoverController.sourceRect = sender.bounds } // 弹出分享面板 present(activityVC, animated: true, completion: nil) }
这样点击按钮后,用户就能选择Facebook、Twitter等平台分享,系统会自动处理跳转和内容填充。
二、定制化平台分享(单独集成SDK)
如果需要更定制化的分享界面(比如Facebook的原生分享弹窗)或者要统计分享数据,可以单独集成对应平台的SDK。
1. Facebook分享(用FBSDKShareKit)
首先通过CocoaPods安装SDK:在Podfile里添加pod 'FBSDKShareKit',然后执行pod install。
然后在控制器里写分享代码:
import FBSDKShareKit // 单独分享到Facebook的方法 func shareToFacebook() { guard let articleURL = URL(string: currentArticleURL) else { return } // 配置分享内容 let shareContent = ShareLinkContent() shareContent.contentURL = articleURL shareContent.title = currentArticleTitle shareContent.quote = currentArticleDesc // 弹出Facebook原生分享弹窗 let shareDialog = ShareDialog(fromViewController: self, content: shareContent, delegate: self) shareDialog.show() } // 实现Facebook分享的代理方法,处理分享结果 extension YourViewController: SharingDelegate { func sharer(_ sharer: Sharing, didCompleteWithResults results: [String : Any]) { print("Facebook分享成功啦!") } func sharer(_ sharer: Sharing, didFailWithError error: Error) { print("Facebook分享失败:\(error.localizedDescription)") } func sharerDidCancel(_ sharer: Sharing) { print("用户取消了Facebook分享") } }
注意:还要在Info.plist里配置Facebook的App ID等信息,具体可以参考官方配置步骤。
2. Twitter分享
现在Twitter官方的TwitterKit已经弃用,你可以用URL Scheme的方式直接跳转Twitter App,或者用网页版:
func shareToTwitter() { // 拼接要分享的文本和链接 let tweetContent = "\(currentArticleTitle) \(currentArticleURL)" // 转成URL编码格式,避免特殊字符出错 guard let encodedContent = tweetContent.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return } // 先尝试打开Twitter App if let twitterAppURL = URL(string: "twitter://post?text=\(encodedContent)"), UIApplication.shared.canOpenURL(twitterAppURL) { UIApplication.shared.open(twitterAppURL, options: [:], completionHandler: nil) } else { // 如果没安装Twitter,打开网页版分享 let twitterWebURL = URL(string: "https://twitter.com/intent/tweet?text=\(encodedContent)")! UIApplication.shared.open(twitterWebURL, options: [:], completionHandler: nil) } }
如果用URL Scheme,需要在Info.plist里添加LSApplicationQueriesSchemes数组,加入twitter这个值,不然没法检测是否安装了Twitter App。
三、重要注意事项
- UIWebView已经被苹果弃用了,建议你后续迁移到
WKWebView,获取页面内容的方法类似,用evaluateJavaScript即可,性能和安全性都更好。 - 对于iOS 10及以上版本,使用URL Scheme跳转第三方App时,必须在
Info.plist里配置LSApplicationQueriesSchemes,否则canOpenURL会返回false。 - 如果集成Facebook SDK,记得在开发者后台配置好你的App信息,包括Bundle ID、权限等,不然分享会失败。
内容的提问来源于stack exchange,提问作者Murtuza




