通常客户端和服务端的关系是:客户端发送请求,服务端响应请求,返回给客户端进行展示.这个过程中,客户端占据主动,服务端处在响应的位置,一去一回中消耗了前端大量的资源,而且会占用较长时间,用户体验就不太好.换一种方式,如果服务端能主动推动数据,客户端来响应数据,服务端承担主动的角色,这样就能解决上述的问题.微信消息,就是采用后一种思路来实现,其流畅通讯带来的舒适体验,相信是每一个聊天的人都能用心感觉.非常感谢腾讯团队,将实现方式Mars项目进行开源.更好的是,我们项目顺利集成Mars,实现所需效果.
初看Mars项目,里面的类多而杂,下面是使用过程中几个关键类关系的介绍:
NetWorkService类负责Mars的创建,并作为Mars回调类stn_callback的代理.由于Mars代理方法过多,为了隔离其代理方法,便于管理,增添了独立的代理类NetWorkEvent.
首先在AppDelegate中,对其进行初始化:
[NetworkService sharedInstance].delegate = [[NetworkEvent alloc] init];
[[NetworkService sharedInstance] setCallBack];
[[NetworkService sharedInstance] createMars];
[[NetworkService sharedInstance] setClientVersion:200];
[[NetworkService sharedInstance] setLongLinkAddress:[GXBHttpTools shareManager].marsHostUrl port:----];
[NetworkService sharedInstance].deviceToken=@"token";
[[NetworkService sharedInstance] setShortLinkPort:8080];
[[NetworkService sharedInstance] reportEvent_OnForeground:YES];
[[NetworkService sharedInstance] makesureLongLinkConnect];
[[NetworkStatus sharedInstance] Start:[NetworkService sharedInstance]];
其次在需要使用Mars的界面设置代理:
[[NetworkService sharedInstance] addPushObserver:self withCmdId:codes];
最后实现PushNotifyDelegate的代理方法
-(void)notifyPushMessage:(NSData*)pushData withCmdId:(int)cmdId;
当服务器响应变化时,就会自动向客户端推送,客户端进行变化的响应就行了.
Tips:由于长连接消耗资源,我们项目中采用的是,在当前页面,需要客户端先发送一次请求,然后才和服务端建立长连接.
进过测试,响应速度成倍提升,性能也十分稳定,欢迎使用的小伙伴提出疑问,共同交流.