Как я могу получить файл с помощью WKWebView?

Существует файл (CSV), который я хочу загрузить. Он находится за экраном входа на веб-сайт. Я хотел показать WKWebView чтобы позволить пользователю войти в систему, а затем загрузить приложение после того, как он вошел в систему.

Я попытался загрузить файл за пределами WKWebView после того, как пользователь вошел в систему на веб-сайт, но данные сеанса, похоже, изолированы, потому что он загружает html-документ с формой входа вместо желаемого файла.

Я также попытался добавить WKUserScript к объекту WKUserContentController , но скрипт не запускается, когда загружается не-HTML-файл.

Есть ли способ получить доступ к этому файлу, позволяя пользователям входить в систему через WKWebView ?

5 Solutions collect form web for “Как я могу получить файл с помощью WKWebView?”

В настоящее время экземпляры WKWebView игнорируют любые сетевые хранилища по умолчанию (NSURLCache, NSHTTPCookieStorage, NSCredentialStorage), а также стандартные сетевые классы, которые вы можете использовать для настройки сетевых запросов (NSURLProtocol и т. Д.).

Таким образом, файлы cookie экземпляра WKWebView не хранятся в стандартном хранилище Cookie вашего приложения, поэтому NSURLSession / NSURLConnection, который использует только стандартное хранилище Cookie, не имеет доступа к куки-файлам WKWebView (и именно это, вероятно, проблема: «статус входа», скорее всего, хранится в файле cookie, но NSURLSession / NSURLConnection не увидит файл cookie).

То же самое относится к кешу, учетным данным и т. Д. WKWebView имеет свои собственные хранилища и, следовательно, не очень хорошо работает со стандартными сетевыми классами Cocoa.

Вы также не можете настраивать запросы (добавлять собственные HTTP-заголовки, изменять существующие заголовки и т. Д.), Использовать свои собственные схемы URL-адресов и т. Д., Так как NSURLProtocol не поддерживается WKWebView.

Так что сейчас WKWebView довольно бесполезен для многих приложений, потому что он не участвует со стандартными сетевыми API-интерфейсами Cocoa.

Я все еще надеюсь, что Apple изменит это до выхода iOS 8, потому что иначе WKWebView будет бесполезен для многих приложений, и мы, вероятно, будем придерживаться UIWebView немного дольше.

Поэтому отправляйте отчеты об ошибках в Apple, поэтому Apple узнает, что эти проблемы являются серьезными и должны быть исправлены.

Вы проверили ответные файлы cookie, возвращенные из запроса. Вы можете использовать такой метод делегата.

 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{ NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response; NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL]; for (NSHTTPCookie *cookie in cookies) { [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; } decisionHandler(WKNavigationResponsePolicyAllow); } 

Я сделал нечто похожее на то, что вы пытаетесь сделать:

  • используйте веб-представление для входа в систему, как вы уже делаете
  • установить navigationDelegate по вашему веб-просмотру
  • реализовать -webView:decidePolicyForNavigationResponse:decisionHandler в вашем -webView:decidePolicyForNavigationResponse:decisionHandler
  • когда этот метод делегата вызывается (после NSHTTPURLResponse* пользователя в систему) вы можете проверить navigationResponse.response ( NSHTTPURLResponse* его NSHTTPURLResponse* ) и найти заголовок Set-Cookie , содержащий информацию о сеансе, которая вам понадобится для сеансов с проверкой подлинности.
  • вы можете загрузить CSV вручную, указав заголовок Cookie в своем запросе с помощью файлов cookie, указанных в ответе.

Обратите внимание, что методы делегата вызываются только для запросов «основного кадра». Это означает, что запросы AJAX или внутренние кадры не будут запускать его. Вся страница должна обновиться для этого.

Если вам нужно вызвать поведение для запросов AJAX, iframes и т. Д., Вам нужно будет добавить некоторый javascript.

Кажется, у меня нет cookie сеанса, когда я пытаюсь выполнить запрос от userContentController didReceiveScriptMessage.

Однако при вызове из решенияPolicyForNavigationAction следующий код обнаруживает, что я вошел в систему.

  let urlPath: String = "<api endpoint at url at which you are logged in>" let url = NSURL(string: urlPath) let session = NSURLSession.sharedSession() let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in let string1 = NSString(data: data, encoding: NSUTF8StringEncoding) println(string1) println(data) if(error != nil) { println("Error sending token to server") // Print any error to the console println(error.localizedDescription) } var err: NSError? }) task.resume() 

Вы можете получить cookie через Javascript :

Затем вы можете использовать полученный файл cookie для загрузки файла вручную:

 webView.evaluateJavaScript("(function() { return document.cookie })()", completionHandler: { (response, error) -> Void in let cookie = response as! String let request = NSMutableURLRequest(URL: docURL) request.setValue(cookie, forHTTPHeaderField: "Cookie") NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) in // Your CSV file will be in the response object }).resume() }) 
  • Не получать обратный вызов из didReceiveScriptMessage в фоновом режиме
  • Я не могу захватить снимок экрана WKWebView
  • iOS WKWebView получает цвет пикселя RGBA от точки
  • Обработчик сообщения сценария не работает
  • Отображение индикатора активности на WKWebView с использованием быстрой
  • WKSelectionGranularityCharacter опция WKWebView, поврежденная в iOS 9
  • Недопустимый сертификат WKWebView https.
  • В iOS, как читать данные формы нескольких частей в NSURLRequest, происходящих из WKWebView?
  • Как получить AVPlayer на веб-странице с помощью WKWebView в swift?
  • iOS10 WKWebview - оценкаJavaScript ("document.height") return nil
  • Отобразить дочерний URL-адрес с родительским URL-адресом в предыстории WKWebView в iOS
  • Interesting Posts

    Добавление элементов в массив Firebase в Swift без предварительного наблюдения за массивом

    Xcode 8.2 не может устанавливать членство в правах

    Доступ к пользовательским переменным, переданным из командной строки xcodebuild

    Создание объекта – Objective-C

    iOS / Objecitve-C UILabel текстовый кернинг

    Как определить, когда появляется центр управления / уведомления?

    Распределение iOS – постоянное количество в кучерах не всегда 0

    UIStackView – требуется процент для определения каждого элемента

    беспорядочное мировое происхождение / выравнивание для ARSessionConfiguration.WorldAlignment = .gravityAndHeading

    Невозможно масштабировать окно устройства в iOS Simulator

    Установка стабильной сборки Cocoapods pod

    iOS – требуется OpenGL ES 2.0 для обновления?

    Программно эмулировать выбор в UITableViewController в Swift

    Режим редактирования UITableView

    «Нажмите, чтобы сфокусироваться», чтобы «автофокусироваться» при изменении содержимого в режиме камеры. Логика, как в приложении с камерой или UIImagePickerController для iOS?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.