iOS tweak 集成CocoaAsyncSocket

简介: iOS tweak 集成CocoaAsyncSocket

前言

应用场景:app端集成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的安装

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
- (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

  • 建立连接
#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;
}
  • 处理消息提送任务

image.png

依赖的第三方库: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

目录
相关文章
|
2月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
152 0
|
3月前
|
iOS开发 Perl
IOS集成flutter_boost 3.0常见问题
IOS集成flutter_boost 3.0常见问题
70 0
|
5月前
|
人工智能 数据安全/隐私保护 iOS开发
苹果在WWDC24上宣布的所有内容:Apple Intelligence、集成ChatGPT的Siri、iOS 18
苹果在WWDC24上宣布的所有内容:Apple Intelligence、集成ChatGPT的Siri、iOS 18
|
5月前
|
机器学习/深度学习 定位技术 开发工具
必知的技术知识:ios个推推送集成
必知的技术知识:ios个推推送集成
101 0
|
6月前
|
安全 Android开发 iOS开发
构建未来:安卓与iOS的无缝集成技术探索
【5月更文挑战第20天】随着智能设备的普及和技术的不断进步,安卓和iOS两大操作系统之间的界限正在逐渐模糊。本文将深入探讨如何通过最新的API、框架和工具实现安卓与iOS应用的无缝集成,以及这一趋势对开发者和用户的潜在影响。我们将从技术可行性、安全性挑战、用户体验优化等角度出发,分析当前的发展状况,并展望未来可能的技术融合路径。
|
6月前
|
存储 监控 安全
打造高效移动办公环境:Android与iOS平台的集成策略
【5月更文挑战第15天】 在数字化时代,移动办公不再是一种奢望,而是日常工作的必需。随着智能手机和平板电脑的性能提升,Android与iOS设备已成为职场人士的重要工具。本文深入探讨了如何通过技术整合,提高两大移动平台在企业环境中的协同工作能力,重点分析了各自平台上的系统集成策略、安全性考虑以及跨平台协作工具的应用。通过对现有技术的剖析与案例研究,旨在为读者提供一套实用的移动办公解决方案。
|
6月前
|
机器学习/深度学习 PyTorch TensorFlow
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
182 0
|
iOS开发 开发者 Perl
使用mPaaS iOS通过Pod集成"mPaaS_TinyApp"时遇到了错误
使用mPaaS iOS通过Pod集成"mPaaS_TinyApp"时遇到了错误
141 2
|
小程序 JavaScript API
支付宝小程序集成mqtt兼容IOS和安卓
支付宝小程序集成mqtt兼容IOS和安卓
210 0
|
API 开发工具 iOS开发
一点就通,社交源码IOS客户端开发集成SDK
所谓SDK,全称是SoftwaredevelopmentKit,翻译成软件开发工具包。SDK用助开发某种软件,今天给大家简单讲解下如何在社交源码IOS客户端上开发集成 SDK。