2016-12-21 2 views
0

Wenn wir den Wert des User-Agenten vonUIWebView User-Agent ist nicht richtig eingestellt für benutzerdefinierten Wert

Mozilla/5.0 (iPhone; CPU iPhone OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72 

zu

Mozilla/5.0 (iPad; CPU OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72 

dh auf iPhone app, mein app muss eingestellt ändern möchten der User-Agent von iPad.

Mein Code sieht aus wie

class ViewController: UIViewController, UIWebViewDelegate { 
    @IBOutlet weak var webView: UIWebView! 
    var userAgent:String = "" 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     userAgent = self.webView.stringByEvaluatingJavaScript(from: "navigator.userAgent")! 

     let range = userAgent.range(of: "iPhone") 

     if range != nil { 
      userAgent = userAgent.replacingCharacters(in: range!, with: "iPad") 
      userAgent = userAgent.replacingOccurrences(of: "iPhone", with: "") 
     } 
     userAgent = userAgent.replacingOccurrences(of: " ", with: " ") 

     UserDefaults.standard.register(defaults: ["UserAgent": userAgent]) 

    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     self.webView.loadRequest(URLRequest(url: URL(string: "http://www.google.com")!)) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool { 
     let userAgent = request.allHTTPHeaderFields!["User-Agent"] 
     print("\(userAgent)") 
     return true 
    } 

} 

In obigem Fall der User-Agent nicht gesetzt und hält den Standardwert

Statt Logik, um die Zeichenfolge zu manipulieren, wie iPad User-Agent zu sehen, wenn ich ändern und hart codierten Wert in viewDidLoad wie

UserDefaults.standard.register(defaults: ["UserAgent": “Mozilla/5.0 (iPad; CPU OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72”]) 

dann auch wird es nicht aktualisiert eingestellt.

Aber wenn ich hart Code wie

UserDefaults.standard.register(defaults: ["UserAgent": “MyValue”]) 

dann wird es richtig

Jede Idee gesetzt, was ging hier falsch?

Antwort

1

Wenn Sie anrufen, um iOS-Browser-User-Agent-Wert mit Js-Code zu erhalten, erstellt iOS und sendet Wert zu diesem Zeitpunkt. Daher können Sie den Benutzer-Agent nach dem Erstellen nicht aktualisieren. Versuchen Sie, alle Benutzerprogramme zu schreiben, wie manuell, ohne durch Javascript, wie dies Aufruf:

let manuelUserAgent = "Mozilla/5.0 (iPad; CPU OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72" 

    let newUserAgent = "\(manuelUserAgent) YourOpt.Text" 

    UserDefaults.standard.register(defaults: ["UserAgent": newUserAgent]) 
+0

Ja, das ist richtig, es funktionierte. Verstanden, bevor wir die Web-Ansicht initialisiert haben, müssen wir den Benutzer-Agent in Benutzer-Standardeinstellungen setzen. Vielen Dank. Dennoch gibt es noch eine weitere Frage: Da jedes Gerät eine leicht unterschiedliche Zeichenfolge von Benutzeragent hat, musste ich nur die iPhone-Zeichenfolge in iPad-Zeichenfolge ändern, und der Rest ist der gleiche wie der Standardwert im Benutzer-Agent-Wert. – Jay

+1

Sie können die Zeichenfolgen nicht mit einem anderen Gerätewert ändern, indem Sie codieren. Weil Browser ihre Benutzer-Agent-Werte immer aktualisieren. Also müssen Sie die iphone- oder ipad-Werte manuell einstellen. Zum Erkennen des Geräts: https://StackOverflow.com/a/24059373/3116663 – agenc

0

Es ein interessantes Training dafür ist, dass es mir in einem ähnlichen Projekt geholfen:

  • Es ist wahr, dass, wenn Sie erhalten den Wert eines hTTP-Header Sie es später nicht mehr ändern kann (es ist ein Bug?)
  • wegen, dass man kann nicht den aktuellen Wert erhalten und modifizieren
  • das ist für eine Instanz eines webview Objekt wahr ist . Aus diesem Grund können Sie ein temporäres Objekt mit der Eigenschaft "hidden" mit einem wahren Wert hinzufügen, sodass es nicht in Ihrer GUI erscheint und dann den Wert dieses Objekts abruft, damit Sie es am ursprünglichen Objekt ändern können:

    @IBOutlet var tmpWebView: UIWebView!

    @IBOutlet var webview: UIWebView!

    var newAgent = tmpWebView.stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Added new string" 
    UserDefaults.standard.register(defaults: ["UserAgent": newAgent]) 
    
Verwandte Themen