zoukankan      html  css  js  c++  java
  • Swift 自定义Useragent

    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)
        }()
    }
  • 相关阅读:
    phpcms后台进入地址(包含No permission resources错误)
    phpmyadmin上传大sql文件办法
    ubuntu彻底卸载mysql
    Hdoj 2602.Bone Collector 题解
    一篇看懂词向量
    Hdoj 1905.Pseudoprime numbers 题解
    The Python Challenge 谜题全解(持续更新)
    Hdoj 2289.Cup 题解
    Hdoj 2899.Strange fuction 题解
    Hdoj 2199.Can you solve this equation? 题解
  • 原文地址:https://www.cnblogs.com/madarax/p/9296973.html
Copyright © 2011-2022 走看看