我是怎么开始接触它的?
公司前两天要做个项目类似于PP红包App Store应用刷榜项目,需求是用户在safari中操作,并且支持一下几点功能:
- 判断设备是否安装某app
- 如果安装启动app
- 获取到设备和网络信息
- ...
很遗憾这些功能前端都做不了,只能我开发一个助手,帮助他完成以上功能。 大致的实现思路就是,我把功能开发好,在app启动时开启http服务,他在safari中调用127.0.0.1:端口号/功能
,这种请求,由我来执行相应的操作。 说明:以上的1、2两点都是通过bundle id
处理,而非URL Scheme
。
学习它能做啥?
- app开服务供本地的其他项目访问(例如:safari)
- 局域网内传文件
- ...
怎么用?
-
下载CocoaHTTPServer
-
导入CocoaHTTPServer-master目录下的Core、Vendor文件夹
-
编辑如下代码:
let localHttpServer = HTTPServer()
localHttpServer.setType("_http.tcp")
// 设置端口
localHttpServer.setPort(53246)
localHttpServer.setConnectionClass(HTTPConnection.classForCoder())
do {try localHttpServer.start()print("开启成功")print(localHttpServer.listeningPort())
} catch {printLog(error)print("开启失败")
}现在是可以访问了,那么怎么处理请求呢?
处理本地请求
-
创建HTTPConnection子类
-
在子类中实现如下方法
override func supportsMethod(_ method: String!, atPath path: String!) -> Bool {print("supportsMethod - method:\(method!) - path:\(path!)")return true
}override func expectsRequestBody(fromMethod method: String!, atPath path: String!) -> Bool {print("expectsRequestBody - method:\(method!) - path:\(path!)")return true
}override func httpResponse(forMethod method: String!, uri path: String!) -> (NSObjectProtocol & HTTPResponse)! {// 获取应用信息if path.hasPrefix("/getAppInfo") {do {let respDic = ["bundleIdentifier": Bundle.main.bundleIdentifier,"version": shortVersionString,"build": versionString,"appName": displayName] // 应用信息let respData = try JSONSerialization.data(withJSONObject: respDic, options: JSONSerialization.WritingOptions.init(rawValue: 0))return LYHTTPDataResponse(data: respData)} catch {}}return httpResponse(forMethod: method, uri: path)
}
注意:
如果访问时出现跨域问题,尝试添加如下代码:
override func httpHeaders() -> [AnyHashable : Any]! {return ["Content-type": "*","Access-Control-Allow-Origin": "*","Access-Control-Allow-Credentials": "true","Access-Control-Allow-Methods": "POST, GET, OPTIONS","Access-Control-Max-Age": "3600","Access-Control-Allow-Headers": "Origin, Referer, User-Agent, Accept"]
}