iOS开发:如何手动触发指定应用的共享扩展,定向发送文件


实现方案
该需求有两种成熟的实现路径,分别适配不同的分享场景:
方案1:使用目标应用的自定义URL Scheme(适合文本、轻量内容分享)
这是最常用的直达跳转方案,需要目标应用公开了跳转规则:
- 第一步:确认目标应用公开的URL Scheme和传参规范,例如Slack的公开Scheme为
slack://,官方会提供不同跳转场景对应的路径、参数规则。 - 第二步:在项目的Info.plist中添加
LSApplicationQueriesSchemes数组,将目标应用的Scheme(例如slack)加入数组,否则iOS会拦截应用的安装状态检测请求。 - 第三步:添加按钮点击逻辑,先校验应用是否安装,再执行跳转传参:
// Swift 示例代码 guard let slackUrl = URL(string: "slack://open"), UIApplication.shared.canOpenURL(slackUrl) else { // 未安装Slack,可自定义提示逻辑 return } // 要分享的内容可以先写入系统剪贴板,Slack唤起后会自动读取剪贴板内容 // 文本分享 UIPasteboard.general.string = "要分享的文本内容" // 文件分享 // UIPasteboard.general.setData(fileData, forPasteboardType: "public.file-url") UIApplication.shared.open(slackUrl)
方案2:使用UIDocumentInteractionController(更适合文件分享,无需记忆Scheme)
该方案不需要提前查询目标应用的Scheme,只要拿到对应应用的Bundle ID即可直接唤起,更适配文件分享场景:
- 第一步:获取目标应用的Bundle ID,例如Slack iOS版的Bundle ID为
com.tinyspeck.chatlyio,可通过公开资料、导出已安装应用IPA包两种方式查询。 - 第二步:初始化文档交互控制器,直接调用指定应用打开方法:
// Swift 示例代码 let fileUrl = URL(fileURLWithPath: "待分享文件的本地存储路径") guard let docController = UIDocumentInteractionController(url: fileUrl) else { return } // 直接指定Bundle ID唤起应用,不会弹出系统选择面板 let openSuccess = docController.open( inApplicationWithBundleIdentifier: "com.tinyspeck.chatlyio", animated: true ) if !openSuccess { // 打开失败,通常是未安装应用、或应用不支持当前分享的文件格式 }
注意事项
- 两种方案都要求目标应用本身支持接收你分享的文件格式,否则即使唤起应用也无法正常加载内容。
- 如果需要提前判断目标应用是否安装,还是需要在
LSApplicationQueriesSchemes中添加对应应用的Scheme,通过canOpenURL接口检测状态。 - 若目标应用未公开Scheme也无法获取到Bundle ID,则无法实现直达分享,只能使用系统原生UIActivityViewController。
内容的提问来源于stack exchange,提问作者Kevin Renskers
相关产品推荐
相关产品推荐

