Swift使用URLComponents提取URL参数queryItems返回nil如何解决?
问题根因
- 你使用的是自定义scheme的非标URL,HTTP/HTTPS等标准URL的查询参数需位于
?之后,当前你的参数直接拼接在scheme后缀的:之后,被URLComponents识别为path属性而非query属性,因此queryItems返回nil。 - 后续将
:替换为?后解析异常,是因为原URL中参数分隔符&、键值分隔符=都被URL编码为%26、%3D,URLComponents解析时会将编码后的字符识别为参数名/值的普通内容,不会作为参数分隔符处理,因此整段内容会被识别为单个异常参数。
解决方案
直接修改函数兼容非标URL的参数提取,利用URLComponents已经自动解码path内容的特性,将解码后的路径当做查询字符串二次解析即可:
func getQueryStringParameter(url: String, param: String) -> String? { guard let urlItems = URLComponents(string: url) else { return nil } // 优先适配标准URL的查询参数解析 if let queryItems = urlItems.queryItems, !queryItems.isEmpty { return queryItems.first { $0.name == param }?.value } // 非标场景从解码后的path中提取参数 let queryString = urlItems.path var tempComponents = URLComponents() tempComponents.query = queryString return tempComponents.queryItems?.first { $0.name == param }?.value }
调用你给出的入参测试,该函数会正常返回token对应的bbbbbbbb。
优化建议(可选)
如果可以控制URL的生成逻辑,建议遵循URL标准规范:
- 仅对参数值的特殊字符做URL编码,不要编码参数分隔符
&和键值分隔符= - 自定义scheme的URL的查询参数放在
?之后,示例结构为myprefix://?un=test&add=%3D1&token=bbbbbbbb
遵循规范的URL直接使用原生URLComponents即可正常解析,无需额外兼容逻辑。
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

