IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:iOS

共 101 篇相关文章

IT 累计浏览 4,013

苹果iOS系统下的推送机制及实现

这篇指南从iOS应用在后台无法持续运行、难以实时通知用户的现实问题出发,详细剖析了苹果推送通知服务(APNS)的完整解决方案。 核心是讲解APNS的工作流程:应用获取设备标识(device token)并交由你的服务器保管;当需要推送时,服务器向APNS发起请求,再由APNS将通知分发到用户设备。文章清晰地拆解了从用户授权、证书配置到通知主体JSON格式编写的全过程,包括alert、sound、badge等字段的具体用法。 更重要的是,它指出了开发者必须注意的关键点:APNS并不能保证通知的送达率和实时性,发送延迟或失败是常态;同时,在苹果的证书和配置文件体系下进行设置的过程相当繁琐,需要开发者耐心操作。文中还探讨了维护推送服务可能带来的服务器负载与成本问题。 如果你正在为iOS应用寻找后台唤醒用户的方法,那么这篇从原理到实践、兼顾理想与现实限制的讲解,会是一个扎实的起点。

IT 累计浏览 2,834

小心别让圆角成了你列表的帧数杀手

这篇讲的是在iOS滚动列表中滥用圆角导致性能暴跌的“坑”。作者实测发现,为cell中的UIImageView设置`cornerRadius`时,随着圆角视图数量增加,帧率会迅速下滑至45fps甚至30fps以下,造成明显的卡顿感。 更出人意料的是,使用`layer.mask`来实现圆角,性能比`cornerRadius`还要差,帧率可能直接跌到20fps。文章剖析了根源在于**离屏渲染**,特别是频繁的上下文切换带来了数十倍于普通渲染的开销。 对此,作者给出了明确的避坑指南:滚动列表中应尽量避免使用`cornerRadius`或`mask`。如果必须使用,可以通过开启`shouldRasterize`来缓存渲染结果,或者采用预处理圆角图片、覆盖镂空图层等更高效的替代方案来保障流畅度。

IT 累计浏览 5,947

iOS的定位原理揭秘

这篇讲的是iOS设备上那个既快又准的Wi-Fi定位,究竟是怎么实现的。文章从一个很直觉的矛盾点切入:家里的Wi-Fi路由器本身没有位置信息,手机却能通过它定位,这背后藏着一段“商业史”与一套精巧的算法。 作者梳理了Wi-Fi定位数据库的演进:从最早由Skyhook公司开车采集,到苹果后来凭借庞大的用户设备群建立起自己的数据库,完成了从依赖第三方到自主可控的转变。定位的精度和速度也随之提升,如今甚至无需连接Wi-Fi,设备缓存的周边信号信息就足以完成估算。 文章核心深入到了技术原理。它区分了基于信号到达时间等需要特殊硬件、在手机上不实用的方法,以及更可行的基于信号强度的定位。在后者中,又对比了“三角定位”和“指纹算法”的差异。三角定位需要预先知道AP位置,而指纹算法更像机器学习——先离线采集区域内的信号“指纹”建立数据库,在线定位时则将实时数据与之匹配。后者因对环境变化更强的适应性,成为智能手机室内定位的主流选择。 整篇从一个有趣的现象讲起,层层剥开技术实现的逻辑,让读者对日常使用却未曾深究的定位功能有了更立体的认识。

IT 累计浏览 1,923

IOS安全—阻止tweak注入hook api

这篇讲的是如何通过一种简单的编译设置来阻止iOS应用被Tweak注入和Hook。作者从网上看到一个通过添加特定Linker Flags来防止dylib注入的方法,并动手进行了验证。 他先用Theos编写测试Demo,在不添加任何flags的情况下,成功Hook了viewDidLoad方法并打印日志。随后,在Xcode的Other Linker Flags中加入`-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null`并重新编译。再次测试后,发现注入的dylib无法加载,Hook失败。通过MachOView可以看到,二进制文件中多出了一个名为`__RESTRICT/__restrict`的段。 文章深入分析了其原理:根据dyld源码,当主可执行文件包含此特定段时,系统会忽略`DYLD_INSERT_LIBRARIES`等环境变量,从而阻断了动态库注入的途径。这是一种轻量级的防护手段。然而,作者也展示了攻防的动态性——他使用010 Editor手动修改了这个段的名称,重新签名安装后,应用又能够被成功注入了。这清晰地揭示了该防护机制的核心依赖于段的特定名称,为安全研究提供了有价值的视角。

IT 累计浏览 2,247

大屏 iPhone 的适配

