CocoaHttpServer使用

我是怎么开始接触它的?

公司前两天要做个项目类似于PP红包App Store应用刷榜项目,需求是用户在safari中操作,并且支持一下几点功能:

  1. 判断设备是否安装某app
  2. 如果安装启动app
  3. 获取到设备和网络信息
  4. ...

很遗憾这些功能前端都做不了,只能我开发一个助手,帮助他完成以上功能。 大致的实现思路就是,我把功能开发好,在app启动时开启http服务,他在safari中调用127.0.0.1:端口号/功能,这种请求,由我来执行相应的操作。 说明:以上的1、2两点都是通过bundle id处理,而非URL Scheme

学习它能做啥?

  1. app开服务供本地的其他项目访问(例如:safari)
  2. 局域网内传文件
  3. ...

怎么用?

  1. 下载CocoaHTTPServer

  2. 导入CocoaHTTPServer-master目录下的Core、Vendor文件夹

  3. 编辑如下代码:

    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("开启失败")
    }
    复制代码

    现在是可以访问了,那么怎么处理请求呢?

处理本地请求

  1. 创建HTTPConnection子类

  2. 在子类中实现如下方法

    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"]
}
复制代码

转载于:https://juejin.im/post/5bea749e51882546605d2b30

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值