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

3
我将使用SignalR-ObjC客户端在我的IOS应用程序和.Net服务器之间提供通信。
我可以连接长轮询,从自托管跨域服务器调用方法而不出现任何错误。但是由于我的应用程序需要,我必须使用WebSocket。我有一个类似单例管理器的东西:
@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)”错误。

1个回答

3

在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分支中修复了。

太好了!这解决了我的问题。非常感谢你! - Cihan Acar
1
@dolcalmi 太棒了!我在这上面浪费了几个小时,谢谢!顺便问一下,为什么我们不把这个加入到SignalR-ObjC基础代码中呢? - kernix
我该如何使用Pods导入Feature-2.0.0.beta1? - EK_AllDay
那个传输方式在某些带有8.x客户端的WiFi网络上似乎比长轮询要不稳定得多 :-( 我不得不回退到长轮询 :-[ - Anton Tropashko
@dolcalmi 我无法从SignalR服务器获取数据,请检查此链接:http://stackoverflow.com/questions/32477837/unable-to-receiving-data-from-signalr-server-in-ios - Goutham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接