美文网首页
iOS开发--开发相关的实用小技巧

iOS开发--开发相关的实用小技巧

作者: 青苹果园 | 来源:发表于2018-11-19 17:47 被阅读20次

    1. 蒲公英一步快速获取 iOS 设备的 UDID

    2. 如果Xcode版本和手机版本有代差,可以用个命令行的方式把包安装如手机,步骤如下:

    • (1) . 需要安装node环境,并安装ios-deploy插件;
    brew install node  # 需要先安装node环境    
    npm install -g ios-deploy    # 安装 ios-deploy 
    
    • (2) . Xcode先build好.app包(在项目的Products目录下);
    • (3) . 命令行中,执行ios-deploy < app 包路径>,回车即可。

    3. 使用SwiftLint进行代码规范检查

    4. Swift使用命名空间优雅的处理命名冲突问题,经典案例RxSwift,参考喵神的文章

    public struct NameSpace<T> {
        private let objc: T
        public init(_ objc: T) {
            self.objc = objc
        }
    }
    
    protocol NameSpaceProtocol {
        associatedtype CompatibleType
        static var ls: NameSpace<CompatibleType>.Type { get set }
        var ls: NameSpace<CompatibleType> { get set }
    }
    
    extension NameSpaceProtocol {
        public static var ls: NameSpace<Self>.Type {
            get {
                return NameSpace<Self>.self
            }
            set {
                // this enables using Reactive to "mutate" base type
            }
        }
        
        public var ls: NameSpace<Self> {
            get {
                return NameSpace.init(self)
            }
            set {
                // this enables using Reactive to "mutate" base object
            }
        }
    }
    
    import class Foundation.NSObject
    /// 凡是继承自NSObject都遵守NameSpaceProtocol代理
    extension NSObject: NameSpaceProtocol {}
    

    示例:

    // UIView
    ///  继承NSObjective类型的使用“:”
    extension NameSpace where T: UIView {
        /// 统一的加载xib方法
        static func loadNib() -> T {
            let nibName = String(describing: T.self)
            guard let view = Bundle.main.loadNibNamed(nibName, owner: nil, options: nil)?.first as? T else {
                fatalError("Can't load nib with name = \(nibName)")
            }
            return view
        }
    
        func log() {
          print(self)
        }
    }
    
    // String
    extension String: NameSpaceProtocol {}
    /// 非继承NSObjective类型的,使用“==”
    extension NameSpace where T == String {
        func log() {
            print(self)
        }
    }
    
    /// 使用:
    self.view.ls.log()
    "命名空间".ls.log()
    /*结果:
    NameSpace<UIView>(objc: <UIView: 0x7fb26670b340; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x60c000039ea0>>)
    NameSpace<String>(objc: "命名空间")
    */
    

    5. 使用 Fastlane match 管理 iOS 证书和 profile

    6. 配置UserAgent

    /// 设置 webView userAgent
        class func configWebViewUserAgent() {
            let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent") ?? ""
            let dict = ["UserAgent": "\(userAgent)[tuandai_loan_ios]"]
            UserDefaults.standard.register(defaults: dict)
            UserDefaults.standard.synchronize()
        }
    

    注意点:userAgent的配置必须在loadRequset方法请求之前配置,否则无效。

    7. WKWebView在相同的域名下配置Cookies

      1. 第一次加载的时候, 把Cookies信息配置到请求头中;
      1. 配置Cookies信息,加入webView的UserScript中。
    private let Domain = "www.baidu.com"
    
    override func loadRequest() {
            if var request = self.webViewRequest {
                // 如果设置了false, 那么发送的请求header中就不会自动加上cookie信息
                request.httpShouldHandleCookies = true
                
                let token = CKUserInfoManager.share.token
                let cookie = "cookie=\(token);path=/;domain=\(Domain)"
                
                // 配置请求头
                var cookieValue = cookie
                let cookies = HTTPCookieStorage.shared.cookies
                if let cookieArray: [HTTPCookie] = cookies {
                    for cookie in cookieArray {
                        cookieValue = cookieValue + "\(cookie.name)=\(cookie.value);"
                    }
                }
                request.addValue(cookieValue, forHTTPHeaderField: "cookie")
                
                // 配置configuration
                let tokenSource = "document.cookie = '\(cookie)'"
                let tokenUserScript = WKUserScript.init(source: tokenSource,
                                                        injectionTime: WKUserScriptInjectionTime.atDocumentStart,
                                                        forMainFrameOnly: false)
                webView.configuration.userContentController.addUserScript(tokenUserScript)
                
                // 加载网页
                webView.load(request)
            }
        }
    

    // 持续更新中...

    相关文章

      网友评论

          本文标题:iOS开发--开发相关的实用小技巧

          本文链接:https://www.haomeiwen.com/subject/apoatqtx.html