iOS 9 适配中出现的坑

1、NSAppTransportSecurityios

iOS9让全部的HTTP默认使用了HTTPS,原来的HTTP协议传输都改为TLS1.2协议进行传输。直接形成的状况就是App发请求的时候弹出网络没法链接。解决办法就是在项目的info.plist 文件里加上以下节点:git

blob.png

NSAppTransportSecurity - NSAllowsArbitraryLoads
github

这个子节点的意思是:是否容许任性的加载?! 设为YES的话就将禁用了AppTransportSecurity转而使用用户自定义的设置,这个问题就解决了。web

上面说是苹果限制了HTTP协议,可是也并非说全部的HTTPS都能完美适配iOS9了。算法

举个栗子,从app内起webView加载https的网页。新建个项目写几行起网页的代码数组

1
2
3
4
5
6
7
8
9
10
11
12
- (void)loadView{
     UIWebView *web = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
     self.view = web;
}
- (void)viewDidLoad {
     [ super  viewDidLoad];
      
     UIWebView *web = (UIWebView *)self.view;  //董铂然
     NSURL *url = [NSURL URLWithString:@ "https://github.com/" ];
     NSURLRequest *request = [NSURLRequest requestWithURL:url];
     [web loadRequest:request];
}

中间的url就是咱们想要加载的https地址,用https://baidu.com/ 和 https://github.com/ 分别试一下,结果不一样xcode

blob.png

blob.png

github的网页能打开,百度的网页打不开,下面打印了一行log浏览器

1
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

缘由是苹果的说首先必需要基于TLS 1.2版本协议。而后证书的加密的算法还须要达到SHA256或者更高位的RSA密钥或ECC密钥,若是不符合,请求将被中断并返回nil.安全

在浏览器中是能够直接查看这个网站的加密算法的,先点绿锁再点证书信息。网络

blob.pngblob.pngblob.png
从右边两张图能够看出,github带RSA加密的SHA-256符合苹果的要求,因此才能够展现。

针对百度的状况能够在info.plist中配置以下,若是网站引用的比较多应该是须要针对每一个网站进行配置。

blob.png

NSAppTransportSecurity,NSExceptionDomains,NSIncludesSubdomains,NSExceptionRequiresForwardSecrecy,NSExceptionAllowInsecureHTTPLoads 写在下面便于复制。

其中的ForwardSecrecy理解为超前的密码保护算法,在官方里有写,一共是11种。配置完毕百度能够访问。

blob.png

blob.png

2、Bitcode

bitcode的理解应该是把程序编译成的一种过渡代码,而后苹果再把这个过渡代码编译成可执行的程序。bitcode也容许苹果在后期从新优化咱们程序的二进制文件,有相似于App瘦身的思想。

用了xcode7的编译器编译以前没问题的项目可能会出现下列报错。

1
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

问题的缘由是:某些第三方库还不支持bitcode。要否则是等待库的开发者升级了此项功能咱们更新库,要不就是把这个bitcode禁用。

禁用的方法就是找到以下配置,选为NO.(iOS中bitcode是默认YES,watchOS中bitcodes是不让改的必须YES。)

blob.png



3、设置信任

这一条只和企业级应用或inhose 有关,和AppStore渠道的应用无关。

在iOS8只是弹出一个窗问你是否须要让手机信任这个应用,可是在iOS9却直接禁止,若是真的想信任须要本身去手动开启。相似于Mac系统从未知开发者处下载的dmg直接打不开,而后要到系统偏好设置的安全性与隐私手动打开。 下图展现左边iOS8,右边iOS9

blob.png

blob.png

用户须要去 设置---》通用---》描述文件 里面自行添加信任。

这种问题的处理方法也就两种:1.提早周知暂时不要升级iOS9  2.大可能是公司员工使用的企业级应用,群发一个指导邮件。 

4、字体

iOS8中,字体是Helvetica,中文的字体有点相似于“华文细黑”。只是苹果手机自带渲染,因此看上去可能比普通的华文细黑要美观。iOS9中,中文系统字体变为了专为中国设计的“苹方” 有点相似于一种word字体“幼圆”。字体有轻微的加粗效果,而且最关键的是字体间隙变大了!

因此不少本来写死了width的label可能会出现“...”的状况。

iOS8

blob.png


iOS9 蛋疼

blob.png


上面这两张图也能够直观的看出同一个界面,同一个label的变化。

因此为了在界面显示上不出错,就算是固定长度的文字也仍是建议使用sizetofit 或者ios向上取整 ceilf() 或者提早计算

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

5、URL scheme

URL scheme通常使用的场景是应用程序有分享或跳其余平台受权的功能,分享或受权后再跳回来。

在iOS8并无作过多限制,可是iOS9须要将你要在外部调用的URL scheme列为白名单,才能够完成跳转

若是iOS9没作适配 会报以下错误

1
canOpenURL: failed  for  URL :  "mqzone://qqapp"  - error:  "This app is not allowed to query for scheme mqzone"

具体的解决方案也是要在info.plist中设置 LSApplicationQueriesSchemes 类型为数组,下面添加全部你用到的scheme

blob.png

6、statusbar

这个还好只是报一个警告,若是就是无论他,也不会出现问题。

1
: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

之前咱们为了可以实时的控制顶部statusbar的样式,可能会在喜欢使用

1
2
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]
[[UIApplication sharedApplication]setStatusBarHidden:YES];

可是这么作以前须要将 info.plist 里面加上View controller-based status bar appearance  BOOL值设为NO,就是把控制器控制状态栏的权限给禁了,用UIApplication来控制。可是这种作法在iOS9不建议使用了,建议咱们使用吧那个BOOL值设为YES,而后用控制器的方法来管理状态栏好比。

1
2
3
4
- (UIStatusBarStyle)preferredStatusBarStyle
{
     return  UIStatusBarStyleLightContent;
}

点进头文件能够验证刚才说法:

1
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden NS_DEPRECATED_IOS(2_0, 9_0,  "Use -[UIViewController prefersStatusBarHidden]" );

7、didFinishLaunchingWithOptions

若是运行的时候报下列错误,那就是你的didFinishLaunchingWithOptions写的不对了

1
***** Assertion failure  in  -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m:3294**

iOS9不容许在didFinishLaunchingWithOptions结束了以后尚未设置window的rootViewController。 也许是xcode7的编译器自己就不支持。

解决的方法固然就是先初始化个值,以后再赋值替换掉

1
2
UIWindow *window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];
window.rootViewController = [[UIViewController alloc]init];

8、tableView

虽然如今的iOS9已经推送正式版了,可是iOS9使用时仍是会感受到App比之前更加卡顿了,tableView拖动时卡顿显示的最为明显。 而且以前遇到一个bug,本来好的项目用xcode7一编译,tableView刷新出了问题 ,[tableView reloadData]无效 有一行cell明明改变了可是刷新不出来。 感受多是这个方法和某种新加的特性冲突了,猜想多是reloadData的操做被推迟到下一个RunLoop执行最终失效。

解决的方法是,注释[tableView reloadData],改用局部刷新,问题竟然就解决了。

1
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

暂时遇到这些问题,感受iOS9的出现让全部iOS开发都是菊花一紧,但愿苹果这种大刀阔斧作改变,特立独行的风格发展下去之后别和government 产生矛盾,而后公司倒闭 致使开发人员失业,也许是我想多了。预祝全部的iOS都能及时的作好适配改完bug,下个版本一上线,全部问题都解决。

相关文章
相关标签/搜索