2016-12-21 6 views
0

のために設定されていません我々はiPhoneアプリでのUIWebViewのUser-Agentが正しくカスタム値

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

すなわちに

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

からユーザーエージェントの値を変更したい場合は、私のアプリは、設定する必要がありますiPadのユーザーエージェント。

私のコードは

のUser-AgentがI場合は、iPadのユーザエージェントのように見えるように文字列を操作する代わりに、ロジックのデフォルト値

を設定し、保持されていない上記の場合

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 
    } 

} 

のように見えます変更してviewDidLoadのハードコーディングされた値を

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”]) 

のように設定してください。

しかし、私は

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

のようなハードコードは、それが適切に

任意のアイデアを設定した場合、何が間違ってここに行きましたか?

答えて

1

iOSブラウザのユーザーエージェントの値をjsコードで取得するために呼び出すと、iOSはこの時点で作成して値を送信します。したがって、作成後にユーザーエージェントを更新することはできません。このようなジャバスクリプトによって呼び出さずとして手動ですべてのユーザー・エージェントを書くようにしてください:

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

はい、これは正しい、それが働きました。 Webビューを初期化する前に、ユーザーエージェントをユーザーデフォルトに設定する必要があることを理解してください。ありがとう。それでも、それぞれのデバイスにはユーザーエージェントの文字列が若干異なるため、iPhone文字列をiPad文字列に変更する必要があり、残りはユーザーエージェント値に設定されているデフォルトと同じです。 – Jay

+1

符号化によって、別のデバイス値で文字列を変更することはできません。ブラウザは常にユーザーエージェントの値を更新しているためです。だからあなたは手動でiphoneやipadの値を設定する必要があります。デバイス検出用:https://stackoverflow.com/a/24059373/3116663 – agenc

0

それは同様のプロジェクトで私を助けたのはこのための興味深いトレーニングがあります:それは一度あなたのことは事実である

  • は、 (それはバグですか?)
  • 現在の値を取得して変更することができないため、
  • というWebヘッダーオブジェクトの1つのインスタンスに当てはまります。そのため、「隠し」プロパティがtrue値の一時オブジェクトを追加することができます。そのため、GUIに表示されずにこのオブジェクトから値を取得することができます。

    @IBOutlet var tmpWebView:UIWebView!

    @IBOutlet var webview:UIWebView!

    var newAgent = tmpWebView.stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Added new string" 
    UserDefaults.standard.register(defaults: ["UserAgent": newAgent]) 
    
関連する問題