UIActivityViewController分享至Instagram报错并闪退问题求助
问题分析与解决方案
核心问题
- Instagram分享报错:Instagram通过系统分享面板仅支持分享纯图片/视频数组,不接受文本+图片的混合内容,这就是弹出提示的原因。
- 程序无响应:没有给
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
相关产品推荐
相关产品推荐

