一、NSAppTransportSecurity

iOS9让所有的HTTP默认使用了HTTPS,原来的HTTP协议传输都改成TLS1.2协议进行传输。直接造成的情况就是App发请求的时候弹出网络无法连接。解决办法就是在项目的info.plist 文件里加上如下节点:

NSAppTransportSecurity - NSAllowsArbitraryLoads

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

如果你不是在董铂然博客园看到本文,请点击查看原文。

上面说是苹果限制了HTTP协议,但是也并不是说所有的HTTPS都能完美适配iOS9了。

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

 
- (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/ 分别试一下,结果不同

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

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

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

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

从右边两张图可以看出,github带RSA加密的SHA-256符合苹果的要求,所以才可以展示。

针对百度的情况可以在info.plist中配置如下,如果网站引用的比较多应该是需要针对每个网站进行配置。

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

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

二、Bitcode

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

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

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

三、设置信任

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

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

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

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

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

所以很多原本写死了width的label可能会出现“...”的情况。

iOS8

iOS9 蛋疼

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

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

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

五、URL scheme

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

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

如果iOS9没做适配 会报如下错误

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

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

六、statusbar

这个还好只是报一个警告,如果就是不管他,也不会出现问题。

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

以前我们为了能够实时的控制顶部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;
}

点进头文件可以验证刚才说法:

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

七、didFinishLaunchingWithOptions

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

 
***** 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的编译器本身就不支持。

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

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

八、tableView

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

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

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

如果你不是在董铂然博客园看到本文,请点击查看原文。

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

转载于:https://www.cnblogs.com/tian-sun/p/4849720.html

整理iOS9适配中出现的坑相关推荐

  1. iOS 9 适配中出现的坑

    整理 iOS 9 适配中出现的坑(图文) 2015-10-22 iOS开发 库克表示:"现在在中国有150多万的开发者在iOS当中开发应用程序,我们鼓励更多的人开发应用程序,也鼓励更多的创业 ...

  2. 整理前端工作中的可复用代码(二):拓展spark-md5,支持计算网络文件md5

    这里是<整理前端开发中的可复用代码>中的第二篇,最初此系列文章的标题不是这个,但觉得标题要准确.明白一些,便做了修改.这里的经验都来自作者的工作实践,入了前端坑的摸爬滚打. 背景 在工作中 ...

  3. 细数sass安装中遇到的坑

    前言: 前两天打算清理电脑的时候,遇到了一点特殊的问题,打算重装一些东西,其中就有我一直用的顺手的SASS预编译工具. 但是在重装的时候,我发现我居然不会用了??? 靠,要不是我用了半年的Sass,我 ...

  4. 让你在 API 设计中少踩坑的实战分享

    本文来自作者 奔跑吧架构师 在 GitChat 上分享 「让你在 API 设计中少踩坑的实战分享」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 在项目开发中,实际的编码只占用了整个项目不 ...

  5. mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点

    MySQL的分区和分表应用场景分析 在日常工作中当我们的某张表的数据量过大的时候,首当其冲的可能就是进行分区和分表,但是是如何分区或者分表都要结合一点的业务场景下进行分析,才会显著的提升性能,来聊一聊 ...

  6. 线性模型系数解读中的那些坑,以套索回归(LASSO)和岭回归(Ridege)为例

    线性模型系数解读中的那些坑,以套索回归(LASSO)和岭回归(Ridege)为例 在线性回归类模型的训练过程中,模型通过数据拟合了目标变量y与特征变量X的关心,通过特征变量的线性组合来表征目标变量y; ...

  7. 公众号python训练营真的假的_python中的这些坑,早看早避免。

    python中的这些坑,早看早避免. 说一说python中遇到的坑,躲坑看这一篇就够了 传递参数时候不要使用列表 def foo(num,age=[]): age.append(num) print( ...

  8. MutipartFile使用过程中遇到的坑

    MutipartFile使用过程中遇到的坑 MutipartFile是spring里面定义的接口,它封装了用户在上传图片时所包含的所有信息,但是有些时候我们要将file转换成MutipartFile, ...

  9. Innodb表压缩过程中遇到的坑(innodb_file_format) - billy鹏

    原文地址:http://www.cnblogs.com/billyxp/p/3342969.html 对于越来越多的数据,数据库的容量越来越大,压缩也就越来越常见了.在我的实际工作中进行过多次压缩工作 ...

最新文章

  1. python中package机制的两种实现方式(转载)
  2. response对象简介
  3. java中怎么用代码打出ASCII码字符_JAVA实现打印ascii码表代码
  4. C#多线程之旅(3)——线程池
  5. Storm集群的安装及简单使用
  6. 考教育统计与测量可以带哪种计算机,《教育统计与测量》练习题库及答案
  7. mac mail 删除邮件服务器,如何从Mac OS X中的邮件中删除所有电子邮件 | MOS86
  8. 转载:.NET Memory Leak: XmlSerializing your way to a Memory Leak
  9. 如何用c#打开文件夹并选择文件夹内的一个文件 open folder and select file
  10. iptables总结--理解四表五链/snat/dnat/redirect/synproxy/性能
  11. 大学课程很少有教怎么设计单片机开发板,进阶板更不用说
  12. 使用Python,OpenCV反转视频
  13. 关于去除“请选择”问题
  14. 安卓手机内存卡测试软件,安卓手机硬件检测软件
  15. FICO辅助工具介绍【LSMW和Query】
  16. H 小P的数学问题(分块)
  17. Rosalind第10题——ros_bio10_CONS
  18. 全球室内设计界NO.1力作!东呈联合HBA打造柏曼酒店;万豪集团在上海开设第五家福朋喜来登酒店 | 美通社头条...
  19. 李开复:我的大学生活琐忆
  20. 实达集团任命IT业界知名高管叶成辉为总裁(首席执行官)

热门文章

  1. Xamarin组件包 Xamarin.ToolKit
  2. Windows下OpenSSL创建CA证书以及客户端和服务器端证书
  3. 韩顺平循序渐进学java 第13讲 抽象类.接口
  4. ThinkPHP- 3.1
  5. 浅谈UML的概念和模型之UML九种图
  6. mysql 5.6.10 32_安装mysql-5.6.10-win32 解压版-略有修改
  7. 无盘服务器读写缓存,无盘系统中实现网络磁盘本地写缓存控制的方法
  8. Java中Class.forName和 ClassLoader.loadClass()区别
  9. java resourcebundle_Java - Properties和ResourceBundle类学习
  10. 硬件:固态硬盘SSD的基础知识及安装注意事项!