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

移动开发

共 365 篇文章

IT 2016-02-20 11:46:24 / 累计浏览 4,304

iOS到Android到底有多远

这篇讲的是一位在iOS开发四年后,重拾Android开发并独立上线应用的作者,分享从iOS转向Android过程中的核心差异与思考。 作者发现,最大的挑战始于编程语言。他对比了Objective-C与Java,指出OC在泛型、枚举和抽象类等现代语言特性上已显落后,这也是Swift应运而生的背景;而Java在Android平台依然稳固,Go语言暂无取代之势。在系统平台层面,作者深入分析了Android独有的Context概念——这个贯穿于各种API中的“上下文”参数,与iOS更为模块化、去中心化的资源访问方式形成了鲜明对比。 文章不仅停留在技术点的罗列,更延伸出一个核心观点:平台有生死,但开发者应超越具体平台,去掌握多线程、算法、设计模式等那些不会随平台消亡的通用思想。这对于计划拓宽技术栈的开发者,尤其是iOS工程师,提供了非常切实的视角和路线参考。

本机暂存
IT 2016-02-20 11:43:11 / 累计浏览 2,561

为UIView任意角设置圆角

这篇讲的是如何在 iOS 开发中为 UIView 的任意角设置圆角。作者从最常见的全圆角需求出发,指出虽然一句 `cornerRadius` 就能搞定四个角,但当我们只想让某些角变圆时,就得动用 `layer.mask` 与 `UIBezierPath` 这一组合。 文章核心在于利用 `UIRectCorner` 枚举精准控制哪些角需要圆角处理。通过枚举值,开发者可以灵活组合左上、右上、左下、右下四个角。作者展示了一个实际代码示例:在 `layoutSubviews` 中创建一个 `CAShapeLayer`,将其路径设置为一个由 `bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:` 方法生成的贝塞尔曲线,最后将这个 shapeLayer 作为视图的遮罩。运行效果显示,一个视图的三个角(除了右下角)被成功设置成了圆角。 整个过程清晰展示了从发现问题(需要局部圆角)到提供具体实现方案的思路,对于需要精细化 UI 处理的 iOS 开发者来说,这是一个非常实用的小技巧。

本机暂存
IT 2016-02-20 11:41:23 / 累计浏览 1,939

Swift错误和异常处理

这篇文章梳理了Swift中的错误与异常处理机制,对比了其与Objective-C时代处理方式的根本区别。作者指出,在Objective-C中, NSError 更像一种“可选”的契约,开发者容易因省事而忽略它,导致潜在问题在运行时才暴露。而Swift 2.0引入的异常机制,强制开发者使用 try/catch 来面对可能出错的同步操作,从语言层面鼓励更严谨的编程习惯。 对于异步API(如网络请求),文章则介绍了当前社区的最佳实践:利用泛型枚举(如 Result)来包装成功与失败两种状态。这种模式弥补了异常机制无法应用于异步流程的限制,并提供了比传统回调更清晰、更类型安全的结果处理方式。 最终,文章给出了明确的指引:同步API优先使用语言级异常,异步API则推荐使用枚举进行结果封装。这不仅关乎代码健壮性,也体现了Swift在安全性与表达力上的设计权衡。

本机暂存
IT 2016-02-18 23:45:10 / 累计浏览 1,990

APP调用Custom URL Scheme

这篇讲的是如何让应用之间通过一个自定义的地址跳转来打开并传递信息,也就是实现Custom URL Scheme。文章从Android和iOS两个主流平台出发,清晰拆解了各自的配置方法与核心代码。 在Android端,核心是在AndroidManifest.xml的Activity中配置intent-filter,指定自定义的scheme(如`mgtv`),并通过Intent或浏览器链接来启动应用,接收端可以获取完整的URI数据。对于iOS,则需要在Xcode项目中设置URL Types,注册你的scheme标识符,并在AppDelegate里实现特定的处理方法来接收调用。文章用`mgtv://?action=play&data=12345`作为贯穿始终的例子,直观地展示了参数如何在应用间流动。 除了基础的启动,文章还深入介绍了如何进行参数解析与应用间通信,比如iOS应用可以判断调用源,并返回一个回调URL来告知调用方执行结果,甚至能在应用未启动时拉起特定页面。这使得URL Scheme不仅仅是打开一个应用,更能支撑起丰富的交互逻辑。 总的来说,这是一篇从配置到实战,覆盖双平台的应用间跳转指南,对于想实现应用深度链接或应用间协作的开发者来说,提供了非常具体的实现路径。

