SignalR IOS客户端,Web Socket传输无法从服务器调用该方法

我使用SignalR-ObjC Client在我的IOS应用程序和.Net服务器之间提供通信。

我可以连接longpulling并从自托管跨域服务器调用方法,没有任何错误。 但由于我的应用程序需求,我必须使用WebSocket。 我有一个Singleton Manager,如:

@implementation SignalRManager static int reconnectingTry; + (id)sharedManager { static SignalRManager *sharedHttpManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedHttpManager = [[self alloc] init]; sharedHttpManager.hubConnection = [SRHubConnection connectionWithURL:@"http://xxx:8080/signalr"]; sharedHttpManager.proxy = [sharedHttpManager.hubConnection createHubProxy:@"myhub"]; }); return sharedHttpManager; } +(SRHubProxy *)proxy { return [[SignalRManager sharedManager] proxy]; } +(SRHubConnection *)connection { return [[SignalRManager sharedManager] hubConnection]; } +(void)start { SRWebSocketTransport *transport = [[SRWebSocketTransport alloc] init]; [[SignalRManager connection] start:transport]; } +(void)stop { [[SignalRManager connection] stop]; } 

和我调用像:

  [[SignalRManager proxy] invoke:@"Hello" withArgs:[NSArray array]]; 

我建立连接,服务器可以调用客户端方法,但是当我尝试从客户端到服务器的调用方法时,会发生“请求失败:错误请求(400)”错误。

似乎是SRWebSocketTransport中的协议(SRClientTransportInterface)实现的问题。

实际上是:

 - (void)send:(id )connection data:(NSString *)data completionHandler:(void (^)(id response, NSError *error))block; 

而且必须是

 - (void)send:(id )connection data:(NSString *)data connectionData:(NSString *)connectionData completionHandler:(void (^)(id response, NSError *error))block; 

像子类一样没有实现调用超类(SRHttpBasedTransport)方法,因此你得到“请求失败:错误请求(400)”(是另一个http请求,而不是websocket)。

要解决此问题,只需在Pods项目中打开文件SRWebSocketTransport.m并更改实现,如下所示:

 - (void)send:(id)connection data:(NSString *)data connectionData:(NSString *)connectionData completionHandler:(void (^)(id response, NSError *error))block { [_webSocket send:data]; if(block) { block(nil,nil); } } 

希望这有帮助。

pd:只是检查github似乎在feature-2.0.0.beta1分支中得到修复