oc连接signalr,各种填坑

在网上搜了signalr的oc客户端,基本上都指向同一个东西https://github.com/DyKnow/SignalR-ObjC

但是这个也有日子没更新了,用cocoapods安装下来是编译不过的。

在issue里有人说,需要吧pods的引用改为

platform :ios, '7.0'
pod 'AFNetworking', '1.3.3'
pod 'SignalR-ObjC'

指定AFNetworking的版本为1.3.3,安装下来编译通过。

不要高兴的太早。

按照简单的建立hub的方式连接服务器。

   1: //Client
   2: #import "SignalR.h"
   3:  
   4: // Connect to the service
   5: SRHubConnection *hubConnection = [SRHubConnection connectionWithURL:@"http://localhost/mysite"];
   6: // Create a proxy to the chat service
   7: SRHubProxy *chat = [hubConnection createHubProxy:@"chat"];
   8: [chat on:@"addMessage" perform:self selector:@selector(addMessage:)];
   9: // Start the connection
  10: [hubConnection start];
  11:  
  12: - (void)addMessage:(NSString *)message {
  13:     // Print the message when it comes in
  14:     NSLog(message);
  15: }

会出现时好时坏的现象。经过一翻调试和跟踪,是他源码中的问题。

signalr的流程是,先发送negotiate请求,获取token,然后发送start,附带刚才收到的token,token是一个base64的字符串,里面可能有加好“+”,源码中未对加好做处理,导致+在start请求中发送,服务器接收到会转意成空格“ ”,结果就是token不匹配

找到源码中的 SRHttpBasedTransport.m文件,

其中的receiveQueryString方法

{B05EC24A-4416-4541-A289-605FDA9B8002}

修改其中的内容,把token中的+替换成%2b,等于是做一个urlencode

2

之后即可连接成功。

同理,发送的方法也需要处理

3

如果在连接时需要传递参数,客户端也提供了传一个NSDictionary的方式。但是一传参,就崩溃了。

首先是 SRConnection.m这个文件中

4

这个方法中,调用createQueryString,原本是[[self class] createQueryString]。当时我也不懂[self class]是什么意思,于是就把self class直接改成self了。一试果然不报错了。后来查了一些资料,大概是类似c#里的实例方法和静态方法的区别,oc里实例方法是-开头,静态方法是+开头。

image

而createQueryString是-开头的,所以,如果把-改成+,可能也是可以的。

虽然不报错了。但是连接是没成功的。又是跟踪调试,发现在发送请求是,路径是错的。

一个地方是SRHttpBasedTransport.m中

5

此方法中调用了getCustomQueryString方法,而该方法的实现是

image

于是最后拼接的url是http://…./negotiation&a=1&b=2&c=3…..;明显第一个不应该是&而应该是?

我并不清楚getCustomQueryString是否在其他地方被使用了,并且确实需要这样的字符串,所以是在调用的地方增加了处理

第二个地方是SRHubConnection.m

6

这里增加了一个判断,如果已经是signalr/结尾的了,就不继续增加signalr字符了。

因为在跟踪代码时,发现signalr请求的地址,有时候会变成http://…/signalr/signalr/ 重复了好几次,但是没有看明白外层的逻辑是那里有问题。所以直接在这里进行判断。

经过以上几个地方的修改。连接成功了。

但是是否还有其他的bug,还需要进一步测试

原文地址:https://www.cnblogs.com/czcz1024/p/4538010.html