本机暂存
IT 2016-02-16 22:16:42 / 累计浏览 1,954

iOS如何用代码控制以不同屏幕方向打开新页面?

这篇实战记录,正是一位开发者在面对“APP保持竖屏,但特定页面需横屏打开”这一需求时,从踩坑到解决的全过程。文章从最基础的`UIDevice.currentDevice().setValue(...)`方法实现页面旋转切入,但很快遭遇了方向被锁死、退出页面后异常横屏的典型BUG。 作者没有停留在表面,而是深入研究了`shouldAutorotate`、`supportedInterfaceOrientations`等系统回调的运作机制。关键在于,对于`TabBarController`包裹`NavigationController`这类常见复杂架构,系统判断屏幕方向的依据并非当前页面,而是根控制器。文章最终给出了自定义`TabBarController`并覆写相关方法的终极方案,并提供了完整的代码仓库供参考。对于需要精细控制屏幕方向的iOS开发者,其中对系统机制的分析和分层解决方案具有直接的实用价值。

本机暂存
IT 2016-02-16 20:53:22 / 累计浏览 1,851

安卓第三方应用调起常见问题

当Android开发者需要调起其他应用分享或登录时,常常会卡在“如何精确唤起目标页面”这一步。这篇讲的就是解决这个具体痛点。文章没有空谈理论,而是直接给出了核心代码——通过Intent明确指定ComponentName(即包名和Activity名),并辅以常用Activity的ACTION_MAIN和CATEGORY_LAUNCHER标志,确保能从桌面正常启动。 为了让开发者“拿来即用”,作者还贴心地列出了微博、微信、QQ等几个常用应用的具体包名和编辑界面Activity路径。这就像一份速查手册,省去了反复查阅官方文档的时间。 更进一步,文章考虑到了目标应用可能未安装的场景。它演示了两种方案:一是通过PackageManager遍历已安装列表来判断,二是利用Intent的URI Scheme(如`sinaweibo://`)进行直接调用,并最终通过Intent.createChooser提供一个“兜底”选择。如果App未安装,则自动跳转到对应的网页版,实现了体验上的优雅降级。 从直接调起到异常处理,这篇文章为开发者提供了一套清晰、可落地的实施步骤。

本机暂存
IT 2016-02-16 20:51:02 / 累计浏览 1,597

Swift的Range 操作符 ... 和 ..<

这篇讲的是Swift中从脚本语言借鉴而来却独具特色的Range操作符`...`和`..<`。文章没有停留在基础用法——用`0...3`表示包含3的闭区间,用`0..<3`表示不包含3的开区间——而是深入剖析了这两个操作符的泛型定义。 作者通过解读源码中的函数签名,揭示了它们的强大之处:除了常见的整数和浮点数,这两个操作符还支持所有遵循`Comparable`协议的类型。这意味着它们可以用于字符串,构建如`"a"..."z"`这样的字符范围。文中用一个实际例子演示了如何利用这一特性高效地校验字符串中的每个字符是否为小写英文字母,让抽象的语法定义立刻变得实用。 文章的亮点在于,它清晰地展示了Swift如何将一种常见的语法糖,通过泛型设计提升为一个通用且类型安全的强大工具,让读者不仅会用,更理解了其背后的设计思路和扩展潜力。

本机暂存
IT 2016-02-16 20:49:04 / 累计浏览 2,105

Swift GCD 和延时调用

作者从一个具体的需求出发:在应用中需要实现“N秒后执行某操作”,但Swift中原来常用的performSelector:afterDelay方法因内存安全问题已被移除。文章的核心是介绍如何利用GCD的dispatch_after来优雅地实现延迟调用,并进一步提供了一个可取消的封装方案。 作者首先演示了最基础的dispatch_after用法,随后直指痛点:实际开发中我们常常需要能够取消这些延迟任务。因此,文章的重点在于一个精心编写的delay函数,它利用GCD的演进特性(如dispatch_block_t),将延迟任务包装成一个可被取消的“Task”。通过这个封装,调用变得极为简洁:`delay(2) { ... }`,而取消也只需调用`cancel(task)`。这种封装避免了引入NSTimer等不相关的类,同时利用闭包提供了安全的内存管理和取消能力。 整篇文章从实际问题切入,提供了超越简单语法演示的实用工具代码。这套轻量封装解决了实际问题,也展示了Swift下灵活使用GCD的思路。

