您的位置:首页 > 移动开发 > IOS开发

iOS9的新特性

2016-07-25 17:45 337 查看
    2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送。

   新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放。iOS 9加入了更多的新功能,包括更加智能的Siri,新加入的省电模式。iOS
9为开发者提供5000个全新的API。

这对于使用者来说固然是一个好消息,每一次版本更新带来的都是更多的便利和更全面的功能,接受新的系统固然会有一些不适应,新的系统也有可能会有一些缺陷,但是至少苹果在不断地更新,让我们体验更好的产品.
然而,对于我们开发者来说,这就不能说是一个好消息了,系统更新迭代,伴随的是我们需要快速的接受新的知识,掌握新的技巧,以及大量的修改我们的工程,不过也没办法,谁让我们是程序员呢,不更新自己就会被科技淘汰,相信很多朋友在这上面被坑过


iOS 9 时代开发者面临的最大的挑战和最急切的任务可能有两个方面,首先是如何利用和适配 iPad 的新的分屏多任务特性,其次是如何面对和利用 watchOS 2 来构建原生的手表 app。另外的新课题基本就都是现有框架的衍生和扩展,包括从单元测试扩展到 UI 测试,如何进一步占领和使用系统的通知中心及搜索页面,以及 Swift 2 的使用等。

可以说,经过了 iOS 7 和 iOS 8 连续两次重量级的变革和更新,对普通的 app 开发者来说,iOS 9 SDK 略归于缓和和平静,新的 SDK 在 API 和整体设计上并没有发生什么非常巨大的改变。开发者们也正可以利用这个机会喘息一下,尽快进一步熟悉和至少过渡到使用 iOS 8 SDK 的内容来构筑自己的 app (比如尝试使用 Size
Class 和 Presentation Controller 等),尽快提升自己的职业技能和制作的 app 的水平,并保证能跟上滚滚向前的 Apple 车轮,应该是今年 Cocoa 开发者们的主要任务。


Multitasking

这可以说是 iOS 9 最大的卖点了。多任务特性,特别是分屏多任务使得 iPad 真正变得像一个堪当重任的个人电脑。虽然在很早以前就已经有越狱插件能让 iPad 同时运行多个程序,但是 Apple 还是很谨慎地到 2015 年才在自己性能最为强劲的移动设备上实装这个功能。iOS 9 中的多任务分为三种表现形式,分别是临时调出的滑动覆盖 (Slide Over),视频播放的画中画模式 (Picture in Picture)
以及真正的同时使用两个 app 的分割视图 (Split View)。现在能运行 iOS 9 的设备中只有最新的 iPad Air 2 支持分割视图方式,但是相信随着设备的更新,分割视图的使用方式很可能成为人们日常使用 iPad 的一种主流方式,因此提早进行准备是开发者们的必修功课。

虽然第一眼看上去感觉要支持多任务的视图会是一件非常复杂的事情,但是实际上如果你在前一年就紧跟 Apple 步伐的话,就很简单了。滑动覆盖和分割视图的 app 会使用 iOS 8 引入的 Size Class 中的 Compact Width 和 Regular Height 的设定,配合上 AutoLayout 来进行布局。也就是说,如果你的 app 之前就是 iPhone 和 iPad 通用的,并且已经使用了
Size Class 进行布局的话,基本上你不需要再额外做什么事儿就已经能支持 iOS 9 的多任务视图了。
  视频 app 的画中画模式相对简单一些,如果你使用 
AVPlayerViewController
 或者 
AVPlayerLayer
 来播放视频的话,那什么都不用做就已经支持了。但如果你之前选择的方案是 
MPMoviePlayerController
 或者 
MPMoviePlayerViewController
 的话,你可能也需要今早迁移到
AVKit 的框架下来,因为 Media Player 将在 iOS 9 被标记为 deprecated 并不再继续维护。



下面是关于iOS9的适配方案

1. 限制HTTP协议,全部改用更安全的HTTPS

iOS9让所有的HTTP默认使用了HTTPS,原来的HTTP协议传输都改成TLS1.2协议进行传输。直接造成的情况就是App发请求的时候弹出网络无法连接。

HTTPS和HTTP的区别在于哪里呢?
举个简单的栗子:原来的 HTTP 是塑料水管,容易被戳破;那么如今新设计的 HTTPS 就像是在原有的塑料水管之外,
再包一层金属水管。一来,原有的塑料水管照样运行;二来,用金属加固了之后,不容易被戳破。

Apple让你的HTTP采用SSL/TLS协议,就是让你从HTTP转到HTTPS.
不使用SSL/TLS的HTTP通信,就是不加密的通信!

所有信息明文传播,带来了三大风险:
窃听风险(eavesdropping):第三方可以获知通信内容。
篡改风险(tampering):第三方可以修改通信内容。
冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS协议是为了解决这三大风险而设计的:
所有信息都是加密传播,第三方无法窃听。
具有校验机制,一旦被篡改,通信双方会立刻发现。
配备身份证书,防止身份被冒充。

在 Info.plist 中声明,倒退回不安全的网络请求依然能让App访问指定http,甚至任意的http(苹果不建议这么做):



需要添加的节点

NSAppTransportSecurity - NSAllowsArbitraryLoads

这个子节点的意思是:是否仍然允许加载?! 设为YES的话就将禁用了AppTransportSecurity转而使用用户自定义的设置,这个问题就解决了。
果断让公司升级HTTPS服务器,保障数据安全,升级方法请点我

2. Bitcode

