如何在iOS上获取用户代理?

Dav*_*vid 12 iphone ios

iOS上是否有办法获取设备的用户代理?我不想硬编码,因为我需要所有设备的用户代理,我需要将用户代理附加到URL.

谢谢.

小智 39

在iOS中确定用户代理的一种更简单的方法是直接从UIWebView使用此SO帖子的接受答案中获取它.引用这个答案:

解决方案是创建一个UIWebView,然后使用javascript来提取用户代理.

UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString* secretAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
Run Code Online (Sandbox Code Playgroud)


gbk*_*gbk 8

每个请求中的移动应用程序都必须发送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>

如何获得每个组件?

  1. 标题键 - 你可以硬编码或使用一些常量值
  2. 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)
  3. 设备信息

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)
  1. 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)

从这里

  1. 达尔文版

     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


aim*_*ess 6

您实际上不需要发出请求才能获取用户代理。只需从以下委托方法返回 NO 并保留 user-Agent 标头:

\n\n
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n