这篇讲的是苹果推出 iPhone 6 系列后,iOS 开发者面临的屏幕适配挑战。文章直接切入核心问题:旧工程在新设备上默认以“兼容模式”运行,导致显示模糊。作者总结出两种让应用进入高分辨率模式的有效方法——要么添加对应的 LaunchImage,要么使用 Xcode 6 引入的 Launch Screen 文件。考虑到对旧版 iOS 的兼容性,文章推荐了更稳妥的第二种方案。 文章还深入到了资源显示层面,指出了一个关键差异:iPhone 6 Plus 的设备像素密度更高,需要使用 @3x 图片,并且其内部逻辑分辨率与实际物理分辨率之间存在一个 1/1.15 的缩放过程。对于开发者最关心的屏幕参数,文章附上了一份清晰的对比表格,列出了从 iPhone 到 iPhone 6 Plus 各代设备的 Point 值、像素值、Scale 和 PPI,为具体适配工作提供了直接的数据参考。

IT 累计浏览 2,307

深入理解RunLoop

这篇讲的是 iOS/macOS 系统中至关重要的事件循环机制——RunLoop。作者从 CFRunLoop 的开源源码出发,带我们看清了这个底层对象的真实面貌。 文章不止于概念,而是层层深入:解释了 RunLoop 与线程一对一的绑定关系,剖析了 Source(事件源)、Timer、Observer 这三个核心组件的区别与协作,特别是区分了需要手动唤醒的 Source0 和能主动唤醒线程的 Source1。对于 Mode 的机制讲解也十分关键,说明了 RunLoop 每次运行只能处理特定模式下事件的设计意图。 最实用的部分在于,文章详细拆解了苹果是如何基于这套机制来实现自动释放池、触摸事件分发、屏幕刷新(CADisplayLink)、定时器等日常功能的。最后,通过分析 AFNetworking 和 AsyncDisplayKit 这两个经典框架的用法,展示了 RunLoop 在高性能网络监听和界面异步渲染中的巧妙应用,让理论立刻有了落脚点。 通篇将源码逻辑与系统设计结合,不仅解释了“是什么”,更阐明了“为什么这么实现”,对于想穿透 API 层、理解 iOS 系统运行原理的开发者来说,是一次扎实的源码导览。

IT 累计浏览 1,630

iOS 处理图片的一些小 Tip

这篇讲的是 iOS 开发中几个容易被忽略的图片处理细节,作者从实际编码经验出发,给出了不少实用技巧。 比如保存 GIF 动图,直接用 UIImageWriteToSavedPhotosAlbum 会转码成 PNG,正确做法是通过 ALAssetsLibrary 的 writeImageDataToSavedPhotosAlbum 来保留原始动图格式。保存 UIImage 到磁盘时,用 NSKeyedArchiver 其实是性能最差的方案,对于不含透明像素的图片,用 UIImageJPEGRepresentation(0.9) 压缩保存反而在编码速度和文件体积上都更优。 文章还深入解释了 UIImage 的缓存机制。通过 imageNamed 创建的图片,其解码数据在第一次显示时才会生成,并缓存在全局缓存中,通常只在 App 退后台或收到内存警告时清空。即使使用 imageWithData 创建图片,底层也会启用缓存。想要避免缓存,可以手动调用 CGImageSourceCreateWithData 并关闭缓存参数,或者更常见地,将图片绘制到画布再取出数据——这也是很多网络图片库采用的做法。 此外,文章还介绍了如何直接获取图片解码后的原生数据、快速判断文件图片类型,以及如何利用 CGImageSource 的 Incremental 方式实现像浏览器那样边下载边显示图片的效果,并对比了 PINRemoteImage、YYWebImage 与 SDWebImage 在这方面的实现差异。

IT 累计浏览 1,468

iOS安全—dumpdecrypted APP砸壳

这篇讲的是iOS应用逆向工程中一个关键步骤:如何给从App Store下载的加密应用“砸壳”。作者从dumpdecrypted这个工具出发,详细拆解了整个解密流程。 文章首先点明背景:商店下载的应用都带有加密壳,阻碍了class-dump或IDA这类静态分析工具的使用。核心方案分三步走:首先在本地下载并编译dumpdecrypted源码,生成一个dylib动态库;接着,通过Cycript等工具定位到目标应用的沙盒目录——因为只有沙盒内才有读写权限;最后,将生成的dylib上传至该目录并注入,启动应用即可完成解密。 其巧妙之处在于原理的简洁:通过DYLD_INSERT_LIBRARIES环境变量,强制让App加载这个自定义的dylib。动态库在初始化时便会执行dump操作,从而在运行时将解密后的二进制数据导出。整个过程清晰地展示了如何利用系统机制与沙盒环境来实现对加密应用的动态脱壳,为后续的深度分析扫清了障碍。

