1

尝试从 HttpUrlResponse 获取标头时,我发现 iOS 模拟器不区分大小写,而真实设备区分大小写。

Web 服务返回 HTTP 标头“Grandmas-Cookies: XXXX”

当标题键有大写字母时urlResponse.response.allHeaderFields["Grandmas-Cookies"] as? String

  • 模拟器找不到密钥。
  • 真正的设备会看到密钥。

当标题键全部为小写字母时urlResponse.response.allHeaderFields["grandmas-cookies"] as? String

  • 模拟器确实找到了钥匙。
  • 真实设备看不到密钥。

我可以对模拟器进行设置以使其行为类似于真实设备吗?在这一点上将 Web 服务中的 HTTP 标头更改为小写是不可取的,但奇怪的是这只是最近才开始发生(是的,这是那些有趣的时代之一)。

4

1 回答 1

1

编辑:

@Adam我找到了一种更好的方法来确保这不是问题。

我创建了这个使检查大小写不敏感的函数。

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,在电话设备上运行时返回 false。

我改编了这篇 StackOverflow帖子中的代码,以制作一个适用于您的场景以及我也面临的场景的解决方案。

于 2017-06-15T17:37:00.133 回答