利用好模拟器
这个 session 讲了模拟器的一些知识,帮助我们更加好的利用模拟器进行开发。
模拟器是什么
从功能上理解
模拟器让我们能在 MacOS 上模拟 iOS、watchOS 和 tvOS。
相比真实的设备,有更多的内存和 CPU,并且能够同时运行多个。
作为工程师,停留在这个水平显然是不够的。
从技术上理解
Simulator is iOS, watchOS, or tvOS userspace running on macOS kernel
怎么理解这句话呢?
操作系统可以大略分为 kernel 和 userspace。
kernel 处理关于硬件的抽象及内存分配等。
userspace 自底向上可以分为四层:
- launchd
- daemons,比如 cfprefsd
- framworks,比如 UIKit
- appliacation,比如 photo 应用
每一个模拟器都是这样子一个 userspace。 整体架构如下图:

关于模拟器还有以下事实:
- macOS 和模拟器共用一套文件系统,但是有不同的
$HOME
路径
- 从
libSystem
到UIKit
,都使用了模拟系统的 ABI - 不是
emulator
,因此架构不是arm
,而是x86
- 不能模拟 CPU 和 内存
- 和真实设备相比,有不同的 CPU 核心数,多线程表现也不尽相同
- 没有沙盒限制。在模拟器上可以在在沙盒外写数据,但是在设备上不可以
- 和macOS 不同,模拟器的文件系统是大小写敏感的
- 支持 Thread Sanitizer
模拟器使用的技巧
手势操作
- 可以利用
option
来模拟pinch
手势
- 可以利用
control
来模拟drag & drop
- 可以通过
hardware
来手动触发shake
手势
设置音频输入输出

这样子可以在模拟器放歌曲,在耳机里听歌了。
支持 iCloud 操作
可以登陆 iCloud,也可以手动触发 iCloud 同步。
模拟内存不足
在 Debug
菜单内,也可以通过键盘快捷键。

模拟器管理
新增  新增模拟器时,可以选择 OS Version 和 Simulator Name。
如果需要下载其他 runtime 的模拟器,比如 iOS 10,那么需要先下载 runtime。 删除
可以勾选掉Show as run destination
。 
也可以直接删除,通过delete
按键或者上下文菜单都可以
调整模拟器的 size

有三种预置尺寸可以选择
- Physical Size
把手机放上去,和屏幕上一模一样 - Point Accurate
1 UIKit point = 1 AppKit point - Pixel Accurate
物理像素一致。模拟器的一个物理像素和电脑的一个物理像素对齐。
此外,还可以使用鼠标缩放模拟器,如同操作普通窗口一样。
可以模拟慢速动画

旧的 Xcode 版本使用新版本的模拟器
其实只要有新版本模拟器的 runtime
就好了
传输内容到模拟器上
可以通过拖拽方式,直接把以下五种类型的数据转移到模拟器上。
- App bundles
- Locations: 需要在模拟器和电脑上同时打开 Map
- Photo/image files
- Video files
- URLs: 需要在模拟器和电脑上同时打开 Safari
其他操作
- 可以模拟位置和运动速度
- 可以模拟电话进来
- 可以模拟有外接屏幕
- 可以设置墙纸
- 支持语音输入
- 可以设置键盘,也支持滑动输入
- 支持 dark mode
- 可以支持 Siri
- 可以支持 tvOS
simctl
simtl
,其实就是 simulator control
,是一个命令行工具,可以用来操作模拟器。
help 命令
可以输入xcrun simctl help
来获取所有帮助信息,也可以输入xcrun simctl help <subcommand>
来获取制定子命令的详细信息,如xcrun simctl help list
list 命令获取列表
输入xcrun simctl list
,获取所有模拟器信息,会按照Device Types
、Runtimes
和 Devices
来展示所有设备。list
后可以输入条件来过滤,例子如下
xcrun simctl list devices 'iPhone 8'
== Devices ==
-- iOS 12.2 --
iPhone 8 (70E73274-90B7-474E-A2C3-A490BE004EEC) (Shutdown)
iPhone 8 Plus (1C31EE65-6B40-418A-BF83-899AE4F83BCD) (Booted)
-- tvOS 12.2 --
-- watchOS 5.2 --
通过 create
命令创建模拟器
create <name> <device type> <runtime>
通过 lanuch
来启动模拟器上的一个应用
launch <device> <bundle> <arguments>
和用手点击模拟器的图标效果一样
启动和关闭模拟器
分别对应 boot
和 shutdown
命令
clone 模拟器
可以 clone 模拟器中的 App、UserDefaults 等信息。
安装应用到模拟器上
install <device> <example.app>
一些 alias
模拟器的命令,有些需要输入设备名字。有一些别名可以简化这个操作
- booted 已经被启动的模拟器
- all 所有模拟器
- unavailable 对应的运行时已经被删除了的模拟器
一个Demo

Metal 和模拟器
新的 macOS 系统上运行的新模拟器支持 Metal 了,这有两层含义:
- 模拟器运行在 Metal 上,速度更快了
- 在模拟器上可以运行 Metal API了,不必在真机上调试

目前模拟器上 UIKit
、SpriteKit
、SceneKit
、CoreAnimation
、CoreImage
和 MapKit
都是基于 Metal 的。
Session 里通过几个例子来对比了前后的运行速度,确实快了很多很多。
至于在模拟器上运行 Metal,这个我暂时不会。
导图

参考
posted on 2019-06-14 09:13 花老???? 阅读(378) 评论(0) 编辑 收藏