IT 累计浏览 2,032

自己动手打造基于 WKWebView 的混合开发框架(一)——WKWebView 上手

这篇讲的是如何从零开始,基于 iOS 的 WKWebView 打造自己的混合开发框架。作者从 WKWebView 的优势切入——它解决了 UIWebView 的内存和性能顽疾,将渲染进程交给系统管理,还支持高达 60fps 的刷新和更直接的 JS 通信方式。 文章是典型的“上手指南”风格,手把手教学。它从最基础的代码示例开始,逐步带你完成初始化、加载网页、解决 iOS 9 默认不支持 HTTP 的 bug,再到实现错误处理和 JS 的 alert 弹窗等核心功能。每一部分都配有具体代码和效果截图,特别适合想了解混合开发底层实现的 iOS 开发者参考。 在教程之外,作者还推荐了一个名为 BlackHawk 的开源项目,它是用 Swift 实现的高性能 Cordova 替代方案。如果你对文章里的基础实现感兴趣,这个项目提供了一个更完整的工业级参考。

IT 累计浏览 1,648

iOS JSON 模型转换库评测

这篇评测文章从实际开发需求出发,对 iOS 平台常用的六个 JSON/模型转换库进行了横向对比。评测覆盖了手动转换(Manually)、YYModel、FastEasyMapping、JSONModel、Mantle 和 MJExtension 这几个主流选择。 文章的核心围绕三个维度展开:性能、功能与容错性。在性能测试中,作者使用了两个典型用例(一个简单的 GitHub User 数据,一个复杂的微博数据),给出了直观的耗时对比图表。结论非常明确:YYModel 的性能显著领先,甚至接近手写代码的效率;Mantle 的性能在对比中最弱;JSONModel 和 MJExtension 处于中间水平。功能上,各库各有侧重,比如 FastEasyMapping 支持 CoreData,但使用者较少。 容错性测试则揭示了更实际的开发体验差异。YYModel 和 Mantle 会进行类型检查以避免崩溃,但处理策略不同:前者尝试自动转换并在失败时留空,后者直接终止转换并向上报错,更利于调试。MJExtension 在自动转换失败时可能直接赋值不匹配的类型,存在潜在风险。 总的来说,文章为开发者选择库提供了清晰的参考:追求极致性能可以看 YYModel,注重稳定和调试体验可考虑 Mantle,而 MJExtension 和 JSONModel 则是在功能与易用性上的常见折中选择。

IT 累计浏览 1,636

YYCache 设计思路

这篇讲的是作者从实际需求出发,设计高性能iOS缓存库YYCache的思考过程。他对比了NSCache、TMMemoryCache、PINMemoryCache等主流内存缓存实现,发现它们在性能或功能上各有不足,于是YYMemoryCache采用了OSSpinLock保证线程安全,并实现了LRU淘汰算法,在基准测试中性能表现突出。 针对磁盘缓存,文章分析了基于文件、mmap和SQLite三种技术路径的优劣。作者指出SQLite在存储小数据时性能更优,且便于实现元数据管理和淘汰策略,因此YYDiskCache采用了SQLite结合文件存储的混合方案,在实测中兼顾了性能与功能。 最后,作者还对比了Realm与SQLite的性能差异,并提到Realm会向外部IP发送数据,建议开发者谨慎使用。整篇文章从技术选型到性能评测,为iOS开发者选择和构建缓存方案提供了详实的参考。

IT 累计浏览 3,679

iOS 保持界面流畅的技巧

这篇深度解析从 iOS 屏幕显示原理入手,剖析了界面卡顿的根源。文章详细拆解了 VSync 机制下,CPU 与 GPU 协同工作的流程,并指出当任一方未能及时完成渲染时,掉帧便会发生。作者系统性地列举了 CPU 侧的对象创建与销毁、布局计算(尤其是 Autolayout 的性能陷阱)、文本渲染等常见开销来源,也涵盖了 GPU 侧的渲染与合成问题。 在剖析原理的基础上,文章重点介绍了 AsyncDisplayKit 框架。作者阐述了其图层预合成、异步并发操作等核心设计,以及如何利用 Runloop 进行任务分发,从而将主线程从繁重的布局和渲染任务中解放出来。 文章更提供了极具实践价值的参考:一个完全仿照微博、Twitter 的开源列表 Demo。通过预排版、预渲染、异步绘制等优化技巧的组合运用,该 Demo 即使在 iPhone 4S 上快速滑动,也能稳定保持 50-60 FPS 的流畅度。这不仅仅是理论分析,更是一份可供验证、对比和直接使用的性能优化方案指南。

