获得徽章 0
- Python-crawler-tutorial-starts-from-zero:python 爬虫教程,带你从零到一,包含js逆向,selenium,tesseract OCR识别,mongodb 的使用,以及scrapy框架121
- 推荐文章:
VIPER best practices for iOS developers -
theswiftdev.com
编辑简评:本文是作者在过去一年对 VIPER 架构最佳实践系列分享的第二篇。主要包括以下内容:
1. 使用 VIPERA 代码生成工具自动生成 VIPER 各个模块
2. 以 App 首页业务为例结合 Promises 分别实现 View、Interactor、Presenter、Entities、Router 、Services
3. VIPER 模块间通信
结合 Promises 基于 VIPER 架构可以使代码结构更加清晰,更容易做单元测试,更易复用,[点击这里](github.com)阅读源码。
对 VIPER 架构感兴趣的读者可以扩展阅读作者这个系列教程[第一篇:]theswiftdev.com 各种架构及 VIPER 基本概念,[第三篇:]
theswiftdev.com 面向协议编程在 VIPER 架构上的实践。
更多优质内容,请查看本周周报:展开评论4 - #iOS知识小集#「 iOS 判断设备是否静音 」
在 iOS 设备中,主要有以下两种类型的声音:
* 铃声和提醒:包括电话、短信、通知等系统类的声音(也包括按键音、锁定声,这两者可在设置中设置是否开启),它们受物理静音开关键的控制,也就是说,当设备开启静音时,这些声音是不会播放的。
* 媒体声音:一般为 App 播放音视频时的声音,音量大小可通过物理音量 + - 键来控制,但它不受设备静音开关键的控制,即当静音键开启时,我们仍然可以通过相关 API 正常播放声音。
因此,这里说的静音分为两种情况,“通过物理静音键开启静音” 和 “将媒体音量调小至 0”。对于后者比较简单,我们可以通过 [AVAudioSession sharedInstance].outputVolume 获取当前音量大小是否为 0 来判断。
下面我们介绍一下如何检测设备静音开关键的状态。
在 iOS 5 之前,我们可以使用如图 1 所示的方式判断静音键的开关,但苹果在 iOS 5 之后禁止了这种方式的使用,并且也没有提供相关新的 API 来判断,于是网上有一种曲线救国的方式,大致实现为:
使用 AudioServicesPlaySystemSound 函数播放一段极短的空白音频(假设为 0.2s),并监听音频播放完成事件,如果从开始播放到回调完成方法的间隔时间小于 0.1s,则意味当前静音开关为开启状态。这是因为,AudioServicesPlaySystemSound 有一个特性是:它播放的声音属于系统音效,所以是受静音按键控制的,且如果当前处于静音模式的话,调用此函数后会立即执行播放完成的回调,这样计算得到的时间间隔会很小,就可以用来判断设备是否静音了。代码大致如图 2 所示。展开18 - #iOS知识小集#「 iOS 判断设备是否锁屏 」
在某些特定的业务场景下,我们可能需要判断用户在使用 App 过程中是否锁屏了。那么,我们该如何监听 iOS 设备的锁屏事件呢?
在 AppDelegate 的回调事件中,当单击 Home 键进入后台时,会依次调用 applicationWillResignActive:(App 即将失去焦点)和 applicationDidEnterBackground:(App 已经进入后台),而当 App 在前台使用过程中进行锁屏操作时,也是依次执行这两个回调。
因此,我们无法通过 AppDelegate 的上述相应回调事件来直接判断设备是否锁屏了。
在网上搜了一下,目前主要有以下几种方式:
1)通过 Darwin 通知监听锁屏事件,代码大致如图 1 所示,不过这种方式已被禁用,在提交 App Store 审核时会被拒。
2)通过 <notify.h> 中的 notify_register_dispatch 函数添加锁屏和解锁监听,代码如图 2 所示。
3)苹果官方其实也提供了另外两个回调:applicationProtectedDataWillBecomeUnavailable: 和 applicationProtectedDataDidBecomeAvailable: 可以分别用于判断锁屏和解锁事件,如图 3 所示,不过这两个方法只有在手机设置了密码、TouchID 或 FaceID 时才会调用。
4)通过屏幕亮度是否为 0 进行判断。
如前面所述,在 App 打开状态下,对于点击 Home 键和锁屏操作,接收到的回调事件是一样的。因此,我们可以在 App 进入后台的 applicationDidEnterBackground: 回调中获取当前屏幕的亮度值,如果为 0,则认为是锁屏操作,否则认为是点击了 Home 键,代码如图 4 所示。不过这种方式存在不足,经验证,有时锁屏后获取到的屏幕亮度值并不为 0,且如果手机的亮度调到最低时,获取到的亮度值始终都为 0,就无法区分锁屏和 Home 键了。
5)此外,OIOS 监听锁屏 这篇文章中也提出一种通过是否能更改屏幕亮度进行判断。代码如图 5 所示,不过经验证,这种方式无效!展开评论10