[英]SignalR IOS Client, Web Socket transport cannot invoke the method from server
我使用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 <SRConnectionInterface>)connection data:(NSString *)data completionHandler:(void (^)(id response, NSError *error))block;
而且必须是
- (void)send:(id <SRConnectionInterface>)connection data:(NSString *)data connectionData:(NSString *)connectionData completionHandler:(void (^)(id response, NSError *error))block;
像子类一样,没有那个实现调用超类(SRHttpBasedTransport)方法,因此你得到“请求失败:错误请求(400)”(是另一个http请求,而不是websocket)。
要解决此问题,只需在Pods项目中打开文件SRWebSocketTransport.m并更改实现,如下所示:
- (void)send:(id<SRConnectionInterface>)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分支中得到修复
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.