GCDWebServer:使用真实时无法打开主页 iPhone
GCDWebServer: Unable to open home page when using real iPhone
我有一个旧应用程序使用 GCDWebServer 的 GCDWebUploader 将文件上传到应用程序中。并且我把实现代码复制到一个新的项目中。
问题:在这个新项目中,GCDWebServer的主页在iOS模拟器中可以打开,但在真实中无法连接iPhone。
环境:
Xcode 12.2,iOS 14
CocoaPods
这很奇怪,因为我已经有了一个可用的应用程序。所以我做了一些检查:
- 首先,旧应用程序可以运行。表示可以打开主页。
- 所有设备都在同一个wifi下。
- 尝试在浏览器中打开
http://192.168.1.5/
或 http://192.168.1.5:80
,safari 说“无法打开页面,因为服务器没有响应”,但是我可以在终端中 ping 192.168.1.5
成功。
- 重启我的 iPhone
- 比较info.plist两个项目
无结果!你们能否就我遗漏的内容提出建议,也许 Xcode 中的某些配置允许 HTTP 通信或启用某些功能?
控制台中的内容:
[DEBUG] Did open IPv4 listening socket 3
[DEBUG] Did open IPv6 listening socket 4
[INFO] GCDWebUploader started on port 80 and reachable at http://192.168.1.5/
Visit http://192.168.1.5/ in your web browser
代码:
import GCDWebServer
import Foundation
class MyWebUploader {
// move webuploader to outside of init func to fix app crash issue.
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
lazy var webUploader = GCDWebUploader(uploadDirectory: self.documentsPath)
func initWebUploader() -> String {
var ipAddress = String()
webUploader.start()
webUploader.allowedFileExtensions = ["mp3", "aac", "m4a", "wav"]
if webUploader.serverURL != nil {
// retrieve IP address from URL
let str = webUploader.serverURL!.absoluteString
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -1)
let range = start..<end
let mySubstring = str[range]
ipAddress = String(mySubstring)
print("Visit \(webUploader.serverURL!) in your web browser")
} else {
ipAddress = "No Wifi connected"
}
return ipAddress
}
func stopWebUploader() {
webUploader.stop()
}
}
此问题是由 iOS 14 to find and connect to devices on your local network
中的新权限引起的。
要修复它,我们需要在 info.plist
中添加以下信息
<key>NSLocalNetworkUsageDescription</key>
<string>Reason for using Bonjour that the user can understand</string>
<key>NSBonjourServices</key>
<array>
<string>_http._tcp</string>
<string>_http._udp</string>
</array>
详情请看
我有一个旧应用程序使用 GCDWebServer 的 GCDWebUploader 将文件上传到应用程序中。并且我把实现代码复制到一个新的项目中。
问题:在这个新项目中,GCDWebServer的主页在iOS模拟器中可以打开,但在真实中无法连接iPhone。
环境: Xcode 12.2,iOS 14 CocoaPods
这很奇怪,因为我已经有了一个可用的应用程序。所以我做了一些检查:
- 首先,旧应用程序可以运行。表示可以打开主页。
- 所有设备都在同一个wifi下。
- 尝试在浏览器中打开
http://192.168.1.5/
或http://192.168.1.5:80
,safari 说“无法打开页面,因为服务器没有响应”,但是我可以在终端中 ping192.168.1.5
成功。 - 重启我的 iPhone
- 比较info.plist两个项目
无结果!你们能否就我遗漏的内容提出建议,也许 Xcode 中的某些配置允许 HTTP 通信或启用某些功能?
控制台中的内容:
[DEBUG] Did open IPv4 listening socket 3
[DEBUG] Did open IPv6 listening socket 4
[INFO] GCDWebUploader started on port 80 and reachable at http://192.168.1.5/
Visit http://192.168.1.5/ in your web browser
代码:
import GCDWebServer
import Foundation
class MyWebUploader {
// move webuploader to outside of init func to fix app crash issue.
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
lazy var webUploader = GCDWebUploader(uploadDirectory: self.documentsPath)
func initWebUploader() -> String {
var ipAddress = String()
webUploader.start()
webUploader.allowedFileExtensions = ["mp3", "aac", "m4a", "wav"]
if webUploader.serverURL != nil {
// retrieve IP address from URL
let str = webUploader.serverURL!.absoluteString
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -1)
let range = start..<end
let mySubstring = str[range]
ipAddress = String(mySubstring)
print("Visit \(webUploader.serverURL!) in your web browser")
} else {
ipAddress = "No Wifi connected"
}
return ipAddress
}
func stopWebUploader() {
webUploader.stop()
}
}
此问题是由 iOS 14 to find and connect to devices on your local network
中的新权限引起的。
要修复它,我们需要在 info.plist
<key>NSLocalNetworkUsageDescription</key>
<string>Reason for using Bonjour that the user can understand</string>
<key>NSBonjourServices</key>
<array>
<string>_http._tcp</string>
<string>_http._udp</string>
</array>
详情请看