苹果开发最便捷的持续集成方案—Xcode Server

如果要进行iOS持续集成,最流行的大概是Jenkins,Fastlane。但是目前来看这些配置都比较复杂,而最简单的是使用Xcode Server,但是网上资料却比较少。 Xcode Server由苹果开发,与Xcode高度集成,可对代码进行静态分析、单元测试、打包等。对苹果开发来说是最友好的一种方式。 Xcode 9,是Xcode Server的一次转折。在此之前需要安装MacOS Server 在其基础上进行配置,虽然能够实现CI,但Bug比较多。 从Xcode 9开始,Xcode Server就集成到了Xcode中,只需要安装Xcode就能进行CI操作,而且配置操作变得极其简单,证书也可以自动配置。 步骤一 – 开启Xcode Server 在你希望用于持续集成的Mac电脑上开启Xcode Server 打开Xcode -> Preferences -> 选中Server...

记一次随机EXC_BAD_ACCESS崩溃排查

说到排查BAD_ACCESS崩溃,我们可能首先会想到使用Zombie来进行定位。但是这种方式只能适用于崩溃到同一个位置的时候。 如果我们遇到的crah是随机的怎么办呢? 首先我们要知道随机BAD_ACCESS产生的原因。当访问野指针、被损坏的内存区域等无法执行消息的内存时,便会出现BAD_ACCESS。 当这个问题随机产生,崩溃到不同对象上时,就需要考虑是否是内存分配上的问题。因为每次启动对象创建的先后顺序会有差异,因此有内存错误时出错的对象便会不一样。 为了确认这个问题,我们开启Address Sanitizer。 这是Xcode7集成的内存分析功能,比Zombie有更强的捕获能力。多次运行,会发现都会停止在同一地方。而且都是同样的错误heap_buffer_overflow。 这个地方是我们调用了一个底层C++库的地方,并且有手动分配内存的操作。 通过与底层库的排查,我们发现是由于定义不一致,导致一个结构体里有个字符串分配了256的内存,而底层写入时以1024大小来写入,导致了内存溢出。这使后面分配给其他对象的内存区域被破坏,出现随机的BAD_ACCESS错误。 小结 如果不是手动操作内存,出现随机BAD_ACCESS问题概率还是比较低的。当Zombie不能解决问题时,可以使用Address Sanitizer进行更深的分析。 平时开发中,我们需要关注工具新特性的更新,用好了工具,在辅助我们分析问题时会有事半功倍的效果。...

理解苹果ARKit 1和2

DEMO 包含功能平面检测、环境纹理、物体操作(添加、选中、拖动、缩放、旋转)、图像识别、环境音效 什么是ARKit AR(Augmented Reality)运用计算机技术,将虚拟的信息应用到真实世界,被人类感官所感知。给人一种虚拟物体存在于现实世界的错觉。而ARKit整合运动传感器数据,相机数据,相机捕捉到的图像分析数据,用于建立现实场景和建模AR内容的虚拟场景的对应关系,为这种错觉提供数据基础,简化构建AR体验。 构建AR体验的三驾马车 Tracking 通过Tracking,我们可以: 获得相机在现实世界中的位置。 将相机图像和运动数据整合,形成AR视图。 追踪特征点,构建AR场景。追踪人脸,图像,物体等。 AR追踪的单位为m。因此在制作AR模型时,需要按照物体实际在现实世界中的屋里比例来制作。这样物体不至于过大或过小,呈现会更真实。 在iOS开发中,Tracking通过AVFoundation来获取场景图像,CoreMotion来获取运动数据。结合两者形成AR视图。 Tracking质量 要保证高质量的追踪Tracking数据,需要高质量的特征点。需要满足以下条件: 持续的相机数据和传感器数据 环境纹理要足够明显。需要处于一个光线充足并且纹理明显的环境当中,这样ARKit更容易提取特征点,建立空间对应关系。 静态场景。动态场景会导致视觉数据和运动数据不相符,影响追踪质量。...

我的代码习惯

我的代码习惯 一直以来我都坚持团队合作里面要有一份编码规范,尽量保持编码的一致性,让代码更清晰,便于代码审查和团队合作。即使迫于某些原因无法普遍的实施,但也要严格要求自己。 自己写的代码不仅仅是对项目,对自己负责,也要对他人负责。正常来讲在自己的写的东西在特定阶段会有其他人参与,也会被其他人接手,为了不被后来人骂的太惨,还是要保持良好的编码习惯。 代码规范 代码规范不是自己凭空想像的,主要还是参考了各家的代码规范,外加自己的实践。自己遵守的代码规范,主要参考Objc Zen Book。当时在火车上一口气看完,看完即决定就是它了。之前已有整理,详见《禅与Objective-C 编程艺术》笔记。接下来我再挑一些比较重要的来讲。 代码组织 分组 推荐使用属性。除了init和dealloc方法,应该总是使用.语法访问属性,如果getter方法里进行了初始化和其他操作,init方法里也应该使用.语法。 善于用#Pragma Mark进行代码分组。 私有方法添加p_前缀进行区分,但不要以下划线_开头。...

做一些改变

做一些改变 最近在思考工作这几年的成长,之前因为太懒很多东西都没有一个记录,导致再回顾的时候,大部分也就记不清了。其次现在每天获取的信息都太多太快,每一次的停留不过几分钟,长时间感觉自己都无法静下心来思考。 因此决定每个季度都能输出几篇文章,文章内容大部分还是对自己的一个记录,如果对大家有用,那就各取所需了。 之前总觉得很多东西别人已经写的很好了,自己再去写写只不过是一些二手文章。不过现在自己对此的观点有些变化。写博客对不同人来说意义可能不太一样,对于我来说首先是为自己所用,是一种适合自己对知识吸收,抒发感想的一种方式。管他的有用、无用、是否矫情,一切冷暖自知。如果自己写的东西能为别人所用,那自己也会产生助人为乐的喜悦感,当然我也希望能够多产生这种附加价值。当我们了解一个知识点,总会参考很多个方面,如果不去总结,时间久了,也就慢慢淡忘了,当再去了解时,又会重复之前的操作。如果能有一个记录,在之后有更深的了解时,可以不断的充实和修正。 成长就是不断的探索和回顾,从这篇文章开始,对过去说再见,开始一段新的旅程。