You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS端使用Facebook ShareDialog分享视频的异常问题

iOS Facebook SDK 17.0.0 ShareDialog分享视频无预览且未附加的问题解决

问题场景

使用iOS Facebook SDK 17.0.0的ShareDialog分享从相册获取的PHAsset视频时,仅显示空白分享输入框,视频未附加;但图片、链接分享正常,且该视频可在Instagram正常分享。代码实现如下:

let video = ShareVideo(videoAsset: videoAsset)
content.video = video
self.shareDialog = ShareDialog(viewController: self,
                               content: content,
                               delegate: self.delegate)
do {
    try shareDialog?.validate()
} catch {
    print("error")
}
self.shareDialog?.show()

可行解决思路

  • 转换PHAsset为本地URL后再初始化ShareVideo
    直接使用PHAsset初始化ShareVideo可能存在资源加载不完整或权限问题,建议先将PHAsset导出为本地视频URL:
func exportVideo(from asset: PHAsset, completion: @escaping (URL?) -> Void) {
    let options = PHVideoRequestOptions()
    options.isNetworkAccessAllowed = true
    options.deliveryMode = .highQualityFormat
    
    PHImageManager.default().requestAVAsset(forVideo: asset, options: options) { avAsset, audioMix, info in
        guard let urlAsset = avAsset as? AVURLAsset else {
            completion(nil)
            return
        }
        completion(urlAsset.url)
    }
}

// 调用导出方法并创建分享内容
exportVideo(from: videoAsset) { videoURL in
    guard let url = videoURL else { return }
    let content = ShareVideoContent()
    content.video = ShareVideo(url: url)
    
    self.shareDialog = ShareDialog(viewController: self, content: content, delegate: self.delegate)
    do {
        try self.shareDialog?.validate()
        self.shareDialog?.show()
    } catch let error as NSError {
        print("验证失败: \(error.localizedDescription)")
    }
}
  • 确认分享内容类型为ShareVideoContent
    确保使用专门的视频分享内容类,避免混用其他分享类型:
let content = ShareVideoContent() // 必须明确使用该类型
content.video = video
  • 检查权限与配置

    • 确认Info.plist中已配置NSPhotoLibraryUsageDescription,以及Facebook应用ID、URL Scheme等必要项;
    • 登录Facebook开发者后台,检查应用是否开启视频分享权限,且应用状态允许该功能。
  • 优先使用原生Facebook应用分享
    网页版分享对视频支持有限,可强制使用原生应用(需先判断应用是否安装):

if ShareDialog.canShow(ShareVideoContent.self, in: .native) {
    shareDialog?.mode = .native
}
  • 查看具体验证错误
    修改错误打印逻辑,获取详细错误信息以定位问题:
do {
    try shareDialog?.validate()
} catch let error as NSError {
    print("ShareDialog验证错误: \(error.localizedDescription),错误码: \(error.code)")
}

内容的提问来源于stack exchange,提问作者Razvan S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:04:52