iOS开发
文章平均质量分 77
iOS的开发技术专题
CaicaiNo.1
这个作者很懒,什么都没留下…
展开
-
iOS开发-iOS如何本地调试JS
文章目录前言Charles代理HTTPS代理设置WKWebView的缓存机制本地映射html 资源请求远端映射映射到远端映射到本地服务器Safari的调试功能前言最近在排查问题时,遇到Html网页问题,总结下调试经验Charles代理HTTPS代理设置关于 charles 的 https 代理设置,这里简单说明下:打开 Charles,选择上侧菜单栏,选择 SSL Proxying ,安装证书到手机 Mobile Device根据弹框提示,打开网址下载证书,并信赖,然后配置wifi在同一网原创 2021-04-19 22:57:43 · 1463 阅读 · 0 评论 -
iOS开发-逆向注入SDK(三)MonkeyDev注入打包
文章目录MonkeyDev使用注入SDKMonkeyDev强大的工具集,MonkeyDev ,使用它行了!安装教程见 Wiki使用拿着之前通过 frida砸壳 的 ipa包,先创建一个 MonkeyDev 工程。这里以 qqmusic 为例将砸壳的 ipa 放到 qqmusic/TargetApp/ 下,然后拖拽至工程文件中。设置主工程的证书,dylib的不用设置提示 Showing All Messages Signing for "qqmusicDylib" requir原创 2021-03-23 11:06:39 · 2562 阅读 · 2 评论 -
iOS开发-逆向注入SDK(二)frida砸壳
文章目录下载app使用frida完成 iOS开发-逆向注入SDK之iOS越狱 之后 ,我们开始砸壳app下载app手机安装了 爱思极速版 后,我们可以不经过 appstore 下载,因为是砸壳,选择一些不需要登录的app为好,选择微信,登录后可能会被封号。使用fridafrida算是比较无脑的一个,简单,所以这里选择用它。下拉 frida-ios-dumpgit clone https://github.com/AloneMonkey/frida-ios-dump下拉仓库。cydia原创 2021-03-22 21:49:56 · 981 阅读 · 0 评论 -
iOS开发-逆向注入SDK(一)iOS越狱
越狱这里采用使用 iphone 5S, iOS 12.4.9 为例,进行 非完美越狱非完美越狱:重启手机越狱失效,需要再进行越狱,越狱也不麻烦,点几下就行了,不过不关机就行了哈i4助手安装 i4助手(爱思助手) https://www.i4.cn/ 是个很好的软件,如果你的手机变砖了,正好可以使用它刷机。不过被密码锁定的手机不行。如果你的iphone已经开机就黑,选择合适的固件版本,进行刷机这里对其功能不做进一步说明,低版本可以直接完美越狱,我们这里仅使用它来方便访问越狱文件以及安装a原创 2021-03-22 21:16:57 · 717 阅读 · 0 评论 -
iOS开发-NSThread子线程autoreleasepool的问题
前言对于 NSThread 开启的子线程,我们需要在 main 函数中创建一个autoreleasepool,当我们从其他线程跳转到该线程执行时,对象是如何释放的呢?主线程是由于runloop的循环,在beforeWait时,触发主线程的autoreleasepool的pop和push操作来释放的,而子线程并没有自动添加这些observer,那么如何释放的?探索跳转到我们线程执行任务的方法如下,使用了performSelector:系列的方法。OBJC_EXTERN void _objc_autor原创 2021-02-04 00:10:29 · 1364 阅读 · 1 评论 -
iOS - 关于对App跳转方法的hook
文章目录App的跳转方法hookApp的跳转方法实现app跳转有urlscheme以及universal Link(deep link) 跳转。url schemeapplication:openURL:options:是最新的方法,其他两个都废弃了- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>原创 2020-12-04 17:57:04 · 1069 阅读 · 0 评论 -
iOS开发-关于iOS13.4的UITextMultiTapRecognizer问题记录
UITextMultiTapRecognizer 在 iOS 13.4上,点击 UITextField 时,会由UITextMultiTapRecognizer 触发事件。通过 hook UIApplication的sendAction:to:from:forEvent:- (BOOL)growing_sendAction:(SEL)action to:(id)target from:(id)sender原创 2020-09-22 17:53:45 · 427 阅读 · 0 评论 -
iOS开发 - OCLint的自定义规则编写
文章目录通过Xcode显示Warning方案的选择简易Rule编写brew安装Aggregate 添加脚本规则编写通过Xcode显示Warning方案的选择前面已经说过如何添加自定义的规则rule以及Xcode调试:iOS开发 - OCLint自定义规则的编译与Xcode调试一般来说,我们都有这样的需求:想在写代码的时候,就能分析出代码问题,并及时进行修改。虽然OCLint能够分析单个文件,但没有Xcode插件,像 Analyze 这样的实时分析可能并不好实现,这里我们就选择编译一次然后在项目中提示原创 2020-07-20 17:40:52 · 1621 阅读 · 0 评论 -
iOS开发 - 创建自定义的brew仓库oclint-0.15
文章目录背景创建仓库brew create创建tap使用参考文档背景项目需要使用 oclint 0.15 版本,并添加一定的规则 rule ,这里oclint 0.13版本之后就没有再更新了,两个版本由于clang版本不同,不能共用,如果让每个人去拉包,然后替换,太繁琐了,这里创建一个brew库用于快速集成。在 Homebrew 的架构下,至少有 4 层概念Keg(酒桶):安装好的脚本、软件等;Cellar(酒窖):所有用 Homebrew 安装在本地的脚本、软件组成的集合;Formula(配原创 2020-07-16 13:00:42 · 565 阅读 · 0 评论 -
iOS开发 - NSUUID的重复概率问题
文章目录概述探索概述对于 [[NSUUID UUID] UUIDString] 产生的字符串有可能重复吗?概率是多少?code代码时是否需要考虑?探索根据 NSUUID的苹果官方说明 阐述:UUIDs (Universally Unique Identifiers), 也被称作 GUIDs (Globally Unique Identifiers) 或者 IIDs (Interface Identifiers), 是128位值. NSUUID创建的uuid符合RFC 4122 version 4,原创 2020-07-13 12:46:16 · 2664 阅读 · 0 评论 -
iOS开发 - NSHashTable与Runloop所造成的强引用问题
文章目录概述Runloop Observer的问题AutoreleasePool界面更新概述首先,我来描述一下这个问题,NSHashTable 是OC中用于弱引用对象的NSMutableSet 类型,在项目使用中,我们发现调用其 allObjects 方法会造成强引用关系,导致对象不会释放。具体情况如下:我们监听了主线程的 Runloop 并在 kCFRunLoopBeforeWaiting | kCFRunLoopExit 时触发,由于我们需要统计 UITableViewCell 的信息,所以我们将原创 2020-07-03 10:13:23 · 805 阅读 · 0 评论 -
iOS开发 - Runloop的mode是如何切换的
文章目录问题探索Runloop的mode是如何切换的mode切换时会退出吗?问题Runloop的mode是如何切换的?Runloop的mode切换时,上一个mode是需要退出吗?探索Runloop的mode是如何切换的UITableView滑动时,Runloop会进行切换mode,由kCFRunLoopDefaultMode切换为UITrackingRunLoopMode,根据源码,切换mode实际是调用CFRunLoopRunSpecific 这个函数SInt32 CFRunLoopRu原创 2020-07-01 15:12:13 · 1634 阅读 · 0 评论 -
iOS开发 - OCLint自定义规则的编译与Xcode调试
OCLint的编译基于版本 oclint version 0.15OCLint 需要自定义规则的话需要自己编译原创 2020-06-23 19:53:41 · 2023 阅读 · 0 评论 -
iOS开发-NSMapTable NSHashTable NSPointerArray的使用
文章目录NSMapTableNSDictionary的局限性NSMapTable优势配置参数 OptionsMemory OptionARC下MRC下Personality optionsUsage快捷生成自定义配置NSHashTableNSHashTable 优势配置参数UsageNSPointerArrayNSPointerArray 特性创建Usage对于工程中使用的弱引用集合的特性进行整理,有些点还是容易忘记NSMapTable NSHashTable NSPointerArray 是iOS中用原创 2020-06-18 15:18:16 · 2011 阅读 · 0 评论 -
iOS开发 - method swizzle方式的选择
文章目录1 method swizzle方式的选择1.1 错误的swizzle方式1.2 正确的swizzle方式1.3 案例1 method swizzle方式的选择1.1 错误的swizzle方式根据 right-way-to-swizzle 文章的阐述,当我们进行方法交换时,实质是交换了objc_method结构体中的IMP函数指针struct objc_method SEL method_name OBJC2_UNAVAILABLE; char *meth原创 2020-06-16 19:26:22 · 506 阅读 · 0 评论 -
RAC中宏的使用-预编译确定函数参数个数
RAC中宏的使用-预编译确定函数参数个数对于RAC框架中的宏定义,预编译期确认参数个数/** * Returns the number of arguments (up to twenty) provided to the macro. At * least one argument must be provided. * * Inspired by P99: http://p99.gforge.inria.fr */#define metamacro_argcount(...) \原创 2020-06-09 20:34:11 · 420 阅读 · 0 评论 -
iOS开发-Audio Unit错误之CrashIfClientProvidedBogusAudioBufferList
类似堆栈如下:* thread #10, name = 'AURemoteIO::IOThread', stop reason = EXC_BAD_ACCESS (code=1, address=0x201862df8) * frame #0: 0x00000002276974e4 AudioToolbox`CrashIfClientProvidedBogusAudioBufferList + 64 frame #1: 0x00000002277ed378 AudioToolbox`Audio原创 2020-05-17 12:52:20 · 1380 阅读 · 0 评论 -
iOS开发-NSObject的alloc函数执行
文章目录前言流程callAllocallocWithZone对流程的影响_class_createInstanceFromZone方法init和new前言探索下alloc的方法执行流程debug来调试runtime源码,执行以下逻辑:NSObject *objc1 = [[NSObject alloc] init];id __weak objc2 = objc1;id __weak objc3 = objc2;流程callAlloc调用 callAlloc// Calls [cls a原创 2020-05-10 16:58:38 · 408 阅读 · 0 评论 -
iOS开发-FBRetainCycleDetector中的深度优先搜索DFS
文章目录图有向图图的实现方式遍历广度优先搜索 BFS深度优先搜索 DFSFBRetainCycleDetector的应用最近复习 FBRetainCycleDetector 源码的时候,需要的图的查询方法,深度优先搜索,这里记录下,便于系统复习。这里仅仅为分析FBRetainCycleDetector实现原理,采用深度优先搜索DFS图图由顶点(vertex)和边(edge)组成,通常表示为...原创 2020-05-01 12:06:38 · 575 阅读 · 0 评论 -
iOS开发-MLeaksFinder原理学习
文章目录内存泄漏原理MLeaksFinder 是WeRead团队开源的iOS内存泄漏检测工具,用于检测内存泄漏内存泄漏app内存有3中Leaked memory: 应用程序未引用的内存不能再次使用或释放(也可以使用Leaks仪器检测到)Abandoned memory: 应用程序仍然引用的内存没有任何用处Cached memory: 仍然被应用程序引用的内存,可以再次使用以...原创 2020-05-01 10:15:57 · 1812 阅读 · 0 评论 -
iOS开发-GCD技术
GCD是iOS开发中常用的线程技术原创 2020-04-29 23:33:06 · 1023 阅读 · 0 评论 -
iOS开发-weak引用以及sidetable表
文章目录__weaksidetable对象的释放__weakid obj = [[NSObject alloc] init];@autoreleasepool { id __weak obj1 = obj; NSLog(@"%@",obj1);}括号内的代码编译器会转化为:id obj1;objc_initWeak(&obj1,obj);id tmp = objc_l...原创 2020-04-28 23:28:18 · 2430 阅读 · 0 评论 -
iOS开发-线程死锁
文章目录线程死锁互斥锁和自旋锁iOS的常见的锁线程死锁线程死锁的4个必要条件:互斥:一个资源每次只能被一个进程使用占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。进程和线程的...原创 2020-04-29 16:48:04 · 719 阅读 · 0 评论 -
iOS开发-class_ro_t和class_rw_t的区别
文章目录class_ro_tclass_rw_tclass_rw_t生成时机分类方法加载到class_rw_t的流程class_ro_tclass_ro_t存储了当前类在编译期就已经确定的属性、方法以及遵循的协议,里面是没有分类的方法的。那些运行时添加的方法将会存储在运行时生成的class_rw_t中。ro即表示read only,是无法进行修改的。struct class_ro_t {...原创 2020-04-27 23:26:57 · 5867 阅读 · 0 评论 -
iOS开发-一个 NSObject 对象占用多少内存空间
一个 NSObject 对象占用多少内存空间?在64位CPU中,NSObject 对象占用大小为16字节,其中8字节为指针大小,8字节为实例对象结构体所占大小。在32位CPU中,NSObject 对象占用大小为8字节,其中4字节为指针大小,4字节为实例对象结构体所占大小。可以参考唐巧的 深入理解Tagged Pointer故所以当4个字节就能表示的值,要用8个字节来存储时,就会很浪费内...原创 2020-04-27 20:52:31 · 1303 阅读 · 0 评论 -
日常学习-关于GSIMap结构
文章目录数据结构解析数据结构最近研究NSNotification源码碰上了一个GSIMap结构体,发现其结构很有意思,即* A rough picture is include below: * * * This is the map C - array of the buckets * +---------------+ ...原创 2020-04-27 00:31:25 · 437 阅读 · 0 评论 -
iOS开发-NSNotification源码原理学习
文章目录问题1. 实现原理对于addObserver方法,为什么需要object参数?都传入null对象会怎么样addObserver源码逻辑2.通知的发送时同步的,还是异步的3. NSNotificationCenter接受消息和发送消息是在一个线程里吗?如何异步发送消息4.NSNotificationQueue和runloop的关系5.如何保证通知接收的线程在主线程6.多次添加同一个通知会是...原创 2020-04-25 18:13:28 · 1261 阅读 · 3 评论 -
iOS开发-airpods的音频event适配
文章目录单耳机拿下iOS 7.1 BeforeMPRemoteCommandCenter双耳机取下对于airpods的适配,主要适配其单耳机拿下pause,以及恢复和双耳机取下等情景的适配。单耳机拿下对于这些事件,airpods单耳机拿下属于pause事件Event,我们使用MediaPlayer框架。iOS 7.1 Before在iOS 7.1之前,系统提供了#import <...原创 2020-04-21 16:11:47 · 1409 阅读 · 1 评论 -
iOS开发-对多个对象进行消息转发
文章目录目的实现目的参考NSProxy的实现,那么我们需要通过对多个消息的转发如何做呢?如何存储对象,强引用集合对象已经不可取,会使得对象引用计数+1,所以可以采用OC中弱引用集合 NSPointerArray参考以下文章:http://www.isaced.com/post-235.htmlhttps://www.jianshu.com/p/9d1c34999f3e通过消...原创 2020-04-19 00:46:24 · 440 阅读 · 0 评论 -
iOS开发-KVO下的isa-swizzling
文章目录前言探索1. 引用问题2. KVO原理前言对于KVO技术,开发中使用较多,能够监听值的改变。探讨下KVO的技术实现,KVO接口如下:@interface NSObject(NSKeyValueObserverRegistration)/* Register or deregister as an observer of the value at a key path relat...原创 2020-04-18 15:48:54 · 384 阅读 · 0 评论 -
iOS开发-isKindOfClass和isMemberOfClass
文章目录前言源码前言isKindOfClass和isMemberOfClass多多少少都用过isKindOfClass 方法调用者是传入的类的实例对象,或者调用者是传入类的继承者链中的类的实例对象,则返回YES。isMemberOfClass:returns YES if the receiver is an instance of the specified class.方法调用者...原创 2020-04-18 12:25:17 · 349 阅读 · 0 评论 -
iOS开发-关于+load和+initialize
文章目录执行时机loadinitializemethod swizzle最近面试遇到这样的问题,一般来说我们会在+load和+initialize进行method swizzle,那么两个方法差异在哪里执行时机load+load方法是在main函数之前被调用,先调用类的+load,再调用分类的+load,且每个+load方法只执行一次。这里的只执行一次是值得是每个文件中执行一次,因为类要...原创 2020-04-18 11:17:25 · 506 阅读 · 0 评论 -
iOS开发-main函数之前app做了哪些事
文章目录main之前1.加载可执行文件(App 的`.o `文件的集合)2.加载动态链接库,进行 rebase 指针调整和 bind 符号绑定;3.Objc 运行时的初始处理,包括 Objc 相关类的注册、category 注册、selector 唯一性检查等;4.初始化,包括了执行 +load() 方法、attribute((constructor)) 修饰的函数的调用、创建 C++ 静态全局变...原创 2020-04-16 22:45:22 · 923 阅读 · 0 评论 -
iOS学习笔记-KVC技术
文章目录https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/KeyValueCoding.htmlhttps://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Key...原创 2020-04-16 01:36:12 · 226 阅读 · 0 评论 -
iOS开发-如何解决静态库的冲突问题
文章目录问题静态库Fat文件thin文件.a文件的构成解包将.o合并为.aduplicate问题各个架构的支持问题iOS中进入静态库经常会出现 dulipcate symbols 的问题。分享下我的处理以及经验。静态库在 iOS 中静态库有.a和framework文件。下面讲解如何对静态库解包和处理冲突的问题。Fat文件首先需要了解的是,一般来说我们拿到的静态库都是Fat文件,我们都...原创 2020-04-08 12:44:45 · 1887 阅读 · 1 评论 -
iOS开发-dispatch_once相关
文章目录使用场景原理关于dispatch_compiler_barrier性能测试使用场景dispatch_once 能够保证代码块只执行一次,即使在多线程使用时。一般来说我们如果要保证代码只执行一次,就是进行加锁,通过修改一个变量值0 -> 1 来判断这段代码是否执行过。在iOS中dispatch_once经常被用来创造单例对象,或者进行方法交换swizzle method例如 ...原创 2020-04-07 20:58:45 · 850 阅读 · 0 评论 -
iOS开发-关于block块的实现
文章目录block的结构体没有引入变量的block引入变量的block引入常量引入block引入 __attribute__((NSObject)) 变量引入__block前缀变量访问__block的变量(声明范围内)访问__block的变量(block内)引入的__attribute__((NSObject)) __block 变量block 的释放block 嵌套Object-C扩展block...原创 2020-04-26 17:32:28 · 229 阅读 · 0 评论 -
iOS开发-全量日志捕获CocoaLumberjack
文章目录前言ASL前言全量日志就是app的运行日志打印等等。有时候光凭Crash日志并不能找到并解决问题,如果有Crash时App的日志输出,则会事半功倍。CocoaLumberjack是OSX和iOS平台优秀的全量日志抓取第三方库。github链接ASL (Apple system logger)是苹果公司自己实现的一套输出日志的接口。ASL通过DDASLLogger.m文件,我们了...原创 2020-04-05 14:15:23 · 2101 阅读 · 0 评论 -
iOS开发-App电量消耗以及CPU占用
文章目录如何获取电量消耗UIDevice 获取IOKit电量分析如何获取电量消耗UIDevice 获取- (float)batteryValue { [UIDevice currentDevice].batteryMonitoringEnabled = YES; return [UIDevice currentDevice].batteryLevel;}这个值以0.05...原创 2020-04-04 12:19:58 · 869 阅读 · 0 评论 -
iOS开发-App应用崩溃卡顿分析
文章目录App崩溃问题可捕获的崩溃信息收集PLCrashReporter实现系统接口不可捕获的崩溃iOS后台模式Runloop 卡顿Watch DogApp达到单个App上限被杀死JetsamEvent 分析内存大小XNU获取内存限值task_info接口App崩溃问题app经常会遇见崩溃问题,比如下数据越界多线程操作同一指针,当指针为空时崩溃野指针问题KVO问题NSNotific...原创 2020-04-04 01:35:52 · 3934 阅读 · 0 评论