Swift 自定义Useragent

摘要:
Swift自定义Useragent背景最近在接阿里云的WAF,防火墙会拦截某些请求。被拦截的请求是看不到Headers信息的,只能看到Useragent,所以,应后台需求,自定义Useragent,这样可以更方便从服务器日志定位问题。准备当前项目中使用的是Alamofire进行网络请求。通过查看源码发现,默认的SessionManager是初始化完成的,不能修改。openstaticlet`default`:SessionManager={letconfiguration=URLSessionConfiguration.defaultconfiguration.httpAdditionalHeaders=SessionManager.defaultHTTPHeadersreturnSessionManager}()默认SessionManager的Useragent也是不可修改的,如下:openstaticletdefaultHTTPHeaders:HTTPHeaders={letacceptEncoding:String="gzip;q=1.0,compress;q=0.5"letacceptLanguage=Locale.preferredLanguages.prefix.enumerated().map{index,languageCodeinletquality=1.0-return";q="}.joinedletuserAgent:String={ifletinfo=Bundle.main.infoDictionary{letexecutable=info[kCFBundleExecutableKeyasString]as?"Unknown"letosNameVersion:String={letversion=ProcessInfo.processInfo.operatingSystemVersionletversionString=".."letosName:String={#ifosreturn"iOS"#elseifosreturn"watchOS"#elseifosreturn"tvOS"#elseifosreturn"OSX"#elseifosreturn"Linux"#elsereturn"Unknown"#endif}()return""}()letalamofireVersion:String={guardletafInfo=Bundle.infoDictionary,letbuild=afInfo["CFBundleShortVersionString"]else{return"Unknown"}return"Alamofire/"}()return"/"}return"Alamofire"}()return["Accept-Encoding":acceptEncoding,"Accept-Language":acceptLanguage,"User-Agent":userAgent]}()但是可以通过自定义的方法重新初始化一个SessionManager。
Swift 自定义Useragent

背景

最近在接阿里云的WAF,防火墙会拦截某些请求。被拦截的请求是看不到Headers信息的,只能看到Useragent,所以,应后台需求,自定义Useragent,这样可以更方便从服务器日志定位问题。

准备

当前项目中使用的是Alamofire进行网络请求。 通过查看源码发现,默认的SessionManager是初始化完成的,不能修改。

open static let `default`: SessionManager = {
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
    return SessionManager(configuration: configuration)
}()

默认SessionManager 的Useragent也是不可修改的,如下:

open static let defaultHTTPHeaders: HTTPHeaders = {
    let acceptEncoding: String = "gzip;q=1.0, compress;q=0.5"
    let acceptLanguage = Locale.preferredLanguages.prefix(6).enumerated().map { index, languageCode in
        let quality = 1.0 - (Double(index) * 0.1)
        return "(languageCode);q=(quality)"
    }.joined(separator: ", ")
    let userAgent: String = {
        if let info = Bundle.main.infoDictionary {
            let executable = info[kCFBundleExecutableKey as String] as? String ?? "Unknown"
            let bundle = info[kCFBundleIdentifierKey as String] as? String ?? "Unknown"
            let appVersion = info["CFBundleShortVersionString"] as? String ?? "Unknown"
            let appBuild = info[kCFBundleVersionKey as String] as? String ?? "Unknown"
            let osNameVersion: String = {
                let version = ProcessInfo.processInfo.operatingSystemVersion
                let versionString = "(version.majorVersion).(version.minorVersion).(version.patchVersion)"
                let osName: String = {
                    #if os(iOS)
                        return "iOS"
                    #elseif os(watchOS)
                        return "watchOS"
                    #elseif os(tvOS)
                        return "tvOS"
                    #elseif os(macOS)
                        return "OS X"
                    #elseif os(Linux)
                        return "Linux"
                    #else
                        return "Unknown"
                    #endif
                }()
                return "(osName) (versionString)"
            }()
            let alamofireVersion: String = {
                guard
                    let afInfo = Bundle(for: SessionManager.self).infoDictionary,
                    let build = afInfo["CFBundleShortVersionString"]
                else { return "Unknown" }
                return "Alamofire/(build)"
            }()
            return "(executable)/(appVersion) ((bundle); build:(appBuild); (osNameVersion)) (alamofireVersion)"
        }
        return "Alamofire"
    }()
    return [
        "Accept-Encoding": acceptEncoding,
        "Accept-Language": acceptLanguage,
        "User-Agent": userAgent
    ]
}()

但是可以通过自定义的方法重新初始化一个SessionManager。

  public init(
    configuration: URLSessionConfiguration = URLSessionConfiguration.default,
    delegate: SessionDelegate = SessionDelegate(),
    serverTrustPolicyManager: ServerTrustPolicyManager? = nil)
{
    self.delegate = delegate
    self.session = URLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
    commonInit(serverTrustPolicyManager: serverTrustPolicyManager)
}

下面是我的初始化方法:

class  MYSessionManager {
open static let `default`: SessionManager = {
    let bhUserAgent = "device:xx;version:xx;bundleId:xx;"
    var bhHttpHeaders = SessionManager.defaultHTTPHeaders
    bhHttpHeaders["User-Agent"] = bhUserAgent
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = bhHttpHeaders
    return SessionManager(configuration: configuration)
    }()
}

免责声明:文章转载自《Swift 自定义Useragent》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HDFS缓存机制基于Web Service的客户端框架搭建一:C#使用Http Post方式传递Json数据字符串调用Web Service下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

android spinner学习

   用法 1 :以资源方式,静态展示 Spinner 选项 1.     在资源文件 (strings.xml) 中,增加:          < string name = "spin_prompt" > 请选择城市 </ string >          < string-array name = "cities" &...

RocketMQ(一)原理和实战!

一、RocketMQ的安装 1、文档 官方网站 http://rocketmq.apache.org GitHub https://github.com/apache/rocketmq 2、下载 wget https://mirror.bit.edu.cn/apache/rocketmq/4.7.0/rocketmq-all-4.7.0-bin-relea...

httpclient x-www-form-urlencoded

1. 使用Apache httpclient提交post请求 http工具方法(需指定编码, 否则出错,这里用的UTF-8) public static String postWithParamsForString(String url, List<NameValuePair> params){ HttpClient clie...

SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)

1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例。 使用技术:SpringBoot、mybatis、shiro、thymeleaf、pagehelper、Mapper插件、druid、dataTables、ztree、jQuery 开发工具:intellij idea 数据库:mysql、red...

C#发送邮件(使用SSL,587端口)

static readonly string smtpServer = System.Configuration.ConfigurationManager.AppSettings["SmtpServer"]; static readonly string userName = System.Configuration.Configurati...

angular写的一个导航栏

ts import { Component } from '@angular/core'; // 定义一个interface interface Menu{ title:string,link:string,id:string } @Component({ selector: 'app-root', templateUrl: './app.co...