2017-06-02 19 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"])) 
     } 
    } 
}