Чувствительность к регистру поля заголовка iOS HttpUrlResponse
При попытке получить заголовки из HttpUrlResponse я обнаружил, что симулятор iOS не учитывает регистр, а реальное устройство чувствительно к регистру.
Веб-сервис возвращает HTTP-заголовок "Grandmas-Cookies: XXXX"
Когда ключ заголовка имеет заглавные буквы:urlResponse.response.allHeaderFields["Grandmas-Cookies"] as? String
- Симулятор НЕ находит ключ.
- Реальное устройство видит ключ.
Когда ключ заголовка имеет все строчные буквы:urlResponse.response.allHeaderFields["grandmas-cookies"] as? String
- Симулятор действительно находит ключ.
- Реальное устройство НЕ видит ключ.
Могу ли я настроить симулятор на поведение, аналогичное реальному устройству? Смена заголовков HTTP в веб-службе на строчные не желательна, но странно, что это началось совсем недавно (да, это один из тех забавных моментов).
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
который возвращает истину при запуске из симулятора и ложь при работе на телефонном устройстве.
Я адаптировал код из этого поста Stackru, чтобы создать решение, подходящее для вашего сценария, с которым я столкнулся.