Пользовательский заголовок http в запросах UIWebView, вызывающий поломку кнопки «Назад»

Я использую следующий код для вставки пользовательского заголовка http в мои запросы UIWebView:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        let headerFields = request.allHTTPHeaderFields
        var headerIsPresent = contains(request.allHTTPHeaderFields?.keys.array as [String], "X-Test-App")

        if headerIsPresent || navigationType == UIWebViewNavigationType.Other {
            return true
        } else {
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
                dispatch_async(dispatch_get_main_queue(), {
                    let url = request.URL
                    var newRequest: NSMutableURLRequest = request as NSMutableURLRequest
                    // set new header
                    newRequest.addValue("MyValue", forHTTPHeaderField: "X-Test-App")

                    // reload the request
                    self.webView.loadRequest(newRequest)
                })
            })
            return false
        }
    }

Проблема в том, что история кнопки «Назад» не сохраняется. Поэтому, если я нажму на 3 запроса в глубину. При возврате он перейдет только на предыдущую страницу, а затем повторный удар приведет к возврату на страницу, с которой вы только что вернулись. По сути, это бесконечный цикл между двумя последними запросами. Любая идея, как я могу изменить приведенный выше код, чтобы сохранить всю историю веб-поиска и позволить кнопкам «назад/вперед» работать должным образом?


person codeman    schedule 20.01.2015    source источник


Ответы (1)


Проблема в том, что встроенный в UIWebView goBack() возвращает только 1 страницу назад, но, перехватив loadRequest и заменив его новым запросом, webView видит это как новый, второй элемент в истории. Поэтому потребуется больше работы, чтобы объединить 1) встроенную историю UIWebview, 2) UIWebView goBack() и 3) этот метод перехвата запросов на загрузку.

Кнопка, вызывающая goBack(), может просто вызвать goBack() дважды — если в одном и том же блоке кода, я предполагаю, что UIWebView перейдет ко второму элементу в истории. Но это хрупко другими способами, не рекомендуется.

Вы можете создать стек немодифицированных запросов. Настройте массив и вызовите append(), чтобы добавить немодифицированный запрос перед созданием нового. Но сначала для каждого немодифицированного запроса проверьте, является ли он последним объектом в массиве. Если это так, им, вероятно, нужен предыдущий, поэтому удалите его из конца массива и создайте измененный запрос с новым lastObject.

person Mike Sand    schedule 20.01.2015