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的扩展和伸缩 通 ...
随机推荐
- 也学习Java/JVM/GC(四)
GC日志分析 程序代码: public class JvmTest { public static void main(String[] args) { int m = 1024 * 1024; by ...
- js 经典正则判断 一个字符串是否包含另一个字符串
if (!new RegExp(list_table[i].value.split("—")[0]).test(lhtj)) { }判断在lhtj中是否包含list_table[i ...
- Eclipse配置PHP及自动提示功能
Eclipse是一个开发工具,具有强大的插件功能,虽然用于Java理所当然,但为PHP所用,也为尝不可.虽然我一直用的是notepad,但发现开发工具也可以省去一些不必要的记忆. 言归正传,下面就来实 ...
- Mac 识别NTFS移动硬盘
下载工具 TUXERA NTFS 2014
- android wifi ANR问题分析总结
android wifi ANR问题分析总结 1 看看main进程阻塞在那里? 2 调用关系的函数阻塞在那里? 3 最终阻塞函数的阻塞前的log以及状态
- java jdb命令详解
jdb - Java debugger 功能描述: 通过简单的命令行程序,对本地或远程jvm进程进行调试. 开启jdb会话: 有多种方式可以开启jdb会话. (1)常见的方式是采用Jdb命令打开一个新 ...
- input只读属性区别
readonly disabled 相同点:都是禁止输入 不同点:readonly属性会把该input提交到form表单 disabled属性不会把该input提交到form表单
- Caused by: java.lang.UnsatisfiedLinkError...解决经历
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load BaiduMapVOS_v2_1_3: findLibrary returned nu ...
- Java多线程18:线程池
使用线程池与不使用线程池的差别 先来看一下使用线程池与不适应线程池的差别,第一段代码是使用线程池的: public static void main(String[] args) { long sta ...
- Html做三个平台原生APP啦
DeviceOne之前介绍过了,现在来介绍一下DeviceOne快速开发到什么程度 使用js只需要5分钟就可以打出垮Android.ios.windows三大平台的纯原生UI的安装包. 只需要6个小时 ...