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

2018-11-19  本文已影响20人  青苹果园

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

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

brew install node  # 需要先安装node环境    
npm install -g ios-deploy    # 安装 ios-deploy 

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

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)
        }
    }

// 持续更新中...

上一篇下一篇

猜你喜欢

热点阅读