iOS9的新特性以及适配方案

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

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


    iOS9的新特性以及适配方案_第1张图片
    选为NO禁用

3. 企业级分发

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

  • 设置-->通用--->描述文件 自行添加信任.
iOS9的新特性以及适配方案_第2张图片
选择描述文件

iOS9的新特性以及适配方案_第3张图片
添加信任

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中加入
LSApplicationQueriesSchemes     
    
wechat    
weixin    
   
sinaweibohd    
sinaweibo    
sinaweibosso    
weibosdk    
weibosdk2.5    
   
mqqapi    
mqq    
mqqOpensdkSSoLogin   
mqqconnect   
mqqopensdkdataline   
mqqopensdkgrouptribeshare   
mqqopensdkfriend   
mqqopensdkapi   
mqqopensdkapiV2   
mqqopensdkapiV3   
mqzoneopensdk   
wtloginmqq    
wtloginmqq2    
mqqwpa    
mqzone    
mqzonev2    
mqzoneshare    
wtloginqzone    
mqzonewx   
mqzoneopensdkapiV2   
mqzoneopensdkapi19   
mqzoneopensdkapi   
mqzoneopensdk    
    
alipay    
alipayshare```

###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的迁移**](http://www.jianshu.com/p/0ab3ffa9c5f5),如果有感兴趣的朋友可以看看.

###8.UIAlertController
这其实不算是新特性,只是在iOS9版本,废弃了UIAlertView,Action Sheets,因此我们必须要掌握UIAlertController的使用,现在为了适配iOS7,很多项目还是会继续使用UIAlertView,Action Sheets,但是下几个版本应该就会慢慢不用了.
这里我只列出简单的使用方法,具体的方式有一个[博客](http://www.cocoachina.com/ios/20141126/10320.html)详细说明.

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布局三等分,类似于
![三个按钮](http://upload-images.jianshu.io/upload_images/1149840-0e1f36350cc5bd99.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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

![StackView](http://upload-images.jianshu.io/upload_images/1149840-745fec18805b7d07.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
有了这个玩意儿,整个过程会简化很多,这里我也不具体说明如何使用了,因为我也在摸索中,[详细介绍博客](http://www.cocoachina.com/ios/20150820/13118.html).

以上就是我所总结的有关于iOS9的新特性以及适配方案,可能还会有一些遗漏或者错误的地方,欢迎大家指出和补充,知识只有交流才能进步,让我们一起成长,一起学习,一起提高自己!

如果觉得文章对你有帮助的话,请点赞噢!谢谢.

你可能感兴趣的:(iOS9的新特性以及适配方案)