本机暂存
IT 2016-02-16 20:45:46 / 累计浏览 1,437

iOS开发检测通讯录权限并申请开启

这篇讲的是开发者在升级到 iOS 6 后,遇到的通讯录访问权限问题。原先正常的代码突然报错,且程序在系统的隐私设置中“隐身”,根本原因在于 iOS 6 对通讯录访问控制进行了收紧,要求应用必须主动向用户请求授权。 作者分析了官方文档后,提供了一个清晰的解决方案:封装一个检查权限的方法。该方法首先通过 `ABAddressBookGetAuthorizationStatus()` 获取当前状态,若非已授权,则主动调用 `ABAddressBookRequestAccessWithCompletion` 发起请求,并通过回调处理结果。文章中给出的代码,巧妙地利用 `dispatch_async` 确保回调在主线程执行,方便更新 UI。 实际应用时,开发者可以在关键路径调用此方法。如果用户首次拒绝了授权,就只能引导其前往系统设置手动开启。这个封装的方法将权限检查与请求逻辑整合在一起,为解决此类权限问题提供了一个可复用的实践模板。

本机暂存
IT 2016-02-16 20:32:38 / 累计浏览 1,947

苹果iOS系统下检查第三方APP是否安装及跳转启动

这篇讲的是如何在iOS系统中检测其他APP是否安装,并实现跳转启动。作者从移动端常见的“应用间跳转”需求出发,详细介绍了基于URL Scheme框架的解决方案。核心方法是通过调用`canOpenURL:`方法判断目标APP的Scheme是否被系统支持,从而得知其是否安装;再使用`openURL:`方法即可唤起对应应用。文章不仅给出了清晰的代码示例(如检测和启动QQ),还整理了一份极其详尽的“常用APP的URL Scheme前缀”列表,覆盖社交、出行、工具、娱乐等上百款应用,甚至包括部分系统功能设置的跳转路径。 对于iOS开发者而言,这份列表省去了大量查阅官方文档的时间。无论是想快速集成第三方登录、分享功能,还是探索应用间的数据传递与交互,文中提供的方案都直观且易于实现。需要注意的是,自iOS 9起,使用`canOpenURL`需要在项目的`Info.plist`中声明要查询的Scheme,文章虽未深入讨论此权限变更,但其提供的基础逻辑与Scheme索引仍具很高的实用参考价值。

本机暂存
IT 2016-02-15 17:08:09 / 累计浏览 4,034

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

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

本机暂存
IT 2016-02-13 23:43:21 / 累计浏览 2,779

移动端点击、触碰随记

这篇讲的是移动端开发里几个老生常谈却又总踩坑的“事故”:点击延迟、点穿和焦点获取错误。作者从实测数据出发,直观展示了移动端原生click事件为何存在约300ms的固定延迟(为了判断是否双击缩放),以及为何要拥抱更快的tap事件(如zepto的实现)。 文章深入分析了触摸事件与鼠标事件的触发顺序,指出tap和click本质是同一次触碰的不同阶段。针对“点穿”这个经典坑(根源在于事件绑定层级),作者对比了阻止事件流的方法,明确preventDefault是关键大招,并顺势对比了fastclick、Yocto等库的解决方案,分析了它们的原理与适用场景。 最后,文章还深入探讨了在Angular框架下如何处理ng-click点穿问题,以及如何区分处理input、textarea等元素的焦点获取需求,给出了具体的代码思路。全文从现象到原理,再到框架内的实战方案,是一份扎实的移动端触控问题排查指南。

本机暂存
IT 2016-02-13 23:14:36 / 累计浏览 2,640

一个“三端”开发者眼中的React Native

