UIWebView Navigator userAgent 属性 更改为 iOS9 不起作用
UIWebView Navigator userAgent property changing with iOS9 doesn't work
我有 UIWebView,我需要在其中更改 Navigator userAgent 属性。
对于 iOS 版本 10+,下面的代码完美运行:
func webViewDidFinishLoad(_ webView: UIWebView) {
let script = "window.navigator.__defineGetter__('userAgent', function() " +
"{ return '+keys +thatIs +neededTo +add'; });"
webView.stringByEvaluatingJavaScript(from: script)
}
但是对于 iOS9 这不起作用。
有人有什么主意吗?
在 Info.plist 中,我已将 NSAllowsArbitraryLoads
设置为 true。
需要在 UserDefaults 中设置用户代理。
您可以使用以下代码进行设置。
func setUserAgent(as userAgentString: String) {
UserDefaults.standard.register(defaults: ["UserAgent": userAgentString])
}
用法:
let userAgentString = "USER AGENT STRING HERE"
setUserAgent(as: userAgentString)
编辑:
我看到您想将一些字符串附加到当前的 UserAgent。
为此,您需要读取当前用户代理的值,存储它,添加您的自定义字符串,然后存储新的用户代理。用法保持不变。
func setUserAgent(as value: String) {
let webView = UIWebView(frame: CGRect(width: 0, height: 0))
let defaultUserAgentString = webView.stringByEvaluatingJavaScript(from: "navigator.userAgent")
UserDefaults.standard.register(defaults: ["UserAgent": defaultUserAgentString + " " + value])
// remove the " " space if you don't need it
}
编辑 2:
是的,更改它会更改您应用中的所有 Web 视图。为避免这种情况,您可以...
func setUserAgent(as value: String) {
let webView = UIWebView()
Constants.defaultUserAgentString = webView.stringByEvaluatingJavaScript(from: "navigator.userAgent") ?? ""
UserDefaults.standard.register(defaults: ["UserAgent": defaultUserAgentString + " " + value])
}
func resetUserAgent() {
if let defaultString = Constants.defaultUserAgentString {
UserDefaults.standard.register(defaults: ["UserAgent": defaultString])
}
}
Constants
这里有一个struct/class用来存放全局常量,有的话可以换成自己的struct/class。只需添加静态变量 defaultUserAgentString
来跟踪默认用户代理。
完成后使用 resetUserAgent()
切换回默认用户代理。也许将它添加到 ViewController
上的 viewWillDisappear(
) 处理需要修改的用户代理的 WebView
。
我有 UIWebView,我需要在其中更改 Navigator userAgent 属性。
对于 iOS 版本 10+,下面的代码完美运行:
func webViewDidFinishLoad(_ webView: UIWebView) {
let script = "window.navigator.__defineGetter__('userAgent', function() " +
"{ return '+keys +thatIs +neededTo +add'; });"
webView.stringByEvaluatingJavaScript(from: script)
}
但是对于 iOS9 这不起作用。
有人有什么主意吗?
在 Info.plist 中,我已将 NSAllowsArbitraryLoads
设置为 true。
需要在 UserDefaults 中设置用户代理。 您可以使用以下代码进行设置。
func setUserAgent(as userAgentString: String) {
UserDefaults.standard.register(defaults: ["UserAgent": userAgentString])
}
用法:
let userAgentString = "USER AGENT STRING HERE"
setUserAgent(as: userAgentString)
编辑:
我看到您想将一些字符串附加到当前的 UserAgent。 为此,您需要读取当前用户代理的值,存储它,添加您的自定义字符串,然后存储新的用户代理。用法保持不变。
func setUserAgent(as value: String) {
let webView = UIWebView(frame: CGRect(width: 0, height: 0))
let defaultUserAgentString = webView.stringByEvaluatingJavaScript(from: "navigator.userAgent")
UserDefaults.standard.register(defaults: ["UserAgent": defaultUserAgentString + " " + value])
// remove the " " space if you don't need it
}
编辑 2:
是的,更改它会更改您应用中的所有 Web 视图。为避免这种情况,您可以...
func setUserAgent(as value: String) {
let webView = UIWebView()
Constants.defaultUserAgentString = webView.stringByEvaluatingJavaScript(from: "navigator.userAgent") ?? ""
UserDefaults.standard.register(defaults: ["UserAgent": defaultUserAgentString + " " + value])
}
func resetUserAgent() {
if let defaultString = Constants.defaultUserAgentString {
UserDefaults.standard.register(defaults: ["UserAgent": defaultString])
}
}
Constants
这里有一个struct/class用来存放全局常量,有的话可以换成自己的struct/class。只需添加静态变量 defaultUserAgentString
来跟踪默认用户代理。
完成后使用 resetUserAgent()
切换回默认用户代理。也许将它添加到 ViewController
上的 viewWillDisappear(
) 处理需要修改的用户代理的 WebView
。