iOS tweak 集成CocoaAsyncSocket(建连、断开、重连、心跳、通用请求)【应用场景:微信机器人】

2021-03-08 12:00:38 浏览数 (2)

前言

  • 原文:

https://blog.csdn.net/z929118967/article/details/77053764

  • 应用场景:微信机器人
  • 从CSDN资源下载demo源码 https://download.csdn.net/download/u011018979/15136868

https://github.com/zhangkn/KNCocoaAsyncSocketDemo

  • iOS的tweak开发可以有两种发布方式

  1. 只能在越狱设备上安装的打包成deb格式的安装包
  2. 直接使用开发者自己的证书/企业证书直接将补丁打包成ipa,这样不需要越狱也是可以安装的,只是这种非越狱的限制比较大,通常只是用来给某个app打个补丁.

I 、知识储备

1.1 tweak


  • tweak是什么?

iOS越狱开发中,各种破解补丁的统称为Tweak 基本上,tweak都依赖于一个名叫cydia Substrate (以前名字也叫mobile Substrate)的动态库, Mobile Substrate是Cydia的作者Jay Freeman (@saurik)的作品,也叫Cydia Substrate,它的主要功能是hook某个App,修改代码比如替换其中方法的实现, Cydia上的tweak都是基于Mobile Substrate实现的.

  • tweak的实质就是ios平台的动态库。

IOS平台上有两种形势的动态库,dylib与framework。1、Framework这种开发者用的比较多, 2、而dylib这种就相对比较少一点,比如libsqlite.dylib,libz.dylib等。而tweak用的正是dylib这种形势的动态库。

代码语言:javascript复制
iPhone:~ root# cd /Library/MobileSubstrate/DynamicLibraries

我们可以在设备的/Library/MobileSubstrate/DynamicLibraries目录下查看手机上存在着的所有tweak。这个目录下除dylib外还存在着plist与bundle两种格式的文件,plist文件是用来标识该tweak的作用范围,而bundle是tweak所用到的资源文件。

  • those的安装

http://blog.csdn.net/z929118967/article/details/77051246

1.2 长连接

  • http请求:

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

  • 长连接

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

  • 短连接,并行连接,持久连接与长连接

https://blog.csdn.net/z929118967/article/details/86494386

II 、采用MonkeyDev 的logos Tweak模版 集成CocoaAsyncSocket

因为它支持使用CocoaPods,至于服务端的搭建可以采用Node.js。

2.1 读消息的设置

  • 默认读消息为timeout 可以设置10
代码语言:javascript复制
- (void)socketWriteData:(NSString *)data {
    // 开始写数据
    NSLog(@"socketWriteData:%@",data);
    
    NSData *requestData = [data dataUsingEncoding:NSUTF8StringEncoding];
    [self.socket writeData:requestData withTimeout:-1 tag:0];
//    [self socketBeginReadData];// 修改为连接建立之后  就立马监听
}

如果想要实时监听服务端的消息推送就可以修改为:连接一旦建立就开始读

代码语言:javascript复制
- (void)socket:(GCDAsyncSocket *)socket didConnectToHost:(NSString *)host port:(UInt16)port {

        [self.socketManager socketBeginReadData];// 修改为连接建立之后  就立马监听

}
  • 开始读数据
代码语言:javascript复制
/**
 开始读数据
 */
#pragma mark - ******** 设置读数据的timeout   连接建立之后就开始监听读取数据

- (void)socketBeginReadData {
    NSLog(@"socketBeginReadData");
    [self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 maxLength:0 tag:0];//考虑使用-1
}

2.2 业务逻辑的处理

代码语言:javascript复制
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {

// 根据服务端返回的消息类型,解析参数,处理任务
}

2.3 实现实时监听服务端的流的方法

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

2.4 区分服务端主动推送和服务端响应的方式

区分的两者方式如下:

  • 可以让服务端新增响应类型进行区分
  • app 端进行判断响应数据是否包含reqId,这个reqId 是只有app 主动发起的请求响应时才会存在

2.4.1 处理服务端的消息推送

代码语言:javascript复制

    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 异常断开连接处理

  • 失败重新连接

0 人点赞