IT 累计浏览 3,475

iOS安全系列之一:HTTPS

这篇讲的是HTTPS,但不是泛泛而谈。作者从iOS开发者普遍对安全不够重视的现状出发,指出即便是未越狱设备,网络安全依然是不可回避的课题。文章的核心,是厘清HTTPS并非什么新协议,其本质只是在HTTP之下增加了一层SSL/TLS加密。 最硬核的部分在于对SSL/TLS原理的拆解:它通过四次握手交换三个随机数来生成安全的“对话密钥”,并依赖数字证书体系(PKI)进行身份验证。文章用清晰的逻辑讲透了证书的签发与验证流程——接收端如何通过哈希对比和递归验证,最终追溯到操作系统内置的根CA。这解释了“为什么信任链的起点如此重要”。 在实现层面,文章没停留在理论。它具体展示了如何在iOS的NSURLConnection中处理证书验证回调,利用Security Framework的API完成Trust Object的评估。无论是使用系统默认验证,还是为自建证书等高安全场景进行更严格的本地匹配校验,都给出了可落地的代码思路。对于想用AFNetworking简化流程的开发者,也有明确的指引。 从概念辨析到原理图解,再到代码级实践,这篇文章提供了一条清晰的路径,帮助开发者完成从HTTP到HTTPS的安全升级。

IT 累计浏览 2,223

说说 XcodeGhost 这个事

这篇文章围绕曾经引起广泛关注的“XcodeGhost”事件展开。作者并非单纯复述事件经过,而是从一个技术观察者的视角,深入剖析了这场安全风波背后的技术逻辑与行业生态。 文章指出,被植入木马的Xcode确实导致了大量国产App被污染,但其实际危害程度需要理性评估。作者核心观点在于,iOS系统自身的安全设计(例如iCloud密码的高优先级保护、沙盒机制)构筑了多道防线,有效限制了恶意代码所能造成的最坏后果。他详细解释了为何直接窃取iCloud密码极其困难,并指出了用户可识别的钓鱼特征,如对话框反常地要求输入完整的Apple ID。 更重要的是,作者将此事与国内开发者普遍集成不明第三方SDK的风气进行了对比,认为后者对App信任链的破坏远超XcodeGhost。他借此批评了行业安全意识的薄弱,并呼吁用户(尤其是国产安卓用户)加强基本防护,如开启二步验证、谨慎对待系统弹窗。文章最后回归到技术本质,强调了操作系统层面安全机制的关键作用,为读者提供了在恐慌情绪之外更为冷静和深入的安全思考。

IT 累计浏览 3,674

如何写简历

这篇讲的是一位技术招聘者看了200多份简历后,从“收件人视角”总结的简历优化指南。 作者从日常招聘中遇到的实际问题切入:比如HR需要快速分发简历给不同岗位的面试官,而很多应聘者连简历文件名都只写“个人简历”。他建议将命名规范化为【姓名-应聘岗位-城市】,这一个小动作就能大幅提升协作效率。对于加分项,作者提到附上活跃的GitHub或博客链接是很好的补充,但长期不更新的反会减分;项目经验则强调与岗位要求直接挂钩,并尽量提供可在线访问的URL,避免让面试官花费额外精力去搜索验证。 文章最后点出核心:简历的本质是换位思考。用通用的PDF格式、为在线作品提供便捷入口、保持稳定的职业经历,这些细节都在为阅读者降低信息获取成本。当一份简历让招聘方觉得“舒服”,offer的可能性就大大增加了。

IT 累计浏览 4,365

解决IOS点击链接触发的颜色块

这篇讲的是移动端开发中一个常见的视觉“坑”:在iOS设备上,手指点击链接时系统默认触发的半透明灰色高亮块,有时会影响页面设计的整洁度。作者从实际项目出发,通过对比淘宝、京东等主流网站,发现它们巧妙地避免了这一现象。 问题的根源在于iOS Safari的一个默认行为,而非CSS样式问题。作者通过审查元素,最终定位到WebKit的私有CSS属性`-webkit-tap-highlight-color`。通过将该属性的Alpha通道(即RGBA颜色值的最后一个参数)设为0,就可以完全禁用这个点击高亮效果。 文章进一步解释了该属性的完整用法,包括它支持的系统版本、适用的元素范围,以及如何利用RGBa颜色值来定义高亮色或彻底隐藏它。最后,作者还贴心地分享了苹果官方的Safari CSS参考文档,为需要在iOS上进行深度Web开发的同学提供了进一步探索的路径。

