2017-06-02 21 views
1

背景处理数据从一个txt文件打开时在IOS的WebView

我在Swift重写的Android应用。该应用程序的要点是,它加载一个网站webView,允许用户登录,然后让他们访问一个名为“下载您的数据”的链接。

问题

当用户点击IOS它打开视图中的txt文件的链接现在。所以整个txt文件出现在屏幕的视图中。

在Android中,它下载文件,我可以通过文件系统访问它,然后通过POST将数据访问到服务器。

问题

考虑到数据出现在屏幕上,并不会下载或给我访问通过文件系统中的文件,

在哪些方面或者怎么样,我可以访问此文件或文件内的数据,以便我可以将其发布到服务器?

示例代码

import UIKit 
import WebKit 

class ViewController: UIViewController, WKUIDelegate { 

    var webView: WKWebView! 

    override func loadView() { 
     let webConfiguration = WKWebViewConfiguration() 
     webView = WKWebView(frame: .zero, configuration: webConfiguration) 
     webView.uiDelegate = self 
     view = webView 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let viewUrl = URL(string: "https://www.example.com") 
     let viewUrlRequest = URLRequest(url: viewUrl!) 
     webView.load(viewUrlRequest) 
    } 

} 
+0

我在寻找类似的东西,我想 - 你检查了'UIDocumentInteractionController'? – ArielSD

+0

我解决了这个给我一个biIt,我会告诉你。 – wuno

+0

很酷,期待! – ArielSD

回答

0

予处理,这是通过探查的同时请求正在取得交通方式。寻找必要的标题和URL端点,然后在Swift中形成一个查询来处理文件下载。一旦我获得了数据,我就可以随心所欲地做任何事情。在我的情况下,我把它发布到服务器上。

查尔斯

你可以找到Charles here

查尔斯是一个HTTP代理/ HTTP监视器/反向代理,使一个 开发者查看所有的HTTP和SSL/HTTPS流量之间 他们的机器和互联网。这包括请求,响应和HTTP头(其中包含cookie和缓存信息)。

您将需要此来调查您需要进行的http请求才能获取应用程序中的数据。通过这种方式,您可以实现请求并控制应用程序的流程。

在我的应用程序中,我使用JavaScript来模拟点击并强制下载。我必须将正确的标题附加到我使用Charles找到的http请求上。解

说明下面是使用夫特和注入的JavaScript的例子。这显示了如何添加标头并发出http请求。你将不得不花时间弄清楚你需要改变以完成这项工作。但逻辑在这里。

在我的情况下,我不得不将用户登录到网站,点击接受条款和条件的链接,然后点击链接下载数据。如果你只需要点击一个端点,那么你就不需要把它做得像我一样广泛。如果你确实需要模拟点击,那么我的代码应该会有很大的帮助。

示例代码

import Foundation 
import UIKit 

class Downloader: NSObject { 
    enum Step { case idle, login, agreeToTerms, download } 


    var currentStep = Step.idle 
    var uiwebview: UIWebView! 
    var username: String = "" 
    var password: String = "" 
    var completion: ((Data?, Error?) -> Void)? 

    static var downloader: Downloader! 

    static func download(username: String, password: String, completion: @escaping (Data?, Error?) -> Void) { 
     if self.downloader == nil { self.downloader = Downloader() } 

     self.downloader.uiwebview = UIWebView(frame: CGRect(x: 0, y: 0, width: 320, height: 480)) 
     self.downloader.uiwebview.scalesPageToFit = true 
     self.downloader.uiwebview.delegate = self.downloader 

     self.downloader.username = username 
     self.downloader.password = password 
     self.downloader.completion = completion 

     let url = URL(string: "URL-END-POINT-HERE")! 
     self.downloader.currentStep = .login 
     self.downloader.uiwebview?.loadRequest(URLRequest(url: url)) 
    } 
} 

extension Downloader: UIWebViewDelegate { 
    func webViewDidFinishLoad(_ webView: UIWebView) { 
     if self.currentStep == .login, webView.request!.url?.absoluteString == "SOME-OTHER-URL-ACTION" { 
      let script = "document.getElementById('signInNew:inputUserId').value = '\(self.username)'; document.getElementById('signInNew:inputPassword').value = '\(self.password)'; document.getElementById('signInNew:signin_login').click()" 
      self.currentStep = .agreeToTerms 
      webView.stringByEvaluatingJavaScript(from: script) 
     } else if self.currentStep == .agreeToTerms, webView.request!.url?.absoluteString == "https://www.nslds.ed.gov/npas/pub/disclaimer.htm" { 
      self.currentStep = .download 
      webView.stringByEvaluatingJavaScript(from: "document.getElementsByClassName('button signIn')[0].click()") 
     } else if self.currentStep == .download, webView.request?.url?.absoluteString == "SOME-OTHER-URL-ACTION" { 
      let url = URL(string: "SOME-OTHER-URL-ACTION")! 
      var request = URLRequest(url: url) 
      var headers = request.allHTTPHeaderFields ?? [:] 

      if let cookies = HTTPCookieStorage.shared.cookies(for: url) { 
       for (key, value) in HTTPCookie.requestHeaderFields(with: cookies) { headers[key] = value } 
      } 
      // headers here - change these to the correct headers 
      headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" 
      headers["Accept-Encoding"] = "gzip, deflate, sdch, br" 
      headers["Accept-Language"] = "en-US,en;q=0.8" 
      headers["Connection"] = "keep-alive" 
      headers["Referer"] = "URL-REFERER-HERE-END-POINT" 
      headers["User-Agent"] = "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E8301" 
      //headers["Referer"] = "URL-REFERER-HERE-END-POINT" 
      request.allHTTPHeaderFields = headers 
      request.httpShouldHandleCookies = false 

      URLSession.shared.dataTask(with: request) { data, response, error in 
       self.completion?(data, error) 
      }.resume() 
     } else { 
      print("URL mismatch: \(webView.request!.url!.absoluteString)") 
      self.completion?(nil, NSError(domain: "Connection", code: 100, userInfo: [NSLocalizedDescriptionKey: "Check username & password \nDownload sequence mismatch"])) 
     } 
    } 
}