美团技术团队-iOS系列文章
从预编译的角度理解Swift与Objective-C及混编机制
本文从预编译的基础知识入手,由浅至深的介绍了Objective-C和Swift的工作机制,并通过这些机制来解释混编项目中使用到的技术和各种参数的作用,由此来指导开发者如何进行混编。美团 App 在 2015 年就已经基于 CocoaPods 完成了组件化的工作。在组件化的改造过程中,为了能够加速整体工程的构建速度,我们对需要集成进美团 App 的组件进行了二进制化,同时提供一个叫做 cocoapods-binary 的 CocoaPods 插件来支持本地工程使用二进制。因此,美团 App 的开发者在集成开发时,除了自己正在开发的组件,其他的组件都以二进制的形式存在。使用二进制,虽然会给工程带来构建速度的提升,但是会带来一个新的问题:在调试工程时,那些使用二进制的组件,无法像源码调试那样看到足够丰富的调试信息。
本文主要讲述了如何从一个猜想,通过不断的实验,将一个非常有趣的功能落地到现有工具中的过程。对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久。如果在开发、测试阶段能够提前暴露问题,就有助于避免线上事故的发生。代码覆盖率检测正是帮助开发、测试同学提前发现问题,保证代码质量的好帮手。
本文介绍美团到店餐饮团队对 iOS 覆盖率检测算法的研究,分享一种可以嵌入到现有开发流程中,并对开发透明的增量代码测试覆盖率工具的实现。冷启动时长是App性能的重要指标,作为用户体验的第一道“门”,直接决定着用户对App的第一印象。美团外卖iOS客户端从2013年11月开始,历经几十个版本的迭代开发,产品形态不断完善,业务功能日趋复杂;同时外卖App也已经由原来的独立业务App演进成为一个平台App,陆续接入了闪购、跑腿等其他新业务。因此,更多更复杂的工作需要在App冷启动的时候被完成,这给App的冷启动性能带来了挑战。对此,我们团队基于业务形态的变化和外卖App的特点,对冷启动进行了持续且有针对性的优化工作,目的就是为了呈现更加流畅的用户体验。目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App 而言,这些解决方案并不完美。有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们提出了一套解决方案并开发了相应的转场库,目前该转场库已经成为美团多个 App 的基础组件之一。
在美团 App 开发的早期,涉及到导航栏样式改变的需求时,经常会遇到转场效果不佳或者与预期样式不符的“小问题”。在业务体量较小的情况下,为了满足快速的业务迭代,通常会使用硬编码的方式来解决这一类“小问题”。但随着美团 App 业务的高速发展,这种硬编码的方式便遇到了挑战。随着移动互联网的快速发展,不断迭代的移动端工程往往面临着耦合严重、维护效率低、开发不够敏捷等常见问题,因此越来越多的公司开始推行“组件化”,通过解耦重组组件来提高并行开发效率。
本文主要介绍如何通过Category特性来实现优雅的组件间通信方案,并分享了美团平台对于Category用法的管控与实践。2014年,苹果公司在WWDC上发布Swift这一新的编程语言。经过几年的发展,Swift已经成为iOS开发语言的“中流砥柱”。
Swift提供了非常灵活的高级别特性,例如协议、闭包、泛型等,并且Swift还进一步开发了强大的SIL(Swift Intermediate Language)用于对编译器进行优化,使得Swift相比Objective-C运行更快性能更优,Swift内部如何实现性能的优化,本文进行了解读,希望能对大家有所启发和帮助。目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App 而言,这些解决方案并不完美。有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们提出了一套解决方案并开发了相应的转场库,目前该转场库已经成为美团多个 App 的基础组件之一。
本文从导航栏的概念入手,通过讲解转场过程中的状态管理、转换时机和样式变化等内容,引出了在大型应用中导航栏转场的三种常见解决方案,并对美团的解决方案进行剖析,同时介绍了我们总结的最佳实践。Logan是美团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务。此前我们公众号发布过一篇文章《Logan:美团移动端基础日志库揭秘》,主要讲述了Logan的很多技术细节。本文重点阐述了Logan的整体框架。
Logan已经稳定迭代了一年多的时间。目前,美团绝大多数App已经接入并使用Logan进行日志收集、上传、分析。近日,我们决定开源Logan生态体系中的存储SDK部分(Android/iOS),希望能够帮助更多开发者合理的解决移动端日志存储收集的相关痛点,也欢迎更多社区的开发者和我们一起共建Logan生态。
GitHub上的项目地址:https://github.com/Meituan-Dianping/Logan。beeshell —— 开源的 React Native 组件库
beeshell 是一个 React Native 应用的基础组件库,基于 0.53.3 版本,提供一整套开箱即用的高质量组件,包含 JavaScript组件和复合组件(包含 Native 代码),涉及前端(FE)、iOS、Android 三端技术,兼顾通用性和定制化,支持自定义主题,用于开发和服务企业级移动应用。
GitHub 上的项目地址:https://github.com/meituan/beeshell。增强现实(Augmented Reality)是一种在视觉上呈现虚拟物体与现实场景结合的技术。Apple 公司在 2017 年 6 月正式推出了 ARKit,iOS 开发者可以在这个平台上使用简单便捷的 API 来开发 AR 应用程序。
本文结合了美团到餐业务场景,介绍一种基于位置服务(LBS)的 AR 应用。使用 AR 的方式展现商家相对用户的位置,这会给用户带来身临其境的沉浸式体验。动态化作为移动客户端技术的一个重要分支,一直是业界积极探索的方向。目前业界流行的动态化方案,如Facebook的React Native,阿里巴巴的Weex都采用了前端系的DSL方案,而它们在iOS系统上能够顺利的运行,都离不开一个背后的功臣:JavaScriptCore,它建立起了Objective-C和JavaScript两门语言之间沟通的桥梁。
无论是这些流行的动态化方案,还是WebView Hybrid方案,亦或是之前广泛流行的JSPatch,JSCore都在其中发挥了举足轻重的作用。作为一名iOS开发工程师,了解JSCore已经逐渐成为了必备技能之一。当前,美团移动客户端的组件库超过600个,多个移动项目的代码量达到百万行级别,每天有几百次的发版集成需求。这对移动持续集成提出更高的要求,而整个移动研发团队也迎来了新的机遇和挑战。
本文从美团App的业务复杂度出发,介绍构建稳定高效自动化的移动持续集成系统的最佳实践,在此基础上通过自研的静态准入方案进一步提升移动项目质量,通过全流程的托管方案提升移动开发生产力。美团外卖业务的快速发展对技术支撑提出了更高的要求:为线上用户提供高稳定的服务体验,保障全链路业务和系统高可用运行的同时,要提升多入口业务的研发速度,推进App系统架构的合理演化,进一步提升跨部门跨地域团队之间的协作效率。
本文主要介绍了多入口业务形态下的多端复用需要如何推动,有哪些前提条件与技术支撑,如何不影响现有业务进行平滑的架构迁移以及如何规避架构演进衍生出的副作用。12月4日,Apple CEO Tim Cook 和王兴共同出现在上海的一家老字号生煎店“大壶春”,现场用大众点评App体验了iOS 11新功能,包括用地图找店订座、用相机扫码点餐及Apple Pay付款等一条龙便利服务。
在WWDC上,大众点评App更进一步:Apple技术人员在“Create Great Customer Experience Using Wallet and Apple Pay”演讲中专门重点演示了如何用iPhone相机直接扫码点餐下单,并使用Apple Pay支付闭环的全流程。这背后的技术是怎么实现的呢?一直以来,如何能更高效地开发与维护页面是Android与iOS开发同学最主要的工作和最关心的问题。随着业务的不断发展,根据特定业务场景产生的定制化需求变得越来越多。
Shield是美团到店综合团队模块化UI界面解决方案,它不仅仅是一个Native(Android&iOS)的UI开发框架,还是到店综合团队基于自身复杂的业务场景沉淀出来的UI开发最佳实践。它具备高可复用、容易协同开发等特性,还包括后端动态配置、动态模块等一系列解决方案。
GitHub 上的项目地址:https://github.com/Meituan-Dianping/Shield。iPhone X 刘海机于9月13日发布,给科技小春晚带来一波高潮。作为开发人员却多出来一份忧虑,iPhone X 怎么适配?我们 App 的脑袋会不会也长一刘海出来?Tabbar 会不会被圆角?
本文就介绍了美团APP在iPhone X以及iOS 11上的适配工作。Hyperloop 是服务于美团客户端的组件发版、持续集成、App 打包构建、资源调度等各个环节的发布调度系统。名称起源于美国 Elon Musk 构想的 Hyperloop 超级高铁,象征着现代、简洁、高效。
Hyperloop 提供了一站式的平台,管理着美团 iOS 业务的超过 300 个组件和包括美团 iOS 客户端在内的4个App。接入 Hyperloop 系统后,开发同学可以通过 Hyperloop 来管理自己的项目,配置发版和打包所需要的步骤和检查项。开发完成时,用户只需要登录 Hyperloop 进行相关操作,Hyperloop 就会根据项目的配置去调用不同的步骤,上报每个步骤的状态,给出错误日志、状态通知等。网络优化对于App产品的用户体验至关重要,与公司的运营和营收息息相关。这里列举两个公开的数据:页面加载超过3秒,57%的用户会离开;Amazon页面加载延长1秒,一年就会减少16亿美金营收。
如何防止网络通信被劫持?如何提升用户页面打开速度?老板反馈页面打不开时你该怎么办?来听听美团客户端网络优化实践中的经验分享吧。性能问题是造成App用户流失的罪魁祸首之一。App的性能问题包括崩溃、网络请求错误或超时、响应速度慢、列表滚动卡顿、流量大、耗电等等。而导致App性能低下的原因有很多,除去设备硬件和软件的外部因素,其中大部分是开发者错误地使用线程、锁、系统函数、编程范式、数据结构等导致的。即便是最有经验的程序员,也很难在开发时就能避免所有导致性能低下的“坑”,因此解决性能问题的关键是在于能不能尽早地发现和定位这些“坑”。
美团外卖在实践中通过总结常见性能问题,并在学习了业内微信、360等性能监控技术原理后,开发了一套移动端性能监控解决方案——Hertz(赫兹)。ReactiveCocoa是一个函数响应式编程框架,它能让我们脱离Cocoa API的束缚,给我们提供另外一套编码的思路与可能性,它能在宏观层面上提升代码易读性与稳定性,让程序员写出富有“诗意”的代码,因此倍受业内推崇。
本文略过RAC基本概念与基础使用(有些技术点可以参考美团技术博客之前的几篇文章:RACSignal,冷信号与热信号系列,内存泄漏),着重介绍RAC数据流方面的内容,剖析RAC核心元素与RAC Operation在数据流中扮演的角色,并从数据流的角度切入,介绍RACComand与RACChannel。ReactiveCocoa中潜在的内存泄漏及解决方案
ReactiveCocoa是GitHub开源的一个函数响应式编程框架,目前在美团App中大量使用。用过它的人都知道很好用,也确实为我们的生活带来了很多便利,特别是跟MVVM模式结合使用,更是如鱼得水。
不过刚开始使用的时候,可能容易疏忽掉一些隐藏的细节,从而导致内存泄漏等问题。本文就带大家深入了解下ReactiveCocoa中隐藏的一些细节,帮助大家以更加正确的姿势使用ReactiveCocoa。