2015是移动技术快速发展的一年,基于Apple平台的技术也发展迅速。iPhone6s/iPhone6s plus、iPad pro等新设备发布,iOS9、watchOS 2、OS X EL Capitan、tvOS等新的平台,Swift开源及Swift 2发布,React Native、JSPatch等开源社区也一片繁荣。但同时XcodeGhost等后门事件对于我们关注iOS安全也敲响了警钟。
PS:本文不是一篇技术深入的文章,只是对技术的回顾,如对某一技术点感兴趣,可详细参考对应的推荐链接。如有遗漏的地方,欢迎评论中补充~
(一)iOS App适配64位
2015年开年,让所有iOS开发者头疼的一件事就是苹果所有app自2015年2月1号起,所有提交审核的App必须适配64位,目的是能充分利用64位ARM处理器的高性能支持,让应用能够拥有更为极致的体验。(iPhone5s开始的A7处理器开始支持64位CPU)
对于App适配64位Apple也给出了方法:
- Architectures支持
在Xcode Building Setting中Architectures为 Standard architectures(include 64-bit)。注意:支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。这也是支持64位后App体积变大的主要原因。
参考,ARM指令集对应的硬件
ARMv8/ARM64
iPhone 6s(Plus),iPhone 6(Plus), iPhone 5s, iPad Air(2), Retina iPad Mini(2,3)
ARMv7s
iPhone 5, iPhone 5c, iPad 4
ARMv7
iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini
数据类型导致的变化
导致问题:
在32位CPU和64位CPU上整型和浮点型的字结数和字节对齐的方式都不一样,从而导致App如果按照32-bit的写法去适配64位会出现很多溢出、移位等内容问题。同时适配64位可能会导致一些其它问题。
1)增加内存压力。
2)64位到32位数据之间的相互转化,增加了一些性能开销。
3)计算可能产生不同的结果。
4)当把一个值从大的数据类型拷贝到小的数据类型,数据可能被截断,如NSInteger -> int。
解决办法:
解决办法需要遵循数据类型的编码规范,苹果也给出了官方的建议及规范,同时也可以参考,在这里也就不详细展开,毕竟适配64位在当前应不算是问题。方法调用导致的变化
基于32-bit的CPU和基于64-bit上的CPU有不同数量的寄存器,在方法调用上有不同的协议。因此32位和64位在汇编层级上是不同的。如果我们在程序中不使用汇编,调用协议很少会遇到。第三方库支持
64位适配中其实最坑的是第三方库的支持,对于即时更新的第三方库还好(如AFNetworking,SDWebImage),但是对于一些更新较慢或者已经停止更新的Framework(如wax,作者已经停止维护),那就比较坑。当初在公司项目中,需要提前适配64位,记得当初就一直联系新浪微博SDK开发希望能够极早支持64位,我个人在公司中开发的LoginSDK组件也第一时间对64位给予了支持。
(二) WWDC 2015
WWDC 2015发布了三大平台的更新iOS 9、watch OS 2、OS X EL Capitan,同时发布了Apple Music。
iOS 9
主要更新以下亮点
功能角度:
- Siri语音助手智能化,性能提升40%。
- Apple News新闻聚合App发布,但很遗憾中国内地被禁用。
- Wallet应用取代Passbook。
- iOS自带应用更新:引入Transit通勤路线功能、记事本可以云共享、carplay可自动连接、carplay可自动连接等。
- 续航优化,支持低功耗模式,平均续航能力可延长3个小时。
- 更新iOS 9剩余容量只需1.3GB,之前更新至少需要4GB以上。
7)iPad引入双屏模式。
技术角度
-
3D Touch
目前支持3D Touch的设备只有 iPhone 6s 和 iPhone 6s Plus。
- Pressure Sensitivity:压力灵敏度,可以和绘画类及其它创作型软件结合使用,如根据压力的大小来改变笔触/画线的粗细值。主要为UITouch类增加了一些新属性,例如
estimatedProperties
(触摸属性),updatedProperties
(触摸对象更新)等,新增的API,主要集中在获取X/Y坐标时的精度部分,如- PreciseLocationInView:
,- PrecisePreviousLocationInView:
等。需要特别注意的是UIForceTouchCapability
,使用功能前,必须进行功能可用性检测。 - Peek and Pop:新引入的手势,主要可以让用户预览内容,甚至进行操作。
- Home Screen Quick Actions:快捷菜单,涉及API主要是:
UIApplicationShortcutItem
。ShortcutItem分了2种类型:静态 & 动态。其中静态方式在info.plist中进行配置;动态则通过UIApplicationShortcutItem
等API进行动态配置处理。系统默认会优先展示静态的Actions。若App安装后从未打开时,则默认只会展示静态Actions。
-
Search
iOS 9中用户可以更容易搜索到他想要的内容(不管是在App还是在web上),增强了Search的功能,对应的技术点主要涉及3个API。
- NSUserActivity:
NSUserAcitivity
在介绍 iOS8 的Handoff
时引入,iOS9 中允许对这些 activities 进行搜索。你可以提供元数据给这些 activities, 这意味着 Spotlight 可以索引这些内容。 - CoreSpotlight.framework:新增framework,提供了增、删、改、查等搜索API,可以索引App的内容。
- Web Markup:Web内容可被搜索。iOS 9支持灵活的通用无缝链接(universal links介绍),用户来你的网站或直接到您的应用程序,不管你是否已经安装了App。
详细可以学习Apple Develop文档。
Multitasking
-
Slide Over
Slide Over适用于iPad air以及iPad mini2以后的所有机型。iPad简单分屏功能,左侧原来的App占据屏幕的70%面积,右侧是30%,右侧App出来后进入活跃状态,左侧的App,所有基本活动将中断,但是并没有进入后台。
-
Split View
Slide Over和Split View可以互相转换,只要用户点击一下Slide Over界面旁边的白色竖条按钮。目前Split View只支持iPad中性能最高的iPad Air 2。两个app并列呈现在屏幕上,其中左侧的app是primary app,右侧的app是secondary app。用户可以滑动两个app之间的分界线,当分界线滑倒最左侧时,secondary app将变成primary app。
-
Picture in picture(PiP)
Pip允许你在退出App时,同时观看视频类的App,如下图所示:
Pip涉及AVKit、AV Foundation或WebKit等相关框架类的视频播放接口。
- AVKit框架提供了 AVPlayerViewController 类,它会为用户自动显示画中画按钮。如果你使用AVKit 支持PiP功能,但要退出特定的画中画视频,请将播放器视图控制器的 allowsPictureInPicturePlayback 属性设置为NO。
2)AVKit还提供了 AVPictureInPictureController 类,可以和AV Foundation 框架的 AVPlayerLayer 类一同使用。如果你想为视频播放提供自己的视图控制器和自定义用户界面,可使用这个方法。
3)同时WebKit框架提供了 WKWebView 类,它支持iOS 9的PiP功能。如果你使用WebKit支持PiP功能,但要退出特定视频的画中画。设定关联webView 实例的allowsPictureInPictureMediaPlayback属性为NO。
注意:如果你的App使用Media Player 框架播放视频,无论使用其框架中的MPMoviePlayerController或MPMoviePlayerViewController类,你必须迁移使用AVKit或AV Foundation。Media Player视频播放正式在iOS 9中弃用。
在iOS9中Multitasking支持一下机型:
详细Multitasking相关技术可参考Multitasking Apple Develop文档,
或者CocoaChina上的Multitasking翻译文档。
-
App thinning
iOS App瘦身一直是开发者关注的问题,iOS 9推出了App thinnig,包括三部分功能:slicing、on-demand resources、bitcode。可让你的iPhone能够腾出更多的剩余空间,在应用升级过程中使用更少的数据。
-
slicing
如下图所示:
slicing可以对应用进行分割,根据用户设备类型和屏幕分辨率的不同分发定制化下载包
,开发者只需要把完整应用包的内容上传到iTunes Connect即可。 bitcode
Bitcode是一个已编译程序的中间代码
。如果你上传到iTunes Connect里的应用包含bitcode的话,就可以被编译和链接到App Store。加入Bitcode可以让苹果在未来对你的应用二进制文件进行再次优化
,而不需要你向App Store提交新版本。
注意:对于iOS,bitcode是可选
的;对于watchOS,bitcode是必须
的;而Mac OS是不支持
bitcode。但是对于iOS App来说,如果你的App提供bitcode,那么App里的所有第三方框架都必须支持bitcode。我在公司内部开发的网易通行证LoginSDK登陆组件
也第一时间支持了bitcode,在适配bitcode前请确定是否第三方库支持,否则需要寻求对应开发者的帮助。-
on-demand resources
开发者可以把App初始化用不到的资源分类打包上传到AppStore,在用户使用的时候系统会根据资源标签在必要的时候调用资源,当某些资源不再使用的时候会被系统自动清除。如下图所示:
下载和管理按需加载资源是由操作系统完成的。app使用NSBundleResourceRequest来:
a) 请求获取按需加载资源。
b) 通知操作系统某些资源不再使用。
c) 更新下载的优先级。
d) 追踪下载的进度。
e) 检查存储空间不足的通知。
当已下载的某些资源不再使用时,可以用NSBundle中的方法来设置保存优先级。
详细on-demand resources介绍可以参考Apple Develop on-demand resources guide。
其它
a) 新增3种的App Extension Points:Network、Safari、Spotlight。
b) 新增Contacts Framework,与此同时废除AddressBookUI Framework。
c) Watch Connectivity,由于watchOS 2的架构变化,需要这么一个东西来对iPhone和Watch进行双向通信。
d) UIKit新增,如UIStackView。
e) 新增Safari Services Framework。
f) 游戏方面新增了更多的Api,涉及GameplayKit、Model I/O Framework、MetalKit三方框架。
g) iOS 9.1新增UITouch对Apple Pencil API的支持,详细参考。适配iOS9
关于适配iOS 9就不一一展开介绍,主要涉及到以下几个点,详细可以参考Github iOS9适配详解
a) 网络适配ATS:改用更安全的HTTPs。
b) 更灵活的后台定位。
c) 企业级分发,默认不能安装,需要在设置里点击“信任”。
d) 适配Bitcode。
e) URL Scheme 适配引入白名单概念,打开第三方App需要注册在URL中注册白名单。
f) iOS9更改了字体,字体间隙变大导致 UI 显示异常。iOS 9.2发布。
watchOS 2
watchOS 2相对于上个版本做了很多改进。watchOS 2 的主要变化跟早期的 iPhone 差不多,那就是增加了本地化的 app。苹果向开发者提供了全新的 WatchKit,也就是说从 watchOS 2 开始,应用开发者可以基于 Apple Watch 开发一些应用,应用可以通过 API 调用数码表冠、麦克风甚至 Tapic Engine 等功能,应用获取的健康数据也可以直接在 Apple Watch 上进行处理,不需要再传输到 iPhone。如下图所示:
同时watchOS 2新增了 ClockKit Framework,可以将你的Watch App相关信息同时显示在表的钟面上。
关于watchOS 2的更多介绍可以参考Apple Develop文档
OS X EL Capitan
WWDC 2015同时发布了OS X EL Capitan版本。El Capitan从窗口管理、内置app和搜索等方面优化了Mac体验,并提升了性能,令启动和切换app、打开PDF文件以及访问电子邮件等日常事务都变得更加快速。
关于OS X EL Capitan的技术点详细讲解也超出了本文的范围,详细可以参考 Apple Develop文档。
(三)Swift
2015最让人兴奋的事之一莫过于Swift 2.0发布及Swift宣布开源,Swift社区及开源库也发展迅速。
- Swift 2.0
WWDC 2015发布了Swift 2.0版本,苹果针对此门语言做了很多改进及抱有很多的期望,同时承诺年底前开放Swift的源码。
Swift 2.0主要引入以下新特性:
- 增加
guard
语句。 - 增加异常处理机制。
- 协议可扩展。
- 打印语句的语法改变。
- 增加
available
检查。 - do-while语句重命名。
- 增加
defer
关键字。
详细介绍可参考。
Swift 3.0
3.0版本将在2016年秋天发布。
Swift 3.0承诺会保持 ABI(Application Binary Interface)的稳定性:成功保持 ABI 稳定性意味着,即便源代码语言发生了变化,用以后版本的 Swift 开发的应用程序和编译库能在二进制层次上和 Swift 3.0 版本的应用程序和编译库相互调用。
1)Swift API优化,废弃冗长的Objective-C式风格。
2)废弃函数柯里化声明(苹果认为柯里化声明语法太过复杂)。
3)废弃var形式的行参。
4)废弃++ & --运算符(C语言遗留)。5.废弃for-loops(C语言遗留)Swift开源
2015年12月4号Swift宣布开源。苹果开源了Swift 三大库。
- Swift Complier & Standard Library(Swift编译器&基础库)
编译器主要负责Swift的语法解析&语义分析,将Swift语言编译成高效可执行的机器代码,同时前端提供比如Swift语法高亮,代码自动补全等一些便捷的工具(想读懂这块源码要有编译器的基础知识,词法分析、语法分析......)。Swift基础库主要包括各种数据类型,如基础类型、协议、方法、集合及集合所遵循的协议和操作数据类型的基础算法。Swift的基础库底层是以Swift来实现的,更多的功能细分可以参考Swift官方博客-编译器&基础库基本介绍。 - Swift Package Manger(Swift包管理器)
Swift主要是用来管理和共享Swift代码的工具,与Swift build system协调来自动处理Swift的下载,链接及依赖处理。 ( max howell 与mattt参与开发,mattt竟然跳槽去了苹果)。同时苹果官方也给出了一个 demo来教你怎样写一个Library Package,同时处理各个Packages之间的依赖(demo :example-package-dealer ,感兴趣的同学可以动手写下)。 - Swift Core Library(Swift核心库)
Swift核心库提供了比基础库更高级的功能,基于 Swift 标准库。这些库提供的函数有:定位,网络,多线程,单元测试,数据持久化,文件系统访问,用户参数等功能。Swift核心库的功能将会在Swift 3.0发布,个人预计Swift 3.0将会在2016 WWDC发布。目前核心库开源了三个库Foundation、libdispatch(GCD)、XCTest(单元测试框架),这三大框架也将会随3.0发布,目前处在早期开发阶段。
(四)tvOS
Apple TV在国内没有销售,随着近年Apple TV新品的发布,全新的第四代Apple TV 采用A8 芯片,性能更胜以往,因此开发者可为电视打造引人入胜的游戏和定制内容的 app。同时,Apple也发布了tvOS系统,该系统也是基于iOS系统,也内置了App Store。国外Netflix、HBO、Hulu等视频平台均已推出根据tvOS重新制作了对应版本的app,
同时在开源社区上许多开源组件也对tvOS给予了支持。
详细的tvOS开发文档 参考
及 tvOS human-interface-guidelines
如AFNetworking支持iOS, OS X, watchOS, and tvOS全平台。
未来关于Apple TV在国内的销售仍然不明,不过个人对tvOS的发展还是很看好的。
(五)XCodeGhost
2015令人值得关注的一件事是XCodeGhost,同时也给iOS开发者对于App安全敲响了警钟。
Xcode Ghost是通过Xcode注入,于2015年9月被发现。它的初始传播途径主要是通过非官方下载的 Xcode 传播,通过 CoreService 库文件进行感染。当应用开发者使用带毒的Xcode工作时,编译出的App 都将被注入病毒代码,从而产生众多带毒APP。用户在iOS设备上安装了被感染的APP后,设备在接入互联网时APP会回连恶意URL地址init.icloud-analysis.com,并向该URL上传敏感信息(如设备型号、iOS 版本)。
苹果第一时间也对感染XCodeGhost的App下架,
阿里工程师也针对XCodeGhost做了逆向分析,可以参考XCodeGhost逆向分析。
(六)开源项目
React Native
Learn once, write anywhere。Facebook 在 React.js Conf 2015 大会上推出了基于 JavaScript 的开源框架React Native
。React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用。在 JavaScript 中用 React 抽象操作系统原生的 UI 组件,代替 DOM 元素来渲染等。
React Native 使你能够使用基于 JavaScript 和 React 一致的开发体验在本地平台上构建世界一流的应用程序体验。React Native 把重点放在所有开发人员关心的平台的开发效率上——开发者只需学习一种语言就能轻易为任何平台高效地编写代码。Facebook 在多个应用程序产品中使用了 React Native,并将继续为 React Native 投资。JSPatch
JSPatch 只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。详细的JSPatch原理可以参考。Swift
1)Kingfisher
是一个异步下载和缓存图片的库,SDWebImage的Swift 实现版。
2)Perfect
Swift的跨平台能力值得关注,Perfect 是一个使用Swift编程语言开发Web和其他REST服务的框架,其主要目标是简化需要后端服务器软件的移动应用的开发,使开发人员可以使用同一种语言进行客户端和服务端开发。
3)更多...AFNetworking 3.0
AFNetworking在3.0版本中删除了基于 NSURLConnectionAPI的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。YYKit
YYKit 是一组庞大、功能丰富的 iOS 组件。
为了尽量复用代码,这个项目中的某些组件之间有比较强的依赖关系。包含以下组件:
YYModel — 高性能的 iOS JSON 模型框架。
YYCache — 高性能的 iOS 缓存框架。
YYImage — 功能强大的 iOS 图像框架。
YYWebImage — 高性能的 iOS 异步图像加载框架。
YYText — 功能强大的 iOS 富文本框架。
YYKeyboardManager — iOS 键盘监听管理工具。
YYDispatchQueuePool — iOS 全局并发队列管理工具。
YYAsyncLayer — iOS 异步绘制与显示的工具。
YYCategories — 功能丰富的 Category 类型工具库。
(七) 更多其他技术点
后面几点展开太多,也是移动开发中值得关注的永恒主题,在此就不一一列举,欢迎补充~。
移动架构
跨平台
数据持久化
App性能优化
APP瘦身
页面布局
动效开发
参考链接:
苹果官方适配64位参考方法
2015移动开发白皮书·IOS篇
iOS 9/新OS X/watch OS成主角 秋季正式推出
iOS 9分屏多任务
iOS 9 App thinning介绍
Facebook与Twitter提供的Apple tvOS SDKs支持登录与分析功能
React Native 官方文档中文版
jspatch平台