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

UIActivityViewController分享至Instagram报错并闪退问题求助

问题分析与解决方案

核心问题

  1. Instagram分享报错:Instagram通过系统分享面板仅支持分享纯图片/视频数组,不接受文本+图片的混合内容,这就是弹出提示的原因。
  2. 程序无响应:没有给UIActivityViewController设置完成回调,分享失败后界面无法正常关闭或回到原状态。

修复步骤

1. 适配Instagram的分享内容

修改ShareableText和ShareableImage的itemForActivityType方法,针对Instagram类型单独处理:

  • 对于Instagram,只返回图片,不返回文本;其他平台保持原逻辑。

2. 添加分享完成回调

给UIActivityViewController设置completionWithItemsHandler,处理分享后的各种状态,确保界面正常响应。

修改后的完整代码

let activityItem1 = ShareableText(title: name)
var activities:[Any] = [ activityItem1 ]

if let aScreenShot = myScreenshot() {
    let activityItem2 = ShareableImage(image: aScreenShot)
    activities.append(activityItem2)
}

let shareVC = UIActivityViewController(activityItems: activities, applicationActivities: nil)
shareVC.excludedActivityTypes = [ .assignToContact, .airDrop, .addToReadingList ]

// 添加分享完成回调,解决无响应问题
shareVC.completionWithItemsHandler = { activityType, completed, returnedItems, error in
    if let error = error {
        print("分享出错: \(error.localizedDescription)")
    }
    // 无论成功失败,确保分享面板正常退出
    if !completed {
        shareVC.dismiss(animated: true)
    }
}

self.present(shareVC, animated: true)


class ShareableImage: NSObject, UIActivityItemSource {
    let image: UIImage
    
    init(image: UIImage) {
        self.image = image
    }
    
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return image
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivity.ActivityType?, suggestedSize size: CGSize) -> UIImage? {
        return UIImage(named: "Icon_CompletedShare")
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        // 对Instagram直接返回图片,确保符合要求
        if activityType == .postToInstagram {
            return image
        }
        return image
    }
}


class ShareableText: NSObject, UIActivityItemSource {
    let title: String
    
    init(title: String) {
        self.title = title
    }
    
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return title
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
        return title
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivity.ActivityType?, suggestedSize size: CGSize) -> UIImage? {
        return UIImage(named: "Icon_CompletedShare")
    }
    
    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        // Instagram不接受单独文本,这里返回nil
        if activityType == .postToInstagram {
            return nil
        }
        return title
    }
}

额外说明

如果需要在Instagram分享中包含文本内容,有两种可选方案:

  • 把文本绘制到截图图片上,生成带文字的图片后再分享。
  • 直接调用Instagram的官方SDK,但这需要额外的集成步骤和权限申请。

内容的提问来源于stack exchange,提问作者Lena Verhoev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:20:34