继续创造,加速生长!这是我参与「日新方案 10 月更文应战」的第26天,点击检查活动概况

前言

  1. 应用场景:app端集成CocoaAsyncSocket与服务端进行通讯,利用完成机器人功能。
  2. 即时通讯的大数据处理逻辑:多线程逐条处理,你也能够选用事务处理聊天记录大数据,但假如发生过错需求悉数回滚

创立NSBlockOperation 放到NSOperationQueue异步履行。

系统会自动将NSOperationQueue中的NSOperation取出,将取出的NSOperation封装的操作放到一个新的线程中履行。

  1. 注意事项:socket不引荐放在主行列
 [[GCDAsyncSocket alloc] initWithDelegate:delegate delegateQueue:dispatch_get_main_queue()];

引荐自定义一个串行行列。

iOS小技能: tweak 集成CocoaAsyncSocket(建连、断开、重连、心跳、通用请求)

I 常识储藏

1.1 tweak是什么?

tweak的本质便是ios渠道的动态库。IOS渠道上有两种局势的动态库,dylib与framework。Framework这种开发者用的比较多,而dylib这种就相对比较少一点,比方libsqlite.dylib,libz.dylib等。而tweak用的正是dylib这种局势的动态库。

越狱开发中,各种破解补丁的统称为Tweak。iOS tweak 基本上都依靠于cydia Substrate的动态库, Substrate是Cydia 作者Jay Freeman 的作品,它的主要功能是hook某个App修正代码,比方替换其中办法的完成;Cydia上的tweak都是依据Mobile Substrate完成的。

iPhone:~ root# cd /Library/MobileSubstrate/DynamicLibraries

咱们能够在设备的/Library/MobileSubstrate/DynamicLibraries目录下检查手机上存在着的一切tweak。这个目录下除dylib外还存在着plist与bundle两种格式的文件,plist文件是用来标识该tweak的作用规模,而bundle是tweak所用到的资源文件。

those的装置

blog.csdn.net/z929118967/…

1.2 长衔接

  • http恳求:

每次更新数据都要向对应的端口发送一次恳求,之后回来数据之后关闭衔接

  • 长衔接

客户端和服务器一直连着,当有数据更新的时分,服务器会直接发给客户端,不需求客户端自动恳求。(client 需求监听流的输入) ps:在这过程中,为了保证服务端和客户端一直是衔接状态,客户端会定时不间断的发送心跳数据到服务器,标明还衔接着,不然长期没有数据更新,会断开衔接,这样一直有心跳数据的时分,就会保证了衔接没有中止,至于心跳数据的内容,便是前端后端共同商议的,和恳求的数据是单独的。(通常选用nstimer)

  • 短衔接,并行衔接,耐久衔接与长衔接

blog.csdn.net/z929118967/…

II 选用MonkeyDev 的logos Tweak模版 集成CocoaAsyncSocket

由于它支撑运用CocoaPods,可选用Node.js搭建对应的服务端。

2.1 读音讯的设置

  • 默认读音讯为timeout 能够设置10
- (void)socketWriteData:(NSString *)data {
    // 开端写数据
    NSLog(@"socketWriteData:%@",data);
    NSData *requestData = [data dataUsingEncoding:NSUTF8StringEncoding];
    [self.socket writeData:requestData withTimeout:-1 tag:0];
//    [self socketBeginReadData];// 修正为衔接树立之后  就立马监听
}

假如想要实时监听服务端的音讯推送就能够修正为:衔接一旦树立就开端读

- (void)socket:(GCDAsyncSocket *)socket didConnectToHost:(NSString *)host port:(UInt16)port {
        [self.socketManager socketBeginReadData];// 修正为衔接树立之后  就立马监听
}
  • 开端读数据
/**
 开端读数据
 */
#pragma mark - ******** 设置读数据的timeout   衔接树立之后就开端监听读取数据
- (void)socketBeginReadData {
    NSLog(@"socketBeginReadData");
    [self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 maxLength:0 tag:0];//考虑运用-1
}

2.2 事务逻辑的处理

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
// 依据服务端回来的音讯类型,解析参数,处理使命
}

2.3 完成实时监听服务端的流的办法

一旦接受到数据 就敞开下一次的监听输入流:receive data -》socketBeginReadData

2.4 区分服务端自动推送和服务端呼应的方式

区分的两者方式如下:

  • 能够让服务端新增呼应类型进行区分
  • app 端进行判断呼应数据是否包括reqId,这个reqId 是只有app 自动建议的恳求呼应时才会存在

