整理iOS9适配中出现的坑

 

一、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由c# dynamic是否装箱引发的思考

前言前几天在技术群里看到有同学在讨论关于dynamic是否会存在装箱拆箱的问题,我当时第一想法是"会"。至于为啥会有很多人有这种疑问&#xff0c;主要是因为觉得dynamic可能是因为有点特殊&#xff0c;因为它被称为动态类型,可能是因为这里的动态对大家造成的误解,认为…

【看动漫学编程】程序员在异世界生个娃 第3篇:搞不好我就是个王者

前言 作者文笔比较水&#xff0c;还请见谅。 以下内容还将使用视频动态漫画表现&#xff0c;剪辑完将会贴出链接。 小说剧情为剧情需要&#xff0c;过渡到知识点&#xff0c;部分篇幅可能没有技术知识点还望谅解。 由于没有经费支持&#xff0c;所以画出来的东西是我自己用代码…

PHP会话控制考察点

为什么要使用会话控制技术 HTTP协议是无状态的&#xff0c;也就是说HTTP没有一个内建的机制来维护两个事务之间的状态。当一个用户完成一个请求发起第二个请求的时候&#xff0c;服务器无法知道这次请求是来自于上一次的客户。而用户登录、购物车等&#xff0c;这些是需要服务器…

数据库SQL语句学习笔记(6)-使用函数处理数据

1.SQL也可以用函数来处理数据&#xff0c;函数一般是在数据上执行的&#xff0c;为数据的转换和处理提供了方便。但是每一个数据库管理系统&#xff08;DBMS&#xff09;都有特定的函数&#xff0c;事实上&#xff0c;只有少数几个函数被所有的DBMS等同地支持。例如&#xff0c…

java3n 1_1005 继续(3n+1)猜想(JAVA)

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里&#xff0c;情况稍微有些复杂。当我们验证卡拉兹猜想的时候&#xff0c;为了避免重复计算&#xff0c;可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候&#xff0c;我们需要计算 3、5、8、4、2、1&…

【遥感物候】Matlab求解一元六次多项式,计算植被生长季始期

一元六次多项式能很好的逼近滤波后的曲线,与二次多项式相比,在拟合植被整个生长季曲线方面有更好的优势,该方法常用来描述北方温带和高纬度地区时序NDVI生长季模式。因此,本文使用一元六次多项式来拟合植被整个生长季曲线,效果很好。那么拟合后,这样解方程呢求生长季参数…

Android之给控件添加水纹波效果

1 问题 给控件添加水纹波效果&#xff0c;点击起来像点中了&#xff0c;不然效果太粗糙了&#xff0c;没反应。 2 实现 给控件添加如下属性 android:background"?android:attr/selectableItemBackground"波纹有边界 android:background"?android:attr/sele…

《看聊天记录都学不会C语言?太菜了吧》(1)我在大佬群里问基础问题没人理?

若是大一学子或者是真心想学习的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手…

个人博客作业_week2

1. 是否需要有代码规范 1.这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率&#xff0c;浪费时间的东西。 我不同意这个论点。 有句俗语’无规矩不成方圆‘&#xff0c;这亘古传承的至理同样适用于写代码。制定代码撰写规范并不是 迫于压力完成上级的任务&am…

最全面透彻的RabbitMQ指南

概念RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯…

TensorFlow中RNN实现的正确打开方式

上周写的文章《完全图解RNN、RNN变体、Seq2Seq、Attention机制》介绍了一下RNN的几种结构&#xff0c;今天就来聊一聊如何在TensorFlow中实现这些结构&#xff0c;这篇文章的主要内容为&#xff1a; 一个完整的、循序渐进的学习TensorFlow中RNN实现的方法。这个学习路径的曲线较…

【遥感物候】Hants NDVI时间序列谐波分析法数据重构,植被生长季曲线效果可佳(附Hants软件下载)

NDVI时间序列谐波分析法(Harmonic Analysis of NDVI Time-Series)(简称Hants )对时间序列数据进行平滑。该方法是一种新的物候分析方法,可用于定量化的监测植被动态变化。其核心算法是傅里叶变换和最小二乘法拟合, 即把时间波谱数据分解成许多不同频率的正弦曲线和余弦曲线,…

Android之在Java socket作为服务器里面返回数据头部怎么写入浏览器需要下载文件的文件名

1 问题 Android app里面写了一个Java socket的简单服务器,在浏览器里面输入相应的IP和端口访问服务器下载文件,Java socket怎么写返回数据的头部信息,浏览器才知道需要下载文件的名字呢? 2 关于Content-Disposition 在常规的HTTP应答中,Content-Disposition 响应头指示回…

java中hasnext的作用_java中Scanner的hasNext()的疑问

第一个问题&#xff0c;两段代码的区别在于阻塞的位置不同&#xff0c;加上一行输出代码就可以很明显地看到差别。Test.javaimport java.util.Scanner;public class Test {public static void main(String[] args) {Scanner s new Scanner(System.in);while(s.hasNext()){Syst…

《看聊天记录都学不会C语言?太菜了吧》(2)我说编程很容易你们不服?

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

ABAP的自学之路 ,初步认识ABAP 一

由于工作的关系&#xff0c;最近需要对SAP系统进行二次开发&#xff0c;于是开始学习ABAP。鉴于网上对于ABAP的资料少之又少&#xff0c;所以自己整理一些资料。 第一章 ABAP 开发环境和总体介绍1.1 ABAP 开发环境ABAP 开发的三种环境&#xff1a;&#xff08;1&#xff09;SAP…

LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序

/* 程序名&#xff1a;    LCD1602&#xff0c;4位数据总线液晶屏时钟&#xff0c;STC12C5A60S2的10位ADC功能程序 编写时间&#xff1a;  2015年10月4日 硬件支持&#xff1a;  LCD1602液晶屏 STC12C5A60S2 外部12MHZ晶振 接线定义&#xff1a; DB7 --> P1^7DB6…

WPF|黑暗模式的钱包支付仪表盘界面设计

收集下大家的意见&#xff0c;是否需要在文中贴上源码&#xff08;文末会给出源码链接&#xff09;&#xff0c;请大家踊跃留言。阅读目录效果展示准备简单说明 源码结尾&#xff08;视频及源码仓库&#xff09;1. 效果展示欣赏效果&#xff1a;2. 准备创建一个WPF工程&#x…

量子计算机的现状和趋势

量子计算机概述 计算机是一种新型的运算 它具有具有强大的并行处理数据的能力&#xff0c;可解决现有计算机难以运算的数学问题。因此&#xff0c;它成为世界各国战略竞争的焦点。 量子计算机的优势 量子计算机与现有的电子计算机以及正在研究的光计算机&#xff0c;生物计算机…

【空间数据库】Windows操作系统PostgreSQL+PostGIS环境搭建图文安装教程

PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类…