iOS HttpUrlResponse头字段大小写敏感性
当试图从HttpUrlResponse获取头文件时,我发现iOS模拟器不区分大小写,而真实设备区分大小写。iOS HttpUrlResponse头字段大小写敏感性
的web服务,返回的HTTP标头 “奶奶,饼干:XXXX”
当标题密钥具有大写字母: urlResponse.response.allHeaderFields["Grandmas-Cookies"] as? String
- 模拟器未找到键。
- 真正的设备看到了关键。
当标题密钥具有全小写字母: urlResponse.response.allHeaderFields["grandmas-cookies"] as? String
- 模拟器确实找到问题的关键。
- 真实的设备没有看到密钥。
是否有一个设置可以让模拟器的行为与真实设备类似?现在将Web服务中的HTTP标题更改为小写是不可取的,但最近才发生这种情况很奇怪(是的,这是有趣的时刻之一)。
编辑:
@亚当我找到了一个更好的方法来确保这不是问题。
我创建了这个函数,使检查大小写不敏感。
func find(header: String) -> String? {
let keyValues = allHeaderFields.map { (String(describing: $0.key).lowercased(), String(describing: $0.value)) }
if let headerValue = keyValues.filter({ $0.0 == header.lowercased() }).first {
return headerValue.1
}
return nil
}
以下可能对某些人仍然有用。
为了解决这个问题,我创建了一个struct
。在struct
内部,我创建了一个静态变量grandmasCookies
,现在可以在应用程序中的任何位置引用它。这将返回大写
奶奶的饼干
当您在手机设备上运行。
这将返回小写
奶奶饼干
,当你在一个设备上的模拟器,如MacBook Pro的运行。
struct Platform {
static let grandmasCookies: String = {
var xtoken = "Grandmas-Cookies"
#if arch(i386) || arch(x86_64)
xtoken = "grandmas-cookies"
#endif
return xtoken
}()
static let isSimulator: Bool = {
var isSim = false
#if arch(i386) || arch(x86_64)
isSim = true
#endif
return isSim
}()
}
我创建了一个第二方便可变isSimulator
从模拟器运行和假电话设备上运行时,时返回true。
我调整了这个StackOverflow代码post的代码,以便为您的方案和我所面对的问题制定一个解决方案。
RFC明确规定“每个头域包含一个名称,后跟一个冒号(”:“)和字段值,字段名称不区分大小写。”所以我对这个解决方案并不是100%满意,但现在可以工作。 https://tools.ietf.org/html/rfc2616#section-4.2 – Adam
如果你还没有,提交一个错误。所有标题字段查找都应该是不区分大小写的。 – dgatwood