我是怎么开始接触它的?
公司前两天要做个项目类似于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"]
}
复制代码