小智 39
在iOS中确定用户代理的一种更简单的方法是直接从UIWebView使用此SO帖子的接受答案中获取它.引用这个答案:
解决方案是创建一个UIWebView,然后使用javascript来提取用户代理.
Run Code Online (Sandbox Code Playgroud)UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectZero]; NSString* secretAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
每个请求中的移动应用程序都必须发送User-Agent带有构建版本和设备信息的标头
所以,用户代理应该是这样的:
User-Agent: <AppName>/version (<system-information>) <platform> (<platform-details>) <extensions>
对于 iOS:
User-Agent: <AppName/<version> (<iDevice platform>; <Apple model identifier>; iOS/<OS version>) CFNetwork/<version> Darwin/<version>
如何获得每个组件?
AppName 和版本 -从Info.plist
let infoPlist = try? PListFile<InfoPlist>()
let appName = infoPlist.data.bundleName
let version = infoPlist.data.versionNumber
let build = infoPlist.data.buildNumber
Run Code Online (Sandbox Code Playgroud)设备信息
modelName- 你可以像这里描述的那样获得
let modelName = UIDevice.current.modelName
Run Code Online (Sandbox Code Playgroud)
其他组件:
let platform = UIDevice.current.systemName
let operationSystemVersion = ProcessInfo.processInfo.operatingSystemVersionString
Run Code Online (Sandbox Code Playgroud)
CF网络版
static var cfNetworkVersion: String? {
guard
let bundle = Bundle(identifier: "com.apple.CFNetwork"),
let versionAny = bundle.infoDictionary?[kCFBundleVersionKey as String],
let version = versionAny as? String
else { return nil }
return version
}
Run Code Online (Sandbox Code Playgroud)达尔文版
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.release)
let darvinVersionString = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8,
value != 0 else {
return identifier
}
return identifier + String(UnicodeScalar(UInt8(value)))
}
Run Code Online (Sandbox Code Playgroud)结果:
MyApp/1.8.199 (iOS; iPhone XS; 版本 13.3 (Build 17C45)) CFNetwork/1121.2.1 Darvin/19.3.0
您实际上不需要发出请求才能获取用户代理。只需从以下委托方法返回 NO 并保留 user-Agent 标头:
\n\n-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType\nRun Code Online (Sandbox Code Playgroud)\n\n它可能看起来像这样:
\n\n-(BOOL)webView:(UIWebView *)webView\n shouldStartLoadWithRequest:(NSURLRequest *)request\n navigationType:(UIWebViewNavigationType)navigationType\n{ \n userAgent = [[request valueForHTTPHeaderField:@"User-Agent"] copy]; \n NSLog(@"user-agent: %@", userAgent);\n\n _webView.delegate = nil; \n [_webView release]; \n\n return NO; \n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
21688 次 |
| 最近记录: |