2016-12-19 7 views
1

Я пытаюсь реализовать SignalR с помощью SwiftR.connect - я следил за этим tutorial.Реализация SignalR с использованием Swift 3.0

Получение следующей ошибки.

Starting... 
Error: Optional(["message": Error during negotiation request.]) 
Disconnected. 

Мой исходный код

import UIKit 
import SwiftR 

class ViewController: UIViewController { 

    @IBOutlet weak var statusLabel: UILabel! 
    @IBOutlet weak var startButton: UIButton! 

    var chatHub: Hub! 
    var connection: SignalR! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     SwiftR.useWKWebView = true 

     SwiftR.signalRVersion = .v2_2_1 
     SwiftR.transport = .longPolling   

     connection = SwiftR.connect("http://192.168.X.XX/MyChatApplicationServer/signalr") { [weak self] connection in 

      self?.chatHub = connection.createHubProxy("MyChatHub") 
      self?.chatHub?.on("newMessageReceived") { args in 
       print("MyChatHub on call start") 

       let message = args![0] as! String 
       let detail = args![1] as! String 

       print("Message: \(message) \nDetail: \(detail)") 

      } 

      // SignalR events 
      connection.starting = { [weak self] in 
       self?.statusLabel.text = "Starting..." 
       self?.startButton.isEnabled = false 
       print("Starting....") 
      } 

      connection.reconnecting = { [weak self] in 
       self?.statusLabel.text = "Reconnecting..." 
       self?.startButton.isEnabled = false 
       print("Reconnecting....") 
      } 

      connection.connected = { [weak self] in 
       print("Connection ID: \(connection.connectionID!)") 
       self?.statusLabel.text = "Connected" 
       self?.startButton.isEnabled = true 
       self?.startButton.setTitle("Stop", for: .normal) 
       print("Connected") 
      } 

      connection.reconnected = { [weak self] in 
       self?.statusLabel.text = "Reconnected. Connection ID: \(connection.connectionID!)" 
       self?.startButton.isEnabled = true 
       self?.startButton.setTitle("Stop", for: .normal) 
       print("Stop") 
      } 

      connection.disconnected = { [weak self] in 
       self?.statusLabel.text = "Disconnected" 
       self?.startButton.isEnabled = true 
       self?.startButton.setTitle("Start", for: .normal) 
       print("Disconnected") 
      } 

      connection.connectionSlow = { print("Connection slow...") } 

      connection.error = { error in 
       print("Error: \(error)") 

       // Here's an example of how to automatically reconnect after a timeout. 
       // 
       // For example, on the device, if the app is in the background long enough 
       // for the SignalR connection to time out, you'll get disconnected/error 
       // notifications when the app becomes active again. 

       if let source = error?["source"] as? String, source == "TimeoutException" { 
        print("Connection timed out. Restarting...") 
        connection.start() 
       } 
      } 

      connection.start() 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func startStop(_ sender: Any) { 

     if let text = startButton.titleLabel?.text{ 
      print("text val: \(text)") 
      connection?.start() 
     }else{ 
      connection?.stop() 
     } 
    } 

} 

Примечание: 1) Я обновил SignalR Установка использованием стручок 'SwiftR' 2) В соответствии с урока я использую swift23 branch код 3) In pod SwiftR l ibrary следующий код не работает.

соединение = SigmalR ("http://192.168.X.XX/MyChatApplicationServer/signalr")

Получение следующее сообщение об ошибке.

"Cannot invoke initializer for type 'SignalR' with an argument list of type '(String)'" 

Если я следующий код главной ветви.

Пожалуйста, помогите мне с этим. Спасибо заранее.

+0

Подкачка (swift3), ветвь swift23 и главная ветвь (изменения API) - это все разные коды. Вам нужно будет выбрать одну версию библиотеки и придерживаться ее. Если WKWebView = false работает, но true - нет, значит, у вас, вероятно, нет CORS на вашем сервере SignalR. – Adam

ответ

0

Проверьте, есть ли у вас this issue?

Я советую подумать о ObjC implementation. Так как это просто стручок, ничего плохого с ним.

+0

Спасибо за ответ, но я получил решение, и теперь он работает отлично. –

0

Просто прокомментировал следующий код и он отлично работает. //SwiftR.useWKWebView = true

0

Этот вопрос уже обсуждался в GitHub. Проверьте здесь https://github.com/adamhartford/SwiftR/issues/75

Работает ли он с SwiftR.useWKWebView = false?

Если это так, убедитесь, что на вашем сервере включена CORS. CORS требуется для WKWebView для работы с SwiftR.