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)
        }()
    }
  • 相关阅读:
    Java Web 开发必须掌握的三个技术:Token、Cookie、Session
    $.proxy和$.extend
    手机端和网页端使用同一后台时进行会话控制
    js中使用EL表达式总结
    Durandal入门
    RequireJs入门
    阿里云Prismplayer-Web播放器的使用
    Mac系统实现git命令自动补全
    Mac系统的终端显示git当前分支
    Gulp实现css、js、图片的压缩以及css、js文件的MD5命名
  • 原文地址:https://www.cnblogs.com/madarax/p/9296973.html
Copyright © 2011-2022 走看看