应该有朋友在真机调试的时候发现在使用微博微信等第三方SDK的时候,会提示报错,
XXXX’ does not contain bitcode. You must rebuild it with bitcode enabled
(Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor,
or disable bitcode for this target. for architecture arm64

Xcode默认开启bitcode模式,bitcode的理解应该是把程序编译成的一种过渡代码,然后苹果再把这个过渡代码编译成可执行的程序。bitcode也允许苹果在后期重新优化我们程序的二进制文件,可以直接理解为APP瘦身
解决方式:
某些第三方库还不支持bitcode,我们只能等待库的开发者升级了此项功能.(这个是我们所不能掌握的,嘿嘿)
直接禁用bitcode,禁用的方法就是找到如下配置,选为NO.注意:iOS中bitcode是默认YES,watchOS中bitcodes是不让改的必须为YES。



选为NO禁用

3. 企业级分发

在iOS8只是弹出一个窗问你是否需要让手机信任这个应用,但是在iOS9却直接禁止,如果真的想信任需要自己去手动开启。类似于Mac系统从未知开发者处下载的dmg直接打不开,然后要到系统偏好设置的安全性与隐私手动打开。

解决方式:
设置-->通用--->描述文件 自行添加信任.



选择描述文件



添加信任

4. URL scheme

URL scheme一般使用的场景是应用程序有分享或跳其他平台授权的功能,分享或授权后再跳回来.

在iOS8并没有做过多限制,但是iOS9需要将你要在外部调用的URL scheme列为白名单,才可以完成跳转.

如果iOS9没做适配 会报如下错误 :
canOpenURL: failed for URL : "[mqzone://qqapp](mqzone://qqapp)"  - error: "This app is not allowed to query for scheme mqzone"

例如在实现第三方登录时,不能直接跳转到相应的app直接获取权限.

解决方式为:
设置应用白名单 否则不能直接关联上你手机里的应用
在info.plist中加入
<key>LSApplicationQueriesSchemes</key> <array>
<!-- 微信 URL Scheme 白名单-->
<string>wechat</string>
<string>weixin</string>
<!-- 新浪微博 URL Scheme 白名单-->
<string>sinaweibohd</string>
<string>sinaweibo</string>
<string>sinaweibosso</string>
<string>weibosdk</string>
<string>weibosdk2.5</string>
<!-- QQ、Qzone URL Scheme 白名单-->
<string>mqqapi</string>
<string>mqq</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqqconnect</string>
<string>mqqopensdkdataline</string>
<string>mqqopensdkgrouptribeshare</string>
<string>mqqopensdkfriend</string>
<string>mqqopensdkapi</string>
<string>mqqopensdkapiV2</string>
<string>mqqopensdkapiV3</string>
<string>mqzoneopensdk</string>
<string>wtloginmqq</string>
<string>wtloginmqq2</string>
<string>mqqwpa</string>
<string>mqzone</string>
<string>mqzonev2</string>
<string>mqzoneshare</string>
<string>wtloginqzone</string>
<string>mqzonewx</string>
<string>mqzoneopensdkapiV2</string>
<string>mqzoneopensdkapi19</string>
<string>mqzoneopensdkapi</string>
<string>mqzoneopensdk</string>
<!-- 支付宝  URL Scheme 白名单-->
<string>alipay</string>
<string>alipayshare</string></array>


5. statusbar

以前我们为了能够实时的控制顶部statusbar的样式,可能会在喜欢使用
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]
[[UIApplication sharedApplication]setStatusBarHidden:YES];

但是这么做之前需要将 info.plist 里面加上View controller-based status bar appearance BOOL值设为NO,就是把控制器控制状态栏的权限给禁了,用UIApplication来控制。

但是这种做法在iOS9不建议使用了,建议我们使用把那个BOOL值设为YES,然后用控制器的方法来管理状态栏比如。
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}

6. 字体

iOS9中,中文系统字体变为了专为中国设计的“苹方”,字体有轻微的加粗效果,并且最关键的是字体间隙变大了!

所以很多原本写死了width的label可能会出现“...”的情况。
包括在很多时候我们自动计算行高行宽的时候出现偏差,导致一些不可知的错误

解决方式:
CGSize size = [title sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}];
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));

加上向上取整 ceilf()就能解决了.

7. AFNetworking

为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API,建议立即升级到基于 NSURLSession 的API的AFNetworking的版本。

具体解决方案在我这一篇文档中有详细说明AFNetworking 3.0的迁移,如果有感兴趣的朋友可以看看.

8.UIAlertController

这其实不算是新特性,只是在iOS9版本,废弃了UIAlertView,Action Sheets,因此我们必须要掌握UIAlertController的使用,现在为了适配iOS7,很多项目还是会继续使用UIAlertView,Action Sheets,但是下几个版本应该就会慢慢不用了.

这里我只列出简单的使用方法,具体的方式有一个博客详细说明.
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"标题"
message:@"这个是UIAlertController的默认样式" preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];

UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:nil];

[alertController addAction:cancelAction];

[alertController addAction:okAction];

[self presentViewController:alertController animated:YES completion:nil];

9.堆栈视图(UIStackView)

相信很多朋友还没有发现这个好东西,UIStackView提供了一个高效的接口用于平铺一行或一列的视图组合。对于嵌入到StackView的视图,你不用再添加自动布局的约束了。Stack View管理这些子视图的布局,并帮你自动布局约束。也就是说,这些子视图能够适应不同的屏幕尺寸。
举个栗子:

以前我们如果想要在xib上横向布局三个按钮,让三个按钮距离相等,我们可能需要再加三个View,将button放在View上面,再将View布局三等分,类似于



三个按钮

这样子是不是比较麻烦呢?有了Stack View



StackView
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS9