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方法
修改其中的内容,把token中的+替换成%2b,等于是做一个urlencode
之后即可连接成功。
同理,发送的方法也需要处理
如果在连接时需要传递参数,客户端也提供了传一个NSDictionary的方式。但是一传参,就崩溃了。
首先是 SRConnection.m这个文件中
这个方法中,调用createQueryString,原本是[[self class] createQueryString]。当时我也不懂[self class]是什么意思,于是就把self class直接改成self了。一试果然不报错了。后来查了一些资料,大概是类似c#里的实例方法和静态方法的区别,oc里实例方法是-开头,静态方法是+开头。
而createQueryString是-开头的,所以,如果把-改成+,可能也是可以的。
虽然不报错了。但是连接是没成功的。又是跟踪调试,发现在发送请求是,路径是错的。
一个地方是SRHttpBasedTransport.m中
此方法中调用了getCustomQueryString方法,而该方法的实现是
于是最后拼接的url是http://…./negotiation&a=1&b=2&c=3…..;明显第一个不应该是&而应该是?
我并不清楚getCustomQueryString是否在其他地方被使用了,并且确实需要这样的字符串,所以是在调用的地方增加了处理
第二个地方是SRHubConnection.m
这里增加了一个判断,如果已经是signalr/结尾的了,就不继续增加signalr字符了。
因为在跟踪代码时,发现signalr请求的地址,有时候会变成http://…/signalr/signalr/ 重复了好几次,但是没有看明白外层的逻辑是那里有问题。所以直接在这里进行判断。
经过以上几个地方的修改。连接成功了。
但是是否还有其他的bug,还需要进一步测试