NSURLSession 是否自动发送用户代理
does NSURLSession send user-agent automatically
当用户WatchKit 2.0, iOS 9.0 时,NSURLSession 是否自动发送用户代理?
有没有办法在 WatchKit 应用程序中验证这一点?
是的,用户代理作为默认 session 配置的一部分自动提供。
默认 NSURLSession
请求 header User-Agent
字段包括您的 watchOS 应用程序的捆绑包名称 (CFBundleName
) 和内部版本号 (CFBundleVersion
)扩展名:
$(CFBundleName)/$(CFBundleVersion) CFNetwork/808.3 Darwin/16.3.0
请注意,您的应用的版本号 (CFBundleShortVersionString
) 未包含在内。 (有关详细信息,请参阅 Technical Note TN2420: Version Numbers and Build Numbers。)
例如,对于内部版本号为 1 的产品 "Foo",您的用户代理将是:
Foo%20WatchKit%20Extension/1 CFNetwork/808.3 Darwin/16.3.0
如何验证?
我认为您的应用程序中没有检查默认用户代理字段的方法,因为它是 nil
(除非您已将其设置为自定义值)。
但是,您可以使用 netcat 检查模拟器发送的请求。
运行 nc -l 5678
在终端中让 netcat 监听发送到端口 5678
[=72 上的 localhost
的请求=]
在您应用的 Info.plist
文件中,添加 App Transport Security Settings 字典,并将 Allow Arbitrary Loads 键设置为 YES
将以下代码添加到application(_:didFinishLaunchingWithOptions:)
的开头
let url = URL(string: "http://localhost:5678/")!
URLSession.shared.dataTask(with: url) { (data, response, error) in
let body = String(data: data!, encoding: .utf8)!
print("body: \(body)")
}.resume()
return true
运行 您在模拟器中的应用程序并查看终端中的 netcat 输出
如果您的隐私无关紧要,您可以使用 user-agent.me 等服务在您的设备上进行测试。
将上面的localhost:5678
替换为user-agent.me
运行 您设备上的应用程序
检查 Xcode 的控制台输出
完成验证后,请记住撤消上述所有更改。
关于您的问题,请注意,可以在 WatchKit 中为您的 NSURLSession
手动设置 User-Agent
字符串,使用 NSURLSessionConfiguration
对象并设置 HTTPAdditionalHeaders.
NSURLSession 默认发送 User-Agent。
默认的 User-Agent 样式。
"User-Agent" = "UserAgentDemo/1 CFNetwork/1121.2.1 Darwin/19.2.0";
我们可以自定义User-Agent。
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = ["User-Agent": "zgpeace User-Agent"]
我在下面写了一个URLSession的demo。
func requestUrlSessionAgent() {
print("requestUrlSessionAgent")
let config = URLSessionConfiguration.default
// default User-Agent: "User-Agent" = "UserAgentDemo/1 CFNetwork/1121.2.1 Darwin/19.2.0";
// custom User-Agent
config.httpAdditionalHeaders = ["User-Agent": "zgpeace User-Agent"]
let session = URLSession(configuration: config)
let url = URL(string: "https://httpbin.org/anything")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
let task = session.dataTask(with: url) { data, response, error in
// ensure there is no error for this HTTP response
guard error == nil else {
print ("error: \(error!)")
return
}
// ensure there is data returned from this HTTP response
guard let content = data else {
print("No data")
return
}
// serialise the data / NSData object into Dictionary [String : Any]
guard let json = (try? JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [String: Any] else {
print("Not containing JSON")
return
}
print("gotten json response dictionary is \n \(json)")
// update UI using the response here
}
// execute the HTTP request
task.resume()
}
对了,WKWebView默认的User-Agent是不一样的,像
Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X)
您可以自定义WKWebView User-Agent
webView.customUserAgent = "zgpeace User-Agent"
我也写了一个WKWebView的demo:
func requestWebViewAgent() {
print("requestWebViewAgent")
let webView = WKWebView()
webView.evaluateJavaScript("navigator.userAgent") { (userAgent, error) in
if let ua = userAgent {
print("default WebView User-Agent > \(ua)")
}
// customize User-Agent
webView.customUserAgent = "zgpeace User-Agent"
}
}
警告:当释放 webView 时,"User-Agent" 来自 webView。您可以将 webView 对象设置为 属性 以保留 webView.
NSURLConnection 默认发送 User-Agent。
默认的 User-Agent 样式。
"User-Agent" = "UserAgentDemo/1 CFNetwork/1121.2.1 Darwin/19.2.0";
我们可以自定义User-Agent。
urlRequest.setValue("URLConnection zgpeace User-Agent", forHTTPHeaderField: "User-Agent")
我在下面为 URLConnection 编写了一个演示。
func requestUrlConnectionUserAgent() {
print("requestUrlConnectionUserAgent")
let url = URL(string: "https://httpbin.org/anything")!
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "GET"
// default User-Agent: "User-Agent" = "UserAgentDemo/1 CFNetwork/1121.2.1 Darwin/19.2.0";
urlRequest.setValue("URLConnection zgpeace User-Agent", forHTTPHeaderField: "User-Agent")
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: OperationQueue.main) { (response, data, error) in
// ensure there is no error for this HTTP response
guard error == nil else {
print ("error: \(error!)")
return
}
// ensure there is data returned from this HTTP response
guard let content = data else {
print("No data")
return
}
// serialise the data / NSData object into Dictionary [String : Any]
guard let json = (try? JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [String: Any] else {
print("Not containing JSON")
return
}
print("gotten json response dictionary is \n \(json)")
// update UI using the response here
}
}
github 中的演示:
https://github.com/zgpeace/UserAgentDemo.git
当用户WatchKit 2.0, iOS 9.0 时,NSURLSession 是否自动发送用户代理? 有没有办法在 WatchKit 应用程序中验证这一点?
是的,用户代理作为默认 session 配置的一部分自动提供。
默认 NSURLSession
请求 header User-Agent
字段包括您的 watchOS 应用程序的捆绑包名称 (CFBundleName
) 和内部版本号 (CFBundleVersion
)扩展名:
$(CFBundleName)/$(CFBundleVersion) CFNetwork/808.3 Darwin/16.3.0
请注意,您的应用的版本号 (CFBundleShortVersionString
) 未包含在内。 (有关详细信息,请参阅 Technical Note TN2420: Version Numbers and Build Numbers。)
例如,对于内部版本号为 1 的产品 "Foo",您的用户代理将是:
Foo%20WatchKit%20Extension/1 CFNetwork/808.3 Darwin/16.3.0
如何验证?
我认为您的应用程序中没有检查默认用户代理字段的方法,因为它是 nil
(除非您已将其设置为自定义值)。
但是,您可以使用 netcat 检查模拟器发送的请求。
运行
[=72 上的nc -l 5678
在终端中让 netcat 监听发送到端口5678
localhost
的请求=]在您应用的
Info.plist
文件中,添加 App Transport Security Settings 字典,并将 Allow Arbitrary Loads 键设置为YES
将以下代码添加到
的开头application(_:didFinishLaunchingWithOptions:)
let url = URL(string: "http://localhost:5678/")! URLSession.shared.dataTask(with: url) { (data, response, error) in let body = String(data: data!, encoding: .utf8)! print("body: \(body)") }.resume() return true
运行 您在模拟器中的应用程序并查看终端中的 netcat 输出
如果您的隐私无关紧要,您可以使用 user-agent.me 等服务在您的设备上进行测试。
将上面的
localhost:5678
替换为user-agent.me
运行 您设备上的应用程序
检查 Xcode 的控制台输出
完成验证后,请记住撤消上述所有更改。
关于您的问题,请注意,可以在 WatchKit 中为您的 NSURLSession
手动设置 User-Agent
字符串,使用 NSURLSessionConfiguration
对象并设置 HTTPAdditionalHeaders.
NSURLSession 默认发送 User-Agent。
默认的 User-Agent 样式。
"User-Agent" = "UserAgentDemo/1 CFNetwork/1121.2.1 Darwin/19.2.0";
我们可以自定义User-Agent。
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = ["User-Agent": "zgpeace User-Agent"]
我在下面写了一个URLSession的demo。
func requestUrlSessionAgent() {
print("requestUrlSessionAgent")
let config = URLSessionConfiguration.default
// default User-Agent: "User-Agent" = "UserAgentDemo/1 CFNetwork/1121.2.1 Darwin/19.2.0";
// custom User-Agent
config.httpAdditionalHeaders = ["User-Agent": "zgpeace User-Agent"]
let session = URLSession(configuration: config)
let url = URL(string: "https://httpbin.org/anything")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
let task = session.dataTask(with: url) { data, response, error in
// ensure there is no error for this HTTP response
guard error == nil else {
print ("error: \(error!)")
return
}
// ensure there is data returned from this HTTP response
guard let content = data else {
print("No data")
return
}
// serialise the data / NSData object into Dictionary [String : Any]
guard let json = (try? JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [String: Any] else {
print("Not containing JSON")
return
}
print("gotten json response dictionary is \n \(json)")
// update UI using the response here
}
// execute the HTTP request
task.resume()
}
对了,WKWebView默认的User-Agent是不一样的,像
Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X)
您可以自定义WKWebView User-Agent
webView.customUserAgent = "zgpeace User-Agent"
我也写了一个WKWebView的demo:
func requestWebViewAgent() {
print("requestWebViewAgent")
let webView = WKWebView()
webView.evaluateJavaScript("navigator.userAgent") { (userAgent, error) in
if let ua = userAgent {
print("default WebView User-Agent > \(ua)")
}
// customize User-Agent
webView.customUserAgent = "zgpeace User-Agent"
}
}
警告:当释放 webView 时,"User-Agent" 来自 webView。您可以将 webView 对象设置为 属性 以保留 webView.
NSURLConnection 默认发送 User-Agent。
默认的 User-Agent 样式。
"User-Agent" = "UserAgentDemo/1 CFNetwork/1121.2.1 Darwin/19.2.0";
我们可以自定义User-Agent。
urlRequest.setValue("URLConnection zgpeace User-Agent", forHTTPHeaderField: "User-Agent")
我在下面为 URLConnection 编写了一个演示。
func requestUrlConnectionUserAgent() {
print("requestUrlConnectionUserAgent")
let url = URL(string: "https://httpbin.org/anything")!
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "GET"
// default User-Agent: "User-Agent" = "UserAgentDemo/1 CFNetwork/1121.2.1 Darwin/19.2.0";
urlRequest.setValue("URLConnection zgpeace User-Agent", forHTTPHeaderField: "User-Agent")
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: OperationQueue.main) { (response, data, error) in
// ensure there is no error for this HTTP response
guard error == nil else {
print ("error: \(error!)")
return
}
// ensure there is data returned from this HTTP response
guard let content = data else {
print("No data")
return
}
// serialise the data / NSData object into Dictionary [String : Any]
guard let json = (try? JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers)) as? [String: Any] else {
print("Not containing JSON")
return
}
print("gotten json response dictionary is \n \(json)")
// update UI using the response here
}
}
github 中的演示:
https://github.com/zgpeace/UserAgentDemo.git