1.以链库的方式引用第三方库

一些特殊场景可能会要求使用链库的方式使用第三方库,大体设置如下:

①Other Linker Flags里进行设置,格式为-l+库名称

②Libray Search Paths里设置库的路径地址,注意使用相对路径

③Header Search Paths设置相关头文件的路径

2.检测静态库支持架构以及静态库打包

使用其他部门提供的静态库出现类似Undefined symbols for architecture报错时,很有可能是对方打包时相关设置没有正确设置,这时可以在命令行里使用“lipo -info  静态库路径”确认其所支持的架构信息。

当以静态库形式出包给第三方使用,除了CI例如jenkins等自动编译打包外,需要临时手动快速出包时,进行如下两步即可

①调整好编译模式,例如设置为release模式,分别设置target为模拟器及真机,command+B编译出两个库

②命令行中执行相关命令即可 “lipo -create  真机版静态库路径xxxx  模拟器版静态库路径xxxx  -output   合并后静态库路径”

3.静态库联调问题

当提供一个静态库嵌入到其他业务部门的工程,遇到一些问题必须在其工程里进行调试时,如果仅靠输出log的方式可能不够实时,或者需要重复设置输出log的地方并再次编译出包,这时其实可以将静态库工程和工程放在同一个workSpace下,将静态库最新编辑打包结果更新到主工程里,同时在静态库相关目标位置打断点即可,运行主工程,即可正常进入到相关断点位置,并观察相关变量信息。

4.使用符号断点定位调试其他第三方库的问题

使用第三方库遇到问题,需要排查第三方库相关问题而又不方便联调时,可以使用符号断点的方式定位到相关方法进行观察调试,如果知道对应类名将会更加精确,如图所示

5.charles捕捉https请求

不管出于安全考虑还是之前苹果曾一度要求全部使用https,很多服务端已经将服务迁移使用https了,使用charles捕捉相关请求时也需要进行相应证书设置,否则无法查看到相关信息

步骤如下:

①pc上先安装相应根证书

②在真机上安装相应根证书,注意需要连接到pc代理上再根据提示的地址安装,如果使用该地址安装有问题,可以试试http://charlesproxy.com/getssl

6.符号化crash日志定位原因

虽然现在基本都会采用友盟、bugly之类第三方工具收集崩溃日志,但总有些时候发生崩溃而第三方平台没有采集到相关数据,如果这时候有设备的崩溃日志的话,只能使用Xcode自带的symbolicatecrash手动解析定位下原因了。

需要准备好的是真机导出的crash日志、打包后文件,置于同一目录下,准备进行符号化工作

打开命令行终端开始符号化:

①找到symbolicatecrash并拷贝到目录下,注意使用的是iPhone对应的symbolicatecrash

find /Applications/Xcode.app -name symbolicatecrash -type f

cp symbolicatecrash的路径 对应存放目录路径

②切换到指定目录下进行符号化

对应命令:./symbolicatecrash crash文件路径 dSYM文件路径 > 符号化后的crash日志路径

若中间遇到not define的问题,单独执行命令设置下即可,export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"

7.注意containsString是iOS8以后才支持,iOS7上需要自行扩展

判断字符串包含的方法“containsString”是在iOS8及以上系统版本才支持,8以下系统例如iOS7上会找不到该方法导致崩溃。

解决办法是可以自行加个category扩展下

8.避免重复移除kvo监听导致崩溃

个别特殊场景可能导致重复移除监听崩溃,可以try catch避免重复移除时崩溃或者从根本上避免重复添加移除操作,参考iOS开发-黑科技防止多次添加删除KVO出现的问题

9.在iOS10及以上版本使用UIPasteboard在app之间共享数据的问题

之前使用UIPasteboard临时存放一些数据方便app之间共享数据,为了避免影响系统的复制粘贴信息pasteboardWithName:单独创建了粘贴板,但是iOS10某个小版本后确实如官方所说,这种方式被弃用了,不再支持,表现为通过app A在UIPasteboard设置的信息,在app B内读取出来为空了。

解决办法是:使用系统默认的UIPasteboard,即[UIPasteboard generalPasteboard],或者官方推荐的App Groups方式进行app之间数据共享,不过这种方式是iOS8以后支持的,并且需要手动开启这项功能设置,如果分享对象的app不方便设置的话会相对麻烦一些。

10.打印方法调用者信息

调试的时候,除了打断点一步步跟踪,有时想快速直接获取到某一方法的调用者信息,是可以通过方法实现的,具体参考Print the name of the calling function to the debug log

11.状态栏适配-热点、多媒体占用、定位等导致状态栏高度变化

状态栏高度变化会影响view的frame,需要进行相应适配,当然新出的iPhone X例外,这个适配问题将不会存在,状态栏高度发生变化有两种场景:

①进入页面时,状态栏高度已经增高,这时候需要进行判断其高度并做相应适配,这时状态栏的高度应该是40

②浏览当前页面时,状态栏高度增高,这就需要页面初始化时添加一个监听状态栏高度变化的通知,当起变化是做相应适配处理

12.字符串处理的一些细节

①对于上报服务端信息之类场景,如有必要或保护特殊字符时,需要先进行编码操作,避免乱码

