2015移动开发之iOS回顾

作者: eaa1d39d22a8 | 来源:发表于2016-01-11 10:57 被阅读3482次

    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

    iOS 9发布
    主要更新以下亮点
    功能角度
    1. Siri语音助手智能化,性能提升40%。
    2. Apple News新闻聚合App发布,但很遗憾中国内地被禁用。
    3. Wallet应用取代Passbook。
    4. iOS自带应用更新:引入Transit通勤路线功能、记事本可以云共享、carplay可自动连接、carplay可自动连接等。
    5. 续航优化,支持低功耗模式,平均续航能力可延长3个小时。
    6. 更新iOS 9剩余容量只需1.3GB,之前更新至少需要4GB以上。
      7)iPad引入双屏模式。

    技术角度

    1. 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。
    1. 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文档
    1. Multitasking
    • Slide Over


      iOS9 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。


      iOS9 Split View
    • Picture in picture(PiP)
      Pip允许你在退出App时,同时观看视频类的App,如下图所示:


      Pip

      Pip涉及AVKit、AV Foundation或WebKit等相关框架类的视频播放接口。

    1. 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 框架播放视频,无论使用其框架中的MPMoviePlayerControllerMPMoviePlayerViewController类,你必须迁移使用AVKit或AV Foundation。Media Player视频播放正式在iOS 9中弃用。

    在iOS9中Multitasking支持一下机型:

    iPad Multitasking支持机型
    详细Multitasking相关技术可参考Multitasking Apple Develop文档
    或者CocoaChina上的Multitasking翻译文档
    1. App thinning
      iOS App瘦身一直是开发者关注的问题,iOS 9推出了App thinnig,包括三部分功能:slicing、on-demand resources、bitcode。可让你的iPhone能够腾出更多的剩余空间,在应用升级过程中使用更少的数据。
    • slicing
      如下图所示:

      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,在用户使用的时候系统会根据资源标签在必要的时候调用资源,当某些资源不再使用的时候会被系统自动清除。如下图所示:


      on-demand resources

    下载和管理按需加载资源是由操作系统完成的。app使用NSBundleResourceRequest来:
    a) 请求获取按需加载资源。
    b) 通知操作系统某些资源不再使用。
    c) 更新下载的优先级。
    d) 追踪下载的进度。
    e) 检查存储空间不足的通知。
    当已下载的某些资源不再使用时,可以用NSBundle中的方法来设置保存优先级。

    详细on-demand resources介绍可以参考Apple Develop on-demand resources guide

    1. 其它
      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的支持,详细参考

    2. 适配iOS9
      关于适配iOS 9就不一一展开介绍,主要涉及到以下几个点,详细可以参考Github iOS9适配详解
      a) 网络适配ATS:改用更安全的HTTPs。
      b) 更灵活的后台定位。
      c) 企业级分发,默认不能安装,需要在设置里点击“信任”。
      d) 适配Bitcode。
      e) URL Scheme 适配
      引入白名单概念,打开第三方App需要注册在URL中注册白名单。
      f) iOS9更改了字体,字体间隙变大导致 UI 显示异常。

    3. iOS 9.2发布。

    watchOS 2

    watchOS 2相对于上个版本做了很多改进。watchOS 2 的主要变化跟早期的 iPhone 差不多,那就是增加了本地化的 app。苹果向开发者提供了全新的 WatchKit,也就是说从 watchOS 2 开始,应用开发者可以基于 Apple Watch 开发一些应用,应用可以通过 API 调用数码表冠、麦克风甚至 Tapic Engine 等功能,应用获取的健康数据也可以直接在 Apple Watch 上进行处理,不需要再传输到 iPhone。如下图所示:

    watchOS 2架构演变
    同时watchOS 2新增了ClockKit Framework,可以将你的Watch App相关信息同时显示在表的钟面上。
    关于watchOS 2的更多介绍可以参考Apple Develop文档

    OS X EL Capitan

    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主要引入以下新特性:
    1. 增加guard语句。
    2. 增加异常处理机制。
    3. 协议可扩展。
    4. 打印语句的语法改变。
    5. 增加available检查。
    6. do-while语句重命名。
    7. 增加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 三大库。

    1. Swift Complier & Standard Library(Swift编译器&基础库
      编译器主要负责Swift的语法解析&语义分析,将Swift语言编译成高效可执行的机器代码,同时前端提供比如Swift语法高亮,代码自动补全等一些便捷的工具(想读懂这块源码要有编译器的基础知识,词法分析、语法分析......)。Swift基础库主要包括各种数据类型,如基础类型、协议、方法、集合及集合所遵循的协议和操作数据类型的基础算法。Swift的基础库底层是以Swift来实现的,更多的功能细分可以参考Swift官方博客-编译器&基础库基本介绍。
    2. Swift Package Manger(Swift包管理器
      Swift主要是用来管理和共享Swift代码的工具,与Swift build system协调来自动处理Swift的下载,链接及依赖处理。 ( max howell 与mattt参与开发,mattt竟然跳槽去了苹果)。同时苹果官方也给出了一个 demo来教你怎样写一个Library Package,同时处理各个Packages之间的依赖(demo :example-package-dealer ,感兴趣的同学可以动手写下)。
    3. Swift Core Library(Swift核心库
      Swift核心库提供了比基础库更高级的功能,基于 Swift 标准库。这些库提供的函数有:定位,网络,多线程,单元测试,数据持久化,文件系统访问,用户参数等功能。Swift核心库的功能将会在Swift 3.0发布,个人预计Swift 3.0将会在2016 WWDC发布。目前核心库开源了三个库Foundation、libdispatch(GCD)、XCTest(单元测试框架),这三大框架也将会随3.0发布,目前处在早期开发阶段。

    (四)tvOS

    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平台

    相关文章

      网友评论

      本文标题:2015移动开发之iOS回顾

      本文链接:https://www.haomeiwen.com/subject/uzqqkttx.html