
iOS
文章平均质量分 87
心CC
我不会告诉你他是一只葵鼠哒 O(∩_∩)O
展开
-
总结移动开发入行十周年
我从事移动开发始于2011年春节后。这一年iOS和Android正式登上舞台,使得塞班和WinPhone进入了维护阶段,而Java预装系统则直接萎缩。身在移动开发最前线,直观的感受就是这5个平台的开发团队人数变化,而到了2013年,就只剩下iOS和Android了。2012年Q4我开始了写博客,也正好在2013年的博文里提到,iOS和Android程序员终会像Windows程序员那样像个“标配”般“平凡”。就让我姑且认为大厂们取消大小周加班算是个标志吧,这一天来了。虽然我很早就渗透去了非客户端开发甚原创 2021-07-11 21:16:12 · 2913 阅读 · 4 评论 -
Mac用Homebrew安装libimobiledevice
我的环境是macOS Catalina Version 10.15.2。请注意时效性。第一步,安装Command Line Tools到 https://developer.apple.com/download/more/?=for%20Xcode 安装最新版的Command Line Tools。即使你装了最新版的Xcode,后续仍可能报错。第二步,给pkg-config加权限# 注意路...原创 2019-12-30 10:53:08 · 5709 阅读 · 0 评论 -
xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数
在Objective-C函数的入口处(第一行)加断点,可用esp指针来探查参数。以esp为基址,往后的偏移分别是:0:函数执行完毕后的返回地址(不是返回值的地址哦)4:对象实例的指针,即self指针8:selector,实际是一个char数组型的字符串,即char*12:(如果有)第一个参数…(前一个参数的基址+前一个参数所占的字节数):(如果有)第n个参数由此原创 2013-03-26 07:19:40 · 8008 阅读 · 0 评论 -
iOS开发知识与能力体系 思维导图
越写越多,整理不完,也许思维导图都不是最好的承载工具了,以后再继续补充。分辨率为2042*3917,点击查看大图:转载请注明出处:http://blog.youkuaiyun.com/hursing原创 2013-06-04 11:42:23 · 15419 阅读 · 4 评论 -
IDA反汇编/反编译静态分析iOS模拟器程序(三)函数表示与搜索函数
打开IDA一般都是去搜索函数,可以说函数是IDA工程的基本单位吧,数据结构什么的都是为函数服务而已。函数列表在界面左侧的Functions Window:可以看到,UIKit有27789个函数呢。在搜索前要先知道函数的表示方式。Objective-C函数的表示:拿UIView来做例子吧。在xcode documentation中,UIView的函数会有这样的表示:+ (原创 2013-05-14 18:40:23 · 14361 阅读 · 0 评论 -
iOS Safari/WebKit对DeviceMotionEvent的实现
请先阅读《iOS Safari/WebKit对DeviceOrientationEvent的实现》,本文是姐妹篇。简单地描述一下区别,后面会更详细对比:DeviceOrientationEvent是获取方向,得到device静止时的绝对值;DeviceMotionEvent是获取移动速度,得到device移动时相对之前某个时间的差值比。背景知识:Apple官方依然只原创 2013-06-09 14:40:06 · 12674 阅读 · 0 评论 -
iOS Safari和UIWebView对orientationchange事件的实现
背景知识:Safari Web Content Guide中关于orientationchange的文档:http://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_re原创 2013-06-07 19:56:40 · 6389 阅读 · 1 评论 -
iOS调用WebView私有API的方法
WebView的私有API请查看《UIWebView体系结构(七)WebView》。先上代码吧- (void)modifyUA{ id webView = [uiWebViewInstance valueForKeyPath:@"_internal.browserView._webView"]; [webView performSelector:@selector(set原创 2013-06-14 17:04:22 · 10039 阅读 · 3 评论 -
xcode反汇编调试iOS模拟器程序(二)看懂反汇编
这里当然不会从零开始讲汇编代码了,零基础的话可以看看 王爽 写的书《汇编语言》,请自己找度娘或谷哥要了。这一节主要讲讲书上没有的东西。在xcode中看到的汇编语法不是熟悉的intel格式,而是叫AT&T汇编。基本上只要懂intel,at&t会很快上手。两者的区别请参考这篇文章:AT&T汇编http://blog.youkuaiyun.com/bigloomy/article/details原创 2013-03-26 16:09:19 · 10483 阅读 · 3 评论 -
iOS开发用到的Mac工具
mark一下吧,只是个人经验。Xcode,IDEgdb,lldb,命令行调试工具Simulator,模拟器Application Loader,(上传app store用)Instruments,各种开发辅助工具,性能测试、自动化测试、内存泄露检测等Chrome,看网页、调试网页Safari,可以辅助调试ios模拟器的网页TextMate,简单的文本编辑器原创 2013-06-19 17:13:02 · 4048 阅读 · 0 评论 -
Mac10.9和iOS7新公开的框架JavaScriptCore.framework
官网的介绍:The JavaScript Core framework (JavaScriptCore.framework) provides Objective-C wrapper classes for many standard JavaScript objects. Use this framework to evaluate JavaScript code and p原创 2013-06-18 17:48:30 · 6592 阅读 · 1 评论 -
iOS WebCore的WebEvent和EventHandler
WebEvent是iOS专有的类,负责封装和携带从UIKit得到的系统事件信息,并由WebKit层的WAKResponder子类传递到WebCore的EventHandler。UIKit层的逻辑可参考《iOS私有API(三) UIWebView下的手势识别器gestureRecognizer》,WebKit层的相关类可参考《WebCore::Widget浅探》。开源码中WebEvent的声原创 2013-06-18 16:22:30 · 4177 阅读 · 0 评论 -
查找MobileSafari WebKit revision number的方法
Mobile Safari是开源的Mac Safari的iOS版本,然而iOS WebKit并不完全开源,只公开了部分的WebCore和JavaScriptCore。有时需要知道iOS Safari的WebKit revision number是对应www.webkit.org上的哪个,可以这么看。用Mobile Safari打开http://www.whatsmyuseragent.原创 2013-06-17 12:58:02 · 4890 阅读 · 0 评论 -
xcode反汇编调试iOS模拟器程序(一)查看反汇编
iOS模拟器程序的实质就是Mac OS X程序,只不过它需要以模拟器为载体来运行显示。故它的反汇编代码指令都是x86 CPU的,不是真机上的arm指令。研究模拟器程序的反汇编有两个目的,或叫做好处:一是为了研究深入到iOS系统的类库,你可以较容易地发现私有API,以及看到系统的实现。二是,很直接地,模拟器调试比真机快。而且,相信大多数人更懂x86指令,各类高校教材的汇编教程都不是arm原创 2013-03-21 09:44:34 · 20682 阅读 · 0 评论 -
UIWebView体系结构(六)UIWebView
UIWebView的实际成员变量都由UIWebViewInternal保存,UIWebViewInternal的声明如下:@interface UIWebViewInternal : NSObject{ UIScrollView *scroller; UIWebBrowserView *browserView; UICheckeredPatternView *ch原创 2013-04-16 16:28:49 · 10308 阅读 · 0 评论 -
iOS WebCore的wak目录
《iOS的WebThread》中提到:iOS的WebCore开源码,6.1版本的下载地址为:http://opensource.apple.com/release/ios-61/比起webkit.org上的Mac开源码,会多了个wak目录,内有21个文件。今天认真看了下全目录,还果然挖掘出好多信息。这21个文件的文件名,8个以WAK开头,6个以WebCoreThre原创 2013-05-10 15:12:28 · 3979 阅读 · 0 评论 -
网页在Safari快速滚动和回弹的原理: -webkit-overflow-scrolling : touch;的实现
现在很多for Mobile的H5网页内都有快速滚动和回弹的效果,看上去和原生app的效率都有得一拼。要实现这个效果很简单,只需要加一行css代码即可:-webkit-overflow-scrolling : touch;可用以下网页测试: scroll .container {原创 2013-06-27 13:50:04 · 110096 阅读 · 2 评论 -
iOS Safari/WebKit对DeviceOrientationEvent的实现
背景知识:Apple官方只发现一个文档:https://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/DeviceOrientationEventClassRef/DeviceOrientationEvent/DeviceOrientationEvent.html连个例子都没原创 2013-06-08 18:00:28 · 15196 阅读 · 0 评论 -
移动App模块化设计
业务模块内部一般是MVC、MVP、MVVM式设计,可是这些设计模式没解答跨模块的可依赖性。大部分人会认可基础层可被所有代码依赖,但少有人明确UI层可依赖所有业务层代码(例如A页面可依赖B页面的model)。一般按照界面划分模块后,同属该模块的业务层和UI层都放在同一目录下(还可以有子目录)。如果设计得好,这部分东西是不关联具体业务的,多数可以跨项目使用,由业务层做定制化后为所属项目服务。(层次是功能意义逻辑的划分,不代表每层都有一个类来封装上一层,有时候同一个类内的函数集就是一层)这层的目录命名可以叫。原创 2018-12-18 17:02:13 · 5816 阅读 · 2 评论 -
JavaScript与WebView交互框架设计
总体设计现在最新的xcode都只支持iOS8.0以上的版本了,所以iOS应该直接使用性能高、功能多的WKWebView接口。UIWebView的注入对象方式需要依赖KVC,且有坑,不建议使用。本文都以WKWebView的接口来设计。数据从native传递到js只有一种方法: - ios是[webView evaluateJavaScript:@"some-js-code" compl原创 2018-07-11 16:44:12 · 2808 阅读 · 0 评论 -
apk、ipa包size优化手段
删除冗余代码和资源能简单用代码画的图形,不使用图片能使用系统API自己实现的,不使用第三方库。第三方库一般会考虑通用的情形,实际上不会用上它的全部功能。重构 抽离类似的代码做成通用的模块,减少复制粘贴出来的代码。删除过度设计的代码:看似抽象分层做得很好,但实际不会有作用的代码。(例如,只有一个子类的基类)算法优化,使用更少的代码来实现同一功能。启动图:不使用多张图片来匹配不同分辨率...原创 2018-06-26 11:59:10 · 1527 阅读 · 0 评论 -
HTTP(S)网络框架的设计
0.烦恼操作系统提供的网络接口都相对接近底层,使用时有诸多不便。但是我们不能期望系统API做得很高级,因为没有绝对合适的网络库,必须定制化从而达到适合某业务下的最佳性能。1.需求移动app使用网络库的场景不外乎三个:和自家(CS架构的)服务器通信下载文件Web浏览从方便和可扩展性出发,不少app会选择通信协议为HTTP(S),数据协议则为自定义。为了保护隐私,如果不使用HTTPS,数据都该自原创 2016-08-15 15:07:02 · 4366 阅读 · 1 评论 -
移动开发代码规范与格式化工具
原则有几个原则可以帮助大家不看文档也能写出符合规范的代码:如果是修改已有的代码,跟周围的风格一致如果是使用系统SDK来开发,除非特别说明,风格要和系统SDK一致新建文件写代码都按规范来写;旧文件中不符合规范的代码,找个合适的时间批处理格式化。学会IDE如何设置默认的代码格式如果无公司标准,为了方便都使用谷歌的代码规范集,它已覆盖了很多流行的编程语言。规范iOSApple本身做了很好的规范,原创 2017-12-02 09:58:07 · 1982 阅读 · 0 评论 -
boost全平台编译方法
0.通用规则boost自带一套编译工具bjam,bjam本身是跨平台的,并且也要自行编译出来。在boost目录下有bootstrap.sh和bootstrap.bat两个脚本分别用来编译*nix和windows下的bjam。bootstrap脚本可以传入参数,以在编译bjam过程中生成特定的编译boost的配置。编译bjam过程中生成的project-config.jam就是默认的配置,但还可以在运原创 2015-06-11 12:00:25 · 52970 阅读 · 15 评论 -
跨平台客户端开发经验总结
1 前言因为《猫科动物和企鹅在窗口外看机器人吃苹果》这出戏太美,很多公司都希望能全平台同时发布新版本app,还要能复用代码以降低开发成本。这迫使一部分已熟悉某个平台的先锋们转岗到另一个平台边学习边开发。最终有少部分人在每个战场都打拼过,从而能全盘考虑以设计出良好的可复用架构。 革命总会出新知,今天已有一些开源框架能应对同时在5大平台Mac OS X、Linux、Windows、Android、iO原创 2015-09-22 16:25:21 · 16920 阅读 · 12 评论 -
客户端开发设计总结
1 基础设施程序最基本的处理就是数据IO以及为了并行计算所做的操作,它们通常会作为程序的底层框架,供上层使用。2 交互从PC到现在的移动设备还有VR,人机交互中的输入设备在不断自然化,可是展示界面的元素仍然还是这几种:静态文本、按钮、列表、输入框、选择菜单、进度提示、滚动条、标签页。每种UI框架都提供这些基本组件,可以说掌握它们就等于对这个框架入门了。高级的交互会跨越窗口、跨越程序,并能更智能化地响原创 2016-09-19 16:01:04 · 20937 阅读 · 3 评论 -
利用Objective-C运行时hook函数的三种方法
方法一,hook已有公开头文件的类:首先写一个Utility函数:#import inline void exchangeMethod(Class aClass, SEL oldSEL, SEL newSEL){ Method oldMethod = class_getInstanceMethod(aClass, oldSEL); assert(oldMethod);原创 2013-03-18 20:30:39 · 27020 阅读 · 4 评论 -
利用javascript和canvas获取UIWebView网页里的图片(不用再下载)
在UIWebView网页里要获取img标签的图片,网上的方法都是通过获取到URL然后自己再下载一遍,耗流量、耗时间、不能通过验证。这里是利用UIWebView的stringByEvaluatingJavaScriptFromString函数,执行一段js,返回图片数据。具体的方式有两种:原创 2013-10-19 09:54:28 · 14270 阅读 · 20 评论 -
iOS社交app技术合伙人笔试题
理想状况当然是找到有管理能力且还在写代码的架构师了,然而如果有这样的人,他自己能发起项目了,你要拉上他还真难。满足一定条件就行了,别追求完美。还有比这更完美的吗?请生产这样的机器人:性格开朗(开朗≠外向),平易近人表达能力好,易于沟通交流有设计能力,有攻关能力知识范围广,跨职能团队合作顺畅在业界有一定视野或影响力,有好的人脉资源有管理能力(经验≠能力),中后期能管好团队,顺利成长为管理者没身体和家原创 2014-08-29 17:25:11 · 5096 阅读 · 0 评论 -
IDA反汇编/反编译静态分析iOS模拟器程序(一)话说IDA
上个月写了一系列文章《xcode反汇编调试iOS模拟器程序》,是使用xcode来动态反汇编分析iOS模拟器程序的。这个系列则是静态分析,用到IDA来做反汇编/反编译。一些概念不会在此重复,遇到时可回读xcode反汇编系列。之前有提到一些IDA的常识和下载地址,可看 《IDA Pro权威指南》读书笔记,同时这本书也是更深入挖掘IDA的参考书,只不过书里不会提到Objective-C。本系列使用的原创 2013-05-13 14:58:15 · 7328 阅读 · 0 评论 -
iOS两个线程间嵌套发送同步消息
先上代码,主要逻辑可看注释。最好是直接下载demo再往下看了。demo下载地址:http://download.youkuaiyun.com/detail/hursing/5159144@implementation ViewController #define kLevelsOfNesting 5 NSString *const kParameter = @"Parameter"; NSStr原创 2013-03-18 20:30:58 · 5269 阅读 · 0 评论 -
IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译
反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品。既然是产品,那当然就另外收费,demo版是没有的。反编译的快捷键是F5,菜单位置在 顶部菜单View->Open Subviews->Pseudocode。在显示反汇编的窗口中按F5,经过分析后,会多了一个标签栏Pseudocode-A:继续上一节(可用两个浏览器窗口对比)的示原创 2013-05-16 17:20:22 · 24377 阅读 · 9 评论 -
Objective-C头文件导出工具class-dump
首先,这个工具是开源的。作者网站:http://stevenygard.com/projects/class-dump/用途:分析库文件或可执行文件,得到Objective-C类和部分C结构体的信息。常见使用场景是得到系统SDK的私有API。头文件的例子请参考《UIWebView体系结构(六)UIWebView》原理:Objective-C类的信息会有字符串来对应描述,分析保存这些原创 2013-06-06 09:56:33 · 16104 阅读 · 0 评论 -
UIWebView体系结构(八)各个Client综述
各种Clients会有些共性:1.WebCore会声明抽象基类,各Controller持有基类类型的指针2.由第三方创建Client并传递指针给Controller,Controller析构时会通知Client,Client此时删除自身。例如void WebChromeClient::chromeDestroyed(){ delete this;}3.自身脱离W原创 2013-06-14 16:41:05 · 4107 阅读 · 0 评论 -
xcode反汇编调试iOS模拟器程序(四)自动断点应用之NSNotificationCenter
知道怎么查看后,先看看有什么实际应用,拿NSNotificationCenter来做实践吧。首先在某个容易进入的地方加断点,并停在那,例如main函数。在gdb或lldb输入命令,手工添加断点。如下图:输入的命令如下:b -[NSNotificationCenter addObserver:selector:name:object:]b -[NSNotificationCente原创 2013-04-02 17:05:37 · 5959 阅读 · 4 评论 -
UIWebView体系结构(三)UIWebDocumentView和WebView
WebView是UIWebDocumentView最重要的组合对象,先讲WebView吧。WebView的声明如下:(代码好长,点此跳过)@interface WebView : WAKView{ WebViewPrivate *_private;}+ (void)registerViewClass:(Class)arg1 representationClass:(Cl原创 2013-04-10 10:07:47 · 11164 阅读 · 1 评论 -
UIWebView体系结构(五)_UIWebViewScrollView和UIWebScrollView
_UIWebViewScrollView的继承链为:_UIWebViewScrollView->UIWebScrollView->UIScrollView。通过反编译可以得到实现。_UIWebViewScrollView和UIWebScrollView的实现为:(代码好长,点此跳过)@interface UIWebScrollView : UIScrollView- (void)d原创 2013-04-10 17:43:46 · 9026 阅读 · 0 评论 -
UIWebView体系结构(四)UIWebBrowserView
UIWebBrowserView的声明如下:(代码好长,点此跳过)@interface UIWebBrowserView : UIWebDocumentView { UIWebFormAccessory *_accessory; NSObject *_input; DOMNode *_currentAssistedNode; DOMNode *_assis原创 2013-04-10 11:13:52 · 14876 阅读 · 0 评论 -
UIWebView结构体系(二)UIWebTiledView和WAKWindow
UIWebTiledView是UIWebBrowserView->UIWebDocumentView->UIWebTiledView继承链中的老爷子,但这三个类的职能却是MVC的关系,UIWebBrowserView是Controller,UIWebDocumentView是Model,UIWebTiledView是View。(这也是我第一次见到这样的设计,很有意思)它的声明为: (代码好长,原创 2013-04-09 10:52:23 · 5260 阅读 · 0 评论 -
xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
首先自己写一段代码,加好断点,分别在Build Configuration为Debug和Release下运行,查看反汇编- (void)test{ UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10.0, 20.0f, 30.1, 40)]; [button setTitle:@"test" f原创 2013-04-07 11:49:31 · 8879 阅读 · 1 评论