zoukankan      html  css  js  c++  java
  • 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,还需要进一步测试

  • 相关阅读:
    异常处理的设计和重构学习一
    设计模式之禅之六大设计原则-里氏替换原则
    设计模式之禅之六大设计原则-单一职责原则
    swagger-ui生成api文档并进行测试
    功能强大的swagger-editor的介绍与使用
    swagger-codegen自动生成代码工具的介绍与使用
    Swagger使用教程大全,从入门到精通
    Linux下MySQL的数据文件存放位置
    JUC组件扩展(三):BlockingQueue(阻塞队列)详解
    http_load的安装及使用方法
  • 原文地址:https://www.cnblogs.com/czcz1024/p/4538010.html
Copyright © 2011-2022 走看看