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,还需要进一步测试
oc连接signalr,各种填坑的更多相关文章
- iOS端IM开发从入门到填坑
让App聊起来 IM开发从入门到填坑Demo IM的实现方式 拿来主义,使用第三方IM服务 IM的第三方服务商国内有很多,底层协议基本上都是基于TCP的,类似有网易云信.环信.融云.极光IM.Le ...
- Android Tips – 填坑手册
出于: androidChina http://www.androidchina.net/3595.html 学习 Android 至今,大大小小的坑没少踩,庆幸的是,在强大的搜索引擎与无私奉献的 ...
- Node填坑教程——前言
Node是什么? Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物 ...
- 老司机实战Windows Server Docker:1 初体验之各种填坑
前言 Windows Server 2016正式版发布已经有近半年时间了,除了看到携程的同学分享了一些Windows Server Docker的实践经验,网上比较深入的资料,不管是中文或英文的,都还 ...
- 前端系列——jquery前端国际化解决方案“填坑日记”
前言:最近,新的平台还没有开发完成,原来的老项目又提出了新的需求:系统国际化.如果是前后端完全分离的开发模式,要做国际化,真的太简单了,有现成的解决方案,基于Node构建的时下热门的任何一种技术选型都 ...
- 纯Socket(BIO)长链接编程的常见的坑和填坑套路
本文章纯属个人经验总结,伪代码也是写文章的时候顺便白板编码的,可能有逻辑问题,请帮忙指正,谢谢. Internet(全球互联网)是无数台机器基于TCP/IP协议族相互通信产生的.TCP/IP协议族分了 ...
- 前端系列——jquery.i18n.properties前端国际化解决方案“填坑日记”
前言:最近,新的平台还没有开发完成,原来的老项目又提出了新的需求:系统国际化.如果是前后端完全分离的开发模式,要做国际化,真的太简单了,有现成的解决方案,基于Node构建的时下热门的任何一种技术选型都 ...
- F2eTest和uirecorder自动化测试环境部署填坑记录
坑1:尝试部署的时候只在opennode.bat里面填写了两个浏览器,测试通过后再增加其他浏览器,页面上一直不显示. 填坑:需要清空数据库里的`wd_browsers`和`wd_nodes`表,然后重 ...
- Kubernetes Fluentd+Elasticsearch+Kibana统一日志管理平台搭建的填坑指南
在初步完成Kubernetes集群架构的建立后,通过搭建一些监控组件,我们已经能够实现 图形化的监控每个node,pod的状态信息和资源情况 通过scale进行replicateSet的扩展和伸缩 通 ...
随机推荐
- PYTHON学习之路_PYTHON基础(4)
学习内容: 1.Python函数的基本语法 2.Python函数的返回值与变量 3.Python嵌套函数 4.Python递归函数及实例(二分查找) 5.Python匿名函数 6.Python内置方法 ...
- PL/SQL通过存储过程为相同数据添加序号
在Oracle数据库中存有一串数据(Ori_Seq),数据包含不等量重复: 为方便查看与管理,现希望添加一字段(New_Seq),在原有数据的末尾为其添加一串序号,相同数据序号从小到大排列,序号长度为 ...
- oracle表空间不足时的处理方法
由于数据文件路径下的空间不足或表空间不足时,需要更换或扩展或新增表空间时,以下简单介绍下几种处理方式(数据文件/opt/oracle/oradata/testdb.dbf,原大小为100M) 一.扩大 ...
- Java虚拟机1:什么是Java
前言 让我们来看一下Java的广告词,来自http://www.java.com/zh_CN/about/: 97%的企业桌面运行Java 美国有89%的桌面(或计算机)运行Java 全球有900万J ...
- Android获取View对应的Bitmap
我的应用里面有一个需求,将一个画面分享出去,这个画面底层是一个View,所以首先要把这个View转换成Bitmap,然后在分享这个bitmap即可.话不多说,直接上代码. 有个地方需要注意一下:就是/ ...
- 利用IFormattable接口自动参数化Sql语句
提要 string.Format("{0},{1}",a,b)的用法大家都不陌生了,在很多项目中都会发现很多sql语句存在这样拼接的问题,这种做法很多"懒"程序 ...
- 使用 PowerShell 自动登录Azure
PowerShell 是管理 Azure 的最好方式之一,通过使用 PowerShell 脚本可以把很多的工作自动化.比如对于 Azure 上的虚拟机,可以设置定时关机操作,并在适当的时间把它开机,这 ...
- .NetCore~Linux环境下部署
NetCore正式版已经出现有段时候了,Windows下使用vs2015开发.netCore应用程序,然后通过dotnet程序开启WEB服务,用着很像node.js,当然我们不会于只局限于window ...
- fildder 使用方法汇总
作为网络开发人员,怎能不使用一些抓包工具呢?fildder是个不错的选择. 不过,一般情况下,我们往往使用浏览器自带的控制台的[网络]选项就可以达到查看数据的通信情况了,当然,一些浏览器不容易捕捉的事 ...
- fir.im Weekly - 做一款 App 需要考虑什么
开发 App 是一个痛并快乐的旅程.工具越来越多,成本也越来越低,那么在开发之前需要考虑些什么?limboy 总结了一些经验和反思--做一个 App 前需要考虑的几件事,参考一下为你的 App 多留点 ...