利用好模拟器
這個 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

有三種預置尺寸可以選擇
把手機放上去,和屏幕上一模一樣
1 UIKit point = 1 AppKit point
物理像素一致。模擬器的一個物理像素和電腦的一個物理像素對齊。
此外,還可以使用鼠標縮放模擬器,如同操作普通窗口一樣。
可以模擬慢速動畫

舊的 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 后可以輸入條件來過濾,例子如下
通過 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 了,這有兩層含義:

目前模擬器上 UIKit、SpriteKit、SceneKit、CoreAnimation、CoreImage 和 MapKit 都是基于 Metal 的。
Session 里通過幾個例子來對比了前后的運行速度,確實快了很多很多。
至于在模擬器上運行 Metal,這個我暫時不會。
導圖

參考
- Getting the Most Out of Simulator
- simctl
轉載于:https://www.cnblogs.com/huahuahu/p/li-yong-hao-mo-ni-qi.html
總結
- 上一篇: Python计算机视觉(三)—— 全景图
- 下一篇: ENVI软件学习笔记(1)