Чувствительность к регистру поля заголовка 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, чтобы создать решение, подходящее для вашего сценария, с которым я столкнулся.

Другие вопросы по тегам