iOS tips 13

2017-01-07 | 阅读

iOS 设备- 开发者选项

启动开发者模式后, 在 setting 中会添加一个菜单为 Developer, 里面有一些开发者选项,帮助开发调试 :

  • Logging : 表示记录日志,用于监控app的电量和网络使用情况,在Xcode ,用于在不使用Instrument的情况下记录数据,但是读取数据时,还是需要在 Instrument-File - Import Logged Data From Device,然后读取设备记录的数据。
  • Enable UI Automation : 表示是否支持Instrument的UI测试,如果没有打开,则不能使用 Automation
  • Network Link Conditioner : 网络连接选项,比较常用的功能,可以选择网络状态,进行模拟,但效果不佳,不如直接用代理的网络限速。
  • IAD Developer APP Testing : iad相关

  • PassKit Testing : 关于 Apple pay和卡券相关功能的测试。
  • Media Service Testing : 播放媒体内容时,对音量的设置测试,欧洲人的内容。
  • Reset Local Data on Next Launch : 并不是如同名字那样,重设本地所有数据,只是重设 Layout,image和其他一些缓存的内容,所以,没什么用。

关于iOS web加载时delegate回调触发研究

正常流程 :

  1. shouldStartLoading (requestURL is target page)
  2. didStartLoading
  3. didFinishLoad (改变当前webview的Request 为当前请求的request)

页面加载完成后,调用iframe

  1. shouldStartLoading
  2. didStartLoading
  3. didFinishLoad (不会改变当前webview的Request,即request 不同)

判断请求是否是主IFrame的跳转,通过判断request.mainDocumentURL是否等于request

页面本身触发了 重定向

  1. shouldStartLoading (requestURL is target page)
  2. didStartLoading
  3. shouldStartLoading (requestURL is redirect target)
  4. didFinishLoad (request.URL is redirect target)

页面加载时,同时加载了IFrame

  1. shouldStartLoading (requestURL is main page)
  2. didStartLoading
  3. shouldStartLoading (requestURL is one of the iframes)
  4. didStartLoading (webview.request 为mainpage的request)
  5. didFinishLoad
  6. didFinishLoad

** Note there is no way to distinguish which didFinishLoad maps to which didStartLoad **

通过一个超链接加载新的页面

  1. shouldStartLoading navigationType UIWebViewNavigationTypeLinkClicked
  2. didStartLoading
  3. didFinishLoad

Loading a page by calling window.history.go(-1): 1. shouldStartLoading navigationType UIWebViewNavigationTypeBackForward 2. didStartLoading 3. didFinishLoad

Loading a page by calling location.reload() 1. shouldStartLoading 2. didStartLoading 3. didFinishLoad

Loading a page with an iframe that fails to load: 1. shouldStart (main page) 2. didStart 3. shouldStart (iframe) (事实上触发这一阶段是,就基本表示html本身已经加载成功了) 4. didStart 5. didFailWithError (可以通过URL来判断是IFrame的错误) 6. didFinish

Loading a page with an invalid URL 1. shouldStart (main page) 2. didFailWithError

Loading a page with an iframe that fails to load due to an invalid URL:

  1. shouldStart (main page)
  2. didStart
  3. shouldStart (iframe)
  4. didFailWithError
  5. didFinish

所以,在webview进度条处理时,要确认避免页面加载时iframe的影响,只对真正的页面加载的起点与终点,就必须过滤请求中的iframe触发的回调。

NSJSONReadingOptions

  • NSJSONReadingMutableContainers : 表示转换得到的容器是可变的, 即NSMutableDictionary和NSMutableArray
  • NSJSONReadingMutableLeaves : 表示得到的字符串是可变的 , 即 NSMutableString
  • NSJSONReadingAllowFragments : 允许根节点不是一个 NSArray或者NSDictionary.

OC中的 BOOL不如bool好用

BOOL表示 1是YES , 所以非1是NO. 而bool表示0是false,所以非0是true;

SQLIte

SQLite实际的数据类型只有5种, NULL, INTEGER,REAL,TEXT,BLOB.

所以不能直接保存时间,只能放在这几种类型中.

将时间保存在Text,也就是以ISO8601字符串形式保存.

将时间保存在INTEGER中,像UNIX的时间,为距 1970-01-01 00:00:00UTC 的秒数.

SQLIte中通过一些函数进行日期转换,然后存储,有

  • datetime() 产生时间日期.
  • date() 产生日期
  • time() 产生时间
  • strftime() 对时间日期进行格式化.

右划返回与scrollView冲突

通过 requireGestureRecognizerToFail方法来处理。

[_bigScrollView.panGestureRecognizer requireGestureRecognizerToFail:self.navigationController.interactivePopGestureRecognizer];

将两个手势依次处理, 一个校验失败,再执行另外一个手势的校验,以解决手势冲突.

图片格式简单比较

jpg 压缩性能好,色彩丰富,解析速度比png快,但是没有透明通道。所以适合作为普通的线上资源的图片格式。

png 压缩性能不及jpg,体积比jpg大,色彩不及jpg丰富,解析速度也慢于jpg。但是有透明通道,所以适合做一些小的图标。

webp 格式图片是google推出的新的图片格式,压缩性能优于jpg和png,但是解析速度比两者要慢。 且支持程度没有两者普及,浏览器上基本上只有Chrome内核的浏览器才支持webp格式。 但webp格式的高压缩比,决定了它是jpg的优秀替代者,能够大幅地降低线上图片的体积,节约流量。

UIImage 缓存

通过 imageNamed 创建 UIImage 时,系统实际上只是在 Bundle 内查找到文件名,然后把这个文件名放到 UIImage 里返回,并没有进行实际的文件读取和解码。当 UIImage 第一次显示到屏幕上时,其内部的解码方法才会被调用,同时解码结果会保存到一个全局缓存去。据我观察,在图片解码后,App 第一次退到后台和收到内存警告时,该图片的缓存才会被清空,其他情况下缓存会一直存在。

Xcode 8中的一堆日志

Scheme-Run - Arguments-Environment Variables中设置 :

OS_ACTIVITY_MODE disable

Xcode 环境变量

在build 过程中,要想观察所有已存在的环境变量,你可以在 Build Phases 中添加一个 “Run Script”,并勾选上 “Show environment variables in build log”。