iOS
6.7k 词
XCUITest iOS自动化UI测试框架XCUITest简介XCUITest是Apple提供的内嵌到xcode中的一套UI自动化测试框架。 UI测试依赖于两项核心技术:XCTest框架和Accessibility。 XCTest提供了UI测试功能的框架,与Xcode集成在一起。创建和使用UI测试扩展了您对使用XCTest和创建单元测试的了解。您创建了一个UI测试目标,并将创建UI测试类和UI测试方法作为项目的一部分。您可以使用XCTest断言来验证预期结果是否为真。你也可以通过Xcode Server和xcodebuild实现持续集成。XCTest与Objective-C和Swift完全兼容。 Accessibility是一项核心技术,它允许残疾用户获得与其他用户相同的iOS和macOS丰富体验。它包含了一组丰富的UI语义数据,用户可以使用它来指导他们使用你的应用。可访问性集成了UIKit和AppKit,并有api允许你调整行为和对外公开的使用。UI测试使用这些数据来执行其功能。 在源代码中创建UI测试类似于创建单元测试。你为你的应用创建一个UI测试目标;然后Xcode为你创...
iOS
7.7k 词
iOS 一键唤起APP方案参考移动端业务发展过程中,几乎每个公司都会有活动宣传或者运营引流的需求。这些需求的实现不外乎开发一些吸引人的HTML页面,在页面的某些事件的响应中引导用户下载APP或者打开已经下载的APP。 基本流程为: 策划运营投放活动链接(新用户送红包或者PDD砍一刀) 用户点击活动链接进入活动页面 用户被吸引或诱导点击某个按钮触发事件 H5页面调起相关APP APP响应调起并接力打开对应页面 我们这里主要说一说4、5两步其中的细节处理,也是对最近相关的业务的一个总结。 DeepLink技术在iOS9之前只有通过URL Scheme能够唤起一个APP。 Scheme可以理解为一个APP的名字,因为是URL Scheme所以遵循URL的书写格式,类比于http://www.baidu.com,其中http就是它的Scheme。 每个APP可以设置自己的Scheme,即给自己起个名字,方便”别人“叫我的时候我可以听得懂。 例如我们起了个Scheme叫kr,那么在H5页面内可以通过 openURL()的方式打开 kr://testPage链接调起我们的APP...
iOS
11k 词
如何做一个九宫格GIF播放器需求背景APP V9.4.0版本上线了类似朋友圈的动态,包含文字及最多9张图片。 动态2期内容中九宫格图片内追加了GIF格式的图片,并要求多张GIF图片在九宫格内循环播放,且优先播放信息流内第一个动态中包含的GIF图片。可参考微博信息流内GIF组的播放表现。 技术实现GIF播放GIF图是包含若干帧图片的图片组,由于阿里云存储或者其他存储容器中的文件特征,许多图片路径并不带.gif或.GIF的后缀,所以不能仅通过比对文件名来识别GIF图。而通过二进制数据中来标记其文件类型的固定的位特征来区分较为准确。 目前我们项目中集成了优秀的开源网络图片框架 'Kingfisher',其中包含的 AnimatedImageView类能有效识别GIF文件类型和实现精细的播放控制,且使用方便,仅需要给图片view设置网络图片的URL。 图片对齐方式需求中同时需要支持图片设置顶部对齐裁剪和左部对齐裁剪,1期项目中 KrShortContentImageView类已使用 UIImageViewAlignmentMask来实现此需求。 UIImageViewAl...
iOS
9.2k 词
iOS编译优化方案探索与实践-组件篇序言目前主流的项目构建方案中几乎都使用cocoapods进行组件库管理,不论是第三方开源库还是自研的私有库,都会生成.podspec文件使用cocoapods工具进行维护。 为了便于进行调试,第三方开源库或私有代码库 我们都以源码的方式进行引入。 每次在本机进行全量编译或者ci机器进行打包的时候都会先编译pod仓库中的源代码,然后链接到主项目中。 这个流程没有问题,但是随着项目的的大量迭代和长时间维护,引入的仓库会越来越多。以我们的项目为例,项目迭代了3年左右,引入的第三方仓库达到了30+个。在我的mac上进行一次全量编译时间达到了500s,性能稍差的设备编译消耗的时间更长。 针对组件库的编译时长的优化方案很简单,把cocoapods仓库中引入的需要编译的源码改成不需要编译的二进制库即可。 当然一刀切的引入方式切换是不可取的,根据自身的实际情况,对一些基本不会进入调试的代码和一些稳定版本的常用的仓库进行二进制化较为合适。 针对以上想法有了一些cocoapods插件可以使用。 Cocoapods-Binarycocoapods 1.6.x版本的时...
iOS
1.3k 词
最近Xcode编译完成后在命令行框里第一行总会报一个错误: error: module importing failed: invalid pathname 不论是clean还是删除support文件还是重启Xcode都无法解决这个问题。 于是去google了一番: 把target的scheme中的debug executable的选项取消掉就不报这个错了 试了一下,有效!但是这个选项不能去掉啊,去掉了这个选项就不能打断点进行调试了。😂 Realm删除残留导致的问题?](https://stackoverflow.com/questions/59090655/removed-realm-but-still-getting-this-error-module-importing-failed-invalid-to/59094519#59094519?newreg=5c6ce4372354468b9449dfc34406e472) 看到朋友们删除Realm之后会出现这个问题,但是我又没有安装过Realm,为何也有这个问题呢。 回答中提到解决这个问题需要去编辑~/.lldbi...
iOS
4.7k 词
需求背景近期老板提出了某些需求可能需要借助OCR能力来进行图片到文本的转换。 以下几种方案是对当前可用的免费的OCR的调研。 Vision Vision 是 Apple 在 WWDC 2017 推出的图像识别框架,它基于 Core ML,所以可以理解成 Apple 的工程师设计了一种算法模型,然后利用 Core ML 训练,最后整合成一个新的框架,相比开源模型然后让开发者自己整合起来,这种方式更安全也更方便我们使用。 Overview The Vision framework performs face and face landmark detection, text detection, barcode recognition, image registration, and general feature tracking. Vision also allows the use of custom Core ML models for tasks like classification or object detection. 从官方文档中可以得到Vision框架能做的...
iOS
675 词
Bug:音频列表顺序播放过程中偶尔出现设置的1.5倍速重置为1 原因:音频流卡顿暂停并缓冲到了足够可以继续播放的buffer长度后响应playbackLikelyToKeepUp 事件中 手动调用了 player.play() 方法播放音频 12345678if keyPath == "currentItem.playbackLikelyToKeepUp" { if let item = currentItem, item.isPlaybackLikelyToKeepUp, playStatus == .loading, isPlayerActive { playStatus = .playing player.play() // 播放之后需增加设置rate的步骤 rate = CGFloat(UserDefaultManager.manager.getAudioRateValue()) }} 查看文档可以看到play方法等同于 player.rate = 1,故而导致音频的速率变成了1 ...
iOS
1.7k 词
今天整理了最近半年内使用频率高的一些代码,做了一些代码块 codesnippet使用,并在github上创建了一个私有仓库用来云端维护和同步,写了一个脚本进行代码块下载和合并。 创建方式: 选中要创建的代码块,右键选择Create Code Snippte 右上角 +框快速查看系统和自定义代码块 填写代码块描述,以及快捷方式,修改代码块 xcode中用户自定义的 代码块保存在~/Library/Developer/Xcode/UserData/CodeSnippets路径下,每个代码块都是一个.codesnippet格式的配置文件。 1234567891011~/Library/Developer/Xcode/UserData/CodeSnippets$: ls -ltotal 72-rw-r--r-- 1 zcx staff 1008 Aug 25 19:36 1BF011CF-9292-4B72-9D44-F7C3BC89AFE0.codesnippet-rw-r--r-- 1 zcx staff ...
iOS
9.7k 词
一个小问题引起的思考最近做一个输入框粘贴插入文字的需求时遇到了一个问题: 输入框中输入了文字和表情符😃😃😃(emoji)计算出的光标location和实际感官上的字符个数不一致,最后导致文字插入的位置不对。 这是为什么呢? 查阅资料发现是Unicode编码和UTF-16编码的设计特点导致的此现象。 字符和字素簇定义说明 Characters and Grapheme Clusters It’s common to think of a string as a sequence of characters, but when working with NSString objects, or with Unicode strings in general, in most cases it is better to deal with substrings rather than with individual characters. The reason for this is that what the user perceives as a character in...
iOS
3k 词
NSCacheIntroduction A mutable collection you use to temporarily store transient key-value pairs that are subject to eviction when resources are low. 一种用于临时存储临时键值对的可变集合,在资源不足时容易被回收。 Cache objects differ from other mutable collections in a few ways:The NSCache class incorporates various auto-eviction policies, which ensure that a cache doesn’t use too much of the system’s memory. If memory is needed by other applications, these policies remove some items from the cache, minimizing its memory ...