zoukankan      html  css  js  c++  java
  • iOS开发 常见错误

    一、NSAppTransportSecurity

    错误提示:NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

    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

    六、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项目的名称

    http://jingyan.baidu.com/article/0964eca21126a98285f53625.html

    八、快速打断点的方法,或者说,断点自动定位到崩溃位置的断点怎么打?

    开发中常见的一类崩溃错误是遇到:unrecognized selector sent to instance 0xaxxxx…而backtrace又无法明确说明错误在哪行代码,如何快速定位BUG呢?

    有时读代码一下很难找到是哪个instance出的问题,这时定制有效的DEBUG断点是最好的办法,方法如下:

    在Debug菜单中选择 Breakpoints -> Create Symbolic Breakpoint…

    SymbolicBreakpoint1

    在Symbol中填写如下方法签名:

    SymbolicBreakpoint2

    然后再运行复现错误时断点会停在真正导致崩溃的地方。

    九、 error : typedef redefinition with different types (' ---ConnectionType----- ' vs '-----ConnectionT

    删除后边的那个多余的类型就行!

  • 相关阅读:
    ubuntu 下的中文输入法的安装和配置- ibus
    数据分析-序列处理(2)
    数据分析创建数据框与数据获取(1)
    Python的函数与方法的区别
    Python3笔记015
    Python3笔记014
    Python3笔记013
    Python3笔记012
    Python3笔记011
    Python3笔记010
  • 原文地址:https://www.cnblogs.com/zhaixing/p/5364764.html
Copyright © 2011-2022 走看看