SwiftUI中的问题,Swift SignalR客户端WebSocket关闭,代码:1000

tp5buhyn  于 2022-11-11  发布在  Swift
关注(0)|答案(1)|浏览(222)

我一直在尝试将SignalR集成到我的SwiftUI项目中,WebSocket正在与协商响应连接建立连接,并在20秒内立即断开连接。
以下是日志:2022-06- 13 T05:17:28.192Z调试:HTTP连接初始化2022-06- 13 T05:17:28.201Z调试:集线器连接初始化2022-06- 13 T05:17:28.202Z信息:正在注册客户端集线器方法:“接收”2022-06- 13 T05:17:28.203Z信息:启动集线器连接2022-06- 13 T05:17:28.203Z信息:开始可重新连接的连接2022-06- 13 T05:17:28.203Z调试:正在尝试更改状态:“已断开连接”到:“首发调试”2022-06- 13 T05:17:28.206Z:正在将状态更改为:“启动”成功2022-06- 13 T05:17:28.206Z调试:启动或重新连接2022-06- 13 T05:17:28.206Z调试:HTTP连接初始化HTTP连接定义初始化2022-06- 13 T05:17:28.206Z信息:启动连接调试:正在尝试更改状态:“初始”更改为:“连接调试”2022-06- 13 T05:17:28.207Z:正在将状态更改为:“连接”成功2022-06- 13 T05:17:28.216Z调试:2022-06-13 10:47:29.208760+0530测试信号R [61887:5482369] [boringssl] boringssl_metrics_log_metrics_block_invoke(151)无法记录指标2022-06- 13 T05:17:29.497Z调试:协商完成,状态代码为OK 2022-06- 13 T05:17:29.497Z调试:协商响应:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:调试:收到协商响应2022-06- 13 T05:17:29.502Z信息:选定的WebSocket传输2022-06- 13 T05:17:29.503Z信息:正在启动WebSocket传输调试:2022-06-13 10:47:29.614492+0530测试信号R [61887:5482376] [boringssl] boringssl_metrics_log_metrics_block_invoke(151)无法记录指标2022-06- 13 T05:17:30.313Z信息:WebSocket开放时间:2022-06- 13 T05:17:45.383Z信息来源:WebSocket关闭。代码:1000,理由:2022-06- 13 T05:17:45.383Z调试:将运输标记为已关闭。
由于我们无法使swiftUI视图符合HubConnectionDelegate的回调。我正在创建一个类,它可以符合协议并启动集线器连接。下面是代码。

class SignalRController: UIViewController {
var hubConnection: HubConnection?
private var testSignalConnectionDelegate: HubConnectionDelegate?
override func viewDidLoad() {
}

func startSignalR() {
    guard let url = URL(string: "my_url_for_socket") else {
        return
    }
    self.testSignalConnectionDelegate = TestSignalConnectionDelegate(controller: self)
    self.hubConnection = HubConnectionBuilder(url: url)
        .withLogging(minLogLevel: .debug)
        .withHubConnectionDelegate(delegate: self.testSignalConnectionDelegate!)
        .withAutoReconnect()
        .build()
    self.hubConnection?.on(method: "Receive") { (message: String, _ : String) in
        if !message.isEmpty {
        }
    }
    self.hubConnection?.start()
}
}

class TestSignalConnectionDelegate: HubConnectionDelegate {

weak var controller: UIViewController?

init(controller: SignalRController) {
    self.controller = controller
}

func connectionDidOpen(hubConnection: HubConnection) {
    print("connection succeeded")
}

func connectionDidFailToOpen(error: Error) {
    print("connection failed")
}

func connectionDidClose(error: Error?) {
    print("connection closed")
}

func connectionWillReconnect(error: Error) {
    print("connection reconnection")
}

func connectionDidReconnect() {
    print("connection reconnected")
}
}

并在swiftUIview中的onAppear语句中调用该方法,如下所示。

struct ContentView: View {
var body: some View {
Text("Hello, world!")
.padding()
.onAppear {
let testSignalR = SignalRController()
testSignalR.startSignalR()
}
}
}

当相同的进程在UIKit中运行时,它的工作符合预期。请让我知道我是否遗漏了任何东西或我的任何错误。任何带有signalR的swiftUI示例也将是有帮助的。
等待答复。
此致,J.钱德拉塞卡·雷迪

sg3maiej

sg3maiej1#

好吧,我不能说UIViewController的用法是正确的(或者你以后想用什么),但是现在观察到的断开是因为你在堆栈上创建了控制器,所以它在从上下文退出时就被破坏了(并释放了所有相关的东西)。
为了解决这个问题,让它成为会员

struct ContentView: View {
  let testSignalR = SignalRController()   // << here !!

  var body: some View {
    Text("Hello, world!")
      .padding()
      .onAppear {
        testSignalR.startSignalR()
      }
  }
}

注意:考虑UIViewControllerRepresentable与控制器一起工作,因为真实的控制器呈现自己的视图。

相关问题