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
- 第一次加载的时候, 把Cookies信息配置到请求头中;
- 配置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)
}
}
// 持续更新中...
网友评论