You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Swift中如何将UIWebView内容分享至Facebook、Twitter等社交平台?

在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

火山引擎 最新活动