②使用URLWithString转换字符串为NSURL时,注意先对字符传进行一次UTF-8编码,否则字符串里包含空格等情况时直接URLWithString转换结果返回nil

13.不使用第三方库,一个相对性价比高的高斯模糊的方法

使用vImage实现,兼顾了模糊效果和执行耗时两方面,参考vImage高斯模糊(Blur)

14.使用类似微博的字符计数规则

文字计数时需要将标点、符号、数字等只记为0.5个字符,实际上就是这些ascii字符只记为0.5个字

15.一些宏的使用

①消除warning,例如在部分片段告诉编译器禁用对应警告

②区分真机和模拟器,例如有些功能或SDK不支持模拟器,例如摄像头相关的,为了让模拟器能编译运行,可能需要区分下模拟器,跳过相关部分的编译

iOS开发笔记18:一些编译、开发调试、打包的细节整理的更多相关文章

  1. thinkphp学习笔记3—项目编译和调试模式

    原文:thinkphp学习笔记3-项目编译和调试模式 1.项目编译 在章节2.4项目编译中作者讲到使用thinkphp的项目在第一次运行的时候会吧核心需要加载的文件去掉空白和注释合并到一个文件中编译并 ...

  2. Hololens开发笔记之使用Unity开发一个简单的应用

    一.Hololens概述 Hololens有以下特性 1.空间映射借助微软特殊定制的全息处理单元(HPU),HoloLens 实现了对周边环境的快速扫描和空间匹配.这保证了 HoloLens能够准确地 ...

  3. Yocto开发笔记之《串口驱动调试》(QQ交流群:519230208)

    QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 ======================================================== 串口驱动各 ...

  4. (SenchaTouch+PhoneGap)开发笔记(2)开发环境搭建二

    一.Java环境和Android SDK  1.安装JDK和JRE JRE会在JDK安装完成后自动出现安装界面. 安装完成后,设置环境变量 JAVA_HOME    D:\Program Files\ ...

  5. [转] WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单

    以下文章来自   http://www.blogjava.net/jacally/articles/186655.html 现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了 ...

  6. (SenchaTouch+PhoneGap)开发笔记(1)开发环境搭建一

    1.下载senchaTouch 2.下载senchaCMD 3.安装ruby(for windows ) 4.senchaCmd创建项目: 打开senchacmd,cd到senchaTouch的目录如 ...

  7. [APP] Android 开发笔记 003-使用Ant Release 打包与keystore加密说明

    接上节 [APP] Android 开发笔记 002 5. 使用ant release 打包 1)制作 密钥文件 release.keystore (*.keystore) keytool -genk ...

  8. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  9. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

随机推荐

  1. django系列6--Ajax05 请求头ContentType, 使用Ajax上传文件

    一.请求头ContentType ContentType指的是请求体的编码类型,常见的类型共有三种: 1.application/x-www-form-urlencoded 这应该是最常见的 POST ...

  2. python--中的文件操作

    1.文件操作 把文件打开 open 打开 f = open ('文件路径',mode='模式',encoding='编码格式') #打开一个文件操作的时候取到的是一个句柄 读取的方法 . read() ...

  3. Syncthing源码解析 - 启动过程

    我相信很多朋友会认为启动就是双击一下Syncthing程序图标,随后就启动完毕了!如果这样认为,对,也不对!对,是因为的确是这样操作,启动了Syncthing:不对是因为在调试Syncthing启动过 ...

  4. 用TIdIPWatch获取本地IP

    Indy的“indy misc”下有一个“TIdIPWatch”组件,可以正确获得本地IP,即使有多块网卡,也可以正确获得真正本地IP. 一,引入单元文件“IdIPWatch”. 二,实际代码: pr ...

  5. php如何进行多进程与异步调用方法

    浏览器和服务器之间只一种面向无连接的HTTP协议进行通讯的,面向无连接的程序的特点是客户端请求服务端,服务端根据请求输出相应的程序,不能保持持久连接. 这样就出现了一个问题,一个客户端的相应服务端可能 ...

  6. SpringMVC 的映射

    27.1.1 @RequestMapping使用 之前,我们是把@RequestMapping注解放在方法之上,用来给方法绑定一个请求映射.除此以外,@RequestMapping注解还可以放在类的上 ...

  7. windows环境下ElasticSearch5以上版本安装head插件

    我的ElasticSearch版本是5以上的,网上搜了好多安装方式,都不对. 还好找到一个成功的,转载过来做记录. 原文地址:ElasticSearch-5.0安装head插件 步骤 下载node.j ...

  8. [转] 检查更新时出错:无法启动更新检查(错误代码为 4: 0x80070005 — system level)

    Google浏览器Chrome更新到时候提示错误:检查更新时出错:无法启动更新检查(错误代码为 4: 0x80070005 -- system level),很有可能是Chrome更新服务被禁用了,我 ...

  9. gitLab创建自己的私有库

    一.创建私有库的流程简介 创建一个项目,留着后面的流程3制作私有库 在可以创建私有库的地方创建一个code repository, code repository是代码仓库,我们把代码上传到这个仓库. ...

  10. js中的promise详解

    一 概述   Promise是异步编程的一种解决方案,可以替代传统的解决方案--回调函数和事件.ES6统一了用法,并原生提供了Promise对象.作为对象,Promise有一下两个特点: (1)对象的 ...