IT 累计浏览 2,898

如何做Xcode工程的工程化管理

这篇讲的是如何系统化地管理Xcode工程,解决多人协作时常见的混乱与低效问题。作者从项目代码冲突频繁、依赖管理繁琐、多环境打包易出错等实际痛点出发,分享了一套实战经验。 核心方案分为几个层面:对于大型团队,建议用子Project或Workspace搭配多个Project来划分功能模块,这能有效降低单一project.pbxproj文件的冲突概率。第三方库统一交由CocoaPods管理,显著减少了维护成本。针对多渠道、多测试环境的需求,利用Build Configuration来区分配置,并配合创建与之对应的Scheme来管理打包和执行流程。最后,通过编写xcodebuild命令行脚本,可以一次性完成多个渠道包的构建,大幅提升效率。 整套方法围绕“降低冲突、规范流程、自动化打包”展开,作者强调了共享Scheme和命令行打包在团队协作中的实用性。这些措施将工程管理从依赖个人自觉提升到了流程化的层面,有助于在复杂项目中保持秩序。

IT 累计浏览 2,029

ios webview 相关

这篇讲的是开发者在iOS原生开发中,通过Objective-C操作WebView加载页面时遇到的两个典型“坑”及其排查过程。 第一个问题是关于携带Cookie的WebView加载。当需要传递带有HTTPOnly标记的登录Cookie时,发现NSHTTPCookie本身并不支持设置这个标记。作者的解决方案是绕开API限制,手动在请求头中拼接Set-Cookie字段,并详细演示了如何在加载前清理旧Cookie、在加载后构建并存储带有httponly标记的Cookie对象,确保了安全性和功能同时生效。 第二个问题涉及URL的细微变化。当页面内的JavaScript行为导致URL从“index.php”变为“index.php#”时,WebView的回调机制出现了异常:只会触发`shouldStartLoadWithRequest`,而不会触发`webViewDidFinishLoad`。这意味着如果开发者在此回调中管理“加载中”提示框,该弹窗可能无法自动隐藏,导致用户体验中断。文章指出了这个容易被忽略的加载状态管理时机问题。 文章最后坦言可能有更好的解决方案,并鼓励读者交流分享,体现了在复杂移动端环境中,对WebView这类“水很深”的组件进行细致调试与经验积累的重要性。

IT 累计浏览 4,945

iOS push服务

这篇文章详细拆解了iOS推送服务的完整工作流程。作者从Provider、APNS和iPhone的三阶段交互模型入手,清晰阐述了Push通知如何从应用服务器最终抵达用户设备。 内容涵盖了从原理到实践的关键环节:包括如何将苹果的SSL证书与私钥文件,通过OpenSSL命令转换为适用于Java、PHP等服务端环境的PEM或P12格式;客户端注册推送、获取DeviceToken并处理通知的Objective-C代码示例;以及JSON格式Notification Payload的构成,明确了alert、badge、sound等字段的用法与字节限制。 文章还特别区分了开发与发布证书的用途,并附上了多种语言服务端实现的参考链接,最后简要提及了本地通知的创建方法,为开发者提供了一套从配置到实现的完整参考。

IT 累计浏览 3,787

iOS设备唯一标识获取策略

这篇讲的是iOS开发中如何可靠地获取设备唯一标识。作者从苹果在iOS 7中开始屏蔽MAC地址(返回固定值02:00:00:00:00:00)这一背景出发,系统梳理了开发者曾用过的和现行的各种方案。 文章对比了UDID(已被苹果禁用)、UUID(会随App卸载而改变)、OPEN UDID(依赖其他应用存在)、以及苹果官方推荐的广告标示符IDFA(可被用户重置)和Vendor标示符IDFV(在特定条件下保持不变)等多种标识符。作者详细分析了每种方法的原理、优缺点及适用场景,例如IDFA适合广告追踪,IDFV适合同一开发商下的应用互联。 核心结论是,没有完美的单一方案。文章最终指出,一种相对稳健的做法是在应用首次启动时生成一个UUID,然后将其保存在iOS的Keychain中。Keychain数据不受App卸载影响,从而可以在应用重装后依然识别出是同一设备。这对于需要持久化用户身份(如免重复登录)的场景,提供了一个可行的折衷思路。