处理服务端的音讯推送


    GACRESPONSE_TYPE respType = [json[@"respType"] integerValue];
    if(respType == RESPONSE_TYPE_NOTIFY){//音讯告诉 服务端的自动告诉
        //直接发送告诉
        //   1、 RESPONSE_TYPE_NOTIFY 处理服务端自动推送的使命
        NSMutableDictionary * userInfo = [NSMutableDictionary dictionaryWithObject:json forKey:kRESPONSE_TYPENotificationjsonKey];//respType 传送json
        [[NSNotificationCenter defaultCenter] postNotificationName:kRESPONSE_TYPERESPONSE_TYPE_NOTIFYNotification object:self userInfo:userInfo];
    }else{
        //2、履行对应的block
        SocketDidReadBlock didReadBlock = self.requestsMap[requestID];
        //    if (errorCode != 0) {
        //
        //        jsonError = [[NSError alloc]initWithDomain:NSURLErrorDomain code:errorCode userInfo:nil];
        //    }
        if (didReadBlock) {
            didReadBlock(jsonError, json);
        }
    }
    [self.socketManager socketBeginReadData];// 修正为衔接树立之后  就立马监听

2.5 反常断开衔接处理

  • 失败从头衔接

#pragma mark - ******** 失败从头衔接
- (void)socketDidDisconnect:(GCDAsyncSocket *)socket withError:(NSError *)err {
  • 衔接失败的判断
- (void)socketWriteDataWithRequestType:(GACRequestType)type
                           requestBody:(nonnull NSDictionary *)body
                            completion:(nullable SocketDidReadBlock)callback {
    NSLog(@"socketWriteData:%@",body);
    if (self.socketManager.connectStatus == -1) {
        NSLog(@"socket 未连通");
  • 衔接成功的处理
- (void)socket:(GCDAsyncSocket *)socket didConnectToHost:(NSString *)host port:(UInt16)port {
    self.socketManager.connectStatus = 1;//此处的状态设置,提前到树立衔接的地方
   //此时将重连的时钟删除
    [self.socketManager invalidatereconnectTimer];

2.6 常见问题

问题:

GCDAsyncSocketCommunicationManager.m:41:1: Cannot synthesize weak property in file using manual reference counting

解决方案:修正项目装备为ARC编译环境

修正app LLVMXX -language-Object-C 支撑ARC

详细的顺序是:Y-Y-Y-NO

2.7 demo下载

  • 从CSDN资源下载demo源码 https://download.csdn.net/download/u011018979/15136868

github.com/zhangkn/KNC…

  • 树立衔接
#pragma mark - ******** CMessageMgr init
- (CMessageMgr *)init
{
    %log();
    CMessageMgr *ret = %orig;
    globalMessageMgr =ret;
    id fromUser = [%c(SettingUtil) getLocalUsrName:0];//假如微信没有登录的话,就获取不到
    if ( fromUser == nil/* condition */)
    {
        return ret ;
        /* code */
    }
    CContactMgr *contactMgr = [[objc_getClass("MMServiceCenter") defaultCenter] getService:objc_getClass("CContactMgr")];
    CContact *selfContact = [contactMgr getSelfContact];
    //NSLog(@" selfContact :%@", selfContact);//MMSessionInfo
    /**
     树立长衔接的时分,能够依据host的不同能够精准的推送对应的长衔接
     */
    _connectConfig = [[GACConnectConfig alloc] init];
    _connectConfig.channels = @"dkf";
    _connectConfig.currentChannel = @"dkf";
    _connectConfig.host = KconnectConfighost;
    _connectConfig.port = [KconnectConfigport intValue];
    _connectConfig.socketVersion = 5;
    // 为当时登录的微信ID
    _connectConfig.WeChatNum = fromUser;
    _connectConfig.token = @"f14c431d1a6efa9";
    _connectConfig.selfContact =selfContact;
    // 1.自定义装备衔接环境
    [[GCDAsyncSocketCommunicationManager sharedInstance] createSocketWithConfig:_connectConfig];
    // 注册告诉
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setupRESPONSE_TYPE:) name:kRESPONSE_TYPENotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setupRESPONSE_TYPENOTIFY:) name:kRESPONSE_TYPERESPONSE_TYPE_NOTIFYNotification object:nil];
    //
    return ret;
}
  • 处理音讯提送使命
    iOS小技能: tweak 集成CocoaAsyncSocket(建连、断开、重连、心跳、通用请求)

依靠的第三方库:CocoaAsyncSocket

platform :ios, '8.0'
inhibit_all_warnings!
#use_frameworks!
target 'wlentrust' do
   pod 'CocoaAsyncSocket'
   pod 'JSONModel', '1.1.0'
   pod 'AFNetworking', '3.0.4'
   pod 'XMLDictionary'
end

see also

更多内容请重视 #公号:iOS逆向,只为你出现有价值的信息,专心于移动端技术研究领域;

  • theos的开发者是大神DHowett,不过大从2015年开端,原作者不再更新,交给社区保护了
  • MokeyDev 的logos tweak工程运用注意事项