说起播放器,在 iOS 平台上就离不开 AVPlayer。什么?你说还有 AVAudioPlayer!用不了,根本用不了一点!在流媒体横行的时代,一个“只”能播放本地音频文件的播放器已经被后浪拍死在沙滩上了。撇开跨平台和一些不常见的视频格式不谈,使用 AVPlayer 作为音视频播放器应该是优先考虑的选择。开箱 AVPlayer,你会发现基于 KVO 那一套接口使用起来真的是难受和折磨,要是还想要先下后播或者边下边播这样的缓存功能,唯有带上痛苦面具一边撸代码一边累牛满面了。好在“万能”的 github 上有不少的开源项目可供研究,但未找到一个兼具易用、支持缓存(先下后播/边下边播)、音频会话管理和后台播放控制的轮子。即然无法做伸手党了,遂决定自个儿动手从头撸一个,期望能够对开源界做一点微不足道的贡献。搞砸了还望大伙轻喷,手动狗头保命~
- Nov 22, 2023...more
⌈iOS⌋WKWebView Cookie 同步的一种方式
Oct 25, 2023...more
屈服于 Apple 的“淫威”,开发者不得不将 App 的网页容器从 UIWebView 迁移到 WKWebView。我们在享受后者带来的性能和功能提升的同时,也被诸如 Cookie 同步、截图、白屏等问题弄得抓耳挠腮、狼狈不堪。无疑,上述问题会随着系统更新被逐渐修复,而开发者在产品系统适配的硬性要求下只得各凭本身缝缝补补,以期望减少在用户侧出现的问题。如题,下文我们对 Cookie 同步的情况进行一些说明,并总结出一种可行的方案。
⌈iOS⌋拥抱 MetricKit
Oct 16, 2023...more
自 iOS 问世以来,官方从来没有提供工具让第三方开发者监控线上 App 的运行情况。特别地,如果开发者想要统计分析崩溃和卡顿,那就只能“自食其力”。而这一切从 iOS 14 开始有了转机,因为 Apple 推出的性能诊断框架 MetricKit 终于囊括异常情况的分析数据:卡顿、崩溃等的堆栈信息。“得益”于 Apple 对用户隐私的保护,它只能作为常规手段的一个补充,而非主力选手。此外,MetricKit 能捕捉到诸如 Watchdog timeout 之类的漏网之鱼,让它不至于全然如鸡肋一般,食之无味,弃之可惜。
⌈iOS⌋统一屏幕旋转控制方式
May 17, 2020...more
对于 iPhone 来说,我们都常有一个使用习惯,即将屏幕自动旋转锁定,毕竟 iOS 的这个陀螺仪的方向检测有时候会出现蜜汁现象。不过这样做的话,就错过了验证各大厂 App LaunchScreen 对屏幕方向的支持情况。举个 🌰:众所周知,天猫和淘宝在 iPhone 上的实际使用中只支持横屏。但如果你把屏幕自动旋转锁定关闭,然后将你的 iPhone 横屏,会发现淘宝的 LaunchScreen 也“躺”下了,而天猫没有…… emmmmmmmm
这篇文章会梳理官方提供的几种屏幕旋转控制的方式以及它们的优先级,当然上面提到的这个问题自然就迎刃而解了。
⌈OC⌋简而繁的BlocksKit
Apr 16, 2020...more
意如分类标题(这个博客主题貌似没有,😂)那样,笔者打算开始探究框架与源码。毫无疑问,这其中会遇到各种各样的挑战,但是我觉得我们应尽早走出这一步,不然就错过了很多的精彩。也许这精彩是更加开阔的程序视野,亦或是逻辑思维与编程能力的提升,这其中对耐心与意志的磨炼绝对会让人十分“酸爽”。
而这简而繁
BlocksKit
就成为了第一道菜
,为什么呢?因为之前对它的认知就是对系统API
的block
方式调用的高度封装,这是它简单的使用特性。然而它的灵魂——动态代理让我深切感受到了框架的设计哲学:把简洁留给别人,把复杂留给自己
。不信?那就接着往下看!⌈iOS⌋Bold Text 的坑
Mar 30, 2019...more
相信大家都清楚,iOS 设备上我们可以设置系统字体显示效果,比如字体变大或者加粗之类的。但如果使用的是自定义字体的话,则不在以上开关打开之后的调整范围之内。如果你的 App 想要适配这种情况的话,可能有一些周折,因为这里的 Bold Text 有一个坑点。这也致使我们的“上帝”向我们提出了批评:
你们的前端该换人了
,虽然这实际上是移动端的事,或者说是 iOS 的问题,😂⌈OC⌋字母`U`引发的“血案”
Feb 20, 2019...more
不得不承认,这回标题党了一把!那博主为什么要这么厚颜无耻,究竟是道德的沦丧,还是人性的扭曲…… 高僧:施主,苦海无边,回头是岸,南无阿弥陀佛。
非也,非也,之所以如此这般,只能说博主实在太想表达粗心大意害死人(太想吸引眼球、太想博客有人看、太想出名、太想上电…… 啪啪)这句话了。历史上这样的大事件想必各位历历在目,比如…… loading…… loading…… 服务器忙~
好吧,想不起来了,那就进入这篇文章的主题,看看博主这次维护老代码遇到的坑长成啥样!(前言总算凑够字数,😄)
⌈iOS⌋Safe Area 的适配
Nov 23, 2018...more
早在 iPhone X 发布的时候,即 iOS 11 的时候,就加入了一个新的关于布局的概念:Safe Area,它可以帮助我们让 UI 不被
UINavigationBar
、UITabBar
和UIStatusBar
遮挡。而苹果为了让开发者更好适配刘海屏搞出来的这一套东西,对于老项目的 UI 适配可能不是一个好消息,如果你是基于UINavigationBar
或UITabBar
来布局的,系统可以很好地帮助你完成。但是对于一些静态界面,可能你得慢慢理理,然后让涉及到的代码适配 Safe Area。也因此你会看到几乎所有 App 在 iPhone X 出来之后,都会有一次更新,其中的更新信息中就有适配 iPhone X。但是在 iPhone XS/XR 上使用的 App,你可能还是会发现有些 UI 布局还是有点问题,而在 iPhone X 上却又是正常的(就像扇贝的 App,自黑一波~),原因在于当初适配 iPhone X 时只是简单的用了一个判断 isIPhoneX 来决定 UI 的样子。⌈iOS⌋给你的`Extensions`加层防护
Oct 21, 2018...more
笼统来说,我们在编写代码时候,通常会有两种方式来组织。一个是继承语言本身的数据类型然后派生出新的,这种方式的使用通常是你需要对此类型大改造以满足你的需求。典型的例子就是
UIViewController
,我们在构造视图控制器时,这个基类只是给我们提供了一个模版,其中包括了一些管理生命周期方法的默认实现。而关于UI
方面,则只提供了一个父视图,我们的交互细节则需要在此基础上自行构建。而另外一种就是以扩展的方式,为基本的数据类型增加新的函数或者方法来达成我们的使用目的。后者的一个好处就是使用者不需要特意去用派生类型,只需要基本类型本身调用对应的扩展方法即可。但是它的坏处就是可能会再语言本身的版本迭代过程中与其所新增的函数或者方法名冲突,导致在运行出现二义性,引起程序崩溃。因此我们需要为这些Extensions
做出一些命名和使用上的规范,以规避此风险。(文章主要以iOS
开发用到的Objective-C
和Swift
两门语言举出🌰)⌈iOS⌋那让人印象深刻的坑点和`Bug`
Sep 29, 2018...more
转眼间又来到了九月末,只是这个九月与自读书以来的不太一样,因为开学是TA们的,我只有代码,😂。
不过,我想这不是什么感伤的情绪,而是对学生时期的青春岁月的缅怀,尽管早已逝去,但又怎么不叫人留念呢?👌,祭出代码表示表示吧,:)