iOS中通过Deep Link传递文档URL,如何在目标应用SceneDelegate提取?
解决Deep Link传递文档URL的解析问题
你已经能通过Deep Link启动目标应用,接下来只需要解析传入URL的查询参数,就能提取出原文档的URL,具体步骤和代码如下:
步骤说明
- 从
URLContexts中拿到传入的Deep Link URL后,用URLComponents解析该URL的结构 - 从解析后的查询参数(queryItems)中找到键为
url的参数值 - 对参数值进行URL解码(因为原文档URL的特殊字符在拼接时会被转义)
- 将解码后的字符串转换回
URL类型,得到原文档的URL
修改后的SceneDelegate代码
extension SceneDelegate { func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let deepLinkUrl = URLContexts.first?.url else { return } // 解析Deep Link的URL组件 guard let components = URLComponents(url: deepLinkUrl, resolvingAgainstBaseURL: false), let queryItems = components.queryItems else { print("无法解析Deep Link参数") return } // 查找key为"url"的查询参数 guard let encodedDocUrlString = queryItems.first(where: { $0.name == "url" })?.value else { print("未找到文档URL参数") return } // 对编码后的字符串进行URL解码 guard let decodedDocUrlString = encodedDocUrlString.removingPercentEncoding, let originalDocUrl = URL(string: decodedDocUrlString) else { print("文档URL解码失败") return } // 这里就拿到了原文档的URL,可以进行后续操作 print("原文档URL:\(originalDocUrl.absoluteString)") } }
额外注意点
- 确保拼接Deep Link时,原文档URL的
absoluteString已经被正确转义(你当前的代码直接拼接documenturl.absoluteString其实已经由系统自动处理了转义,但如果有特殊场景可以手动用addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)确保转义正确) - 处理参数不存在、解码失败等异常情况,避免应用崩溃
内容的提问来源于stack exchange,提问作者mimi
相关产品推荐
相关产品推荐

