【发布时间】:2022-06-16 15:46:47
【问题描述】:
我必须在 Swift 或 Obj-C 中为 iOS 应用程序创建一个简单的 Web 服务器。
事实上,它必须是最简单的网络服务器,因为它只需要创建一个套接字或其他任何东西来监听网页请求。
然后它必须在请求到来时提供 HTML 字符串。
仅此而已,不需要来自真实网络服务器的其他功能。
它必须只响应单一类型的请求
localhost:port/page_number.html
或使用不同的别名,例如
alias/page_number.html
有可能吗?
我阅读了 Mac OS 的示例,源代码非常短,但我也发现了 iOS 的示例,源代码文件很多,而且它们一点都不简单。
Mac OS 示例利用了 Darwin 库。也许它非常强大,只需几条指令就可以构建一个简单的 Web 服务器。
来自Tiny http server engine written in Swift programming language
代码如下:
import Darwin.C
let zero = Int8(0)
let transportLayerType = SOCK_STREAM // TCP
let internetLayerProtocol = AF_INET // IPv4
let sock = socket(internetLayerProtocol, Int32(transportLayerType), 0)
let portNumber = UInt16(4000)
let socklen = UInt8(socklen_t(MemoryLayout<sockaddr_in>.size))
var serveraddr = sockaddr_in()
serveraddr.sin_family = sa_family_t(AF_INET)
serveraddr.sin_port = in_port_t((portNumber << 8) + (portNumber >> 8))
serveraddr.sin_addr = in_addr(s_addr: in_addr_t(0))
serveraddr.sin_zero = (zero, zero, zero, zero, zero, zero, zero, zero)
withUnsafePointer(to: &serveraddr) { sockaddrInPtr in
let sockaddrPtr = UnsafeRawPointer(sockaddrInPtr).assumingMemoryBound(to: sockaddr.self)
bind(sock, sockaddrPtr, socklen_t(socklen))
}
listen(sock, 5)
print("Server listening on port \(portNumber)")
repeat {
let client = accept(sock, nil, nil)
let html = "<!DOCTYPE html><html><body style='text-align:center;'><h1>Hello from <a href='https://swift.org'>Swift</a> Web Server.</h1></body></html>"
let httpResponse: String = """
HTTP/1.1 200 OK
server: simple-swift-server
content-length: \(html.count)
\(html)
"""
httpResponse.withCString { bytes in
send(client, bytes, Int(strlen(bytes)), 0)
close(client)
}
} while sock > -1
但我知道 iOS 也很先进,所以也许有一个非常紧凑的代码可以在 iOS 上创建 Web 服务器的最小功能。
【问题讨论】:
-
这个问题的范围是什么(你打算提交到商店的iOS应用程序,或者企业应用程序,或者测试,或者一些应用程序间的通信)?这个“服务单页”服务器的最终目标是什么?例如,如果你只想显示一个页面,你可以简单地使用 WKWebView 或 Safari。
-
@thiscommunityistoxic 目的是在 Safari 中打开该页面,而不是 WKWebView。我知道这很奇怪。我会在苹果开发者论坛中询问是否允许,但首先我想知道它在技术上是否可行。 WKWebView 存在差异,需要对某些方面进行复杂的处理。
-
在这种情况下可能只是导入 GCDWebServer (github.com/swisspol/GCDWebServer),或者将其用作原型,至少它是为 iOS 编写的,而不是为 Mac 编写的
标签: html ios swift sockets webserver