Как я могу получить файл с помощью 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() }) 
  • Получение всех файлов cookie из WKWebView
  • Как запретить WKWebView неоднократно запрашивать разрешение на доступ к местоположению?
  • Сбой: WebThread - EXC_BAD_ACCESS KERN_INVALID_ADDRESS
  • WKWebView в iOS: как я могу перехватить клик и получить связанный контент?
  • Снимок экрана WKWebView не полностью обеспечивает полную высоту страницы
  • Как правильно реализовать didFailProvisionalNavigation с помощью WKWebView?
  • wkwebview требуетсяUserActionForMediaPlayback не работает
  • Как удалить или захватить событие кнопки выбора даты iOS?
  • Аутентификация с помощью WKWebView в Swift
  • Как определить размер содержимого WKWebView?
  • WKWebView открывает ссылки из определенного домена в сафари
  • Как удалить cookie WKWebview
  • Interesting Posts

    iOS измерение времени загрузки веб-страницы

    iTunes Connect: имя приложения со специальными символами (немецкий «умлаут»)

    Метод CorePlot / Swift не найден

    iOS отклоняет UIAlertView, показывая другой

    Как я могу решить ошибку с кодовым знаком: идентификатор ipad не соответствует какой-либо действительной паре с сертификатом / закрытым ключом без истечения срока действия в ваших цепочках ключей?

    Получить позицию UIView в отношении ее супервизора

    команда компоновщика завершилась с кодом выхода 1 xcode4.5

    Google AdMob: странная ошибка + использование ЦП

    Невозможно распространять внутреннее приложение iOS «Невозможно открыть страницу» Ошибка iOS 7

    Приложения Unity3d на iPad2 требуют старого прокси. профиля для запуска

    Xcode 6 экспортирует файл IPA с локально установленным профилем подготовки

    Изменение цвета оттенка штриха делает размытую область черно-белой

    В чем разница между #if и #ifdef Objective-C препроцессором макроса?

    Как публиковать сообщения на twitter, скрывая SLComposeViewController * tweetSheettweet instance

    Не удается получить текущую позицию CALayer во время анимации

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