这篇讲的是一位常年穿梭于前端、服务端和客户端的“三端”开发者,初次接触React Native时的真实感受与深度观察。作者没有停留在技术介绍,而是从自己饱受iOS开发中代码冗长、布局繁琐、调试耗时等痛点困扰的经历出发,生动地分享了RN如何像一位“校花”般用统一的Component模型、动态绑定、类CSS样式和Flexbox布局,解决了这些长期痛点。 文章直率地列举了RN当前阶段的不足,比如组件不全、性能损耗、仅支持iOS以及代码并非全平台通用等现实问题。但核心价值在于作者提出的理性视角:技术讨论不能脱离场景。他从前端与客户端两个角度分析了RN带来的影响——对前端而言,这是拓展技术栈的有趣方向;对客户端开发者,它简化了开发流程,并带来了更高效的NPM生态。 最后,作者展望了一种未来的协作模式:前端负责表层业务开发,客户端团队则专注于构建和封装底层原生组件。文章结尾鼓励开发者不要止于议论,而应动手实践,在学习中积累。这种从个人实践上升到团队协作模式的思考,为如何看待这类跨平台技术提供了切实的参考。

本机暂存
IT 2016-02-13 23:03:08 / 累计浏览 4,081

APP图标的色彩

这篇文章做了一件挺酷的事:用工具批量分析了应用商店里成百上千个APP图标的“支配色”,然后用色轮直观展示了不同类别、平台和排名的APP在色彩选择上的差异。 研究发现,无论是iOS还是Google Play,蓝色和红色都是绝对的主流色,构成了明显的分布群。但细节里很有意思:免费APP图标倾向使用单一颜色,而付费APP的图标则更常组合多种色彩,显得更复杂。社交媒体类APP虽然大家印象中是“蓝色的天下”,但分析显示绿色也有相当比例。游戏APP的色彩则更为丰富和分散。有意思的是,Mac应用商店的色彩分布与iOS非常相似,而Google Play的数据也印证了跨平台的这一趋势。 基于这些发现,作者给出了一个简单的设计师选择指南:想随大流就选蓝或红,想略有不同可以试试绿色,如果想彻底特立独行,那就大胆用上粉色或紫色吧。

本机暂存
IT 2016-02-11 22:56:52 / 累计浏览 2,861

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

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

本机暂存
IT 2016-02-11 22:42:42 / 累计浏览 5,976

iOS的定位原理揭秘

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

本机暂存
IT 2016-02-11 22:39:52 / 累计浏览 2,350

由App的启动说起

这篇讲的是从用户点击App图标到程序真正运行起来,这电光火石的一瞬间里到底发生了什么。作者从“我是谁”的哲学拷问切入,带我们深入App的“新生儿”阶段,探寻那些看不见的启动奥秘。 文章把焦点对准了构成iOS应用的核心——Mach-O文件格式。它细致地拆解了App Bundle的结构,解释了Universal Binary(胖二进制)如何通过一个巧妙的Fat Header将支持不同CPU架构的代码打包在一起,以兼顾兼容性和性能。比如,文中就提到新浪微博的执行文件支持多种架构,而QQ和微信为了控制包体积则没有支持全部新架构。 作者的解读从文件组成到加载机制,层层递进。核心在于揭示那个从二进制文件到活生生应用的“炼金”过程,帮你理解Xcode编译、链接、打包之后,系统是如何接手并启动这个程序的。这种对底层机制的梳理,能让开发者超越日常编码,更透彻地理解App的运行本质。

本机暂存
IT 2016-02-11 22:33:11 / 累计浏览 1,591

Swift断言

这篇讲的是Swift开发中如何优雅地处理输入参数校验问题。作者从编码中的一个哲学困境切入:代码的调用者(无论是其他程序员还是未来的自己)往往不了解实现细节,难以保证传入正确的参数。传统的if条件判断虽然可行,但会增加API复杂度和运行时开销。 文章的核心方案是Swift提供的断言(assert)机制。它通过assert函数在开发阶段进行条件“论断”,一旦输入不满足预设条件(例如温度转换中摄氏温度低于绝对零度),便会中断运行并抛出明确的调试信息。这比冗余的错误处理逻辑更清晰。 断言的一个关键设计在于它是一个“开发时特性”:仅在Debug编译模式下生效,Release构建时会被移除,因此完全不影响最终产品的运行性能。这使得开发者可以放心地在代码中保留这些校验,无需在发布时手动清理。 文章还提及了如何通过编译标记(如-assert-config Release)在特殊情况下强制禁用或启用断言,并对比了在Release阶段需要强制终止程序时应选择fatalError。总之,断言是面向开发者的、轻量且高效的调试守卫。

本机暂存
IT 2016-02-11 14:56:27 / 累计浏览 2,261

大屏 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 2016-02-11 14:55:28 / 累计浏览 2,319

深入理解RunLoop

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

本机暂存