整理 iOS 9 适配中出现的坑(图文)
2015-10-16 09:07
846 查看
![](http://cc.cocimg.com/api/uploads/20151015/1444897007669675.jpg)
作者:董铂然 授权本站转载。
本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性。9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级iOS9,也就逐渐的衍生出了一系列的问题,笔者也在赶忙为自己维护的App做适配,本文写的一些坑基本都是亲身体验了。
一、NSAppTransportSecurity
iOS9让所有的HTTP默认使用了HTTPS,原来的HTTP协议传输都改成TLS1.2协议进行传输。直接造成的情况就是App发请求的时候弹出网络无法连接。解决办法就是在项目的info.plist 文件里加上如下节点:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201510/d2050becd6124803f5488cd4fc2217c3.png)
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/ 分别试一下,结果不同
![](https://oscdn.geek-share.com/Uploads/Images/Content/201510/1fb3885e18758fc4e6bf69af47febf95.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201510/e4d02d50cec5369e72c04034dd01a6f2.png)
github的网页能打开,百度的网页打不开,下面打印了一行log
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
![](http://cc.cocimg.com/api/uploads/20151012/1444621023669655.png)
六、statusbar
这个还好只是报一个警告,如果就是不管他,也不会出现问题。
: 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,下个版本一上线,所有问题都解决。
相关文章推荐
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- iOS-归档模型创建和工具类的封装
- iOS讲解迷惑之键盘弹出遮挡输入框的问题
- iOS--正则表达式
- iOS讲解迷惑之Core Data
- iOS--关于审核
- (IOS)BaiduFM 程序分析
- iOS模拟器录屏转gif神器
- Waring:Title set but using a system identifier解决办法
- 2015年最新苹果开发者账号注册流程详解
- 带你秀的飞起——三款移动端H5制作应用体验报告 iOS Android
- iOS-序列化与反序列化
- iOS 数组排序和遍历
- iOS应用之 二维码
- iOS.StaticLibrary.1-avoid-duplicate-symbol-in-static-library[draft]
- iOS 进制转换(2转10,10转16)
- ios textfield限制中文输入长度
- iOS:核心动画具体的类和协议的介绍
- iOS9 collectionView新特性
- iOS之Cocoa大招KVC键值编码